@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,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce pydantic v2 patterns for validation and serialization
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.py'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Pydantic standards
|
|
8
|
+
|
|
9
|
+
## Models
|
|
10
|
+
|
|
11
|
+
- Use `pydantic.BaseModel` over `dataclass` at I/O and API boundaries.
|
|
12
|
+
- Use `model_config = ConfigDict(...)` over the legacy nested `Config` class.
|
|
13
|
+
- Set `extra="forbid"` on models receiving external input to prevent data pollution.
|
|
14
|
+
- Use `Field(...)` for defaults, descriptions, and constraints over docstring conventions.
|
|
15
|
+
|
|
16
|
+
## Validation
|
|
17
|
+
|
|
18
|
+
- Use `Model.model_validate(data)` over `Model(**data)` for untrusted dict input.
|
|
19
|
+
- Use `Model.model_validate_json(s)` over `json.loads` followed by validation.
|
|
20
|
+
- Use `@field_validator` over the legacy `@validator`.
|
|
21
|
+
- Use `@model_validator(mode="after")` for cross-field invariants.
|
|
22
|
+
|
|
23
|
+
## Types
|
|
24
|
+
|
|
25
|
+
- Use `AnyUrl`, `EmailStr`, `SecretStr`, and `PositiveInt` over hand-rolled regex constraints.
|
|
26
|
+
- Use `Annotated[T, Field(...)]` over default-value `Field(...)` for reusable constrained types.
|
|
27
|
+
- Do not use `Any` in fields. Reach for `JsonValue` or a `Union` of concrete types.
|
|
28
|
+
|
|
29
|
+
## Settings
|
|
30
|
+
|
|
31
|
+
- Use `pydantic_settings.BaseSettings` for env-driven configuration.
|
|
32
|
+
- Load environment through a single `Settings` model. Do not read `os.environ` directly elsewhere.
|
|
33
|
+
|
|
34
|
+
## Serialization
|
|
35
|
+
|
|
36
|
+
- Use `model.model_dump(mode="json")` over the legacy `.dict()`.
|
|
37
|
+
- Use `model.model_dump_json()` over `json.dumps(model.dict())`.
|
|
38
|
+
- Use `by_alias=True` when serializing to external schemas with non-Python field names.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce web frontend security and XSS prevention
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.html'
|
|
7
|
+
- '**/*.astro'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Web security standards
|
|
11
|
+
|
|
12
|
+
## Link safety
|
|
13
|
+
|
|
14
|
+
- Add `rel="noopener noreferrer"` to all external links with `target="_blank"`.
|
|
15
|
+
|
|
16
|
+
## Content sanitization
|
|
17
|
+
|
|
18
|
+
- Sanitize all user-generated content rendered via `dangerouslySetInnerHTML` using DOMPurify or equivalent.
|
|
19
|
+
- Never use `dangerouslySetInnerHTML` without sanitization.
|
|
20
|
+
|
|
21
|
+
## Input validation
|
|
22
|
+
|
|
23
|
+
- Validate all URL parameters and query strings using schema validation before use.
|
|
24
|
+
|
|
25
|
+
## Storage and tokens
|
|
26
|
+
|
|
27
|
+
- Do not store sensitive data (tokens, passwords, PII) in `localStorage` or `sessionStorage`.
|
|
28
|
+
- Store authentication tokens in httpOnly cookies over exposing them to JavaScript.
|
|
29
|
+
|
|
30
|
+
## Third-party scripts
|
|
31
|
+
|
|
32
|
+
- Audit and pin versions for all third-party scripts loaded in the browser.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce server-side authorization, secret handling, and abuse limits on request handlers
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.py'
|
|
5
|
+
- '**/*.ts'
|
|
6
|
+
- '**/*.js'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Server security standards
|
|
10
|
+
|
|
11
|
+
## Authorization
|
|
12
|
+
|
|
13
|
+
- Authorize every request on the server, whatever the client already checked.
|
|
14
|
+
- Derive the caller identity from the verified session or token. Never read it from a request body, query string, or header the client sets.
|
|
15
|
+
- Check that the caller owns or may reach the specific record a request names, not only that the caller is signed in.
|
|
16
|
+
- Deny by default. Grant a route access through an explicit allow.
|
|
17
|
+
|
|
18
|
+
## Credentials
|
|
19
|
+
|
|
20
|
+
- Hash passwords with a memory-hard algorithm and a per-record salt. Never store a reversible password.
|
|
21
|
+
- Compare tokens, signatures, and password hashes with a constant-time function.
|
|
22
|
+
- Expire and revoke sessions and refresh tokens on the server. Do not rely on client-side deletion.
|
|
23
|
+
|
|
24
|
+
## Secrets
|
|
25
|
+
|
|
26
|
+
- Read every secret from the environment or a secret manager at runtime.
|
|
27
|
+
- Never commit a secret, connection string, or private key to the repository.
|
|
28
|
+
- Never return a secret, connection string, or internal hostname in a response body.
|
|
29
|
+
|
|
30
|
+
## Abuse limits
|
|
31
|
+
|
|
32
|
+
- Rate-limit authentication, password reset, and any endpoint that sends mail or costs money per call.
|
|
33
|
+
- Set an explicit maximum body size and request timeout on every endpoint.
|
|
34
|
+
- Bound pagination parameters with a server-side maximum.
|
|
35
|
+
|
|
36
|
+
## Transport
|
|
37
|
+
|
|
38
|
+
- Serve every route over TLS and reject plaintext requests.
|
|
39
|
+
- Restrict CORS to an explicit origin list. Never reflect the request origin or pair a wildcard with credentials.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce persistence boundaries for migrations, query construction, transactions, and rollback
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.py'
|
|
5
|
+
- '**/*.ts'
|
|
6
|
+
- '**/*.js'
|
|
7
|
+
- '**/*.sql'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Persistence standards
|
|
11
|
+
|
|
12
|
+
## Schema changes
|
|
13
|
+
|
|
14
|
+
- Express every schema change as a migration file committed to version control.
|
|
15
|
+
- Ship a tested rollback path with every migration that changes a schema.
|
|
16
|
+
- Never alter a deployed schema outside a migration.
|
|
17
|
+
- Never edit a migration that has run in a shared environment. Add a new one.
|
|
18
|
+
- Separate a destructive migration from the deploy that stops reading the dropped column.
|
|
19
|
+
|
|
20
|
+
## Query construction
|
|
21
|
+
|
|
22
|
+
- Pass every runtime value as a bound parameter.
|
|
23
|
+
- Never interpolate, concatenate, or format a value into a statement string.
|
|
24
|
+
- Name the columns a read needs. Do not select every column by wildcard.
|
|
25
|
+
|
|
26
|
+
## Transactions
|
|
27
|
+
|
|
28
|
+
- Give each transaction one owner that opens it, commits it, and rolls it back.
|
|
29
|
+
- Never open a transaction inside a function that was handed one.
|
|
30
|
+
- Keep network calls, queue publishes, and filesystem writes outside an open transaction.
|
|
31
|
+
|
|
32
|
+
## Access patterns
|
|
33
|
+
|
|
34
|
+
- Load related rows in the query that fetches their parents. Do not resolve a relation lazily inside an iteration.
|
|
35
|
+
- Scope a connection or session to the request that opened it and release it on exit.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Execute an @-referenced snippet's instructions immediately using session context
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Snippet reference standards
|
|
6
|
+
|
|
7
|
+
## Execution
|
|
8
|
+
|
|
9
|
+
- When a snippet is referenced with `@`, execute its instructions immediately using available session context
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce UI copy and text standards for rendered strings in components
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.astro'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# UI copy standards
|
|
11
|
+
|
|
12
|
+
## Casing
|
|
13
|
+
|
|
14
|
+
- Use sentence case for all rendered UI text: headings, labels, nav items, tab titles, and dialog titles.
|
|
15
|
+
- Retain original casing for proper nouns and product names: `GitHub`, `macOS`, `TypeScript`.
|
|
16
|
+
|
|
17
|
+
## Punctuation
|
|
18
|
+
|
|
19
|
+
- Do not use em dashes (`—`). Use a comma or period, or restructure the sentence.
|
|
20
|
+
- Do not add punctuation to button labels or short action strings.
|
|
21
|
+
|
|
22
|
+
## Button copy
|
|
23
|
+
|
|
24
|
+
- Use imperative verbs for actions: `Save`, `Delete`, `Connect`, `Cancel`.
|
|
25
|
+
- Avoid padded phrasing: `Save` over `Save changes`, `Delete` over `Click to delete`.
|
|
26
|
+
|
|
27
|
+
## Error messages
|
|
28
|
+
|
|
29
|
+
- State what to do, not what went wrong: `Enter a valid email` over `Email is invalid`.
|
|
30
|
+
- Keep messages short and actionable.
|
|
31
|
+
- One sentence maximum.
|
|
32
|
+
|
|
33
|
+
## Placeholder text
|
|
34
|
+
|
|
35
|
+
- Show format examples over instructions: `name@example.com` over `Enter your email here`.
|
|
36
|
+
- Reserve instructions for labels or helper text below the input.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Keyboard interaction, focus management, and ARIA accessibility for rendered UI
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.astro'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
- '**/*.css'
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Accessibility and keyboard standards
|
|
12
|
+
|
|
13
|
+
## Focus styles
|
|
14
|
+
|
|
15
|
+
- All interactive elements must use the project focus ring. Do not define per-component focus styles.
|
|
16
|
+
- Never apply `outline-none` without a custom focus ring in the same rule.
|
|
17
|
+
- Focus ring must have 3:1 contrast against its background in both light and dark modes.
|
|
18
|
+
|
|
19
|
+
## Keyboard interaction model
|
|
20
|
+
|
|
21
|
+
- Tab / Shift+Tab: move focus sequentially through interactive elements in DOM order.
|
|
22
|
+
- Enter: activates buttons and links, submits forms.
|
|
23
|
+
- Space: activates buttons and checkboxes, toggles selection in listboxes.
|
|
24
|
+
- Arrow keys: navigate within composite widgets. Do not let them exit the widget.
|
|
25
|
+
- Escape: closes any overlay, popover, dialog, or dropdown. Cancels in-progress edits.
|
|
26
|
+
- Do not introduce non-standard key bindings for common actions.
|
|
27
|
+
|
|
28
|
+
## Composite widgets
|
|
29
|
+
|
|
30
|
+
- Roving tabindex for interactive collections: one item in the tab sequence at a time.
|
|
31
|
+
- Combobox: arrow keys navigate options, Enter selects, Escape closes, typing filters.
|
|
32
|
+
|
|
33
|
+
## Focus management
|
|
34
|
+
|
|
35
|
+
- Move focus into any overlay, popover, or dialog on open. Return focus to the trigger on close.
|
|
36
|
+
- Never move focus on hover. Only on keyboard input or explicit pointer activation.
|
|
37
|
+
|
|
38
|
+
## ARIA semantics
|
|
39
|
+
|
|
40
|
+
- Use semantic HTML over custom elements: `<button>` over a `<div>` carrying a click handler, `<a>` over a `<span>` carrying one.
|
|
41
|
+
- A `<div>` with a click handler requires a role, a tab index, and keyboard handlers. Use `<button>` instead.
|
|
42
|
+
- Spell an attribute the way the file's syntax spells it: `onclick` and `tabindex` in HTML and Astro markup, `onClick` and `tabIndex` in JSX.
|
|
43
|
+
- Set role on custom controls: `role="combobox"`, `role="listbox"`, `role="menu"`, `role="option"`.
|
|
44
|
+
- Synchronize state attributes with visual state: `aria-expanded`, `aria-selected`, `aria-checked`, `aria-disabled`.
|
|
45
|
+
- Add `aria-label` or `aria-labelledby` to interactive elements with no visible text label.
|
|
46
|
+
- Always provide `alt` on `<img>`. Use `alt=""` for decorative images.
|
|
47
|
+
- Describe the content or function of the image, not its appearance. Do not prefix with "Image of" or "Photo of".
|
|
48
|
+
- Alt text for functional images (icons, buttons) should describe the action, not the graphic.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Form validation timing, save-blocking, and derived state for rendered forms
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.astro'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Form standards
|
|
11
|
+
|
|
12
|
+
## Validation timing
|
|
13
|
+
|
|
14
|
+
- Validate on blur, not on every keystroke. Exception: realtime feedback that is explicitly part of the feature (e.g. character count, live search).
|
|
15
|
+
- After a field shows its first error (on blur), re-validate on every change so the error clears as soon as the input becomes valid.
|
|
16
|
+
- Apply the same validation timing to all fields in a form. Do not mix blur-only and change-only validation within one form.
|
|
17
|
+
- Do not show an error on a field the user has never touched.
|
|
18
|
+
|
|
19
|
+
## Save blocking
|
|
20
|
+
|
|
21
|
+
- Block save when any required field is empty, invalid, or has never been touched.
|
|
22
|
+
- Treat whitespace-only values as empty for required fields.
|
|
23
|
+
|
|
24
|
+
## Error placement
|
|
25
|
+
|
|
26
|
+
- Show the error directly under the field that caused it, not under an unrelated field.
|
|
27
|
+
- When a change to field A causes a conflict involving field B, show the error under field A (the field the user edited), not under field B.
|
|
28
|
+
|
|
29
|
+
## Input sanitization
|
|
30
|
+
|
|
31
|
+
- Trim leading and trailing whitespace from text inputs on blur or submit, not on every keystroke.
|
|
32
|
+
- If a field is case-sensitive, surface that constraint near the field. Do not silently treat `Foo` and `foo` as different values without warning.
|
|
33
|
+
|
|
34
|
+
## Derived display state
|
|
35
|
+
|
|
36
|
+
- Reset status indicators, counts, and derived display values when their source input changes.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: UX completeness checklist for interactive components and views
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.astro'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
- '**/*.css'
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# UX completeness standards
|
|
12
|
+
|
|
13
|
+
## Mutation feedback
|
|
14
|
+
|
|
15
|
+
- Every user-initiated mutation (save, delete, sync, import, export) must show inline feedback on success.
|
|
16
|
+
- Feedback must be transient: auto-dismiss after 2-3 seconds without requiring user action.
|
|
17
|
+
- Show inline error feedback when a mutation fails. Do not fail silently.
|
|
18
|
+
|
|
19
|
+
## Empty states
|
|
20
|
+
|
|
21
|
+
- Every list, table, or collection view must handle the empty state explicitly.
|
|
22
|
+
- Empty states must include a next action: a button, link, or instruction that tells the user what to do.
|
|
23
|
+
- Distinguish between "nothing exists yet" (onboarding) and "nothing matches your filter" (recovery). Use different copy for each.
|
|
24
|
+
- Filter-driven empty states must include a way to clear the filter (link or button).
|
|
25
|
+
|
|
26
|
+
## Loading states
|
|
27
|
+
|
|
28
|
+
- Every async operation visible to the user must show a loading indicator (spinner, skeleton, or disabled state).
|
|
29
|
+
- Do not show stale content while new content is loading. Either show a loading state or keep the previous content with a progress indicator.
|
|
30
|
+
|
|
31
|
+
## Destructive actions
|
|
32
|
+
|
|
33
|
+
- Destructive actions (delete, disconnect, discard) must require confirmation before executing.
|
|
34
|
+
- Confirmation UI must be dismissible via Escape in addition to a cancel button.
|
|
35
|
+
|
|
36
|
+
## Inline confirmations
|
|
37
|
+
|
|
38
|
+
- All inline confirmation rows (delete, discard, cancel) must be dismissible via Escape.
|
|
39
|
+
- Confirmation labels and destructive buttons must have sufficient contrast in both light and dark modes.
|
|
40
|
+
|
|
41
|
+
## Status indicators
|
|
42
|
+
|
|
43
|
+
- Status indicators (dots, badges, connection status) must reset to a neutral state when their source input changes.
|
|
44
|
+
- Do not show optimistic status (green dot, "connected") while unsaved edits are pending.
|
|
45
|
+
|
|
46
|
+
## State transitions
|
|
47
|
+
|
|
48
|
+
- Do not flash intermediate states during transitions (e.g., white flash on theme load, layout jump before data arrives).
|
|
49
|
+
- Use CSS transitions or deferred rendering to prevent visible flicker between states.
|
|
50
|
+
|
|
51
|
+
## Interactive element states
|
|
52
|
+
|
|
53
|
+
- All interactive elements must visually respond to hover, active, focus, and disabled states.
|
|
54
|
+
- Disabled elements must use reduced opacity or muted colors and `cursor: not-allowed`.
|
|
55
|
+
- Do not rely on a single state (e.g., focus only) to communicate interactivity.
|
|
56
|
+
|
|
57
|
+
## Overflow and truncation
|
|
58
|
+
|
|
59
|
+
- Long text in constrained containers must truncate with ellipsis, not overflow or wrap unexpectedly.
|
|
60
|
+
- Truncated text must be accessible via `title` attribute or expandable interaction.
|
|
61
|
+
|
|
62
|
+
## Scroll and clipping
|
|
63
|
+
|
|
64
|
+
- Focus rings and interactive borders must not be clipped by parent `overflow: hidden` or `overflow: auto` containers.
|
|
65
|
+
- Add padding or adjust overflow to prevent clipping on edge items in scrollable lists.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Require a capture against a running preview after a rendered surface changes
|
|
3
|
+
paths:
|
|
4
|
+
- '**/routes/**/*.{tsx,jsx,vue,svelte,astro}'
|
|
5
|
+
- '**/pages/**/*.{tsx,jsx,vue,svelte,astro}'
|
|
6
|
+
- '**/app/**/page.{tsx,jsx}'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Surface capture standards
|
|
11
|
+
|
|
12
|
+
## What a surface is
|
|
13
|
+
|
|
14
|
+
- A surface is anything the project renders for a person to look at. A framework route is one. A page the project generates is another, whoever generates it.
|
|
15
|
+
- Judge a generated page by the same rule as a route. Reading its markup reports nothing about how it composes.
|
|
16
|
+
|
|
17
|
+
## When to capture
|
|
18
|
+
|
|
19
|
+
- Run the project's capture command after changing what a surface renders. Report it rather than proceeding silently when the project has none.
|
|
20
|
+
- Capture against a running preview server. Do not capture against a dev server.
|
|
21
|
+
- Capture every theme the surface ships. Do not capture the default theme alone.
|
|
22
|
+
- Capture again after fixing a defect a capture found. A repair inside a shared stylesheet can cancel a rule written earlier in the same file.
|
|
23
|
+
|
|
24
|
+
## What a capture covers
|
|
25
|
+
|
|
26
|
+
- Capture the full page at the viewport its case declares. Do not capture a component in isolation.
|
|
27
|
+
- Drive a state a screenshot cannot reach. An initial render reports nothing about a menu that opens, an answer that is chosen, or a rail that tracks scrolling.
|
|
28
|
+
- Add a case to the capture record when adding a surface.
|
|
29
|
+
- Remove a surface's case in the change that removes the surface.
|
|
30
|
+
|
|
31
|
+
## Sharing a capture
|
|
32
|
+
|
|
33
|
+
- Attach a capture to the pull request by hand when a reviewer needs to see it.
|
|
34
|
+
- Do not commit a capture. Do not remove the capture folder from `.gitignore`.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce the same-tab default for an outbound link and for a mail link
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.astro'
|
|
7
|
+
- '**/*.html'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Link behavior standards
|
|
11
|
+
|
|
12
|
+
## Default target
|
|
13
|
+
|
|
14
|
+
- Open a link in the same tab. Reserve `target="_blank"` for a destination that would discard in-progress work if it replaced the current page, such as a document a user is midway through elsewhere.
|
|
15
|
+
- Do not add `target="_blank"` as a default for every external link.
|
|
16
|
+
|
|
17
|
+
## mailto: links
|
|
18
|
+
|
|
19
|
+
- Open a `mailto:` link in the same tab. It hands off to the mail client rather than replacing page content, so a new tab leaves an empty tab behind.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
extends = ""
|
|
2
|
+
# All four folders whole. Every rule authored under them ships to a base
|
|
3
|
+
# consumer, so adding one is a single edit rather than a file and a name here.
|
|
4
|
+
# `snippets` carries the `@`-reference convention rule, which lost its only
|
|
5
|
+
# other delivery path when `canon snippets install` retired. `ci` carries the
|
|
6
|
+
# workflow rule, whose glob is the only inbound route to the `ci-workflow`
|
|
7
|
+
# skill.
|
|
8
|
+
rules = ["core", "claude", "snippets", "ci", "120-bash"]
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@erclx/canon",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "4.0.0",
|
|
5
|
+
"description": "Infrastructure and quality tooling for developer workflows",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"bin": {
|
|
8
|
+
"canon": "./src/cli.ts"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"src",
|
|
12
|
+
"scripts",
|
|
13
|
+
"standards",
|
|
14
|
+
"snippets",
|
|
15
|
+
"governance",
|
|
16
|
+
"tooling",
|
|
17
|
+
"claude",
|
|
18
|
+
"docs",
|
|
19
|
+
"tsconfig.json",
|
|
20
|
+
"!scripts/sandbox",
|
|
21
|
+
"!scripts/eval",
|
|
22
|
+
"!src/capture",
|
|
23
|
+
"!**/*.test.ts"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"check:spell": "cspell '**' '.*/**' '.*' --no-progress --color --show-context",
|
|
30
|
+
"format": "prettier --write --log-level warn --ignore-path .gitignore --ignore-path .prettierignore . && shfmt --write --indent 2 scripts/ tooling/ claude/",
|
|
31
|
+
"check:format": "prettier --check --log-level warn --ignore-path .gitignore --ignore-path .prettierignore . && shfmt --diff --indent 2 scripts/ tooling/ claude/",
|
|
32
|
+
"check:shell": "find scripts tooling claude .claude/hooks -name '*.sh' -exec shellcheck --severity=warning {} +",
|
|
33
|
+
"check:types": "tsc --noEmit",
|
|
34
|
+
"check:install": "./scripts/core/install-check.sh",
|
|
35
|
+
"test": "bun --bun vitest run",
|
|
36
|
+
"prepare": "husky",
|
|
37
|
+
"check": "bun src/cli.ts gate run",
|
|
38
|
+
"check:ci": "bun src/cli.ts gate run --all --no-write",
|
|
39
|
+
"update": "./scripts/core/update.sh",
|
|
40
|
+
"clean": "./scripts/core/clean.sh",
|
|
41
|
+
"snapshot": "./scripts/core/snapshot.sh",
|
|
42
|
+
"bootstrap": "./scripts/core/bootstrap.sh",
|
|
43
|
+
"canon:sandbox": "canon sandbox",
|
|
44
|
+
"canon:sandbox:reset": "canon sandbox reset"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"commander": "^13.1.0",
|
|
48
|
+
"execa": "^9.5.2",
|
|
49
|
+
"playwright-core": "1.59.1",
|
|
50
|
+
"pptxgenjs": "^4.0.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@astrojs/check": "^0.9.8",
|
|
54
|
+
"@astrojs/react": "^5.0.4",
|
|
55
|
+
"@commitlint/cli": "^20.4.1",
|
|
56
|
+
"@commitlint/config-conventional": "^20.4.1",
|
|
57
|
+
"@playwright/test": "1.59.1",
|
|
58
|
+
"@tailwindcss/vite": "^4.2.4",
|
|
59
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
60
|
+
"@types/bun": "^1.2.10",
|
|
61
|
+
"astro": "^6.1.9",
|
|
62
|
+
"cspell": "^8.17.1",
|
|
63
|
+
"husky": "^9.1.7",
|
|
64
|
+
"prettier": "^3.8.1",
|
|
65
|
+
"prettier-plugin-tailwindcss": "^0.7.2",
|
|
66
|
+
"typescript": "^5.9.3",
|
|
67
|
+
"vitest": "^4.1.5"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
if [ -z "${GITHUB_ORG:-}" ]; then
|
|
4
|
+
_origin_url="$(git config --get remote.origin.url 2>/dev/null || true)"
|
|
5
|
+
if [ -n "$_origin_url" ]; then
|
|
6
|
+
GITHUB_ORG="$(echo "$_origin_url" | sed -nE 's#^(git@github\.com:|https://github\.com/)([^/]+)/.+#\2#p')"
|
|
7
|
+
fi
|
|
8
|
+
unset _origin_url
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
export GITHUB_ORG="${GITHUB_ORG:-}"
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
set -o pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
7
|
+
|
|
8
|
+
source "$PROJECT_ROOT/scripts/lib/ui.sh"
|
|
9
|
+
|
|
10
|
+
ZSHRC="${ZDOTDIR:-$HOME}/.zshrc"
|
|
11
|
+
MARKER_OPEN="# >>> canon aliases >>>"
|
|
12
|
+
MARKER_CLOSE="# <<< canon aliases <<<"
|
|
13
|
+
|
|
14
|
+
check_dependencies() {
|
|
15
|
+
command -v bun >/dev/null 2>&1 || log_error "bun is not installed. See https://bun.sh, then re-run."
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
install_cli() {
|
|
19
|
+
log_step "Installing the canon CLI"
|
|
20
|
+
bun install --cwd "$PROJECT_ROOT" >/dev/null
|
|
21
|
+
bun link --cwd "$PROJECT_ROOT" >/dev/null
|
|
22
|
+
log_info "Dependencies installed and canon linked"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
alias_block() {
|
|
26
|
+
cat <<EOF
|
|
27
|
+
$MARKER_OPEN
|
|
28
|
+
TOOLKIT="$PROJECT_ROOT"
|
|
29
|
+
|
|
30
|
+
alias cl='claude'
|
|
31
|
+
alias clr='cl -r'
|
|
32
|
+
alias clc='cl -c'
|
|
33
|
+
alias clw='cl -w'
|
|
34
|
+
alias cls='cl --model sonnet'
|
|
35
|
+
|
|
36
|
+
alias clp='claude --plugin-dir \$TOOLKIT/claude'
|
|
37
|
+
alias clpc='clp -c'
|
|
38
|
+
alias clps='clp --model sonnet'
|
|
39
|
+
$MARKER_CLOSE
|
|
40
|
+
EOF
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
install_aliases() {
|
|
44
|
+
log_step "Installing Claude Code shell aliases"
|
|
45
|
+
|
|
46
|
+
if [ -f "$ZSHRC" ] && grep -qF "$MARKER_OPEN" "$ZSHRC"; then
|
|
47
|
+
log_info "Aliases already present in $ZSHRC, skipping"
|
|
48
|
+
return
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if [ -f "$ZSHRC" ] && grep -qE "^alias clp=" "$ZSHRC"; then
|
|
52
|
+
log_warn "An unmanaged clp alias is already in $ZSHRC. Leaving it untouched."
|
|
53
|
+
log_warn "Remove it and re-run to switch to the managed block."
|
|
54
|
+
return
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
printf '\n%s\n' "$(alias_block)" >>"$ZSHRC"
|
|
58
|
+
log_add "Appended canon alias block to $ZSHRC"
|
|
59
|
+
log_info "Run 'source $ZSHRC' or open a new shell to load them"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
verify_cli() {
|
|
63
|
+
log_step "Verifying the install"
|
|
64
|
+
if canon --help >/dev/null 2>&1; then
|
|
65
|
+
log_info "canon resolves on PATH"
|
|
66
|
+
else
|
|
67
|
+
log_warn "canon not on PATH yet. Ensure \$BUN_INSTALL/bin is exported, then re-open your shell."
|
|
68
|
+
fi
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
main() {
|
|
72
|
+
open_timeline "canon bootstrap"
|
|
73
|
+
trap close_timeline EXIT
|
|
74
|
+
|
|
75
|
+
check_dependencies
|
|
76
|
+
install_cli
|
|
77
|
+
install_aliases
|
|
78
|
+
verify_cli
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
main "$@"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
set -o pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
7
|
+
|
|
8
|
+
SCRIPTS_ROOT="$PROJECT_ROOT/scripts"
|
|
9
|
+
PALETTE_SOURCE="$SCRIPTS_ROOT/lib/ui.sh"
|
|
10
|
+
|
|
11
|
+
# `find` writes to stderr and returns non-zero for a missing root, inside a
|
|
12
|
+
# process substitution whose status nothing reads. Without this the walk covers
|
|
13
|
+
# nothing and the check reports the tree clean having never measured it.
|
|
14
|
+
if [ ! -f "$PALETTE_SOURCE" ]; then
|
|
15
|
+
echo "No palette source at ${PALETTE_SOURCE#"$PROJECT_ROOT/"}, color sourcing unverifiable." >&2
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Any SGR sequence in either spelling. The cursor and erase sequences an
|
|
20
|
+
# interactive prompt writes end in a letter instead, and they run only where a
|
|
21
|
+
# terminal already exists, so they are not what this measures.
|
|
22
|
+
SGR='\\(033|e|x1b)\[[0-9;]*m'
|
|
23
|
+
|
|
24
|
+
# Sixteen copies of one decision is what made color impossible to turn off on
|
|
25
|
+
# the TypeScript side. A rule nothing enforces rebuilds them the next time a
|
|
26
|
+
# script wants grey, so the escape lives in the shared library and every other
|
|
27
|
+
# script reads the palette that library derives for its stream.
|
|
28
|
+
offenders=""
|
|
29
|
+
while IFS= read -r file; do
|
|
30
|
+
[ "$file" = "$PALETTE_SOURCE" ] && continue
|
|
31
|
+
if grep -qE "$SGR" "$file"; then
|
|
32
|
+
offenders="$offenders ${file#"$PROJECT_ROOT/"}"$'\n'
|
|
33
|
+
fi
|
|
34
|
+
done < <(find "$SCRIPTS_ROOT" -type f -name '*.sh')
|
|
35
|
+
|
|
36
|
+
if [ -n "$offenders" ]; then
|
|
37
|
+
echo "A color escape is defined outside the shared library:" >&2
|
|
38
|
+
printf '%s' "$offenders" >&2
|
|
39
|
+
echo "Source scripts/lib/ui.sh and read its palette, so one answer covers every writer." >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|