@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,10 @@
|
|
|
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
|
+
bun "$PROJECT_ROOT/src/cli.ts" indexes regen --root "$PROJECT_ROOT" --json >/dev/null
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
set -o pipefail
|
|
4
|
+
|
|
5
|
+
# Rewrites the generated path block in the shipped overwrite contract, which
|
|
6
|
+
# names every file a tooling sync can replace. The category reaches past the
|
|
7
|
+
# linters its name suggests, into the CI workflow, the end-to-end harness, and
|
|
8
|
+
# the shell scripts under scripts/, so a reader cannot infer the list. Generating
|
|
9
|
+
# it is what keeps a stack gaining a file from leaving the contract wrong.
|
|
10
|
+
#
|
|
11
|
+
# The stack names come from `tooling list` rather than from a directory walk,
|
|
12
|
+
# so a stack the verb excludes never reaches a contract about what the verb does.
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
16
|
+
|
|
17
|
+
TOOLING_DIR="$PROJECT_ROOT/tooling"
|
|
18
|
+
CONTRACT="$PROJECT_ROOT/claude/skills/canon-cli/SKILL.md"
|
|
19
|
+
|
|
20
|
+
BEGIN="<!-- generated:tooling-paths -->"
|
|
21
|
+
END="<!-- /generated:tooling-paths -->"
|
|
22
|
+
|
|
23
|
+
[ -d "$TOOLING_DIR" ] || exit 0
|
|
24
|
+
[ -f "$CONTRACT" ] || exit 0
|
|
25
|
+
|
|
26
|
+
grep -qF "$BEGIN" "$CONTRACT" || {
|
|
27
|
+
echo "Missing $BEGIN marker in $CONTRACT" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
block="$(mktemp)"
|
|
32
|
+
trap 'rm -f "$block" "$CONTRACT.tmp"' EXIT
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
echo "$BEGIN"
|
|
36
|
+
echo
|
|
37
|
+
while IFS= read -r stack; do
|
|
38
|
+
[ -d "$TOOLING_DIR/$stack/configs" ] || continue
|
|
39
|
+
echo "### $stack"
|
|
40
|
+
echo
|
|
41
|
+
while IFS= read -r rel; do
|
|
42
|
+
echo "- \`$rel\`"
|
|
43
|
+
done < <(cd "$TOOLING_DIR/$stack/configs" && find . -type f | sed 's|^\./||' | sort)
|
|
44
|
+
echo
|
|
45
|
+
done < <(bun "$PROJECT_ROOT/src/cli.ts" tooling list --json | jq -r '.stacks[].name' | sort)
|
|
46
|
+
echo "$END"
|
|
47
|
+
} >"$block"
|
|
48
|
+
|
|
49
|
+
# awk streams the file rather than editing in place, so a pattern that matches
|
|
50
|
+
# nothing produces a file missing the block instead of an unchanged one that
|
|
51
|
+
# exits zero.
|
|
52
|
+
awk -v block_file="$block" -v begin="$BEGIN" -v end="$END" '
|
|
53
|
+
$0 == begin { while ((getline line < block_file) > 0) print line; skipping = 1; next }
|
|
54
|
+
$0 == end { skipping = 0; next }
|
|
55
|
+
!skipping { print }
|
|
56
|
+
' "$CONTRACT" >"$CONTRACT.tmp"
|
|
57
|
+
|
|
58
|
+
# The destination is a tracked file with a mode the copy must not inherit from
|
|
59
|
+
# mktemp, so the content moves onto the original rather than replacing it.
|
|
60
|
+
cat "$CONTRACT.tmp" >"$CONTRACT"
|
|
61
|
+
rm -f "$CONTRACT.tmp"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Repairs `core.bare`, which Claude Code's worktree entry leaves set in the
|
|
3
|
+
# shared config with nothing restoring it. The flag strands the main worktree
|
|
4
|
+
# and breaks the git reads that scope a verification run, so this runs ahead of
|
|
5
|
+
# every stage rather than as one of them.
|
|
6
|
+
#
|
|
7
|
+
# The rule itself lives in `scripts/lib/worktree.sh`, the one bash function in
|
|
8
|
+
# this repository under test, so this file is the invocation and never a second
|
|
9
|
+
# copy of the guard that spares a genuinely bare repository.
|
|
10
|
+
set -e
|
|
11
|
+
set -o pipefail
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
15
|
+
|
|
16
|
+
source "$PROJECT_ROOT/scripts/lib/ui.sh"
|
|
17
|
+
source "$PROJECT_ROOT/scripts/lib/worktree.sh"
|
|
18
|
+
|
|
19
|
+
repair_bare_flag "$PROJECT_ROOT"
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
# shellcheck source=/dev/null
|
|
9
|
+
source "$PROJECT_ROOT/scripts/lib/ui.sh"
|
|
10
|
+
|
|
11
|
+
NESTED="${VERIFY_NESTED:-false}"
|
|
12
|
+
|
|
13
|
+
OUTPUT_FILE=".claude/.tmp/project/PROJECT-SNAPSHOT.md"
|
|
14
|
+
|
|
15
|
+
check_dependencies() {
|
|
16
|
+
command -v find >/dev/null 2>&1 || log_error "find not installed"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
load_gitignore_patterns() {
|
|
20
|
+
if [ ! -f ".gitignore" ]; then
|
|
21
|
+
echo ""
|
|
22
|
+
return
|
|
23
|
+
fi
|
|
24
|
+
grep -v '^\s*#' .gitignore | grep -v '^\s*$' | sed 's|/$||'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
is_ignored() {
|
|
28
|
+
local name="$1"
|
|
29
|
+
local patterns="$2"
|
|
30
|
+
|
|
31
|
+
[ "$name" = ".git" ] && return 0
|
|
32
|
+
[ "$name" = "_" ] && return 0
|
|
33
|
+
|
|
34
|
+
while IFS= read -r pattern; do
|
|
35
|
+
[ -z "$pattern" ] && continue
|
|
36
|
+
# shellcheck disable=SC2053
|
|
37
|
+
if [[ "$name" == $pattern ]]; then
|
|
38
|
+
return 0
|
|
39
|
+
fi
|
|
40
|
+
done <<<"$patterns"
|
|
41
|
+
|
|
42
|
+
return 1
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
build_tree() {
|
|
46
|
+
local dir="${1:-.}"
|
|
47
|
+
local prefix="${2:-}"
|
|
48
|
+
local patterns="${3:-}"
|
|
49
|
+
local entries=()
|
|
50
|
+
|
|
51
|
+
while IFS= read -r entry; do
|
|
52
|
+
local name
|
|
53
|
+
name=$(basename "$entry")
|
|
54
|
+
is_ignored "$name" "$patterns" && continue
|
|
55
|
+
entries+=("$entry")
|
|
56
|
+
done < <(find "$dir" -maxdepth 1 -mindepth 1 | sort)
|
|
57
|
+
|
|
58
|
+
local count=${#entries[@]}
|
|
59
|
+
local i=0
|
|
60
|
+
|
|
61
|
+
for entry in "${entries[@]}"; do
|
|
62
|
+
i=$((i + 1))
|
|
63
|
+
local name
|
|
64
|
+
name=$(basename "$entry")
|
|
65
|
+
local connector="├──"
|
|
66
|
+
local child_prefix="${prefix}│ "
|
|
67
|
+
|
|
68
|
+
if [ "$i" -eq "$count" ]; then
|
|
69
|
+
connector="└──"
|
|
70
|
+
child_prefix="${prefix} "
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
if [ -d "$entry" ]; then
|
|
74
|
+
echo "${prefix}${connector} ${name}/"
|
|
75
|
+
build_tree "$entry" "$child_prefix" "$patterns"
|
|
76
|
+
else
|
|
77
|
+
echo "${prefix}${connector} ${name}"
|
|
78
|
+
fi
|
|
79
|
+
done
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
write_snapshot() {
|
|
83
|
+
local project_name
|
|
84
|
+
project_name=$(basename "$PWD")
|
|
85
|
+
local patterns
|
|
86
|
+
patterns=$(load_gitignore_patterns)
|
|
87
|
+
|
|
88
|
+
mkdir -p "$(dirname "$OUTPUT_FILE")"
|
|
89
|
+
|
|
90
|
+
{
|
|
91
|
+
echo "# Project Snapshot: $project_name"
|
|
92
|
+
echo ""
|
|
93
|
+
echo "## Structure"
|
|
94
|
+
echo ""
|
|
95
|
+
echo '```'
|
|
96
|
+
build_tree "." "" "$patterns"
|
|
97
|
+
echo '```'
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
if [ -f "package.json" ]; then
|
|
101
|
+
echo "## package.json"
|
|
102
|
+
echo ""
|
|
103
|
+
echo '```json'
|
|
104
|
+
cat package.json
|
|
105
|
+
echo '```'
|
|
106
|
+
echo ""
|
|
107
|
+
fi
|
|
108
|
+
} >"$OUTPUT_FILE"
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
main() {
|
|
112
|
+
check_dependencies
|
|
113
|
+
|
|
114
|
+
if [ "$NESTED" = false ]; then open_timeline; fi
|
|
115
|
+
|
|
116
|
+
log_step "Snapshot"
|
|
117
|
+
write_snapshot
|
|
118
|
+
log_info "Written to $OUTPUT_FILE"
|
|
119
|
+
|
|
120
|
+
# The whole frame goes to stderr, since the run writes its document to a file
|
|
121
|
+
# and leaves stdout carrying nothing. Edges on stdout with the body on stderr
|
|
122
|
+
# would capture as a frame with no body inside it.
|
|
123
|
+
if [ "$NESTED" = false ]; then
|
|
124
|
+
close_timeline
|
|
125
|
+
# All six are declared to scope what `set_palette` assigns, so the four this
|
|
126
|
+
# line never spells stay out of the globals a sourcing script reads.
|
|
127
|
+
# shellcheck disable=SC2034
|
|
128
|
+
local GREEN RED YELLOW WHITE GREY NC
|
|
129
|
+
set_palette 2
|
|
130
|
+
echo -e "\n${GREEN}✓ Snapshot complete${NC}" >&2
|
|
131
|
+
fi
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
main "$@"
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
check_dependencies() {
|
|
11
|
+
command -v bun >/dev/null 2>&1 || log_error "bun is not installed"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
main() {
|
|
15
|
+
check_dependencies
|
|
16
|
+
|
|
17
|
+
echo -e "${GREY}┌${NC}"
|
|
18
|
+
|
|
19
|
+
echo -e "${GREY}├${NC} ${WHITE}Interactive dependency update${NC}"
|
|
20
|
+
echo -e "${GREY}│${NC}"
|
|
21
|
+
bun update --interactive
|
|
22
|
+
|
|
23
|
+
log_step "Verifying project health"
|
|
24
|
+
if [ -f "$PROJECT_ROOT/src/cli.ts" ]; then
|
|
25
|
+
bun "$PROJECT_ROOT/src/cli.ts" gate run --nested
|
|
26
|
+
log_info "All checks passed"
|
|
27
|
+
else
|
|
28
|
+
log_warn "Verification entry point not found, skipping."
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
echo -e "${GREY}└${NC}\n"
|
|
32
|
+
echo -e "${GREEN}✓ Update complete${NC}"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
main "$@"
|
|
@@ -0,0 +1,165 @@
|
|
|
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:-$(dirname "$(dirname "$SCRIPT_DIR")")}"
|
|
7
|
+
|
|
8
|
+
source "$PROJECT_ROOT/scripts/lib/ui.sh"
|
|
9
|
+
source "$PROJECT_ROOT/scripts/lib/frontmatter.sh"
|
|
10
|
+
|
|
11
|
+
DOCS_DIR="$PROJECT_ROOT/docs"
|
|
12
|
+
CONTEXT_DIR="$PROJECT_ROOT/.claude/context"
|
|
13
|
+
|
|
14
|
+
INTERNAL_TOPICS=" ci development sandbox "
|
|
15
|
+
|
|
16
|
+
show_help() {
|
|
17
|
+
echo -e "${GREY}┌${NC}"
|
|
18
|
+
echo -e "${GREY}├${NC} ${WHITE}Usage:${NC} canon docs list [options]"
|
|
19
|
+
echo -e "${GREY}│${NC}"
|
|
20
|
+
echo -e "${GREY}│${NC} ${WHITE}Options:${NC}"
|
|
21
|
+
echo -e "${GREY}│${NC} --json ${GREY}# Emit machine-readable JSON${NC}"
|
|
22
|
+
echo -e "${GREY}│${NC} -h, --help ${GREY}# Show this help message${NC}"
|
|
23
|
+
echo -e "${GREY}└${NC}"
|
|
24
|
+
exit 0
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
is_target_facing() {
|
|
28
|
+
case "$1" in
|
|
29
|
+
"Agent surface" | "Domain references") return 0 ;;
|
|
30
|
+
*) return 1 ;;
|
|
31
|
+
esac
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
is_internal_topic() {
|
|
35
|
+
case "$INTERNAL_TOPICS" in
|
|
36
|
+
*" $1 "*) return 0 ;;
|
|
37
|
+
*) return 1 ;;
|
|
38
|
+
esac
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# Emits `name<TAB>description<TAB>category<TAB>target` per target-facing doc,
|
|
42
|
+
# sorted so a domain split into a folder lands in its alphabetical place rather
|
|
43
|
+
# than after every file. A folder declares its category on its own index, since
|
|
44
|
+
# the allowlist is what separates a target-facing doc from a workflow one and a
|
|
45
|
+
# split domain is not exempt from it.
|
|
46
|
+
collect_docs() {
|
|
47
|
+
local file name description category
|
|
48
|
+
{
|
|
49
|
+
while IFS= read -r file; do
|
|
50
|
+
name=$(basename "$file" .md)
|
|
51
|
+
[ "$name" = "index" ] && continue
|
|
52
|
+
category=$(read_frontmatter_field "$file" "category")
|
|
53
|
+
is_target_facing "$category" || continue
|
|
54
|
+
description=$(read_frontmatter_field "$file" "description")
|
|
55
|
+
printf '%s\t%s\t%s\t%s\n' "$name" "$description" "$category" "docs/$name.md"
|
|
56
|
+
done < <(find "$DOCS_DIR" -maxdepth 1 -type f -name "*.md")
|
|
57
|
+
|
|
58
|
+
# A split domain is named by its folder and described by its generated
|
|
59
|
+
# index, which carries subtitle where a sibling file carries description
|
|
60
|
+
while IFS= read -r file; do
|
|
61
|
+
name=$(basename "$(dirname "$file")")
|
|
62
|
+
category=$(read_frontmatter_field "$file" "category")
|
|
63
|
+
is_target_facing "$category" || continue
|
|
64
|
+
description=$(read_frontmatter_field "$file" "subtitle")
|
|
65
|
+
printf '%s\t%s\t%s\t%s\n' "$name" "$description" "$category" "docs/$name/index.md"
|
|
66
|
+
done < <(find "$DOCS_DIR" -mindepth 2 -maxdepth 2 -type f -name "index.md")
|
|
67
|
+
} | sort
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Emits `name<TAB>description<TAB>target` per context entry, sorted so a domain
|
|
71
|
+
# split into a folder lands in its alphabetical place rather than after every
|
|
72
|
+
# file. Matches listTopics in src/docs/read.ts, which sorts both together.
|
|
73
|
+
collect_context() {
|
|
74
|
+
local file name description
|
|
75
|
+
{
|
|
76
|
+
while IFS= read -r file; do
|
|
77
|
+
name=$(basename "$file" .md)
|
|
78
|
+
[ "$name" = "index" ] && continue
|
|
79
|
+
is_internal_topic "$name" && continue
|
|
80
|
+
description=$(read_frontmatter_field "$file" "description")
|
|
81
|
+
printf '%s\t%s\t%s\n' "$name" "$description" ".claude/context/$name.md"
|
|
82
|
+
done < <(find "$CONTEXT_DIR" -maxdepth 1 -type f -name "*.md")
|
|
83
|
+
|
|
84
|
+
# A split domain is named by its folder and described by its generated
|
|
85
|
+
# index, which carries subtitle where a sibling file carries description
|
|
86
|
+
while IFS= read -r file; do
|
|
87
|
+
name=$(basename "$(dirname "$file")")
|
|
88
|
+
is_internal_topic "$name" && continue
|
|
89
|
+
description=$(read_frontmatter_field "$file" "subtitle")
|
|
90
|
+
printf '%s\t%s\t%s\n' "$name" "$description" ".claude/context/$name/index.md"
|
|
91
|
+
done < <(find "$CONTEXT_DIR" -mindepth 2 -maxdepth 2 -type f -name "index.md")
|
|
92
|
+
} | sort
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
list_text() {
|
|
96
|
+
local name description category target
|
|
97
|
+
log_step "Docs"
|
|
98
|
+
while IFS=$'\t' read -r name description category target; do
|
|
99
|
+
log_info "$name : $description"
|
|
100
|
+
done < <(collect_docs)
|
|
101
|
+
|
|
102
|
+
# Absent in a registry install, which ships docs/ without .claude/
|
|
103
|
+
if [ -d "$CONTEXT_DIR" ]; then
|
|
104
|
+
log_step "Domain context"
|
|
105
|
+
while IFS=$'\t' read -r name description target; do
|
|
106
|
+
log_info "$name : $description"
|
|
107
|
+
done < <(collect_context)
|
|
108
|
+
fi
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
emit_json_entry() {
|
|
112
|
+
local name="$1" description="$2" category="$3" target="$4"
|
|
113
|
+
[ "$JSON_FIRST" -eq 0 ] && printf ','
|
|
114
|
+
jq -nc \
|
|
115
|
+
--arg name "$name" \
|
|
116
|
+
--arg description "$description" \
|
|
117
|
+
--arg category "$category" \
|
|
118
|
+
--arg target "$target" \
|
|
119
|
+
'{name: $name, description: $description, category: $category, target: $target}'
|
|
120
|
+
JSON_FIRST=0
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
list_json() {
|
|
124
|
+
local name description category target
|
|
125
|
+
JSON_FIRST=1
|
|
126
|
+
printf '['
|
|
127
|
+
while IFS=$'\t' read -r name description category target; do
|
|
128
|
+
emit_json_entry "$name" "$description" "$category" "$target"
|
|
129
|
+
done < <(collect_docs)
|
|
130
|
+
|
|
131
|
+
if [ -d "$CONTEXT_DIR" ]; then
|
|
132
|
+
while IFS=$'\t' read -r name description target; do
|
|
133
|
+
emit_json_entry "$name" "$description" "" "$target"
|
|
134
|
+
done < <(collect_context)
|
|
135
|
+
fi
|
|
136
|
+
printf ']'
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
main() {
|
|
140
|
+
local json=0
|
|
141
|
+
|
|
142
|
+
while [[ $# -gt 0 ]]; do
|
|
143
|
+
case "$1" in
|
|
144
|
+
-h | --help) show_help ;;
|
|
145
|
+
--json)
|
|
146
|
+
json=1
|
|
147
|
+
shift
|
|
148
|
+
;;
|
|
149
|
+
*) log_error "Unknown option: $1" ;;
|
|
150
|
+
esac
|
|
151
|
+
done
|
|
152
|
+
|
|
153
|
+
trap close_timeline EXIT
|
|
154
|
+
|
|
155
|
+
if [ "$json" -eq 1 ]; then
|
|
156
|
+
printf '{"docs":'
|
|
157
|
+
list_json
|
|
158
|
+
printf '}\n'
|
|
159
|
+
exit 0
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
list_text
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
main "$@"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Reads one frontmatter field from a markdown file.
|
|
4
|
+
#
|
|
5
|
+
# Kept in bash because the list commands call it once per field per file
|
|
6
|
+
# inside a loop, where shelling into the CLI would cost a process per read.
|
|
7
|
+
# Index logic is TypeScript, in src/indexes/, and does not belong here.
|
|
8
|
+
read_frontmatter_field() {
|
|
9
|
+
local file="$1"
|
|
10
|
+
local key="$2"
|
|
11
|
+
awk -v key="$key" '
|
|
12
|
+
NR == 1 && /^---$/ { in_fm = 1; next }
|
|
13
|
+
in_fm && /^---$/ { exit }
|
|
14
|
+
in_fm {
|
|
15
|
+
prefix = key ": "
|
|
16
|
+
if (index($0, prefix) == 1) {
|
|
17
|
+
val = substr($0, length(prefix) + 1)
|
|
18
|
+
if (length(val) >= 2) {
|
|
19
|
+
first = substr(val, 1, 1)
|
|
20
|
+
last = substr(val, length(val), 1)
|
|
21
|
+
if ((first == "\"" && last == "\"") || (first == "'\''" && last == "'\''")) {
|
|
22
|
+
val = substr(val, 2, length(val) - 2)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
print val
|
|
26
|
+
exit
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
' "$file"
|
|
30
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Sole survivor of the gov lib. Called once per rule file inside install and
|
|
4
|
+
# sandbox loops, where routing through the CLI would cost a process per file.
|
|
5
|
+
|
|
6
|
+
rule_subdir() {
|
|
7
|
+
local src="$1"
|
|
8
|
+
local rules_root="${2:-$PROJECT_ROOT/governance/rules}"
|
|
9
|
+
local rel="${src#"$rules_root/"}"
|
|
10
|
+
local subdir
|
|
11
|
+
subdir=$(dirname "$rel")
|
|
12
|
+
[ "$subdir" = "." ] && subdir=""
|
|
13
|
+
echo "$subdir"
|
|
14
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Fixture files carry this suffix so the repository's own checks ignore them.
|
|
4
|
+
# A stored `index.md.fixture` is not an `index.md`, so the index walker, prettier,
|
|
5
|
+
# shfmt, and shellcheck all skip it and the bytes reach the sandbox unmodified.
|
|
6
|
+
FIXTURE_SUFFIX=".fixture"
|
|
7
|
+
|
|
8
|
+
# The tree mirrors the scenario path, so `category` and `scenario` together match
|
|
9
|
+
# `scripts/sandbox/<category>/<scenario>.sh`. Both segments are load-bearing:
|
|
10
|
+
# four scenario basenames repeat across categories (`claude`, `docs`, `review`,
|
|
11
|
+
# `sync`), and `docs` is also a category of its own.
|
|
12
|
+
fixture_stage_dir() {
|
|
13
|
+
local category="$1"
|
|
14
|
+
local scenario="$2"
|
|
15
|
+
local arm="$3"
|
|
16
|
+
local stage="$4"
|
|
17
|
+
echo "$PROJECT_ROOT/scripts/sandbox/fixtures/$category/$scenario/$arm/$stage"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
list_fixture_files() {
|
|
21
|
+
local source_dir="$1"
|
|
22
|
+
find "$source_dir" -type f -name "*$FIXTURE_SUFFIX" -print0 | sort -z
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
count_fixture_files() {
|
|
26
|
+
local source_dir="$1"
|
|
27
|
+
if [ ! -d "$source_dir" ]; then
|
|
28
|
+
echo 0
|
|
29
|
+
return 0
|
|
30
|
+
fi
|
|
31
|
+
find "$source_dir" -type f -name "*$FIXTURE_SUFFIX" | wc -l
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# The copy loops match on the suffix, so a file without one would be skipped in
|
|
35
|
+
# silence and the scenario would provision a tree it was never meant to have.
|
|
36
|
+
assert_fixtures_suffixed() {
|
|
37
|
+
local source_dir="$1"
|
|
38
|
+
[ -d "$source_dir" ] || return 0
|
|
39
|
+
|
|
40
|
+
local stray
|
|
41
|
+
stray="$(find "$source_dir" -type f -not -name "*$FIXTURE_SUFFIX" | sort | tr '\n' ' ')"
|
|
42
|
+
[ -z "$stray" ] || log_error "Fixture missing the $FIXTURE_SUFFIX suffix: $stray"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fixture_target_path() {
|
|
46
|
+
local source_dir="$1"
|
|
47
|
+
local source_file="$2"
|
|
48
|
+
local relative="${source_file#"$source_dir"/}"
|
|
49
|
+
echo "${relative%"$FIXTURE_SUFFIX"}"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
create_from_fixtures() {
|
|
53
|
+
local source_dir="$1"
|
|
54
|
+
[ -d "$source_dir" ] || return 0
|
|
55
|
+
|
|
56
|
+
local source_file target
|
|
57
|
+
while IFS= read -r -d '' source_file; do
|
|
58
|
+
target="$(fixture_target_path "$source_dir" "$source_file")"
|
|
59
|
+
mkdir -p "$(dirname "$target")"
|
|
60
|
+
cp "$source_file" "$target"
|
|
61
|
+
done < <(list_fixture_files "$source_dir")
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# An append fixture extends a file the anchor or the injected seeds already
|
|
65
|
+
# provide. A missing target means that upstream shape changed, so fail rather
|
|
66
|
+
# than create the file and silently alter what the scenario provisions.
|
|
67
|
+
append_from_fixtures() {
|
|
68
|
+
local source_dir="$1"
|
|
69
|
+
[ -d "$source_dir" ] || return 0
|
|
70
|
+
|
|
71
|
+
local source_file target
|
|
72
|
+
while IFS= read -r -d '' source_file; do
|
|
73
|
+
target="$(fixture_target_path "$source_dir" "$source_file")"
|
|
74
|
+
if [ ! -f "$target" ]; then
|
|
75
|
+
log_error "Append fixture has no target: $target"
|
|
76
|
+
fi
|
|
77
|
+
cat "$source_file" >>"$target"
|
|
78
|
+
done < <(list_fixture_files "$source_dir")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Stages the first `count` markdown files the toolkit ships for a domain into
|
|
82
|
+
# `dest`, flattening any source subfolder. Source rather than fixture tree,
|
|
83
|
+
# because an arm modelling a real install wants the files a target actually
|
|
84
|
+
# received and a copy under `fixtures/` would drift from them silently.
|
|
85
|
+
#
|
|
86
|
+
# The flattening is load-bearing rather than incidental. Both `detectUnmigrated`
|
|
87
|
+
# and the sync engine match a target file to its source by basename against the
|
|
88
|
+
# flat domain root, so a file lifted out of a source subfolder such as `bundled/`
|
|
89
|
+
# has no flat sibling and reads as project-authored. An arm staging one claims a
|
|
90
|
+
# drift or an unmigrated domain it did not stage.
|
|
91
|
+
stage_toolkit_markdown() {
|
|
92
|
+
local src="$1"
|
|
93
|
+
local dest="$2"
|
|
94
|
+
local count="$3"
|
|
95
|
+
|
|
96
|
+
mkdir -p "$dest"
|
|
97
|
+
while IFS= read -r file; do
|
|
98
|
+
cp "$file" "$dest/$(basename "$file")"
|
|
99
|
+
done < <(find "$src" -maxdepth 1 -type f -name "*.md" ! -name "index.md" | sort | head -n "$count")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# The newest top-level path history records a deletion under that the toolkit no
|
|
103
|
+
# longer ships. Read from history rather than hardcoded, so an arm stages a root
|
|
104
|
+
# the walk will actually recognize instead of a name that has since come back.
|
|
105
|
+
# `prompts` is preferred because it is the case measured in a real target, and
|
|
106
|
+
# any other dropped root exercises the same walk.
|
|
107
|
+
pick_dropped_root() {
|
|
108
|
+
local preferred="prompts"
|
|
109
|
+
local first=""
|
|
110
|
+
local candidate
|
|
111
|
+
|
|
112
|
+
while IFS= read -r candidate; do
|
|
113
|
+
[ -e "$PROJECT_ROOT/$candidate" ] && continue
|
|
114
|
+
[ "$candidate" = "$preferred" ] && {
|
|
115
|
+
echo "$preferred"
|
|
116
|
+
return 0
|
|
117
|
+
}
|
|
118
|
+
[ -n "$first" ] || first="$candidate"
|
|
119
|
+
done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --name-only --format= |
|
|
120
|
+
awk -F/ 'NF > 1 { print $1 }' | sort -u)
|
|
121
|
+
|
|
122
|
+
echo "$first"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Restores one file's exact published bytes from the commit before it was
|
|
126
|
+
# deleted. Content is what the attribution matches on, so a file written by hand
|
|
127
|
+
# would report unattributed and an arm would assert the wrong verdict.
|
|
128
|
+
#
|
|
129
|
+
# Both reads take the whole listing through a process substitution rather than a
|
|
130
|
+
# pipeline ending in an early exit. `set -o pipefail` is on, and a `grep -m 1`
|
|
131
|
+
# that matches the first line closes the pipe while git is still writing, so the
|
|
132
|
+
# substitution returns git's SIGPIPE status and the arm fails on a listing it
|
|
133
|
+
# actually read.
|
|
134
|
+
restore_dropped_file() {
|
|
135
|
+
local root="$1"
|
|
136
|
+
local rel="" commit="" line
|
|
137
|
+
|
|
138
|
+
while IFS= read -r line; do
|
|
139
|
+
case "$line" in
|
|
140
|
+
"$root"/*)
|
|
141
|
+
rel="$line"
|
|
142
|
+
break
|
|
143
|
+
;;
|
|
144
|
+
esac
|
|
145
|
+
done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --name-only \
|
|
146
|
+
--format= -- "$root/")
|
|
147
|
+
|
|
148
|
+
[ -n "$rel" ] || return 1
|
|
149
|
+
|
|
150
|
+
while IFS= read -r line; do
|
|
151
|
+
commit="$line"
|
|
152
|
+
break
|
|
153
|
+
done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --format=%H -- "$rel")
|
|
154
|
+
|
|
155
|
+
[ -n "$commit" ] || return 1
|
|
156
|
+
|
|
157
|
+
mkdir -p "$(dirname "$rel")"
|
|
158
|
+
git -C "$PROJECT_ROOT" show "$commit^:$rel" >"$rel" || return 1
|
|
159
|
+
|
|
160
|
+
echo "$rel"
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Stages one step of a scenario arm into the sandbox working directory.
|
|
164
|
+
# Scenarios call this once per step so their own git operations stay between
|
|
165
|
+
# the steps, where they are visible.
|
|
166
|
+
stage_fixtures() {
|
|
167
|
+
local category="$1"
|
|
168
|
+
local scenario="$2"
|
|
169
|
+
local arm="$3"
|
|
170
|
+
local stage="$4"
|
|
171
|
+
|
|
172
|
+
local stage_dir
|
|
173
|
+
stage_dir="$(fixture_stage_dir "$category" "$scenario" "$arm" "$stage")"
|
|
174
|
+
|
|
175
|
+
if [ ! -d "$stage_dir" ]; then
|
|
176
|
+
log_error "Fixture stage not found: $category/$scenario/$arm/$stage"
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
assert_fixtures_suffixed "$stage_dir/create"
|
|
180
|
+
assert_fixtures_suffixed "$stage_dir/append"
|
|
181
|
+
|
|
182
|
+
local staged
|
|
183
|
+
staged=$(($(count_fixture_files "$stage_dir/create") + \
|
|
184
|
+
$(count_fixture_files "$stage_dir/append")))
|
|
185
|
+
if [ "$staged" -eq 0 ]; then
|
|
186
|
+
log_error "Fixture stage provisions nothing: $category/$scenario/$arm/$stage"
|
|
187
|
+
fi
|
|
188
|
+
|
|
189
|
+
create_from_fixtures "$stage_dir/create"
|
|
190
|
+
append_from_fixtures "$stage_dir/append"
|
|
191
|
+
}
|