@erclx/canon 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/claude/.claude-plugin/plugin.json +19 -0
- package/claude/skills/bash-cli-script/REQUIREMENT.md +42 -0
- package/claude/skills/bash-cli-script/SKILL.md +48 -0
- package/claude/skills/bash-cli-script/references/template.md +43 -0
- package/claude/skills/bash-script/REQUIREMENT.md +36 -0
- package/claude/skills/bash-script/SKILL.md +100 -0
- package/claude/skills/bash-script/references/patterns.md +349 -0
- package/claude/skills/canon-cli/REQUIREMENT.md +41 -0
- package/claude/skills/canon-cli/SKILL.md +103 -0
- package/claude/skills/canon-feedback-file/REQUIREMENT.md +40 -0
- package/claude/skills/canon-feedback-file/SKILL.md +80 -0
- package/claude/skills/canon-feedback-triage/REQUIREMENT.md +40 -0
- package/claude/skills/canon-feedback-triage/SKILL.md +63 -0
- package/claude/skills/canon-operator/REQUIREMENT.md +61 -0
- package/claude/skills/canon-operator/SKILL.md +108 -0
- package/claude/skills/canon-rollout/REQUIREMENT.md +59 -0
- package/claude/skills/canon-rollout/SKILL.md +147 -0
- package/claude/skills/canon-screencast/REQUIREMENT.md +39 -0
- package/claude/skills/canon-screencast/SKILL.md +167 -0
- package/claude/skills/canon-slides-draft/REQUIREMENT.md +39 -0
- package/claude/skills/canon-slides-draft/SKILL.md +62 -0
- package/claude/skills/ci-workflow/REQUIREMENT.md +40 -0
- package/claude/skills/ci-workflow/SKILL.md +65 -0
- package/claude/skills/ci-workflow/references/workflows.md +98 -0
- package/claude/skills/claude-address-review/REQUIREMENT.md +57 -0
- package/claude/skills/claude-address-review/SKILL.md +212 -0
- package/claude/skills/claude-address-review/references/rebase-conflicts.md +39 -0
- package/claude/skills/claude-autoship/REQUIREMENT.md +50 -0
- package/claude/skills/claude-autoship/SKILL.md +207 -0
- package/claude/skills/claude-design-extract/REQUIREMENT.md +42 -0
- package/claude/skills/claude-design-extract/SKILL.md +102 -0
- package/claude/skills/claude-diagram/REQUIREMENT.md +45 -0
- package/claude/skills/claude-diagram/SKILL.md +177 -0
- package/claude/skills/claude-docs/REQUIREMENT.md +60 -0
- package/claude/skills/claude-docs/SKILL.md +287 -0
- package/claude/skills/claude-docs/references/anchor-sweep.md +58 -0
- package/claude/skills/claude-docs/references/wireframe-sweep.md +45 -0
- package/claude/skills/claude-feature/REQUIREMENT.md +36 -0
- package/claude/skills/claude-feature/SKILL.md +115 -0
- package/claude/skills/claude-groundwork/REQUIREMENT.md +48 -0
- package/claude/skills/claude-groundwork/SKILL.md +142 -0
- package/claude/skills/claude-intake/REQUIREMENT.md +49 -0
- package/claude/skills/claude-intake/SKILL.md +114 -0
- package/claude/skills/claude-intake-answer/REQUIREMENT.md +48 -0
- package/claude/skills/claude-intake-answer/SKILL.md +90 -0
- package/claude/skills/claude-markdown-propose/REQUIREMENT.md +48 -0
- package/claude/skills/claude-markdown-propose/SKILL.md +118 -0
- package/claude/skills/claude-markdown-propose/references/format.md +107 -0
- package/claude/skills/claude-memory-capture/REQUIREMENT.md +50 -0
- package/claude/skills/claude-memory-capture/SKILL.md +101 -0
- package/claude/skills/claude-memory-review/REQUIREMENT.md +50 -0
- package/claude/skills/claude-memory-review/SKILL.md +210 -0
- package/claude/skills/claude-memory-review/references/receipt-format.md +48 -0
- package/claude/skills/claude-orchestrate/REQUIREMENT.md +121 -0
- package/claude/skills/claude-orchestrate/SKILL.md +241 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-dispatch.md +132 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-handoff.md +32 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-parked.md +72 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-poll.md +87 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-resume.md +30 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-sweep.md +21 -0
- package/claude/skills/claude-orchestrate/scripts/poll.sh +373 -0
- package/claude/skills/claude-orchestrate/scripts/watch.sh +181 -0
- package/claude/skills/claude-pr-review/REQUIREMENT.md +47 -0
- package/claude/skills/claude-pr-review/SKILL.md +295 -0
- package/claude/skills/claude-review/REQUIREMENT.md +39 -0
- package/claude/skills/claude-review/SKILL.md +142 -0
- package/claude/skills/claude-seed-sync/REQUIREMENT.md +45 -0
- package/claude/skills/claude-seed-sync/SKILL.md +156 -0
- package/claude/skills/claude-standards-audit/REQUIREMENT.md +33 -0
- package/claude/skills/claude-standards-audit/SKILL.md +99 -0
- package/claude/skills/claude-tasks/REQUIREMENT.md +43 -0
- package/claude/skills/claude-tasks/SKILL.md +161 -0
- package/claude/skills/claude-teach/REQUIREMENT.md +56 -0
- package/claude/skills/claude-teach/SKILL.md +196 -0
- package/claude/skills/claude-teach/references/lesson-craft.md +59 -0
- package/claude/skills/claude-teach/references/pedagogy.md +67 -0
- package/claude/skills/claude-teach/references/promotion.md +54 -0
- package/claude/skills/claude-ui-test/REQUIREMENT.md +40 -0
- package/claude/skills/claude-ui-test/SKILL.md +77 -0
- package/claude/skills/claude-ux-audit/REQUIREMENT.md +40 -0
- package/claude/skills/claude-ux-audit/SKILL.md +79 -0
- package/claude/skills/claude-ux-measure/REQUIREMENT.md +48 -0
- package/claude/skills/claude-ux-measure/SKILL.md +122 -0
- package/claude/skills/claude-worker/REQUIREMENT.md +54 -0
- package/claude/skills/claude-worker/SKILL.md +96 -0
- package/claude/skills/claude-worktree/REQUIREMENT.md +58 -0
- package/claude/skills/claude-worktree/SKILL.md +136 -0
- package/claude/skills/create-rule/REQUIREMENT.md +45 -0
- package/claude/skills/create-rule/SKILL.md +68 -0
- package/claude/skills/create-skill/REQUIREMENT.md +38 -0
- package/claude/skills/create-skill/SKILL.md +32 -0
- package/claude/skills/create-snippet/REQUIREMENT.md +39 -0
- package/claude/skills/create-snippet/SKILL.md +30 -0
- package/claude/skills/create-standard/REQUIREMENT.md +35 -0
- package/claude/skills/create-standard/SKILL.md +29 -0
- package/claude/skills/decision-escalate/REQUIREMENT.md +45 -0
- package/claude/skills/decision-escalate/SKILL.md +79 -0
- package/claude/skills/docs-sync/REQUIREMENT.md +41 -0
- package/claude/skills/docs-sync/SKILL.md +95 -0
- package/claude/skills/git-branch/REQUIREMENT.md +38 -0
- package/claude/skills/git-branch/SKILL.md +60 -0
- package/claude/skills/git-commit/REQUIREMENT.md +36 -0
- package/claude/skills/git-commit/SKILL.md +49 -0
- package/claude/skills/git-followup/REQUIREMENT.md +43 -0
- package/claude/skills/git-followup/SKILL.md +48 -0
- package/claude/skills/git-issue/REQUIREMENT.md +38 -0
- package/claude/skills/git-issue/SKILL.md +65 -0
- package/claude/skills/git-pr/REQUIREMENT.md +50 -0
- package/claude/skills/git-pr/SKILL.md +164 -0
- package/claude/skills/git-pr/references/labels.md +95 -0
- package/claude/skills/git-ship/REQUIREMENT.md +42 -0
- package/claude/skills/git-ship/SKILL.md +55 -0
- package/claude/skills/git-split/REQUIREMENT.md +39 -0
- package/claude/skills/git-split/SKILL.md +162 -0
- package/claude/skills/git-stage/REQUIREMENT.md +39 -0
- package/claude/skills/git-stage/SKILL.md +73 -0
- package/claude/skills/git-worktree/REQUIREMENT.md +38 -0
- package/claude/skills/git-worktree/SKILL.md +130 -0
- package/claude/skills/migration-claude-md/REQUIREMENT.md +40 -0
- package/claude/skills/migration-claude-md/SKILL.md +76 -0
- package/claude/skills/migration-context/REQUIREMENT.md +36 -0
- package/claude/skills/migration-context/SKILL.md +95 -0
- package/claude/skills/migration-standards-drop/REQUIREMENT.md +55 -0
- package/claude/skills/migration-standards-drop/SKILL.md +113 -0
- package/claude/skills/migration-superseded/REQUIREMENT.md +44 -0
- package/claude/skills/migration-superseded/SKILL.md +115 -0
- package/claude/skills/project-commands/REQUIREMENT.md +42 -0
- package/claude/skills/project-commands/SKILL.md +85 -0
- package/claude/skills/restate-plainly/REQUIREMENT.md +41 -0
- package/claude/skills/restate-plainly/SKILL.md +39 -0
- package/claude/skills/session-map/REQUIREMENT.md +57 -0
- package/claude/skills/session-map/SKILL.md +70 -0
- package/claude/skills/session-resume/REQUIREMENT.md +49 -0
- package/claude/skills/session-resume/SKILL.md +51 -0
- package/claude/skills/setup-gov/REQUIREMENT.md +37 -0
- package/claude/skills/setup-gov/SKILL.md +77 -0
- package/claude/skills/setup-indexes/REQUIREMENT.md +45 -0
- package/claude/skills/setup-indexes/SKILL.md +153 -0
- package/claude/skills/setup-init/REQUIREMENT.md +45 -0
- package/claude/skills/setup-init/SKILL.md +127 -0
- package/claude/skills/setup-plugins/REQUIREMENT.md +42 -0
- package/claude/skills/setup-plugins/SKILL.md +81 -0
- package/claude/skills/setup-plugins/references/plugin-catalog.md +53 -0
- package/claude/skills/setup-verify/REQUIREMENT.md +39 -0
- package/claude/skills/setup-verify/SKILL.md +51 -0
- package/claude/skills/systematic-debugging/REQUIREMENT.md +41 -0
- package/claude/skills/systematic-debugging/SKILL.md +70 -0
- package/claude/skills/write-human/REQUIREMENT.md +46 -0
- package/claude/skills/write-human/SKILL.md +68 -0
- package/claude/skills/write-human/references/density.md +38 -0
- package/claude/skills/write-human/references/machine-tells.md +107 -0
- package/claude/skills/write-human/references/source-material.md +37 -0
- package/claude/skills/youtube-transcripts/REQUIREMENT.md +38 -0
- package/claude/skills/youtube-transcripts/SKILL.md +34 -0
- package/docs/agents/audits.md +98 -0
- package/docs/agents/capture.md +37 -0
- package/docs/agents/census.md +23 -0
- package/docs/agents/commands.md +146 -0
- package/docs/agents/comments.md +34 -0
- package/docs/agents/context-audit-checks.md +120 -0
- package/docs/agents/context-audit.md +83 -0
- package/docs/agents/counts.md +76 -0
- package/docs/agents/demo.md +86 -0
- package/docs/agents/docs.md +17 -0
- package/docs/agents/gate.md +84 -0
- package/docs/agents/index.md +47 -0
- package/docs/agents/indexes.md +35 -0
- package/docs/agents/install-and-sync.md +385 -0
- package/docs/agents/intake.md +81 -0
- package/docs/agents/key-changes.md +103 -0
- package/docs/agents/label-coverage.md +73 -0
- package/docs/agents/markdown-audit.md +197 -0
- package/docs/agents/output-shape.md +70 -0
- package/docs/agents/overview.md +26 -0
- package/docs/agents/records.md +170 -0
- package/docs/agents/restated.md +81 -0
- package/docs/agents/review-classification.md +77 -0
- package/docs/agents/routing.md +61 -0
- package/docs/agents/rule-citations.md +98 -0
- package/docs/agents/sandbox.md +71 -0
- package/docs/agents/scripting.md +149 -0
- package/docs/agents/sessions.md +120 -0
- package/docs/agents/skills-audit.md +94 -0
- package/docs/agents/skills-reach.md +64 -0
- package/docs/agents/standards-audit.md +38 -0
- package/docs/agents/state-scoped-risk.md +105 -0
- package/docs/agents/superseded.md +85 -0
- package/docs/agents/targets.md +83 -0
- package/docs/agents/tasks.md +200 -0
- package/docs/agents/teach.md +158 -0
- package/docs/agents/test-order.md +56 -0
- package/docs/agents/worktrees.md +62 -0
- package/docs/ai-workflow.md +317 -0
- package/docs/index.md +23 -0
- package/docs/operating-model.md +223 -0
- package/docs/target-projects.md +258 -0
- package/docs/visual-design-workflow.md +151 -0
- package/docs/zshrc-aliases.md +65 -0
- package/governance/rules/ci/700-ci-workflow.md +44 -0
- package/governance/rules/claude/500-prose.md +15 -0
- package/governance/rules/claude/501-markdown.md +14 -0
- package/governance/rules/claude/510-context.md +28 -0
- package/governance/rules/claude/511-indexes.md +14 -0
- package/governance/rules/claude/520-wireframes.md +12 -0
- package/governance/rules/claude/530-requirements.md +11 -0
- package/governance/rules/claude/540-architecture.md +11 -0
- package/governance/rules/claude/550-design.md +11 -0
- package/governance/rules/claude/555-tasks.md +12 -0
- package/governance/rules/claude/556-groundwork.md +11 -0
- package/governance/rules/claude/557-intake.md +11 -0
- package/governance/rules/claude/558-plan.md +22 -0
- package/governance/rules/claude/559-memory.md +11 -0
- package/governance/rules/claude/560-diagrams.md +18 -0
- package/governance/rules/claude/561-teach.md +13 -0
- package/governance/rules/claude/562-session.md +15 -0
- package/governance/rules/claude/570-skill.md +24 -0
- package/governance/rules/claude/575-hooks.md +17 -0
- package/governance/rules/claude/576-settings.md +14 -0
- package/governance/rules/claude/580-readme.md +11 -0
- package/governance/rules/claude/590-rule-authoring.md +12 -0
- package/governance/rules/claude/591-standard-authoring.md +12 -0
- package/governance/rules/claude/592-claude-md.md +19 -0
- package/governance/rules/core/000-constitution.md +30 -0
- package/governance/rules/core/005-behavior.md +27 -0
- package/governance/rules/core/010-testing.md +35 -0
- package/governance/rules/core/015-output.md +20 -0
- package/governance/rules/core/020-concurrency.md +22 -0
- package/governance/rules/core/025-indexes.md +9 -0
- package/governance/rules/core/030-error-handling.md +31 -0
- package/governance/rules/core/035-tasks.md +13 -0
- package/governance/rules/core/040-performance.md +20 -0
- package/governance/rules/core/045-memory.md +12 -0
- package/governance/rules/core/050-logging.md +20 -0
- package/governance/rules/core/055-scratch.md +9 -0
- package/governance/rules/core/060-naming.md +19 -0
- package/governance/rules/core/065-spelling.md +19 -0
- package/governance/rules/core/070-planning.md +18 -0
- package/governance/rules/core/075-dependencies.md +25 -0
- package/governance/rules/core/080-config-comments.md +22 -0
- package/governance/rules/core/085-worktrees.md +17 -0
- package/governance/rules/core/087-git.md +11 -0
- package/governance/rules/core/090-code-comments.md +39 -0
- package/governance/rules/framework/200-react.md +51 -0
- package/governance/rules/framework/210-astro.md +41 -0
- package/governance/rules/framework/220-fastapi.md +43 -0
- package/governance/rules/framework/230-nextjs.md +48 -0
- package/governance/rules/framework/250-tailwind.md +32 -0
- package/governance/rules/framework/260-shadcn.md +34 -0
- package/governance/rules/lang/100-typescript.md +40 -0
- package/governance/rules/lang/110-python.md +42 -0
- package/governance/rules/lang/120-bash.md +19 -0
- package/governance/rules/lib/300-testing-ts.md +39 -0
- package/governance/rules/lib/305-e2e-reliability.md +34 -0
- package/governance/rules/lib/306-test-scope.md +25 -0
- package/governance/rules/lib/310-zod.md +25 -0
- package/governance/rules/lib/320-tanstack-query.md +32 -0
- package/governance/rules/lib/330-testing-py.md +44 -0
- package/governance/rules/lib/340-pydantic.md +38 -0
- package/governance/rules/lib/350-security-web.md +32 -0
- package/governance/rules/lib/360-security-server.md +39 -0
- package/governance/rules/lib/370-database.md +35 -0
- package/governance/rules/snippets/505-at-references.md +9 -0
- package/governance/rules/ui/400-ui.md +36 -0
- package/governance/rules/ui/410-a11y.md +48 -0
- package/governance/rules/ui/420-forms.md +36 -0
- package/governance/rules/ui/430-ux-completeness.md +65 -0
- package/governance/rules/ui/440-surface-capture.md +34 -0
- package/governance/rules/ui/450-link-behavior.md +19 -0
- package/governance/stacks/astro.toml +2 -0
- package/governance/stacks/base.toml +8 -0
- package/governance/stacks/node-server.toml +2 -0
- package/governance/stacks/node.toml +2 -0
- package/governance/stacks/python-fastapi.toml +2 -0
- package/governance/stacks/python.toml +2 -0
- package/governance/stacks/react.toml +2 -0
- package/package.json +69 -0
- package/scripts/config.sh +11 -0
- package/scripts/core/bootstrap.sh +81 -0
- package/scripts/core/check-color-source.sh +41 -0
- package/scripts/core/check-ignore-parity.sh +162 -0
- package/scripts/core/check-plugin-boundary.sh +45 -0
- package/scripts/core/check-seed-independence.sh +59 -0
- package/scripts/core/check-skill-paths.sh +24 -0
- package/scripts/core/clean.sh +36 -0
- package/scripts/core/install-check.sh +101 -0
- package/scripts/core/list-seed-roots.sh +18 -0
- package/scripts/core/regen-claude-copies.sh +10 -0
- package/scripts/core/regen-hero.sh +217 -0
- package/scripts/core/regen-indexes.sh +10 -0
- package/scripts/core/regen-tooling-paths.sh +61 -0
- package/scripts/core/repair-bare-flag.sh +19 -0
- package/scripts/core/snapshot.sh +134 -0
- package/scripts/core/update.sh +35 -0
- package/scripts/docs/list.sh +165 -0
- package/scripts/lib/frontmatter.sh +30 -0
- package/scripts/lib/gov.sh +14 -0
- package/scripts/lib/sandbox-fixtures.sh +191 -0
- package/scripts/lib/sandbox-git.sh +125 -0
- package/scripts/lib/sandbox-path.sh +206 -0
- package/scripts/lib/tooling.sh +35 -0
- package/scripts/lib/ui.sh +266 -0
- package/scripts/lib/worktree.sh +20 -0
- package/scripts/manage-sandbox.sh +466 -0
- package/scripts/snippets/create.sh +156 -0
- package/scripts/standards/list.sh +115 -0
- package/scripts/tooling/create.sh +109 -0
- package/scripts/tooling/verify.sh +179 -0
- package/snippets/align.md +12 -0
- package/snippets/claude/decision-memo.md +39 -0
- package/snippets/claude/feature-recap.md +19 -0
- package/snippets/claude/figma-steps.md +24 -0
- package/snippets/compact-summary.md +5 -0
- package/snippets/decision-help.md +6 -0
- package/snippets/meta-prompt.md +14 -0
- package/snippets/research-prompt.md +7 -0
- package/snippets/session-notes.md +11 -0
- package/snippets/snippets.toml +5 -0
- package/snippets/step-by-step.md +10 -0
- package/snippets/web-research.md +21 -0
- package/src/audits/baseline.ts +201 -0
- package/src/audits/catalog.ts +876 -0
- package/src/audits/run.ts +204 -0
- package/src/autoship/classify.ts +75 -0
- package/src/autoship/paths.ts +51 -0
- package/src/binary.ts +16 -0
- package/src/browser/engine.ts +40 -0
- package/src/census/count.ts +113 -0
- package/src/claude/cases/all.ts +24 -0
- package/src/claude/cases/authoring.ts +53 -0
- package/src/claude/cases/claude-workflow.ts +158 -0
- package/src/claude/cases/git.ts +44 -0
- package/src/claude/cases/misc.ts +27 -0
- package/src/claude/cases/setup.ts +94 -0
- package/src/claude/gitignore.ts +51 -0
- package/src/claude/routing.ts +283 -0
- package/src/claude/seeds-list.ts +47 -0
- package/src/claude/seeds.ts +150 -0
- package/src/claude/settings.ts +151 -0
- package/src/claude/skills-audit.ts +228 -0
- package/src/claude/skills-drift.ts +156 -0
- package/src/claude/skills-list.ts +99 -0
- package/src/claude/skills-rank.ts +320 -0
- package/src/claude/skills-reach.ts +227 -0
- package/src/cli-run.ts +43 -0
- package/src/cli.ts +200 -0
- package/src/commands/audits.ts +350 -0
- package/src/commands/autoship.ts +129 -0
- package/src/commands/capture.ts +133 -0
- package/src/commands/census.ts +105 -0
- package/src/commands/claude.ts +1286 -0
- package/src/commands/comments.ts +240 -0
- package/src/commands/context.ts +857 -0
- package/src/commands/demo.ts +389 -0
- package/src/commands/deps.ts +173 -0
- package/src/commands/design.ts +36 -0
- package/src/commands/docs.ts +60 -0
- package/src/commands/feedback-format.ts +23 -0
- package/src/commands/feedback.ts +112 -0
- package/src/commands/gate.ts +189 -0
- package/src/commands/gov.ts +1265 -0
- package/src/commands/indexes.ts +184 -0
- package/src/commands/init.ts +113 -0
- package/src/commands/intake.ts +406 -0
- package/src/commands/inventory.ts +256 -0
- package/src/commands/labels.ts +361 -0
- package/src/commands/markdown.ts +544 -0
- package/src/commands/migrate.ts +175 -0
- package/src/commands/pass-through.ts +39 -0
- package/src/commands/pr.ts +411 -0
- package/src/commands/records.ts +728 -0
- package/src/commands/sandbox.ts +468 -0
- package/src/commands/secrets.ts +132 -0
- package/src/commands/serve.ts +159 -0
- package/src/commands/sessions.ts +408 -0
- package/src/commands/slides.ts +126 -0
- package/src/commands/snippets.ts +84 -0
- package/src/commands/standards.ts +247 -0
- package/src/commands/sync.ts +428 -0
- package/src/commands/targets.ts +319 -0
- package/src/commands/tasks.ts +743 -0
- package/src/commands/teach.ts +786 -0
- package/src/commands/tooling.ts +573 -0
- package/src/commands/transcripts.ts +44 -0
- package/src/commands/upgrade.ts +231 -0
- package/src/commands/wiki.ts +100 -0
- package/src/commands/worktrees.ts +191 -0
- package/src/comments/scan.ts +338 -0
- package/src/comments/trend.ts +207 -0
- package/src/comments/vocabulary.ts +85 -0
- package/src/context/architecture.ts +364 -0
- package/src/context/audit.ts +790 -0
- package/src/context/citations.ts +196 -0
- package/src/context/folders.ts +186 -0
- package/src/context/gate.ts +57 -0
- package/src/context/index-drift.ts +64 -0
- package/src/context/narration.ts +99 -0
- package/src/copy.ts +30 -0
- package/src/counts/catalogs.ts +96 -0
- package/src/counts/numbers.ts +79 -0
- package/src/counts/scan.ts +314 -0
- package/src/demo/beats.ts +135 -0
- package/src/demo/compile.ts +326 -0
- package/src/demo/container.ts +63 -0
- package/src/demo/cursors.ts +55 -0
- package/src/demo/drive.ts +357 -0
- package/src/demo/pointer.ts +178 -0
- package/src/demo/theme.ts +112 -0
- package/src/deps/audit.ts +153 -0
- package/src/design/parse.ts +116 -0
- package/src/design/render.ts +249 -0
- package/src/docs/read.ts +77 -0
- package/src/exec.ts +16 -0
- package/src/exempt-marker.ts +43 -0
- package/src/frontmatter.ts +13 -0
- package/src/gate/measures.ts +682 -0
- package/src/gate/sequencer.ts +386 -0
- package/src/gate/stages.ts +412 -0
- package/src/git-env.ts +36 -0
- package/src/git-files.ts +105 -0
- package/src/git-ignore.ts +46 -0
- package/src/github-format.ts +13 -0
- package/src/github.ts +24 -0
- package/src/gov/adapter.ts +103 -0
- package/src/gov/citations.ts +514 -0
- package/src/gov/consumed.ts +129 -0
- package/src/gov/install.ts +132 -0
- package/src/gov/list.ts +106 -0
- package/src/gov/payload.ts +39 -0
- package/src/gov/restated.ts +814 -0
- package/src/gov/stacks.ts +205 -0
- package/src/gov/superseded.ts +415 -0
- package/src/gov/test-order.ts +407 -0
- package/src/indexes/frontmatter.ts +46 -0
- package/src/indexes/regen.ts +84 -0
- package/src/indexes/render.ts +201 -0
- package/src/indexes/walk.ts +83 -0
- package/src/init/flags.ts +60 -0
- package/src/init/plan.ts +114 -0
- package/src/init/run.ts +46 -0
- package/src/init/steps.ts +77 -0
- package/src/intake/folder.ts +320 -0
- package/src/intake/items.ts +174 -0
- package/src/inventory/config.ts +117 -0
- package/src/inventory/group.ts +76 -0
- package/src/inventory/subjects.ts +114 -0
- package/src/inventory/walk.ts +129 -0
- package/src/labels/audit.ts +82 -0
- package/src/labels/coverage.ts +79 -0
- package/src/labels/map.ts +101 -0
- package/src/labels/phase.ts +95 -0
- package/src/markdown/bans.ts +94 -0
- package/src/markdown/files.ts +102 -0
- package/src/markdown/gate.ts +28 -0
- package/src/markdown/scan.ts +295 -0
- package/src/markdown/structure.ts +730 -0
- package/src/migrate/apply.ts +115 -0
- package/src/migrate/plan.ts +103 -0
- package/src/migrate/rename.ts +183 -0
- package/src/pr/bijection.ts +145 -0
- package/src/pr/paths.ts +335 -0
- package/src/process/harness.ts +167 -0
- package/src/project-root.ts +19 -0
- package/src/records/backup.ts +455 -0
- package/src/records/migrate.ts +78 -0
- package/src/records/size.ts +260 -0
- package/src/records/validate.ts +1162 -0
- package/src/sandbox/census.ts +228 -0
- package/src/sandbox/coverage.ts +115 -0
- package/src/sandbox/expect.ts +629 -0
- package/src/sandbox/tree.ts +47 -0
- package/src/secrets/marker.ts +30 -0
- package/src/secrets/patterns.ts +142 -0
- package/src/secrets/scan.ts +123 -0
- package/src/secrets/shipped.ts +111 -0
- package/src/seed-marker.ts +74 -0
- package/src/serve/static.ts +322 -0
- package/src/sessions/claim.ts +85 -0
- package/src/sessions/live.ts +79 -0
- package/src/sessions/registry.ts +137 -0
- package/src/sessions/resolve.ts +333 -0
- package/src/slides/layouts.ts +391 -0
- package/src/slides/open.ts +18 -0
- package/src/slides/parse.ts +84 -0
- package/src/slides/render.ts +88 -0
- package/src/slides/styles.ts +44 -0
- package/src/snippets/categories.ts +66 -0
- package/src/snippets/list.ts +32 -0
- package/src/snippets/presets.ts +50 -0
- package/src/standards/audit.ts +132 -0
- package/src/standards/read.ts +100 -0
- package/src/sync/check.ts +692 -0
- package/src/sync/engine.ts +576 -0
- package/src/sync/git.ts +225 -0
- package/src/sync/history.ts +123 -0
- package/src/sync/layout.ts +140 -0
- package/src/sync/reverse.ts +268 -0
- package/src/sync/seeds-report.ts +126 -0
- package/src/sync/stamp.ts +358 -0
- package/src/sync/target.ts +70 -0
- package/src/sync/workflow.ts +200 -0
- package/src/target.ts +43 -0
- package/src/targets/pulls.ts +250 -0
- package/src/targets/registry.ts +203 -0
- package/src/targets/resolve.ts +145 -0
- package/src/targets/sweep.ts +246 -0
- package/src/tasks/archive.ts +506 -0
- package/src/tasks/record.ts +311 -0
- package/src/tasks/trunk.ts +89 -0
- package/src/tasks/validate.ts +1001 -0
- package/src/teach/lesson.ts +180 -0
- package/src/teach/workspace.ts +842 -0
- package/src/tooling/gitignore.ts +122 -0
- package/src/tooling/inject.ts +193 -0
- package/src/tooling/list.ts +39 -0
- package/src/tooling/manifest.ts +176 -0
- package/src/tooling/package.ts +166 -0
- package/src/tooling/read.ts +65 -0
- package/src/tooling/scan.ts +147 -0
- package/src/tooling/stamp.ts +44 -0
- package/src/transcripts/fetch.ts +156 -0
- package/src/transcripts/metadata.ts +54 -0
- package/src/transcripts/vtt.ts +114 -0
- package/src/ui.ts +266 -0
- package/src/version/compare.ts +53 -0
- package/src/version/installed.ts +40 -0
- package/src/version/manager.ts +67 -0
- package/src/version/skew.ts +192 -0
- package/src/wiki/init.ts +85 -0
- package/src/worktree.ts +143 -0
- package/src/worktrees/reclaim.ts +306 -0
- package/standards/architecture.md +72 -0
- package/standards/branch.md +59 -0
- package/standards/commit.md +72 -0
- package/standards/context.md +151 -0
- package/standards/design.md +93 -0
- package/standards/diagrams.md +152 -0
- package/standards/glossary.md +75 -0
- package/standards/groundwork.md +211 -0
- package/standards/index.md +36 -0
- package/standards/intake.md +192 -0
- package/standards/issue.md +94 -0
- package/standards/markdown.md +137 -0
- package/standards/memory.md +144 -0
- package/standards/plan.md +172 -0
- package/standards/pr.md +139 -0
- package/standards/publish.md +51 -0
- package/standards/readme.md +208 -0
- package/standards/requirements.md +70 -0
- package/standards/rule.md +118 -0
- package/standards/session.md +109 -0
- package/standards/skill.md +300 -0
- package/standards/slug.md +39 -0
- package/standards/snippets.md +76 -0
- package/standards/standard.md +170 -0
- package/standards/tasks.md +254 -0
- package/standards/teach.md +153 -0
- package/standards/versioning.md +71 -0
- package/standards/wireframes.md +113 -0
- package/tooling/astro/configs/astro.config.mjs +31 -0
- package/tooling/astro/configs/eslint.config.js +79 -0
- package/tooling/astro/configs/playwright.config.ts +26 -0
- package/tooling/astro/configs/tsconfig.json +12 -0
- package/tooling/astro/configs/vitest.config.ts +22 -0
- package/tooling/astro/manifest.toml +34 -0
- package/tooling/astro/reference.md +60 -0
- package/tooling/base/configs/.editorconfig +5 -0
- package/tooling/base/configs/.github/pull_request_template.md +18 -0
- package/tooling/base/configs/.github/workflows/verify.yml +35 -0
- package/tooling/base/configs/.husky/commit-msg +1 -0
- package/tooling/base/configs/.husky/post-merge +61 -0
- package/tooling/base/configs/.husky/post-rewrite +21 -0
- package/tooling/base/configs/.husky/pre-commit +1 -0
- package/tooling/base/configs/.husky/pre-push +1 -0
- package/tooling/base/configs/.prettierrc +12 -0
- package/tooling/base/configs/.shellcheckrc +1 -0
- package/tooling/base/configs/.vscode/extensions.json +9 -0
- package/tooling/base/configs/.vscode/settings.json +3 -0
- package/tooling/base/configs/commitlint.config.js +11 -0
- package/tooling/base/configs/scripts/verify.sh +64 -0
- package/tooling/base/manifest.toml +30 -0
- package/tooling/base/reference.md +98 -0
- package/tooling/base/seeds/.claude/context/ci.md +33 -0
- package/tooling/base/seeds/.claude/context/development.md +37 -0
- package/tooling/base/seeds/.claude/context/index.md +11 -0
- package/tooling/base/seeds/.cspell/project-terms.txt +0 -0
- package/tooling/base/seeds/.cspell/tech-stack.txt +19 -0
- package/tooling/base/seeds/.lintstagedrc +8 -0
- package/tooling/base/seeds/.prettierignore +0 -0
- package/tooling/base/seeds/cspell.json +20 -0
- package/tooling/claude/manifest.toml +14 -0
- package/tooling/claude/reference.md +79 -0
- package/tooling/claude/seeds/.claude/ARCHITECTURE.md +13 -0
- package/tooling/claude/seeds/.claude/DESIGN.md +62 -0
- package/tooling/claude/seeds/.claude/REQUIREMENTS.md +18 -0
- package/tooling/claude/seeds/.claude/diagrams/index.md +8 -0
- package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +50 -0
- package/tooling/claude/seeds/.claude/hooks/memory-index.sh +68 -0
- package/tooling/claude/seeds/.claude/hooks/path-form.sh +57 -0
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +52 -0
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +86 -0
- package/tooling/claude/seeds/.claude/hooks/tasks-index.sh +71 -0
- package/tooling/claude/seeds/.claude/memory/index.md +8 -0
- package/tooling/claude/seeds/.claude/settings.json +47 -0
- package/tooling/claude/seeds/.claude/tasks/index.md +8 -0
- package/tooling/claude/seeds/.claude/wireframes/index.md +8 -0
- package/tooling/claude/seeds/CLAUDE.md +29 -0
- package/tooling/claude/user/settings.template.json +10 -0
- package/tooling/claude/user/statusline-command.sh +53 -0
- package/tooling/python/configs/.coveragerc +14 -0
- package/tooling/python/configs/.python-version +1 -0
- package/tooling/python/configs/mypy.ini +6 -0
- package/tooling/python/configs/pytest.ini +4 -0
- package/tooling/python/configs/ruff.toml +15 -0
- package/tooling/python/configs/scripts/verify.sh +77 -0
- package/tooling/python/manifest.toml +16 -0
- package/tooling/python/reference.md +66 -0
- package/tooling/python/seeds/.cspell/tech-stack.txt +19 -0
- package/tooling/python/seeds/tests/test_smoke.py +2 -0
- package/tooling/vite-react/configs/playwright.config.ts +26 -0
- package/tooling/vite-react/configs/tsconfig.json +35 -0
- package/tooling/vite-react/configs/vite.config.ts +24 -0
- package/tooling/vite-react/configs/vitest.config.ts +26 -0
- package/tooling/vite-react/manifest.toml +23 -0
- package/tooling/vite-react/reference.md +55 -0
- package/tooling/vite-react/seeds/.cspell/project-terms.txt +1 -0
- package/tooling/vite-react/seeds/.cspell/tech-stack.txt +1 -0
- package/tooling/web/configs/.github/workflows/verify.yml +134 -0
- package/tooling/web/configs/.vscode/extensions.json +13 -0
- package/tooling/web/configs/.vscode/settings.json +10 -0
- package/tooling/web/configs/e2e/home.spec.ts +6 -0
- package/tooling/web/configs/e2e/screenshot.ts +53 -0
- package/tooling/web/configs/eslint.config.js +82 -0
- package/tooling/web/configs/scripts/screenshot.sh +28 -0
- package/tooling/web/configs/scripts/verify.sh +80 -0
- package/tooling/web/configs/scripts/worktree-port.sh +74 -0
- package/tooling/web/configs/src/test/setup.ts +8 -0
- package/tooling/web/manifest.toml +58 -0
- package/tooling/web/reference.md +115 -0
- package/tooling/web/seeds/.cspell/tech-stack.txt +18 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# Bash script patterns
|
|
2
|
+
|
|
3
|
+
Code templates for the `bash-script` skill. Copy verbatim, keeping only the colors and functions the script uses.
|
|
4
|
+
|
|
5
|
+
## Timeline structure
|
|
6
|
+
|
|
7
|
+
```plaintext
|
|
8
|
+
┌ # Start boundary (alone on its own line)
|
|
9
|
+
│ Title # Script or context title (immediately after ┌)
|
|
10
|
+
│ # Persistent vertical line (grey)
|
|
11
|
+
├ Section Branch # Section headers (no diamond)
|
|
12
|
+
│ ✓ Log message # Info/success logs
|
|
13
|
+
│ ! Warning # Warning logs
|
|
14
|
+
│ ✗ Error # Error logs
|
|
15
|
+
└ # End boundary
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Color palette
|
|
19
|
+
|
|
20
|
+
Define only the colors the script uses from this set:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
GREEN='\033[0;32m' # Success/Active
|
|
24
|
+
RED='\033[0;31m' # Error/Delete
|
|
25
|
+
YELLOW='\033[0;33m' # Warning
|
|
26
|
+
WHITE='\033[1;37m' # Active text
|
|
27
|
+
GREY='\033[0;90m' # Timeline/Inactive
|
|
28
|
+
CYAN='\033[0;36m' # Optional accent
|
|
29
|
+
MAGENTA='\033[0;35m' # Optional highlight
|
|
30
|
+
NC='\033[0m' # Reset
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Timeline lifecycle
|
|
34
|
+
|
|
35
|
+
Define `open_timeline` and `close_timeline`. Call `open_timeline "Title"` at the start of `main()`, then register `close_timeline` as the EXIT trap. The trap guarantees `└` prints on every exit path: normal completion, `exit 1` from cancellation, or unexpected errors. Do not print `└` manually anywhere else.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
open_timeline() {
|
|
39
|
+
echo -e "${GREY}┌${NC}" >&2
|
|
40
|
+
[ -n "${1:-}" ] && echo -e "${GREY}│${NC} ${WHITE}$1${NC}" >&2
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
close_timeline() {
|
|
44
|
+
echo -e "${GREY}└${NC}" >&2
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Register the trap inside `main()` right after opening:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
open_timeline "Script title"
|
|
52
|
+
trap close_timeline EXIT
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Logging
|
|
56
|
+
|
|
57
|
+
All log functions include the `│` prefix and write to stderr.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
log_info() { echo -e "${GREY}│${NC} ${GREEN}✓${NC} $1" >&2; }
|
|
61
|
+
log_warn() { echo -e "${GREY}│${NC} ${YELLOW}!${NC} $1" >&2; }
|
|
62
|
+
log_error() { echo -e "${GREY}│${NC} ${RED}✗${NC} $1" >&2; exit 1; }
|
|
63
|
+
log_step() { echo -e "${GREY}│${NC}\n${GREY}├${NC} ${WHITE}$1${NC}" >&2; }
|
|
64
|
+
log_add() { echo -e "${GREY}│${NC} ${GREEN}+${NC} $1" >&2; }
|
|
65
|
+
log_rem() { echo -e "${GREY}│${NC} ${RED}-${NC} $1" >&2; }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Section headers
|
|
69
|
+
|
|
70
|
+
Use `log_step` for every section header, including the first. It emits a leading blank `│` line to separate the banner from the first section and to give breathing room between subsequent sections:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
open_timeline "Script title"
|
|
74
|
+
trap close_timeline EXIT
|
|
75
|
+
|
|
76
|
+
log_step "Deploy"
|
|
77
|
+
log_step "Verify"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Renders as:
|
|
81
|
+
|
|
82
|
+
```plaintext
|
|
83
|
+
┌
|
|
84
|
+
│ Script title
|
|
85
|
+
│
|
|
86
|
+
├ Deploy
|
|
87
|
+
...
|
|
88
|
+
│
|
|
89
|
+
├ Verify
|
|
90
|
+
...
|
|
91
|
+
└
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Interactive prompts
|
|
95
|
+
|
|
96
|
+
Both prompts transition `◆` to `◇`, guard against non-TTY stdin with `[ -t 0 ]`, and write UI to stderr.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
ask() {
|
|
100
|
+
local prompt_text=$1
|
|
101
|
+
local var_name=$2
|
|
102
|
+
local default_val=$3
|
|
103
|
+
local input=""
|
|
104
|
+
local char
|
|
105
|
+
local display_default=""
|
|
106
|
+
if [ -n "$default_val" ]; then
|
|
107
|
+
display_default=" (${default_val})"
|
|
108
|
+
fi
|
|
109
|
+
if [ ! -t 0 ]; then
|
|
110
|
+
log_error "${prompt_text} requires a TTY"
|
|
111
|
+
fi
|
|
112
|
+
echo -e "${GREY}│${NC}" >&2
|
|
113
|
+
echo -ne "${GREEN}◆${NC} ${prompt_text}${display_default} " >&2
|
|
114
|
+
while IFS= read -r -s -n1 char; do
|
|
115
|
+
if [[ $char == $'\x1b' ]]; then
|
|
116
|
+
read -rsn2 -t 0.001 _ || true
|
|
117
|
+
echo -ne "\r\033[K" >&2
|
|
118
|
+
echo -e "${GREY}◇${NC} ${prompt_text} ${RED}Cancelled${NC}" >&2
|
|
119
|
+
exit 1
|
|
120
|
+
elif [[ $char == $'\x7f' || $char == $'\x08' ]]; then
|
|
121
|
+
if [ -n "$input" ]; then
|
|
122
|
+
input="${input%?}"
|
|
123
|
+
echo -ne "\b \b" >&2
|
|
124
|
+
fi
|
|
125
|
+
elif [[ -z "$char" ]]; then
|
|
126
|
+
break
|
|
127
|
+
else
|
|
128
|
+
input+="$char"
|
|
129
|
+
echo -n "$char" >&2
|
|
130
|
+
fi
|
|
131
|
+
done
|
|
132
|
+
[ -z "$input" ] && input="$default_val"
|
|
133
|
+
echo -ne "\r\033[K" >&2
|
|
134
|
+
echo -e "${GREY}◇${NC} ${prompt_text} ${WHITE}${input}${NC}" >&2
|
|
135
|
+
export "$var_name"="$input"
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
select_option() {
|
|
141
|
+
local prompt_text=$1
|
|
142
|
+
shift
|
|
143
|
+
local options=("$@")
|
|
144
|
+
local cur=0
|
|
145
|
+
local count=${#options[@]}
|
|
146
|
+
|
|
147
|
+
if [ ! -t 0 ]; then
|
|
148
|
+
log_error "${prompt_text} requires a TTY"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
echo -ne "${GREY}│${NC}\n${GREEN}◆${NC} ${prompt_text}\n" >&2
|
|
152
|
+
|
|
153
|
+
while true; do
|
|
154
|
+
for i in "${!options[@]}"; do
|
|
155
|
+
if [ "$i" -eq "$cur" ]; then
|
|
156
|
+
echo -e "${GREY}│${NC} ${GREEN}❯ ${options[$i]}${NC}" >&2
|
|
157
|
+
else
|
|
158
|
+
echo -e "${GREY}│${NC} ${GREY}${options[$i]}${NC}" >&2
|
|
159
|
+
fi
|
|
160
|
+
done
|
|
161
|
+
|
|
162
|
+
read -rsn1 key
|
|
163
|
+
case "$key" in
|
|
164
|
+
$'\x1b')
|
|
165
|
+
if read -rsn2 -t 0.001 key_seq; then
|
|
166
|
+
if [[ "$key_seq" == "[A" ]]; then cur=$(( (cur - 1 + count) % count )); fi
|
|
167
|
+
if [[ "$key_seq" == "[B" ]]; then cur=$(( (cur + 1) % count )); fi
|
|
168
|
+
else
|
|
169
|
+
echo -en "\033[$((count + 1))A\033[J" >&2
|
|
170
|
+
echo -e "\033[1A${GREY}│${NC}\n${GREY}◇${NC} ${prompt_text} ${RED}Cancelled${NC}" >&2
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
;;
|
|
174
|
+
"k") cur=$(( (cur - 1 + count) % count ));;
|
|
175
|
+
"j") cur=$(( (cur + 1) % count ));;
|
|
176
|
+
"q")
|
|
177
|
+
echo -en "\033[$((count + 1))A\033[J" >&2
|
|
178
|
+
echo -e "\033[1A${GREY}│${NC}\n${GREY}◇${NC} ${prompt_text} ${RED}Cancelled${NC}" >&2
|
|
179
|
+
exit 1
|
|
180
|
+
;;
|
|
181
|
+
"") break ;;
|
|
182
|
+
esac
|
|
183
|
+
|
|
184
|
+
echo -en "\033[${count}A" >&2
|
|
185
|
+
done
|
|
186
|
+
|
|
187
|
+
echo -en "\033[$((count + 1))A\033[J" >&2
|
|
188
|
+
echo -e "\033[1A${GREY}│${NC}\n${GREY}◇${NC} ${prompt_text} ${WHITE}${options[$cur]}${NC}" >&2
|
|
189
|
+
SELECTED_OPTION="${options[$cur]}"
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Help system
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
show_help() {
|
|
197
|
+
echo -e "${GREY}┌${NC}"
|
|
198
|
+
echo -e "${GREY}├${NC} ${WHITE}Usage:${NC} ./script.sh [options]"
|
|
199
|
+
echo -e "${GREY}│${NC}"
|
|
200
|
+
echo -e "${GREY}│${NC} ${WHITE}Options:${NC}"
|
|
201
|
+
echo -e "${GREY}│${NC} -h, --help ${GREY}# Show this help message${NC}"
|
|
202
|
+
echo -e "${GREY}│${NC} [flag] ${GREY}# [Description]${NC}"
|
|
203
|
+
echo -e "${GREY}└${NC}"
|
|
204
|
+
exit 0
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Error handling helper
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
run_check() {
|
|
212
|
+
local cmd=$1
|
|
213
|
+
local err_msg=$2
|
|
214
|
+
if ! eval "$cmd"; then
|
|
215
|
+
log_error "$err_msg"
|
|
216
|
+
fi
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Full script structure
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
#!/usr/bin/env bash
|
|
224
|
+
set -e
|
|
225
|
+
set -o pipefail
|
|
226
|
+
|
|
227
|
+
[Color definitions - only used colors]
|
|
228
|
+
|
|
229
|
+
[Function definitions - only needed functions]
|
|
230
|
+
|
|
231
|
+
open_timeline() {
|
|
232
|
+
echo -e "${GREY}┌${NC}" >&2
|
|
233
|
+
[ -n "${1:-}" ] && echo -e "${GREY}│${NC} ${WHITE}$1${NC}" >&2
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
close_timeline() {
|
|
237
|
+
echo -e "${GREY}└${NC}" >&2
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
check_dependencies() {
|
|
241
|
+
[Verify required tools installed]
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
main() {
|
|
245
|
+
check_dependencies
|
|
246
|
+
|
|
247
|
+
open_timeline "Script title"
|
|
248
|
+
trap close_timeline EXIT
|
|
249
|
+
|
|
250
|
+
log_step "First section"
|
|
251
|
+
[Script logic with timeline maintained]
|
|
252
|
+
|
|
253
|
+
trap - EXIT
|
|
254
|
+
echo -e "${GREY}└${NC}\n" >&2
|
|
255
|
+
echo -e "${GREEN}✓ Final success message${NC}"
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
main "$@"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Worked example
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
#!/usr/bin/env bash
|
|
265
|
+
set -e
|
|
266
|
+
set -o pipefail
|
|
267
|
+
|
|
268
|
+
GREEN='\033[0;32m'
|
|
269
|
+
RED='\033[0;31m'
|
|
270
|
+
YELLOW='\033[0;33m'
|
|
271
|
+
WHITE='\033[1;37m'
|
|
272
|
+
GREY='\033[0;90m'
|
|
273
|
+
NC='\033[0m'
|
|
274
|
+
|
|
275
|
+
log_info() { echo -e "${GREY}│${NC} ${GREEN}✓${NC} $1" >&2; }
|
|
276
|
+
log_error() { echo -e "${GREY}│${NC} ${RED}✗${NC} $1" >&2; exit 1; }
|
|
277
|
+
log_step() { echo -e "${GREY}│${NC}\n${GREY}├${NC} ${WHITE}$1${NC}" >&2; }
|
|
278
|
+
log_add() { echo -e "${GREY}│${NC} ${GREEN}+${NC} $1" >&2; }
|
|
279
|
+
|
|
280
|
+
open_timeline() {
|
|
281
|
+
echo -e "${GREY}┌${NC}" >&2
|
|
282
|
+
[ -n "${1:-}" ] && echo -e "${GREY}│${NC} ${WHITE}$1${NC}" >&2
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
close_timeline() {
|
|
286
|
+
echo -e "${GREY}└${NC}" >&2
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
ask() {
|
|
290
|
+
local prompt_text=$1
|
|
291
|
+
local var_name=$2
|
|
292
|
+
local default_val=$3
|
|
293
|
+
local input=""
|
|
294
|
+
local char
|
|
295
|
+
local display_default=""
|
|
296
|
+
if [ -n "$default_val" ]; then
|
|
297
|
+
display_default=" (${default_val})"
|
|
298
|
+
fi
|
|
299
|
+
if [ ! -t 0 ]; then
|
|
300
|
+
log_error "${prompt_text} requires a TTY"
|
|
301
|
+
fi
|
|
302
|
+
echo -e "${GREY}│${NC}" >&2
|
|
303
|
+
echo -ne "${GREEN}◆${NC} ${prompt_text}${display_default} " >&2
|
|
304
|
+
while IFS= read -r -s -n1 char; do
|
|
305
|
+
if [[ $char == $'\x1b' ]]; then
|
|
306
|
+
read -rsn2 -t 0.001 _ || true
|
|
307
|
+
echo -ne "\r\033[K" >&2
|
|
308
|
+
echo -e "${GREY}◇${NC} ${prompt_text} ${RED}Cancelled${NC}" >&2
|
|
309
|
+
exit 1
|
|
310
|
+
elif [[ $char == $'\x7f' || $char == $'\x08' ]]; then
|
|
311
|
+
if [ -n "$input" ]; then
|
|
312
|
+
input="${input%?}"
|
|
313
|
+
echo -ne "\b \b" >&2
|
|
314
|
+
fi
|
|
315
|
+
elif [[ -z "$char" ]]; then
|
|
316
|
+
break
|
|
317
|
+
else
|
|
318
|
+
input+="$char"
|
|
319
|
+
echo -n "$char" >&2
|
|
320
|
+
fi
|
|
321
|
+
done
|
|
322
|
+
[ -z "$input" ] && input="$default_val"
|
|
323
|
+
echo -ne "\r\033[K" >&2
|
|
324
|
+
echo -e "${GREY}◇${NC} ${prompt_text} ${WHITE}${input}${NC}" >&2
|
|
325
|
+
export "$var_name"="$input"
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
check_dependencies() {
|
|
329
|
+
command -v npm >/dev/null 2>&1 || log_error "npm not installed"
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
main() {
|
|
333
|
+
check_dependencies
|
|
334
|
+
|
|
335
|
+
open_timeline "Project Setup"
|
|
336
|
+
trap close_timeline EXIT
|
|
337
|
+
|
|
338
|
+
ask "Project name?" "PROJECT_NAME" "my-app"
|
|
339
|
+
|
|
340
|
+
log_step "Installing dependencies"
|
|
341
|
+
npm install vite
|
|
342
|
+
log_add "vite@latest"
|
|
343
|
+
|
|
344
|
+
log_info "Setup complete"
|
|
345
|
+
echo -e "\n${GREEN}✓ Project created successfully${NC}"
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
main "$@"
|
|
349
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canon-cli
|
|
3
|
+
description: Why the overwrite contract is stated before a sync runs, and why the skill reads rather than executes
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Canon cli requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, a session runs a `canon` sync and finds out afterward what it did. The command names give nothing away. `install` and `sync` differ per domain, some surfaces overwrite unconditionally, some merge, some are written once and never touched again, and none of that is visible from the command line the user typed.
|
|
11
|
+
|
|
12
|
+
The damage lands on the files a project owns. A golden config carrying local edits is replaced without a warning anyone saw, and a standards install overwrites every standard in a project that only needed the two it had drifted on. The user learns which category a file was in by losing the edit.
|
|
13
|
+
|
|
14
|
+
The inverse failure is quieter. A session that assumes a sync will pick up a change edits a seed and waits for an update that never comes, because the seed is copy-once and no sync command writes it again. Both failures are one missing fact available before the command runs.
|
|
15
|
+
|
|
16
|
+
Being reachable is a separate problem from being right. This is a pure reference whose moment happens inside another skill's run, so nothing brings it up unless a body names it. Three sibling requirement files named it and routed nothing, because Claude Code loads `SKILL.md` as the entry and never opens the sibling. A route lives in a body or it does not exist, and a fourth requirement mention would repeat the same defect.
|
|
17
|
+
|
|
18
|
+
The two bodies now carrying an inline pointer are `claude-seed-sync` and `canon-operator`, each at the point it runs or prints an overwriting command.
|
|
19
|
+
|
|
20
|
+
## Must
|
|
21
|
+
|
|
22
|
+
- State per surface and per command whether an existing file is overwritten, merged, written once, or left alone
|
|
23
|
+
- Warn about a destructive run before it happens, naming the surface that will be lost
|
|
24
|
+
- Name the section-preserving path for a standard or seed the project has customized
|
|
25
|
+
- Defer to the toolkit's own context docs when they and this summary disagree, since the summary is a copy and they are the source
|
|
26
|
+
|
|
27
|
+
## Must not
|
|
28
|
+
|
|
29
|
+
- Run any `canon` command. The skill is read before acting.
|
|
30
|
+
- Restate the full semantics. It is a target-session summary and the detail lives with its owner.
|
|
31
|
+
- Take a mention in a sibling's requirement file as an inbound route. The three bodies named in the gap above carry the pointer, and adding a fourth means editing that body rather than its requirement.
|
|
32
|
+
|
|
33
|
+
## Guards
|
|
34
|
+
|
|
35
|
+
- A surface or command the contract does not cover routes to the context docs rather than to an inference from a similar row
|
|
36
|
+
|
|
37
|
+
## Out of scope
|
|
38
|
+
|
|
39
|
+
- Executing the sync, which the user runs or `canon-operator` routes
|
|
40
|
+
- Reconciling a customized seed section by section: `claude-seed-sync`
|
|
41
|
+
- Deciding which stack, rule, or standard a project should install, which the setup skills resolve from live catalogs
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canon-cli
|
|
3
|
+
description: Reference for what canon sync and install commands overwrite, merge, or leave untouched in a target project. Use before running `canon tooling`, `canon standards`, `canon claude sync`, or `canon init`, or when asked "will this overwrite my changes". Do NOT use to run the commands, only to know their effect.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Toolkit CLI contract
|
|
7
|
+
|
|
8
|
+
What each `canon` sync or install command does to existing files in a target project. Consult before running one, then warn the user about anything destructive. This skill is reference only. It does not run commands.
|
|
9
|
+
|
|
10
|
+
## Overwrite contract
|
|
11
|
+
|
|
12
|
+
| Surface | Command | Effect on existing files |
|
|
13
|
+
| -------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------- |
|
|
14
|
+
| Golden configs, listed in full below | `canon tooling sync` | Overwritten once `--write` is passed. Local edits are lost. |
|
|
15
|
+
| Dictionary seeds (`.cspell/*.txt`) | `canon tooling sync` | Merged and sorted. Existing terms preserved. |
|
|
16
|
+
| Other seeds (`cspell.json`, `.lintstagedrc`, state docs) | `canon tooling sync` | Copy-once. Dropped on first install, untouched after. |
|
|
17
|
+
| Standards | none | Nothing installs. `canon standards <name>` reads and never writes. |
|
|
18
|
+
| Seed docs and `CLAUDE.md` | `canon claude init` | Skipped when present. Never overwritten. |
|
|
19
|
+
| Seed docs | `canon claude sync` | Never touched. Only `.gitignore` is written. |
|
|
20
|
+
| Stack references | none | Nothing installs. `canon tooling reference <stack>` reads and never writes. |
|
|
21
|
+
| `.gitignore`, deps, scripts | any sync | Additive. Existing entries preserved. Deps re-pin on major skew. |
|
|
22
|
+
| Generated `index.md` | any sync or regen | Rewritten from target state. Hand edits are lost. |
|
|
23
|
+
|
|
24
|
+
## What a tooling sync can overwrite
|
|
25
|
+
|
|
26
|
+
A golden config is any file a stack ships under `configs/`, and the category is wider than its name suggests. It carries the CI workflow, the git hooks, the end-to-end harness, the shell scripts under `scripts/`, and the editor settings, alongside the linters and compilers a reader expects. A stack inherits its parent's configs, so syncing `astro` also writes everything `web` and `base` hold.
|
|
27
|
+
|
|
28
|
+
Run `canon tooling sync <stack> <target> --check` for the list resolved against a real target. It reports every path and writes nothing. The list below is what the stacks hold as shipped, before any chain resolution.
|
|
29
|
+
|
|
30
|
+
<!-- generated:tooling-paths -->
|
|
31
|
+
|
|
32
|
+
### astro
|
|
33
|
+
|
|
34
|
+
- `astro.config.mjs`
|
|
35
|
+
- `eslint.config.js`
|
|
36
|
+
- `playwright.config.ts`
|
|
37
|
+
- `tsconfig.json`
|
|
38
|
+
- `vitest.config.ts`
|
|
39
|
+
|
|
40
|
+
### base
|
|
41
|
+
|
|
42
|
+
- `.editorconfig`
|
|
43
|
+
- `.github/pull_request_template.md`
|
|
44
|
+
- `.github/workflows/verify.yml`
|
|
45
|
+
- `.husky/commit-msg`
|
|
46
|
+
- `.husky/post-merge`
|
|
47
|
+
- `.husky/post-rewrite`
|
|
48
|
+
- `.husky/pre-commit`
|
|
49
|
+
- `.husky/pre-push`
|
|
50
|
+
- `.prettierrc`
|
|
51
|
+
- `.shellcheckrc`
|
|
52
|
+
- `.vscode/extensions.json`
|
|
53
|
+
- `.vscode/settings.json`
|
|
54
|
+
- `commitlint.config.js`
|
|
55
|
+
- `scripts/verify.sh`
|
|
56
|
+
|
|
57
|
+
### python
|
|
58
|
+
|
|
59
|
+
- `.coveragerc`
|
|
60
|
+
- `.python-version`
|
|
61
|
+
- `mypy.ini`
|
|
62
|
+
- `pytest.ini`
|
|
63
|
+
- `ruff.toml`
|
|
64
|
+
- `scripts/verify.sh`
|
|
65
|
+
|
|
66
|
+
### vite-react
|
|
67
|
+
|
|
68
|
+
- `playwright.config.ts`
|
|
69
|
+
- `tsconfig.json`
|
|
70
|
+
- `vite.config.ts`
|
|
71
|
+
- `vitest.config.ts`
|
|
72
|
+
|
|
73
|
+
### web
|
|
74
|
+
|
|
75
|
+
- `.github/workflows/verify.yml`
|
|
76
|
+
- `.vscode/extensions.json`
|
|
77
|
+
- `.vscode/settings.json`
|
|
78
|
+
- `e2e/home.spec.ts`
|
|
79
|
+
- `e2e/screenshot.ts`
|
|
80
|
+
- `eslint.config.js`
|
|
81
|
+
- `scripts/screenshot.sh`
|
|
82
|
+
- `scripts/verify.sh`
|
|
83
|
+
- `scripts/worktree-port.sh`
|
|
84
|
+
- `src/test/setup.ts`
|
|
85
|
+
|
|
86
|
+
<!-- /generated:tooling-paths -->
|
|
87
|
+
|
|
88
|
+
## Rules
|
|
89
|
+
|
|
90
|
+
- `canon tooling sync` writes nothing until `--write` is passed. A headless run without it reports and exits 1, so a script that forgets the flag fails rather than silently skipping the sync.
|
|
91
|
+
- Run `--check` first when the project carries local edits to any path above. The report names each file it would replace, which is the warning the user needs before the write.
|
|
92
|
+
- An interactive run still prompts. `--write` skips the prompt, and `--check` refuses to write even with a TTY.
|
|
93
|
+
- Seeds are user-owned. Dictionary `.txt` files merge and sort. Other seeds are copy-once, so re-seeding a structured file means deleting it and syncing again.
|
|
94
|
+
- No command writes a standard into a project. A `.claude/standards/` folder from an older toolkit is inert, and deleting it costs nothing.
|
|
95
|
+
- For section-level customizations of a seed doc, use the `claude-seed-sync` skill, not `canon ... sync`. It diffs per section and preserves edits.
|
|
96
|
+
|
|
97
|
+
## CLAUDE.md
|
|
98
|
+
|
|
99
|
+
- `CLAUDE.md` is a copy-once seed. No `canon` sync command ever updates it. Reconcile it with the `claude-seed-sync` skill, which diffs the preamble and each section and preserves customizations by default.
|
|
100
|
+
|
|
101
|
+
## Source of truth
|
|
102
|
+
|
|
103
|
+
- Full semantics live in the toolkit's `.claude/context/tooling.md`, `.claude/context/standards/`, and `.claude/context/claude-plugin/`. This skill is the target-session summary. When they disagree, the context docs win.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canon-feedback-file
|
|
3
|
+
description: Why a toolkit defect is reported from session context alone, and what shipping through the CLI replaces
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Canon feedback file requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, a toolkit defect noticed inside a target project dies with the session. The user is told to mention it in the toolkit repository later, which means retyping a report they no longer have the context to write, so the defect is either reported badly or not at all.
|
|
11
|
+
|
|
12
|
+
The report itself fails two ways. A block printed in chat needs a copy-paste into another repository, and a step that manual is skipped under any time pressure. A report that names no surface cannot be routed, because the toolkit acts on a plugin skill, a snippet, a CLI command, and a seed through different paths, and the difference is not recoverable from the symptom.
|
|
13
|
+
|
|
14
|
+
The last failure is the session's own effort. Asked to report, a session starts diagnosing instead, searching the toolkit and reading its surfaces to find the cause. That spends the context the report was meant to capture cheaply, and it produces a diagnosis from a project that cannot see the toolkit's current source.
|
|
15
|
+
|
|
16
|
+
## Must
|
|
17
|
+
|
|
18
|
+
- Build the report from what the session already holds
|
|
19
|
+
- Name the surface and its type, since the toolkit routes on that rather than on the symptom
|
|
20
|
+
- Write the stated fallback for a field the session cannot fill, so an empty field reads as absent rather than as unreported
|
|
21
|
+
- Ship through the CLI so the report lands without a copy-paste, and print the returned path on its own line
|
|
22
|
+
- Offer the durable route for a report worth keeping across sessions and machines
|
|
23
|
+
- Fall back to printing the block when the CLI is absent, so the report still exists
|
|
24
|
+
|
|
25
|
+
## Must not
|
|
26
|
+
|
|
27
|
+
- Probe the project, list files, grep, or read toolkit surfaces to enrich the report
|
|
28
|
+
- Guess the surface type when the session is ambiguous. Ask one line.
|
|
29
|
+
- Diagnose or fix, which needs the toolkit's source rather than the target's
|
|
30
|
+
|
|
31
|
+
## Guards
|
|
32
|
+
|
|
33
|
+
- Nothing in session context pointing at a toolkit issue stops, since a report assembled from nothing wastes the triage it reaches
|
|
34
|
+
|
|
35
|
+
## Out of scope
|
|
36
|
+
|
|
37
|
+
- Fixing the defect, which happens in the toolkit repository against its own source
|
|
38
|
+
- Draining the queue this fills: `canon-feedback-triage`
|
|
39
|
+
- Filing an issue against the current project: `git-issue`
|
|
40
|
+
- Complaints about tooling the toolkit does not own
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canon-feedback-file
|
|
3
|
+
description: Format a paste-back report about something broken, missing, or off in canon and write it directly to the toolkit's `.claude/review/feedback/` folder via `canon feedback`. Use when asked to "send this to the toolkit", "report this to canon", "file toolkit feedback", or "give the toolkit feedback about X". Do NOT use for general complaints about other tooling, IDE issues, or in-project bugs that do not implicate canon surfaces.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Canon feedback file
|
|
7
|
+
|
|
8
|
+
Format a `## Toolkit feedback` block from the current session, then ship it to the toolkit repo without manual copy-paste.
|
|
9
|
+
|
|
10
|
+
## Guards
|
|
11
|
+
|
|
12
|
+
- If nothing in session context points to a toolkit issue, stop: `❌ No toolkit issue in session context. Describe what broke, then re-invoke.`
|
|
13
|
+
- If the surface type is ambiguous (snippet vs. plugin skill vs. CLI vs. seed), ask one line before formatting.
|
|
14
|
+
- Do not probe the project, list files, grep, or read toolkit surfaces. Use only what the session already contains.
|
|
15
|
+
|
|
16
|
+
## Step 1: build the block
|
|
17
|
+
|
|
18
|
+
From the conversation so far, identify:
|
|
19
|
+
|
|
20
|
+
- Target project name or path
|
|
21
|
+
- Toolkit surface and its type (plugin skill, snippet, tooling config, governance rule, seed, or CLI)
|
|
22
|
+
- Specific toolkit file or name when the session cites one
|
|
23
|
+
- Observed behavior
|
|
24
|
+
- Expected behavior, or `unclear`
|
|
25
|
+
- Repro details already in context (commands run, files touched), or `none`
|
|
26
|
+
- Proposed fix when the user stated one, or `open`
|
|
27
|
+
|
|
28
|
+
Format as a single fenced markdown block:
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
## Toolkit feedback
|
|
32
|
+
|
|
33
|
+
**From project:** <name or path>
|
|
34
|
+
**Surface:** <type>, <file path or name>
|
|
35
|
+
**Observed:** <one or two lines>
|
|
36
|
+
**Expected:** <one or two lines, or "unclear">
|
|
37
|
+
**Repro:** <commands or steps, or "none">
|
|
38
|
+
**Proposed fix:** <one line, or "open">
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Keep each field to one or two lines. Write the literal fallback shown above when a field has nothing.
|
|
42
|
+
|
|
43
|
+
## Step 2: ship to the toolkit
|
|
44
|
+
|
|
45
|
+
Detect whether `canon` is on PATH:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
command -v canon >/dev/null 2>&1
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
If present, pipe the block to `canon feedback`. The CLI writes to its own repo's `.claude/review/feedback/feedback-<slug>-<ts>.md` and prints the absolute path on stdout:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cat <<'EOF' | canon feedback
|
|
55
|
+
## Toolkit feedback
|
|
56
|
+
|
|
57
|
+
...
|
|
58
|
+
EOF
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Report the printed path back to the user on its own line, in the form the project's instruction file sets under `## Output`.
|
|
62
|
+
|
|
63
|
+
For a durable, cross-machine report instead of local scratch, add `--github`. The CLI opens a GitHub issue on the toolkit repo and prints the issue URL. It needs `gh` authenticated, and falls back to local scratch with a warning when `gh` is absent.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cat <<'EOF' | canon feedback --github
|
|
67
|
+
## Toolkit feedback
|
|
68
|
+
|
|
69
|
+
...
|
|
70
|
+
EOF
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Default to local scratch for a quick note. Use `--github` for a report worth tracking across sessions and machines.
|
|
74
|
+
|
|
75
|
+
If `canon` is not on PATH, fall back: print the block in chat and tell the user `📋 Copy the block above into a toolkit-repo session.`
|
|
76
|
+
|
|
77
|
+
## Notes
|
|
78
|
+
|
|
79
|
+
- `canon feedback` resolves the toolkit root from the running `canon` binary's source location. If multiple toolkit clones exist on the machine, the first `canon` on PATH wins.
|
|
80
|
+
- The destination `.claude/review/` is gitignored in the toolkit repo. Feedback lives as session scratch for the next toolkit-side triage, not as a durable archive.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canon-feedback-triage
|
|
3
|
+
description: Why the feedback queue is read from GitHub rather than local scratch, and why triage routes instead of implementing
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Canon feedback triage requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, the feedback queue fills and nothing drains it. Reports arrive from projects the toolkit never sees, and a queue nobody reads on a schedule is the same as no queue. The local review folder looks like the right place to read, and it is the wrong one, because that content is per-machine session scratch that any cleanup removes.
|
|
11
|
+
|
|
12
|
+
Triage fails three ways once it starts. Unrelated issues get batched into one branch, so review has to judge several unconnected changes at once and can approve none of them cleanly. An issue needing a plan gets implemented inline from a paragraph of description, which skips the step where scope is argued. And an issue whose report contradicts itself gets a guess rather than a question, so the fix addresses a defect nobody confirmed.
|
|
13
|
+
|
|
14
|
+
The queue also fails to drain even when the work ships. A fix merged with no link back leaves its issue open, and the next triage re-reads work already done.
|
|
15
|
+
|
|
16
|
+
## Must
|
|
17
|
+
|
|
18
|
+
- Read the durable queue rather than local session scratch
|
|
19
|
+
- Classify each issue in a fixed order and stop at the first match, stating the class and its one-line reason before routing
|
|
20
|
+
- Route to the skills that own planning, branch naming, and the pull request body rather than restating them
|
|
21
|
+
- Keep one issue to one branch and one pull request
|
|
22
|
+
- Link a fix to its issue so merge closes it, and preserve that link when the body is regenerated
|
|
23
|
+
- Ask on the issue when the report is unreadable, then move on rather than blocking the batch
|
|
24
|
+
|
|
25
|
+
## Must not
|
|
26
|
+
|
|
27
|
+
- Batch unrelated fixes into one branch
|
|
28
|
+
- Implement a plan-worthy issue, which stops at the plan handed back to the user
|
|
29
|
+
- Close an issue whose pull request has yet to merge
|
|
30
|
+
|
|
31
|
+
## Guards
|
|
32
|
+
|
|
33
|
+
- The `gh` CLI absent or unauthenticated stops, since the queue is unreachable
|
|
34
|
+
- An empty queue reports nothing open rather than widening the label to find work
|
|
35
|
+
|
|
36
|
+
## Out of scope
|
|
37
|
+
|
|
38
|
+
- Filing new feedback: `canon-feedback-file`
|
|
39
|
+
- Writing the plan a plan-worthy issue needs: `claude-feature`
|
|
40
|
+
- Triage of issues carrying any other label, which surface here by design only under the feedback label
|