@erclx/canon 5.35.0 → 5.36.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/README.md +11 -11
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/canon-cli/REQUIREMENT.md +2 -2
- package/claude/skills/canon-cli/SKILL.md +2 -1
- package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
- package/claude/skills/canvas-board/SKILL.md +2 -2
- package/claude/skills/canvas-board/references/design.md +53 -36
- package/claude/skills/codebase-layout/REQUIREMENT.md +1 -1
- package/claude/skills/codebase-layout/SKILL.md +2 -2
- package/claude/skills/create-rule/REQUIREMENT.md +6 -8
- package/claude/skills/create-rule/SKILL.md +8 -8
- package/claude/skills/create-rule/references/rule.md +11 -23
- package/claude/skills/create-skill/references/skill.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +6 -6
- package/claude/skills/design-taste/SKILL.md +2 -2
- package/claude/skills/design-taste/references/craft.md +1 -1
- package/claude/skills/design-taste/references/preflight.md +2 -2
- package/claude/skills/design-taste/references/tells.md +1 -1
- package/claude/skills/draft-identity/SKILL.md +3 -2
- package/claude/skills/markdown-craft/references/markdown.md +3 -2
- package/claude/skills/plan-feature/SKILL.md +1 -1
- package/claude/skills/review-craft/references/ui.md +1 -1
- package/claude/skills/test-craft/SKILL.md +2 -2
- package/claude/skills/ux-audit/REQUIREMENT.md +1 -1
- package/claude/skills/ux-audit/SKILL.md +2 -2
- package/claude/skills/ux-measure/REQUIREMENT.md +1 -1
- package/claude/skills/write-human/references/machine-tells.md +12 -0
- package/docs/agents/commands.md +12 -9
- package/docs/agents/comments.md +1 -1
- package/docs/agents/gov-detect.md +1 -1
- package/docs/agents/index.md +1 -1
- package/docs/agents/install-and-sync.md +4 -4
- package/docs/agents/markdown-audit.md +12 -0
- package/docs/agents/output-shape.md +1 -1
- package/docs/agents/overview.md +2 -2
- package/docs/agents/rule-citations.md +5 -10
- package/docs/agents/scripting.md +1 -1
- package/docs/target/projects.md +2 -2
- package/docs/target/scenarios.md +5 -5
- package/docs/workflow/ai-workflow.md +1 -1
- package/docs/workflow/visual-design-workflow.md +3 -3
- package/governance/detect.toml +32 -32
- package/governance/renames.toml +44 -0
- package/governance/rules/lib/{305-e2e-reliability.md → e2e-reliability.md} +1 -1
- package/governance/rules/lib/{306-test-scope.md → test-scope.md} +2 -2
- package/governance/rules/ui/{410-a11y.md → a11y.md} +1 -1
- package/governance/rules/ui/{440-surface-capture.md → surface-capture.md} +3 -3
- package/governance/stacks/base.toml +6 -6
- package/governance/stacks/go.toml +1 -1
- package/governance/stacks/node.toml +1 -1
- package/governance/stacks/php.toml +1 -1
- package/governance/stacks/python.toml +1 -1
- package/package.json +1 -1
- package/scripts/core/install-check.sh +2 -7
- package/src/capture/frame-values.ts +3 -6
- package/src/cli/help-all.ts +96 -0
- package/src/cli/help.ts +27 -26
- package/src/cli.ts +8 -1
- package/src/commands/claude.ts +29 -0
- package/src/commands/design.ts +22 -1
- package/src/commands/gov.ts +25 -3
- package/src/commands/init.ts +10 -1
- package/src/commands/markdown.ts +96 -3
- package/src/commands/records.ts +1 -1
- package/src/commands/sync.ts +11 -0
- package/src/commands/tooling.ts +8 -0
- package/src/design/budget.ts +14 -10
- package/src/design/document.ts +5 -5
- package/src/design/parse.ts +21 -4
- package/src/design/render.ts +3 -3
- package/src/gate/measures.ts +1 -1
- package/src/gov/citations.ts +10 -33
- package/src/gov/stacks.ts +3 -3
- package/src/inventory/subjects.ts +1 -1
- package/src/markdown/ceiling.ts +6 -1
- package/src/markdown/colons.ts +86 -0
- package/src/markdown/gate.ts +15 -0
- package/src/markdown/heading-case.ts +74 -0
- package/src/shipped/references.ts +14 -14
- package/src/sync/copy.ts +4 -5
- package/tooling/astro/manifest.toml +0 -1
- package/tooling/astro/reference.md +0 -8
- package/tooling/base/configs/scripts/verify.json +1 -1
- package/tooling/base/configs/scripts/verify.ts +22 -6
- package/tooling/base/manifest.toml +6 -5
- package/tooling/base/reference.md +15 -22
- package/tooling/base/seeds/.github/workflows/verify.yml +0 -6
- package/tooling/base/seeds/.lintstagedrc +1 -2
- package/tooling/base/seeds/canon/context/ci.md +4 -5
- package/tooling/base/seeds/canon/context/development.md +2 -2
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +1 -1
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +27 -2
- package/tooling/claude/seeds/CLAUDE.md +1 -1
- package/tooling/claude/seeds/canon/DESIGN.md +24 -37
- package/tooling/shell/configs/.github/workflows/shell.yml +30 -0
- package/tooling/shell/manifest.toml +12 -0
- package/tooling/shell/reference.md +46 -0
- package/tooling/vite-react/manifest.toml +0 -1
- package/tooling/vite-react/reference.md +0 -8
- package/tooling/web/configs/.github/workflows/readme-screenshot.yml +3 -5
- package/tooling/web/configs/.github/workflows/verify.yml +0 -6
- package/tooling/web/manifest.toml +1 -1
- package/tooling/web/reference.md +3 -3
- package/tooling/base/configs/scripts/verify.sh +0 -2
- /package/governance/rules/canon/{606-git.md → git.md} +0 -0
- /package/governance/rules/canon/{611-indexes.md → indexes.md} +0 -0
- /package/governance/rules/canon/{604-scratch.md → scratch.md} +0 -0
- /package/governance/rules/canon/{602-tasks.md → task-scope.md} +0 -0
- /package/governance/rules/canon/{605-worktrees.md → worktrees.md} +0 -0
- /package/governance/rules/claude/{566-output.md → output.md} +0 -0
- /package/governance/rules/code/{000-code.md → routing.md} +0 -0
- /package/governance/rules/code/{010-testing.md → testing.md} +0 -0
- /package/governance/rules/framework/{210-astro.md → astro.md} +0 -0
- /package/governance/rules/framework/{220-fastapi.md → fastapi.md} +0 -0
- /package/governance/rules/framework/{230-nextjs.md → nextjs.md} +0 -0
- /package/governance/rules/framework/{200-react.md → react.md} +0 -0
- /package/governance/rules/framework/{260-shadcn.md → shadcn.md} +0 -0
- /package/governance/rules/framework/{250-tailwind.md → tailwind.md} +0 -0
- /package/governance/rules/lang/{130-go.md → go.md} +0 -0
- /package/governance/rules/lang/{140-php.md → php.md} +0 -0
- /package/governance/rules/lang/{110-python.md → python.md} +0 -0
- /package/governance/rules/lang/{100-typescript.md → typescript.md} +0 -0
- /package/governance/rules/lib/{370-database.md → database.md} +0 -0
- /package/governance/rules/lib/{340-pydantic.md → pydantic.md} +0 -0
- /package/governance/rules/lib/{360-security-server.md → security-server.md} +0 -0
- /package/governance/rules/lib/{350-security-web.md → security-web.md} +0 -0
- /package/governance/rules/lib/{320-tanstack-query.md → tanstack-query.md} +0 -0
- /package/governance/rules/lib/{335-testing-go.md → testing-go.md} +0 -0
- /package/governance/rules/lib/{336-testing-php.md → testing-php.md} +0 -0
- /package/governance/rules/lib/{330-testing-py.md → testing-py.md} +0 -0
- /package/governance/rules/lib/{300-testing-ts.md → testing-ts.md} +0 -0
- /package/governance/rules/lib/{310-zod.md → zod.md} +0 -0
- /package/governance/rules/tooling/{700-ci-workflow.md → ci-workflow.md} +0 -0
- /package/governance/rules/tooling/{790-code-comments.md → code-comments.md} +0 -0
- /package/governance/rules/tooling/{780-config-comments.md → config-comments.md} +0 -0
- /package/governance/rules/tooling/{775-dependencies.md → dependencies.md} +0 -0
- /package/governance/rules/ui/{480-canvas.md → canvas.md} +0 -0
- /package/governance/rules/ui/{400-ui.md → copy.md} +0 -0
- /package/governance/rules/ui/{460-design-taste.md → design-taste.md} +0 -0
- /package/governance/rules/ui/{420-forms.md → forms.md} +0 -0
- /package/governance/rules/ui/{465-interface-casing.md → interface-casing.md} +0 -0
- /package/governance/rules/ui/{450-link-behavior.md → link-behavior.md} +0 -0
- /package/governance/rules/ui/{470-motion.md → motion.md} +0 -0
- /package/governance/rules/ui/{430-ux-completeness.md → ux-completeness.md} +0 -0
- /package/tooling/{base → shell}/configs/.editorconfig +0 -0
- /package/tooling/{base → shell}/configs/.shellcheckrc +0 -0
|
@@ -24,7 +24,7 @@ Read these in parallel from the project root, skipping any that do not exist:
|
|
|
24
24
|
|
|
25
25
|
Also read these when the feature touches code or UI. Skip them for prose, docs, catalog, or config-only changes:
|
|
26
26
|
|
|
27
|
-
- `canon/DESIGN.md`:
|
|
27
|
+
- `canon/DESIGN.md`: visual intent and component rules, with values read from the stylesheet its lead names
|
|
28
28
|
|
|
29
29
|
Coding standards live in `.claude/rules/`. Claude Code loads them automatically. Path-scoped rules apply to the files they match.
|
|
30
30
|
|
|
@@ -59,7 +59,7 @@ A second theme earns a read only when the diff touches a color token. Name the s
|
|
|
59
59
|
|
|
60
60
|
## Comparing
|
|
61
61
|
|
|
62
|
-
Check each opened image against the layout its checklist box claims, and check
|
|
62
|
+
Check each opened image against the layout its checklist box claims, and check the tokens the image makes visible, being color, type scale, and spacing, against the stylesheet `canon/DESIGN.md`'s lead names, and its component rules against the record itself.
|
|
63
63
|
|
|
64
64
|
Read the width and theme from whatever the image path carries, and fix no width list, since which widths matter belongs to the project. Skip the design file comparison silently when the project has none.
|
|
65
65
|
|
|
@@ -105,5 +105,5 @@ Run the final filter over every test written this session, checking each line. A
|
|
|
105
105
|
|
|
106
106
|
- The red, green, refactor procedure and its order: `test-first`, which loads this skill at its first step
|
|
107
107
|
- Reproducing a failure with no known cause: `systematic-debugging`
|
|
108
|
-
- Runner, file suffix, placement, and query conventions per language: `
|
|
109
|
-
- Settle, guard, and run-scope rules inside an end to end file: `
|
|
108
|
+
- Runner, file suffix, placement, and query conventions per language: `testing-ts`, `testing-py`, `testing-go`, and `testing-php`
|
|
109
|
+
- Settle, guard, and run-scope rules inside an end to end file: `e2e-reliability` and `test-scope`
|
|
@@ -37,4 +37,4 @@ The pass slides into fixing what it finds, and then the audit and the change lan
|
|
|
37
37
|
- Feature planning, which `plan-feature` owns
|
|
38
38
|
- Verifying one specific change, which `ui-checklist` owns
|
|
39
39
|
- Defining the intent it audits against, which the design document owns
|
|
40
|
-
- Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns. Contrast stays here rather than going with it, being computable from two color values this skill already reads off the
|
|
40
|
+
- Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns. Contrast stays here rather than going with it, being computable from two color values this skill already reads off the stylesheet's custom properties.
|
|
@@ -10,14 +10,14 @@ metadata:
|
|
|
10
10
|
## Guards
|
|
11
11
|
|
|
12
12
|
- If no UI files exist in the project (no JSX, TSX, Vue, Svelte, or HTML under `src/`), stop: `❌ No UI surfaces found to audit.`
|
|
13
|
-
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ux-measure`. This skill reads source and reaches no number a browser produces. Contrast is the exception and stays here, since it is computable from
|
|
13
|
+
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ux-measure`. This skill reads source and reaches no number a browser produces. Contrast is the exception and stays here, since it is computable from two color values in the stylesheet's custom properties, which the design document's lead names.
|
|
14
14
|
|
|
15
15
|
## Step 1: read context
|
|
16
16
|
|
|
17
17
|
Read these in parallel from the project root, skipping any that do not exist:
|
|
18
18
|
|
|
19
19
|
- `CLAUDE.md`: project type and conventions
|
|
20
|
-
- `canon/DESIGN.md`: visual intent,
|
|
20
|
+
- `canon/DESIGN.md`: visual intent, typography, and spacing rules, plus the stylesheet its lead names for the values
|
|
21
21
|
- `canon/REQUIREMENTS.md`: feature scope and non-goals
|
|
22
22
|
- A committed capture beside the surface's own source, when the project has one. A rendered surface reads differently composed than it reads written, and a capture is the only artifact here that shows the composed result rather than the markup. Absent one, note that this audit reads source only, and keep going. This is a stated fallback, not a stop: a project with no capture yet, or a capture mid-rebuild, still gets a source-only audit rather than losing the skill entirely.
|
|
23
23
|
|
|
@@ -43,7 +43,7 @@ A session that does start one picks a runner on the spot. The reading then comes
|
|
|
43
43
|
## Out of scope
|
|
44
44
|
|
|
45
45
|
- Judging the interface against stated intent, which `ux-audit` owns
|
|
46
|
-
- Contrast, which is computable from two color values in the
|
|
46
|
+
- Contrast, which is computable from two color values in the stylesheet `ux-audit` already reads. A contrast failure from a color computed at runtime stays invisible to that reader, and the cost is accepted rather than overlooked.
|
|
47
47
|
- Network waterfall, bundle size, and accessibility, which no version of this measures
|
|
48
48
|
- Writing behavioral tests against the interface, which `test-first` and `test-craft` own
|
|
49
49
|
- Fixing what the reading found
|
|
@@ -21,6 +21,7 @@ Work top down. The first three account for most of what a reader calls machine-w
|
|
|
21
21
|
- [Question as transition](#question-as-transition)
|
|
22
22
|
- [Escalating parallel clauses](#escalating-parallel-clauses)
|
|
23
23
|
- [Empty superlative frames](#empty-superlative-frames)
|
|
24
|
+
- [A colon or comma where the dash was](#a-colon-or-comma-where-the-dash-was)
|
|
24
25
|
|
|
25
26
|
## Rule of three
|
|
26
27
|
|
|
@@ -118,3 +119,14 @@ Fix by writing the two claims as two sentences, or by cutting the one that repea
|
|
|
118
119
|
`one of the most important`, `a critical piece of`, `at the heart of`. The frame ranks a thing against a set the sentence never names.
|
|
119
120
|
|
|
120
121
|
Fix by stating what the thing does. A ranking survives only where the set is named and the position is measured.
|
|
122
|
+
|
|
123
|
+
## A colon or comma where the dash was
|
|
124
|
+
|
|
125
|
+
An agent told to remove an em dash swaps in a colon or a comma and leaves the sentence as it was. The join is the same and so is the pause the dash made, which is the habit the ban was written against.
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
Bad: The hook fires on every edit: it reads the record the verb wrote.
|
|
129
|
+
Good: The hook fires on every edit and reads the record the verb wrote.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Fix by splitting the sentence in two, or by cutting the clause that only restates the first. A colon after a label or before a list is not this tell.
|
package/docs/agents/commands.md
CHANGED
|
@@ -5,7 +5,9 @@ description: Every top-level command with its purpose, each domain's subcommands
|
|
|
5
5
|
|
|
6
6
|
# Command catalog
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Bare `canon --help` lists every top-level command under five headings, Project, Domains, Author and render, Session and ship, and Repo reports, with descriptions cut at 80 columns. A pipe gets the same text without the frame glyphs. Behavior notes for the install and sync verbs live in `install-and-sync.md`.
|
|
9
|
+
|
|
10
|
+
`canon <command> --help` lists subcommands, and `canon <command> <subcommand> --help` a leaf's flags, exit codes, and examples. `canon <command> --help --all` prints both. An unknown subcommand exits 1 under a group taking no operand.
|
|
9
11
|
|
|
10
12
|
## Project-level
|
|
11
13
|
|
|
@@ -78,11 +80,11 @@ query = "button, a[href], input, select, textarea, [tabindex]"
|
|
|
78
80
|
|
|
79
81
|
## Domain commands
|
|
80
82
|
|
|
81
|
-
Each domain exposes a consistent shape where applicable: `list`, `install`, `sync`, `create`. The page named beside a domain carries its flags, records, and refusals, and `canon <domain> --help`
|
|
83
|
+
Each domain exposes a consistent shape where applicable: `list`, `install`, `sync`, `create`. The page named beside a domain carries its flags, records, and refusals, and `canon <domain> --help --all` prints every subcommand's flags.
|
|
82
84
|
|
|
83
85
|
- `migrate`, in `migrate.md`: `rename`, `skill-names`, `records`, `surface-roots`, `record-tree`, `rule-layout`, `scratch-evidence`, `record-layout`
|
|
84
86
|
- `targets`, in `targets.md`: `list`, `pulls`
|
|
85
|
-
- `gov`, in `install-and-sync.md`: `list`, `install`, `sync`, `build`, `regen`, `test-order`, `counts`, `superseded`, `citations`, `restated`
|
|
87
|
+
- `gov`, in `install-and-sync.md`: `list`, `install`, `sync`, `build`, `regen`, `detect` (in `gov-detect.md`), `test-order`, `counts`, `superseded`, `citations`, `restated`
|
|
86
88
|
- `tooling`, in `install-and-sync.md`: `list`, `sync`, `diff`, `reference`, `verify`, `inject`, `prune-gitignore`
|
|
87
89
|
- `claude`, in `skills-audit.md`: `init`, `sync`, `setup`, `routing`, `plugin-update`, `seeds list`, `skills list`, `skills audit`, `skills drift`, `skills reach`, `skills rank`
|
|
88
90
|
- `wiki`, in `scripting.md`: `init`
|
|
@@ -92,16 +94,17 @@ Each domain exposes a consistent shape where applicable: `list`, `install`, `syn
|
|
|
92
94
|
- `slides`, described below: `render`, `list`
|
|
93
95
|
- `demo`, in `demo.md`: `compile`, `run`, `frames`
|
|
94
96
|
- `inventory`, described above: `run`
|
|
95
|
-
- `teach`, in `teach.md`: `list`, `open`, `resource`, `glossary`, `lesson`, `stylesheet`, `nav`, `render`
|
|
96
|
-
- `canvas`, described below: `serve`, `list`, `page add`, `page rename`, `frame add`, `frame move`, `frame resize`, `selection`, `edit`, `editing`, `capture`
|
|
97
|
-
- `sandbox`, in `sandbox.md`: `reset`, `clean`, `check`, `coverage`
|
|
97
|
+
- `teach`, in `teach.md`: `list`, `up`, `open`, `resource`, `glossary`, `lesson`, `stylesheet`, `nav`, `render`
|
|
98
|
+
- `canvas`, described below: `serve`, `list`, `page add`, `page rename`, `frame add`, `frame move`, `frame resize`, `fit`, `arrange`, `selection`, `edit`, `editing`, `capture`
|
|
99
|
+
- `sandbox`, in `sandbox.md`: `run`, `equivalence`, `reset`, `clean`, `check`, `coverage`
|
|
98
100
|
- `tasks`, in `tasks.md`: `next-label`, `archive`, `decline`, `plan-citations`, `plan-answers`, `plan-branch`, `plan-reach`, `plan-link`, `pull-request`, `outcome`, `list`, `validate`
|
|
99
101
|
- `intake`, in `intake.md`: `list`, `answer`
|
|
100
|
-
- `records`, in `records.md`: `validate`, `
|
|
102
|
+
- `records`, in `records.md`: `validate`, `ordinal`, `size`, `stale`, `prune-tmp`, `push`, `pull`
|
|
101
103
|
- `sessions`, in `sessions.md`: `list`, `export`, `import`
|
|
102
|
-
- `worktrees`, in `worktrees.md`: `list`, `reclaim`
|
|
104
|
+
- `worktrees`, in `worktrees.md`: `list`, `reclaim`, `repair-bare-flag` (hidden)
|
|
103
105
|
- `hooks`, in `hooks.md`: `post-merge`
|
|
104
|
-
- `pr`, in `pr-reads.md`: `key-changes`, `head`, `checks`, `review-state`, `evidence`, `preview`, `local`, `frames`, `lift` (in `pr-lift.md`)
|
|
106
|
+
- `pr`, in `pr-reads.md`: `key-changes`, `head`, `checks`, `review-state`, `evidence`, `preview`, `local`, `frames`, `lift` (in `pr-lift.md`), `tick` (in `pr-tick.md`)
|
|
107
|
+
- `upstream`, in `upstream.md`: `fetch`, `catalog`, `due`, `advance`
|
|
105
108
|
- `audits`, in `audits.md`: `run`, `list`
|
|
106
109
|
- `gate`, in `gate.md`: `run`
|
|
107
110
|
- `secrets`, in `state-scoped-risk.md`: `scan`
|
package/docs/agents/comments.md
CHANGED
|
@@ -29,6 +29,6 @@ This works only because density is a pure function of a tree. Which author or se
|
|
|
29
29
|
|
|
30
30
|
## Degradation sweep
|
|
31
31
|
|
|
32
|
-
The degradation sweep reads its vocabulary from whichever rule publishes a `## Degradation vocabulary` heading, preferring `.claude/rules/` over `governance/rules/`, so one definition serves the toolkit and every target. Discovery anchors on the heading rather than a filename, because a
|
|
32
|
+
The degradation sweep reads its vocabulary from whichever rule publishes a `## Degradation vocabulary` heading, preferring `.claude/rules/` over `governance/rules/`, so one definition serves the toolkit and every target. Discovery anchors on the heading rather than a filename, because a renamed rule would otherwise empty the vocabulary while the sweep still reported clean. With no such rule the sweep reports **skipped** rather than zero hits, since finding nothing and looking for nothing mean opposite things.
|
|
33
33
|
|
|
34
34
|
`090-code-comments` is the rule that publishes the list, and it ships on the `base` stack. A project that installs or syncs governance for the first time after that rule landed gets a sweep that previously reported skipped, so hits appear where the command used to stay quiet. Edit the backticked terms in the installed copy to change what that project sweeps for. The sweep matches comment text, so a comment naming a term as an example is a hit, and a hit is a prompt to read the line rather than a verdict on it.
|
package/docs/agents/index.md
CHANGED
|
@@ -49,7 +49,7 @@ CLI catalog and invocation rules for agents, split by command domain. Start with
|
|
|
49
49
|
- [Records](records.md): The two roots a record folder resolves at, claiming the ordinal intake and groundwork share, reading each folder's size and growth, pruning stale scratch, and where validation, the canonical review count, and the private-remote backup are described
|
|
50
50
|
- [Restated instructions](restated.md): Counting the instructions the always-loaded file and every path-scoped rule share with the seed, the skill bodies, and each other, how a match is decided, the three classes, which surface a later edit starts from, and why the sweep reports rather than gates
|
|
51
51
|
- [Routing report](routing.md): Reading per CLAUDE.md section how many bullets name a path, what counts as naming one, when a rule counts as covering it, the two refusals, and why the verb reports rather than gates
|
|
52
|
-
- [Rule citations](rule-citations.md): Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the
|
|
52
|
+
- [Rule citations](rule-citations.md): Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the one form a citation is written in, the shapes that look like citations and are not, the two classes where an absent path is correct, why the glob half reads one corpus, and why this one gates
|
|
53
53
|
- [Sandbox](sandbox.md): Scenario routing, the expectation scoring surface, and the coverage census over scenarios and skills
|
|
54
54
|
- [Scripting](scripting.md): The runtime catalogs that replace hardcoded names, what each carries, and a headless invocation per domain
|
|
55
55
|
- [Sessions transfer](sessions-transfer.md): Moving a session to another machine, the export bundle and its manifest, placing it with import, the refusal reasons, and what a resume on the target depends on
|
|
@@ -19,7 +19,7 @@ removes a stale `.claude/GOV.md` from the retired build. Use
|
|
|
19
19
|
|
|
20
20
|
Everything under `.claude/rules/canon/` belongs to the toolkit, so a rule
|
|
21
21
|
there that the toolkit no longer ships is deleted on sync, edited or not. That
|
|
22
|
-
is how a retired rule stops loading in a target. A renamed
|
|
22
|
+
is how a retired rule stops loading in a target. A renamed rule
|
|
23
23
|
the toolkit declares in `governance/renames.toml` moves instead: the sync
|
|
24
24
|
installs the rule under its new name and deletes the old file, whether or not
|
|
25
25
|
the target's stamp records a stack. Local edits to the old file are not
|
|
@@ -34,9 +34,9 @@ groundwork, intake, session, design, readme, and rule copies are deleted as
|
|
|
34
34
|
retired. The markdown rule is hand-written at `writing/markdown.md` and names
|
|
35
35
|
the `markdown-craft` skill, and `800-prose` retires.
|
|
36
36
|
|
|
37
|
-
A project's own rules belong under `.claude/rules/project/`, where
|
|
38
|
-
the
|
|
39
|
-
|
|
37
|
+
A project's own rules belong under `.claude/rules/project/`, where a slug
|
|
38
|
+
the toolkit also ships collides with nothing, and a rule placed under `canon/`
|
|
39
|
+
instead is lost on the next sync.
|
|
40
40
|
|
|
41
41
|
A sync never deletes a rule that a newer canon release installed. The stamp
|
|
42
42
|
records the newest release that synced governance, and an older binary holds
|
|
@@ -55,6 +55,16 @@ A relative link's destination resolves against the filesystem, over the same cor
|
|
|
55
55
|
|
|
56
56
|
The placeholder exemption is the one live case the corpus needs. Every current instance is a genuine illustration rather than a literal path, and a marker-based override is available for the day a real one needs an exception instead.
|
|
57
57
|
|
|
58
|
+
### Colons and heading case
|
|
59
|
+
|
|
60
|
+
Two advisory measures report beside the bans and never fail a run.
|
|
61
|
+
|
|
62
|
+
The colon measure reports a colon followed by more text in a prose line, outside the label position. A list item's first colon, a bold or code span label, a line-final colon, a time, a URL, and anything inside a code span or a link are left alone. A heading, a table row, and a fenced line are skipped. Each finding carries the line, the column, the line's text, and the word before the colon as `lead` under `colons` in the `--json` entry.
|
|
63
|
+
|
|
64
|
+
The heading-case measure reports a heading or a frontmatter `title` with a capitalized word after its first, outside code spans and all-caps tokens, under `headingCase`. A proper noun reports as well and is left as it is.
|
|
65
|
+
|
|
66
|
+
`CHANGELOG.md` is exempt from both, since the release tool writes its headings.
|
|
67
|
+
|
|
58
68
|
### Weight, cadence, and length
|
|
59
69
|
|
|
60
70
|
Bullet and paragraph weight, run depth, the two cadence numbers, and the document length ceiling are each a judgment a reader settles rather than a fact a scan settles. What each measures, the samples behind its checkpoint, and why none of them gates are in `markdown-audit-weight.md`.
|
|
@@ -95,6 +105,8 @@ The target push stage excludes `CHANGELOG.md`, unlike every other surface here.
|
|
|
95
105
|
|
|
96
106
|
The hook prefers a checkout's own `src/cli.ts` over a globally installed binary, so it and the push stage read one build. A published binary lags a branch by whatever has not been released, which would put a ban kind added on the branch into the push and not into the edit. It reads its findings out of the `--json` record rather than off the exit code, so an older binary still reports where the fallback applies. It reads `bans.emptySets` out of the same record, so a set the verb shipped empty reaches the author as a check narrowed to what it could measure rather than as a clean pass.
|
|
97
107
|
|
|
108
|
+
It also relays the two advisory measures from the same record. A heading finding reports for the whole file, and a colon finding reports only where the word before the colon and the colon appear in the text the write carried, so an edit is never asked to answer for a colon it left untouched.
|
|
109
|
+
|
|
98
110
|
That field replaced `bans.missingStandards`, which answered a standard resolving under none of three roots. The set ships with the package now, so the state it named cannot occur and the narrowed check has one cause left, a defect in the build. The hook keeps reading a field either way, since a reader cannot tell a narrowed check from a clean one without it.
|
|
99
111
|
|
|
100
112
|
Both hooks answer an absent record as well. A completed run always writes the record and a refusal writes none, so an empty one means the verb declined to measure rather than measured and found nothing. The verb needs a git repository to build its corpus and refuses without one, which is a project the seeded hook can be installed into, and reading the findings alone reported that as a clean file.
|
|
@@ -40,7 +40,7 @@ Rules:
|
|
|
40
40
|
└
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
Help skips the banner. The `Usage:` line sits directly on `├`. Help writes to stdout because `--help` is documentation, not runtime UI.
|
|
43
|
+
Help skips the banner. The `Usage:` line sits directly on `├`. Help writes to stdout because `--help` is documentation, not runtime UI. `--help --all` on a command prints each block unframed, one after another, and a help request naming an unknown subcommand, under a group that takes no operand of its own, writes its refusal to stderr and exits 1.
|
|
44
44
|
|
|
45
45
|
## JSON and `--names` modes
|
|
46
46
|
|
package/docs/agents/overview.md
CHANGED
|
@@ -11,7 +11,7 @@ This folder is an index of what an agent can run and how to run it cleanly from
|
|
|
11
11
|
|
|
12
12
|
## Invocation rules
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
`output-shape.md` holds the stream and exit contract. It applies to every command in this folder.
|
|
15
15
|
|
|
16
16
|
## Where to start
|
|
17
17
|
|
|
@@ -21,6 +21,6 @@ See `CLAUDE.md` design principles. They apply to every command in this folder.
|
|
|
21
21
|
|
|
22
22
|
## Related
|
|
23
23
|
|
|
24
|
-
- `CLAUDE.md`: project behaviors
|
|
24
|
+
- `CLAUDE.md`: project behaviors
|
|
25
25
|
- `.claude/skills/internal-*`: domain-scoped guidance for editing work, in the toolkit checkout only
|
|
26
26
|
- `docs/index.md`: full docs directory
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Rule citations
|
|
3
|
-
description: Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the
|
|
3
|
+
description: Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the one form a citation is written in, the shapes that look like citations and are not, the two classes where an absent path is correct, why the glob half reads one corpus, and why this one gates
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Rule citations
|
|
@@ -28,14 +28,9 @@ Under `--json` the record holds stdout alone and the frame still renders on stde
|
|
|
28
28
|
|
|
29
29
|
Two files agreeing is what a drift check measures. Whether either one is right about the tree is a different question, and this is the stage that asks it.
|
|
30
30
|
|
|
31
|
-
## The
|
|
31
|
+
## The one form
|
|
32
32
|
|
|
33
|
-
A citation reaches a reader
|
|
34
|
-
|
|
35
|
-
| Form | Shape | Resolves against |
|
|
36
|
-
| --------- | ------------------------ | ---------------------------------- |
|
|
37
|
-
| `path` | a backticked path | the root |
|
|
38
|
-
| `sibling` | a bare `<nnn>-<slug>.md` | the folder the citing rule sits in |
|
|
33
|
+
A citation reaches a reader as a backticked path, reported under the form `path`, and it resolves against the root. A bare filename is never a citation, since with no folder around it nothing tells a rule from a convention such as `index.md`. A rule pointing at another rule writes its repository path.
|
|
39
34
|
|
|
40
35
|
A call to the retired standards verb is no form here. A rule holding one fails the shipped-references stage of `canon gate run`, which reads every shipped file for it.
|
|
41
36
|
|
|
@@ -46,7 +41,7 @@ A `path` is anchored on the whole backticked span rather than on a trailing patt
|
|
|
46
41
|
A rule body is full of backticked spans carrying a slash, and almost none of them names a file in this tree. The stage declines four shapes outright.
|
|
47
42
|
|
|
48
43
|
- A placeholder or glob segment describes a shape rather than naming a file: `canon/context/<domain>.md`, `app/**/route.ts`, `${CLAUDE_SKILL_DIR}/../references/<name>.md`.
|
|
49
|
-
- A bare filename names a convention: `route.ts`, `manifest.toml`, `components.json`, `playwright.config.ts`.
|
|
44
|
+
- A bare filename names a convention: `route.ts`, `manifest.toml`, `components.json`, `playwright.config.ts`.
|
|
50
45
|
- A span carrying no file extension is a folder or a module specifier: `src/pages/`, `next/font`, `try/except`, `react-hooks/set-state-in-effect`, `oven-sh/setup-bun@v2`, `@/lib/utils`.
|
|
51
46
|
- A fenced block displays a path rather than pointing at one.
|
|
52
47
|
|
|
@@ -70,7 +65,7 @@ A rule under `governance/rules/` installs into a target, and its `paths:` entrie
|
|
|
70
65
|
|
|
71
66
|
`internal/rules/` ships nowhere. The tree it governs is the tree present, which makes the question answerable, and all 14 of its globs across 7 rules match at the commit this shipped on.
|
|
72
67
|
|
|
73
|
-
What that leaves unreached is a glob that matches real files and still reaches none of the work it was scoped at. `governance/rules/lib/
|
|
68
|
+
What that leaves unreached is a glob that matches real files and still reaches none of the work it was scoped at. `governance/rules/lib/e2e-reliability.md` scoped itself at `e2e/*.ts` and `e2e/**/*.ts` and now reads `**/e2e/**/*.ts`. No probe in this repository is written under `e2e/`, so the rule asking a session to watch a new guard fail never fired for the session writing guards. Resolution is mechanical and reach is a judgment about where the work happens, so only the first is here.
|
|
74
69
|
|
|
75
70
|
## The exemption marker
|
|
76
71
|
|
package/docs/agents/scripting.md
CHANGED
|
@@ -79,7 +79,7 @@ CANON_NON_INTERACTIVE=1 canon tooling diff astro /path/to/project
|
|
|
79
79
|
CANON_NON_INTERACTIVE=1 canon tooling sync astro /path/to/project --write
|
|
80
80
|
|
|
81
81
|
# Install a governance stack (the stack argument is required headlessly)
|
|
82
|
-
CANON_NON_INTERACTIVE=1 canon gov install node --add
|
|
82
|
+
CANON_NON_INTERACTIVE=1 canon gov install node --add astro,shadcn /path/to/project
|
|
83
83
|
|
|
84
84
|
# Update installed governance rules, dropping a retired .claude/GOV.md
|
|
85
85
|
CANON_NON_INTERACTIVE=1 canon gov sync /path/to/project
|
package/docs/target/projects.md
CHANGED
|
@@ -72,7 +72,7 @@ Keep the `## Scripts` table in `canon/context/development.md` current as scripts
|
|
|
72
72
|
Scaffold installs tooling and seeds. It does not fill the planning docs or the design system. Complete those before the first feature session:
|
|
73
73
|
|
|
74
74
|
1. Fill `canon/REQUIREMENTS.md`. The seed asks for the problem in one line, then goals and non-goals, and the scope is yours to write. The seed states its own cap of 600 words, and `canon context audit` gates on it. Edit the number in the record to loosen it. A decision about how the project is built goes in the `canon/context/` entry of the domain it constrains.
|
|
75
|
-
2. For a UI project, write `canon/DESIGN.md` from the seed template, or work the direction out with `canon:canvas-board` and carry the pick in. Skip for non-UI projects.
|
|
75
|
+
2. For a UI project, write `canon/DESIGN.md` from the seed template and name the project's stylesheet in its lead, or work the direction out with `canon:canvas-board` and carry the pick in. Skip for non-UI projects.
|
|
76
76
|
3. Optionally invoke `canon:draft-figure` naming an architecture view, such as system context or components, and the document it belongs in. It draws the view from the context index, the folder layout, and the requirements and renders it to verify the layout, which downloads the Mermaid CLI on first use and takes about 15 seconds.
|
|
77
77
|
4. Start the feature loop. See [AI workflow](../workflow/ai-workflow.md) for the per-feature sequence.
|
|
78
78
|
|
|
@@ -88,7 +88,7 @@ Escalate for a project writing code. The `target-setup` skill reads `package.jso
|
|
|
88
88
|
|
|
89
89
|
In a monorepo the skill reads each folder holding a `package.json`, `pyproject.toml`, `go.mod`, `composer.json`, or `Cargo.toml` to depth two, skipping what git ignores. Each of those folders gets its own tooling stack and a `canon tooling sync <stack> <folder> --skip base` in the preview. Governance still installs once at the root, since a rule's `paths:` globs reach every subfolder, so a subfolder's language rules join the root install through `--add`.
|
|
90
90
|
|
|
91
|
-
The server-side security and persistence rules belong to no stack. `canon gov detect` proposes both from a server framework or database client in the manifest, which you confirm in the preview, or add them by hand with `--add
|
|
91
|
+
The server-side security and persistence rules belong to no stack. `canon gov detect` proposes both from a server framework or database client in the manifest, which you confirm in the preview, or add them by hand with `--add security-server,database`.
|
|
92
92
|
|
|
93
93
|
Markdown-heavy projects, CLI tools, docs sites, research notebooks, and scripting repos stay on `base`. Escalation is a ceiling move, not a default.
|
|
94
94
|
|
package/docs/target/scenarios.md
CHANGED
|
@@ -26,7 +26,7 @@ bun create vite my-app && cd my-app
|
|
|
26
26
|
claude
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
Invoke `canon:target-setup`. The skill reads `package.json` and the Vite config, resolves tooling to `vite-react` and governance to `node`, proposes `
|
|
29
|
+
Invoke `canon:target-setup`. The skill reads `package.json` and the Vite config, resolves tooling to `vite-react` and governance to `node`, proposes `react` and the other rules its manifest matches as extras, and runs `canon init` with the resolved flags.
|
|
30
30
|
|
|
31
31
|
Ongoing maintenance:
|
|
32
32
|
|
|
@@ -34,22 +34,22 @@ Ongoing maintenance:
|
|
|
34
34
|
- Seed drift: merge by hand against the toolkit copy
|
|
35
35
|
- Catch-all sync: `canon sync .`
|
|
36
36
|
- Governance rule refresh only: `canon gov sync .`
|
|
37
|
-
- Layer a new rule on top, for example `
|
|
37
|
+
- Layer a new rule on top, for example `shadcn` after adopting shadcn: `canon gov install node --add shadcn .`
|
|
38
38
|
|
|
39
39
|
## Monorepo with multiple language roots
|
|
40
40
|
|
|
41
41
|
The repo root owns the shared `base` layer, and each language lives in its own subfolder.
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
canon init --stack node --add
|
|
44
|
+
canon init --stack node --add react .
|
|
45
45
|
canon tooling sync vite-react ./frontend --skip base --write
|
|
46
46
|
canon tooling sync python ./backend --skip base --write
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
`--skip base` drops the `base` layer from each subtree sync, so husky, prettier, commitlint, and CI stay single at the repo root. The one exception is base's verify runner, `scripts/verify.
|
|
49
|
+
`--skip base` drops the `base` layer from each subtree sync, so husky, prettier, commitlint, and CI stay single at the repo root. The one exception is base's verify runner, `scripts/verify.ts` and `scripts/verify.json`, which every subtree still receives so it can verify on its own. Without it, every subtree re-drops husky, and since git honors only one `core.hooksPath` the extra hook dirs silently break. Each subtree still gets its own framework configs (eslint, vitest, tsconfig, vite), and its own stack reference reads through `canon tooling reference <stack>`.
|
|
50
50
|
|
|
51
51
|
A sync whose target sits below the git root knows it is writing into a subfolder:
|
|
52
52
|
|
|
53
53
|
- It withholds `.github/`, since GitHub reads workflows only at the repository root, and names each withheld file. Run the subtree from a job in the root workflow instead, with `working-directory` set to the subtree path the sync prints, such as `working-directory: frontend`.
|
|
54
54
|
- It installs no dependencies and adds no scripts to a subtree without a `package.json`. It names what it skipped and ends on `run 'bun init' in <path>, then sync again`.
|
|
55
|
-
- The subtree carries no `check` script, since that lives in the root's base layer, so run
|
|
55
|
+
- The subtree carries no `check` script, since that lives in the root's base layer, so run `bun scripts/verify.ts` there. It skips the format phases a subtree does not declare, since the root runs them, and still fails on a missing lint, typecheck, or test script, the phases its stack's `scripts/verify.json` requires.
|
|
@@ -17,7 +17,7 @@ Project docs split across three roots at the project root. What the project auth
|
|
|
17
17
|
```plaintext
|
|
18
18
|
canon/
|
|
19
19
|
├── REQUIREMENTS.md ← problem, goals, non-goals
|
|
20
|
-
├── DESIGN.md ← visual intent
|
|
20
|
+
├── DESIGN.md ← visual intent, pointing at the stylesheet (UI projects)
|
|
21
21
|
└── context/ ← per-domain narrative loaded on demand via index.md
|
|
22
22
|
|
|
23
23
|
.claude/
|
|
@@ -14,19 +14,19 @@ The tier framework sits alongside [Claude Design](../../wiki/claude/design.md),
|
|
|
14
14
|
|
|
15
15
|
## Tier 0: prose only
|
|
16
16
|
|
|
17
|
-
The default. `canon/DESIGN.md` holds visual intent
|
|
17
|
+
The default. `canon/DESIGN.md` holds visual intent, being one Overview paragraph, at most three one-line rules a section, and a table naming what each color and shape role is for. Its lead names the stylesheet the values live in, since a hand-typed copy of them drifts from the CSS.
|
|
18
18
|
|
|
19
19
|
Claude Code reads it and writes the implementation. Works for CLI tools, internal dashboards, admin panels, and backend-focused projects.
|
|
20
20
|
|
|
21
21
|
### Seed shape
|
|
22
22
|
|
|
23
|
-
The toolkit seed in `tooling/claude/seeds/canon/DESIGN.md` ships
|
|
23
|
+
The toolkit seed in `tooling/claude/seeds/canon/DESIGN.md` ships an intent template with a starting set of roles, each naming its custom property, and `claude/skills/canvas-board/references/design.md` carries the same tables under `## Template` with placeholder rows. The column headers are what the parser reads, so they stay verbatim in either, while the rows are the project's own. The seed's lead asks for the project's own stylesheet, such as `src/styles/tokens.css` or a Tailwind `@theme` block, and falls back to `.claude/design/project/` only when the project has none.
|
|
24
24
|
|
|
25
25
|
`canon design render` writes an HTML plus CSS preview to `.canon/tmp/render/design/` for eyeballing the current system without leaving Claude Code. See `canon/context/design/index.md`.
|
|
26
26
|
|
|
27
27
|
A project wanting a neutral starting point to override runs `canon design install`, which copies one stylesheet to `.claude/design/base.css` carrying an achromatic token set as custom properties and two components built on them. Greys run from near-black to near-white and the accent is monochrome, so the only palette the project renders is one it writes itself. That file is toolkit-owned and `canon design sync` refreshes it, so a project overrides a value in `.claude/design/project/` instead, which sync never touches. Nothing arrives without that install, and the two channels are independent: a record the project wrote is its own, and the installed stylesheet is the toolkit's.
|
|
28
28
|
|
|
29
|
-
A cell no source anchors ends in `? verify`, and the preview shows that marker beside the value rather than folding it in, so a swatch and a font sample stay built from the value alone. A confidence line above the sections names how many cells are anchored against how many are tagged, which is what tells a reader whether they are looking at a record of the code or a proposal about it. It reads the columns a source could anchor and leaves out the row names, so the ratio is not diluted by cells no tag could ever reach. The proposal path tags nearly all of them, so that count reads low on day one by design.
|
|
29
|
+
A record generated from a token source carries the values in tables instead, which is the shape this toolkit's own record takes. There a cell no source anchors ends in `? verify`, and the preview shows that marker beside the value rather than folding it in, so a swatch and a font sample stay built from the value alone. A confidence line above the sections names how many cells are anchored against how many are tagged, which is what tells a reader whether they are looking at a record of the code or a proposal about it. It reads the columns a source could anchor and leaves out the row names, so the ratio is not diluted by cells no tag could ever reach. The proposal path tags nearly all of them, so that count reads low on day one by design.
|
|
30
30
|
|
|
31
31
|
### Tools
|
|
32
32
|
|
package/governance/detect.toml
CHANGED
|
@@ -21,67 +21,67 @@
|
|
|
21
21
|
deps = []
|
|
22
22
|
files = [".claude/skills", "claude/skills"]
|
|
23
23
|
|
|
24
|
-
["
|
|
24
|
+
["ci-workflow"]
|
|
25
25
|
deps = []
|
|
26
26
|
files = [".github/workflows"]
|
|
27
27
|
|
|
28
|
-
["
|
|
28
|
+
["dependencies"]
|
|
29
29
|
deps = []
|
|
30
30
|
files = ["**/package.json", "**/pyproject.toml", "**/go.mod", "**/composer.json"]
|
|
31
31
|
|
|
32
|
-
["
|
|
32
|
+
["config-comments"]
|
|
33
33
|
deps = []
|
|
34
34
|
files = [".editorconfig", "**/Dockerfile*", "**/*.config.*", "**/.env.example"]
|
|
35
35
|
|
|
36
|
-
["
|
|
36
|
+
["code-comments"]
|
|
37
37
|
deps = []
|
|
38
38
|
files = ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "**/*.sh", "**/*.py"]
|
|
39
39
|
|
|
40
|
-
["
|
|
40
|
+
["go"]
|
|
41
41
|
deps = []
|
|
42
42
|
files = ["**/go.mod"]
|
|
43
43
|
|
|
44
|
-
["
|
|
44
|
+
["php"]
|
|
45
45
|
deps = []
|
|
46
46
|
files = ["**/composer.json"]
|
|
47
47
|
|
|
48
|
-
["
|
|
48
|
+
["react"]
|
|
49
49
|
deps = ["react"]
|
|
50
50
|
files = []
|
|
51
51
|
|
|
52
|
-
["
|
|
52
|
+
["astro"]
|
|
53
53
|
deps = ["astro"]
|
|
54
54
|
files = ["**/astro.config.*"]
|
|
55
55
|
|
|
56
|
-
["
|
|
56
|
+
["fastapi"]
|
|
57
57
|
deps = ["fastapi"]
|
|
58
58
|
files = []
|
|
59
59
|
|
|
60
|
-
["
|
|
60
|
+
["nextjs"]
|
|
61
61
|
deps = ["next"]
|
|
62
62
|
files = ["**/next.config.*"]
|
|
63
63
|
|
|
64
|
-
["
|
|
64
|
+
["tailwind"]
|
|
65
65
|
deps = ["tailwindcss", "@tailwindcss/vite", "@tailwindcss/postcss"]
|
|
66
66
|
files = ["**/tailwind.config.*"]
|
|
67
67
|
|
|
68
|
-
["
|
|
68
|
+
["shadcn"]
|
|
69
69
|
deps = []
|
|
70
70
|
files = ["**/components.json"]
|
|
71
71
|
|
|
72
|
-
["
|
|
72
|
+
["e2e-reliability"]
|
|
73
73
|
deps = ["@playwright/test", "playwright", "cypress"]
|
|
74
74
|
files = ["**/e2e"]
|
|
75
75
|
|
|
76
|
-
["
|
|
76
|
+
["test-scope"]
|
|
77
77
|
deps = ["@playwright/test", "playwright", "cypress"]
|
|
78
78
|
files = ["**/e2e"]
|
|
79
79
|
|
|
80
|
-
["
|
|
80
|
+
["zod"]
|
|
81
81
|
deps = ["zod"]
|
|
82
82
|
files = []
|
|
83
83
|
|
|
84
|
-
["
|
|
84
|
+
["tanstack-query"]
|
|
85
85
|
deps = [
|
|
86
86
|
"@tanstack/react-query",
|
|
87
87
|
"@tanstack/vue-query",
|
|
@@ -91,23 +91,23 @@ deps = [
|
|
|
91
91
|
]
|
|
92
92
|
files = []
|
|
93
93
|
|
|
94
|
-
["
|
|
94
|
+
["testing-go"]
|
|
95
95
|
deps = []
|
|
96
96
|
files = ["**/go.mod"]
|
|
97
97
|
|
|
98
|
-
["
|
|
98
|
+
["testing-php"]
|
|
99
99
|
deps = ["phpunit/phpunit", "pestphp/pest"]
|
|
100
100
|
files = ["**/phpunit.xml", "**/phpunit.xml.dist"]
|
|
101
101
|
|
|
102
|
-
["
|
|
102
|
+
["pydantic"]
|
|
103
103
|
deps = ["pydantic"]
|
|
104
104
|
files = []
|
|
105
105
|
|
|
106
|
-
["
|
|
106
|
+
["security-web"]
|
|
107
107
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
108
108
|
files = ["index.html", "*/index.html"]
|
|
109
109
|
|
|
110
|
-
["
|
|
110
|
+
["security-server"]
|
|
111
111
|
deps = [
|
|
112
112
|
"express",
|
|
113
113
|
"fastify",
|
|
@@ -129,7 +129,7 @@ deps = [
|
|
|
129
129
|
]
|
|
130
130
|
files = []
|
|
131
131
|
|
|
132
|
-
["
|
|
132
|
+
["database"]
|
|
133
133
|
deps = [
|
|
134
134
|
"prisma",
|
|
135
135
|
"@prisma/client",
|
|
@@ -156,42 +156,42 @@ deps = [
|
|
|
156
156
|
]
|
|
157
157
|
files = ["**/migrations", "**/schema.prisma", "**/*.sql"]
|
|
158
158
|
|
|
159
|
-
["
|
|
159
|
+
["copy"]
|
|
160
160
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
161
161
|
files = ["index.html", "*/index.html"]
|
|
162
162
|
|
|
163
|
-
["
|
|
163
|
+
["a11y"]
|
|
164
164
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
165
165
|
files = ["index.html", "*/index.html"]
|
|
166
166
|
|
|
167
|
-
["
|
|
167
|
+
["forms"]
|
|
168
168
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
169
169
|
files = ["index.html", "*/index.html"]
|
|
170
170
|
|
|
171
|
-
["
|
|
171
|
+
["ux-completeness"]
|
|
172
172
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
173
173
|
files = ["index.html", "*/index.html"]
|
|
174
174
|
|
|
175
|
-
["
|
|
175
|
+
["surface-capture"]
|
|
176
176
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
177
177
|
files = ["index.html", "*/index.html"]
|
|
178
178
|
|
|
179
|
-
["
|
|
179
|
+
["link-behavior"]
|
|
180
180
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
181
181
|
files = ["index.html", "*/index.html"]
|
|
182
182
|
|
|
183
|
-
["
|
|
183
|
+
["design-taste"]
|
|
184
184
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
185
185
|
files = ["canon/DESIGN.md", "index.html", "*/index.html"]
|
|
186
186
|
|
|
187
|
-
["
|
|
187
|
+
["interface-casing"]
|
|
188
188
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
189
189
|
files = ["index.html", "*/index.html"]
|
|
190
190
|
|
|
191
|
-
["
|
|
191
|
+
["motion"]
|
|
192
192
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
193
193
|
files = ["index.html", "*/index.html"]
|
|
194
194
|
|
|
195
|
-
["
|
|
195
|
+
["canvas"]
|
|
196
196
|
deps = []
|
|
197
197
|
files = [".canon/canvas"]
|