Skip to content

Prepare the repository for a public launch - #15

Merged
wzslr321 merged 7 commits into
mainfrom
task/public-release-prep
Sep 23, 2026
Merged

wzslr321 merged 7 commits into
mainfrom
task/public-release-prep

Conversation

@claude

@claude claude Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Gets the public repo ready for outside Flutter developers ahead of promoting it. No plugins added or removed; .claude-plugin/marketplace.json changes only in two descriptions.

README

Rewritten as a landing page, shorter than main:

  • A one-sentence hook, and who we are: the team behind Patrol, Marionette MCP and advanced_forms.
  • Before and after is a table from real runs on Claude Sonnet 5, same code and same question ("Tapping Cancel on the second booking does nothing. Why?"). A small Flutter app on macOS talks to a local API outside the app's repository, and an integration test taps Cancel:
    • without the plugin, Claude guesses the cause ("404/409/500, or a network hiccup"): 17 tool calls, $0.50;
    • with /read-logs, Claude reads 409 cancellation_window_closed and the 24-hour rule from the run: 6 tool calls, $0.17.
  • Install is two commands. Team setup and the git URL are folded into <details>.
  • Plugins are listed in tables per group, with a Setup column where a plugin needs one.
  • Contributing points to CONTRIBUTING.md, which now holds the steps and the repo layout.
  • Supported clients and the grouped plugin list stay, because AGENTS.md names both as sources of truth.
  • No em-dashes in user-facing docs: root docs, plugin READMEs and changelogs, and marketplace.json descriptions. Skill content is unchanged.

flutter-analytics: where AnalyticsId comes from (0.2.0)

The conventions assumed an AnalyticsId type that no package provides, and never said how it is wired. As a result, a review invented an analyticsId: parameter on ElevatedButton. The new references/analytics-wiring.md covers:

  • the app-level AnalyticsId class;
  • tappable widgets that register TapAnalyticsEvent through the public leancode_analytics_base;
  • page views reported by the route via LeanAnalyticsRoute.

The review and scaffold skills now check the project's wiring first and must not invent parameters. I re-ran the same review on the same sample after the change. It read the wiring reference first, reported the missing wiring as its first finding, and flagged that ElevatedButton and FloatingActionButton have no analyticsId parameter.

Validator: skill name checks, now with tests

Ported from ai-plugins-internal (frontmatter.go, validateSkillName, plugin_test.go), with ownership, rules and Cursor left out:

  • the frontmatter name must match the skill directory
  • a skill must not share its plugin's name (/foo:foo)
  • SKILL.md must have YAML frontmatter

Before this PR, the go test ./... CI step passed without running anything, because the repo had no test files. It now runs 5 tests. 3 of them fail against the validator on main, which shows they cover the new checks. All 12 local plugins pass the new checks unchanged.

stability was deliberately not ported. Adding it to a plugin.json fails our own strict spec check: plugin.json → stability: Unknown field 'stability'. Claude Code ignores it at load time. Every public plugin would read as stable anyway. A plugin promoted from internal with stability set will need that field dropped here.

MIT licence

LICENSE at the repo root, copyright holder LeanCode, year 2026 (the maintainer's decision over Apache-2.0).

Action pins

Every uses: is pinned to a full commit SHA with a # vX.Y.Z comment, as in ai-plugins-internal. A new .github/dependabot.yml bumps the SHA and the comment together in one grouped monthly PR, so nobody has to maintain the pins by hand. golangci-lint-action is pinned to v9.2.1, the same SHA as internal. The other pins match what their floating tags resolve to today.

Smaller changes

  • TODO(wiktor.zajac) in internal/pluginvalidation/files.go is reworded without the name.
  • lean-contribute no longer calls CONTRIBUTING.md a thin pointer at itself.
  • AGENTS.md documents the new skill-name rules.

Validation

  • gofmt -l cmd internal: no output
  • go vet ./...: clean
  • golangci-lint run ./...: 0 issues.
  • go test ./...: 5 tests pass
  • go run ./cmd/validate-plugins: OK: plugin structure is valid (12 plugin(s) checked).
  • claude plugin validate . --strict (2.1.173, as in CI): Validation passed
  • Every repo-relative link in README.md and CONTRIBUTING.md resolves. External links and the badge return 200.

Not in this PR

  • Repo description, topics and homepage: these need a repo admin in Settings. Proposed values are in the release canvas.
  • Promotions from internal (lean-a11y, qa-workflows, lean-jev): these are separate PRs.

🤖 Generated with Claude Code

wzslr321 and others added 5 commits September 23, 2026 10:53
Add an MIT LICENSE (the maintainer's choice over Apache-2.0), rewrite the
README as a landing page rather than a manual, pin every GitHub Action to a
full commit SHA, and drop a named TODO from the validator.

The README now leads with the value proposition, states what a plugin here
actually is and who the plugins are for, and shows one worked example
(/read-logs) before the install commands. Install keeps the two essential
commands and folds team setup and variants into a details block. Contributing
is now four steps an outside contributor can follow without installing
anything; CONTRIBUTING.md stops calling itself non-canonical and points at
AGENTS.md for conventions and at /lean-contribute as an option.

Action SHAs were resolved from each action's own repository and match the
current floating refs, except golangci-lint-action, which is pinned to the
same v9.2.1 SHA that ai-plugins-internal uses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pDxLYapuG6GTBHwMfNXNP
Follow-up to the public-launch prep, from an adversarial re-read of the
rewritten README against the files it describes.

- The worked example claimed "Nothing is committed; the skill only reads."
  read-logs' first-run setup writes .vscode/settings.json or .zed/tasks.json
  (after asking), so "only reads" was wrong. Also surface the point that
  skills/read-logs/SKILL.md leads with: reading a run sends its contents to
  the model. A public landing page should not drop that.
- "Most plugins are pure rules and skills" contradicted the Supported
  clients section two headings above, which states Claude Code has no
  plugin `rules` concept.
- "Every plugin has a `-usage` skill" is false for the two externally
  sourced entries: marketplace.json gives flutter-forms only
  advanced_forms-build-forms and flutter-patrol only patrol-write-test and
  patrol-test-architecture.
- The install section showed `flutter-bloc@leancode-ai-plugins` with no
  explanation of the suffix after the rewrite dropped it, leaving a reader
  unable to install any other plugin.
- CONTRIBUTING.md is not "the longer version" of the README's Contributing
  section; it carries the same steps plus the guided path.

gofmt -l cmd internal, go run ./cmd/validate-plugins, go test ./... and
claude plugin validate . --strict all pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pDxLYapuG6GTBHwMfNXNP
Port the skill-name checks from ai-plugins-internal: the frontmatter
name must match the skill directory, must not repeat the plugin name
(/foo:foo), and SKILL.md must carry YAML frontmatter. The go test step
in CI previously had no test files to run; it now runs five, three of
which fail against the old validator.

stability is deliberately not ported: claude plugin validate --strict
rejects it as an unknown plugin.json field.

Add Dependabot for the SHA-pinned actions, grouped monthly.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The conventions assumed an AnalyticsId type that no package provides,
so reviews invented widget APIs (an analyticsId parameter on
ElevatedButton). Add analytics-wiring.md: the app-level AnalyticsId
class, tappable widgets that register TapAnalyticsEvent through
leancode_analytics_base, and page views reported by the route. The
review and scaffold skills now check the project's wiring first and
must not invent parameters. Bump to 0.2.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Replace the prose example with a same-question comparison from real
runs: without the plugin Claude guesses at the failure; with /read-logs
it reads the 409 from the run. Move per-plugin setup next to the
plugins that need it, move the contribution steps and repo layout to
CONTRIBUTING.md, and bring lean-core's contributor and usage skills and
AGENTS.md in line with the current checks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@wzslr321
wzslr321 force-pushed the task/public-release-prep branch from 82a463d to 821a680 Compare September 23, 2026 08:53
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@wzslr321
wzslr321 requested a balanced review from Copilot September 23, 2026 09:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@wzslr321
wzslr321 marked this pull request as ready for review September 23, 2026 09:06
@wzslr321
wzslr321 merged commit dc93768 into main Sep 23, 2026
3 checks passed
@wzslr321
wzslr321 deleted the task/public-release-prep branch September 23, 2026 09:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants