@kiwidata/grimoire 0.1.3 → 0.1.5

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.
Files changed (159) hide show
  1. package/AGENTS.md +56 -4
  2. package/README.md +107 -59
  3. package/dist/cli/index.js +7 -7
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/commands/check.js +1 -1
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/configure.d.ts +3 -0
  8. package/dist/commands/configure.d.ts.map +1 -0
  9. package/dist/commands/configure.js +19 -0
  10. package/dist/commands/configure.js.map +1 -0
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +2 -0
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/core/check.d.ts.map +1 -1
  15. package/dist/core/check.js +165 -111
  16. package/dist/core/check.js.map +1 -1
  17. package/dist/core/ci.d.ts.map +1 -1
  18. package/dist/core/ci.js +50 -69
  19. package/dist/core/ci.js.map +1 -1
  20. package/dist/core/configure.d.ts +14 -0
  21. package/dist/core/configure.d.ts.map +1 -0
  22. package/dist/core/configure.js +434 -0
  23. package/dist/core/configure.js.map +1 -0
  24. package/dist/core/detect.d.ts.map +1 -1
  25. package/dist/core/detect.js +153 -26
  26. package/dist/core/detect.js.map +1 -1
  27. package/dist/core/diff.d.ts.map +1 -1
  28. package/dist/core/diff.js +62 -93
  29. package/dist/core/diff.js.map +1 -1
  30. package/dist/core/doc-style.d.ts +0 -4
  31. package/dist/core/doc-style.d.ts.map +1 -1
  32. package/dist/core/doc-style.js +103 -22
  33. package/dist/core/doc-style.js.map +1 -1
  34. package/dist/core/docs.js +202 -170
  35. package/dist/core/docs.js.map +1 -1
  36. package/dist/core/health.d.ts +6 -0
  37. package/dist/core/health.d.ts.map +1 -1
  38. package/dist/core/health.js +133 -96
  39. package/dist/core/health.js.map +1 -1
  40. package/dist/core/hooks.d.ts +0 -3
  41. package/dist/core/hooks.d.ts.map +1 -1
  42. package/dist/core/hooks.js +11 -16
  43. package/dist/core/hooks.js.map +1 -1
  44. package/dist/core/init.d.ts +2 -0
  45. package/dist/core/init.d.ts.map +1 -1
  46. package/dist/core/init.js +230 -406
  47. package/dist/core/init.js.map +1 -1
  48. package/dist/core/list.d.ts.map +1 -1
  49. package/dist/core/list.js +55 -65
  50. package/dist/core/list.js.map +1 -1
  51. package/dist/core/risk-register.d.ts +17 -0
  52. package/dist/core/risk-register.d.ts.map +1 -0
  53. package/dist/core/risk-register.js +73 -0
  54. package/dist/core/risk-register.js.map +1 -0
  55. package/dist/core/shared-setup.d.ts +0 -40
  56. package/dist/core/shared-setup.d.ts.map +1 -1
  57. package/dist/core/shared-setup.js +92 -56
  58. package/dist/core/shared-setup.js.map +1 -1
  59. package/dist/core/status.d.ts.map +1 -1
  60. package/dist/core/status.js +42 -52
  61. package/dist/core/status.js.map +1 -1
  62. package/dist/core/test-quality.d.ts +0 -8
  63. package/dist/core/test-quality.d.ts.map +1 -1
  64. package/dist/core/test-quality.js +24 -30
  65. package/dist/core/test-quality.js.map +1 -1
  66. package/dist/core/trace.d.ts.map +1 -1
  67. package/dist/core/trace.js +67 -75
  68. package/dist/core/trace.js.map +1 -1
  69. package/dist/core/update.d.ts.map +1 -1
  70. package/dist/core/update.js +61 -11
  71. package/dist/core/update.js.map +1 -1
  72. package/dist/core/validate.d.ts +1 -4
  73. package/dist/core/validate.d.ts.map +1 -1
  74. package/dist/core/validate.js +126 -148
  75. package/dist/core/validate.js.map +1 -1
  76. package/dist/index.d.ts +0 -3
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +0 -3
  79. package/dist/index.js.map +1 -1
  80. package/dist/utils/config.d.ts +15 -5
  81. package/dist/utils/config.d.ts.map +1 -1
  82. package/dist/utils/config.js +63 -42
  83. package/dist/utils/config.js.map +1 -1
  84. package/dist/utils/fs.d.ts +0 -12
  85. package/dist/utils/fs.d.ts.map +1 -1
  86. package/dist/utils/fs.js +0 -12
  87. package/dist/utils/fs.js.map +1 -1
  88. package/dist/utils/paths.d.ts +0 -6
  89. package/dist/utils/paths.d.ts.map +1 -1
  90. package/dist/utils/paths.js +0 -6
  91. package/dist/utils/paths.js.map +1 -1
  92. package/dist/utils/spawn.d.ts +0 -3
  93. package/dist/utils/spawn.d.ts.map +1 -1
  94. package/dist/utils/spawn.js +0 -3
  95. package/dist/utils/spawn.js.map +1 -1
  96. package/package.json +1 -1
  97. package/skills/grimoire-apply/SKILL.md +89 -25
  98. package/skills/grimoire-audit/SKILL.md +21 -1
  99. package/skills/grimoire-bug/SKILL.md +48 -9
  100. package/skills/grimoire-commit/SKILL.md +3 -2
  101. package/skills/grimoire-design/SKILL.md +259 -0
  102. package/skills/grimoire-design-consult/SKILL.md +200 -0
  103. package/skills/grimoire-discover/SKILL.md +139 -109
  104. package/skills/grimoire-draft/SKILL.md +131 -15
  105. package/skills/grimoire-plan/SKILL.md +119 -46
  106. package/skills/grimoire-pr/SKILL.md +7 -10
  107. package/skills/grimoire-pr-review/SKILL.md +46 -115
  108. package/skills/grimoire-precommit-review/SKILL.md +205 -0
  109. package/skills/grimoire-refactor/SKILL.md +6 -6
  110. package/skills/grimoire-review/SKILL.md +95 -156
  111. package/skills/grimoire-verify/SKILL.md +40 -7
  112. package/skills/grimoire-vuln-remediate/SKILL.md +107 -0
  113. package/skills/grimoire-vuln-triage/SKILL.md +109 -0
  114. package/skills/references/adversarial-personas.md +225 -0
  115. package/skills/references/brand-tokens-format.md +186 -0
  116. package/skills/references/code-quality.md +172 -0
  117. package/skills/references/container-scan-triage.md +102 -0
  118. package/skills/references/dependency-vuln-triage.md +236 -0
  119. package/skills/references/design-heuristics.md +138 -0
  120. package/skills/references/design-input-formats.md +190 -0
  121. package/skills/references/pattern-guard.md +180 -0
  122. package/skills/references/principles.md +82 -0
  123. package/skills/references/refactor-scan-categories.md +154 -2
  124. package/skills/references/review-personas.md +406 -0
  125. package/skills/references/security-compliance.md +22 -1
  126. package/skills/references/testing-contracts.md +1 -1
  127. package/skills/references/visual-fidelity.md +206 -0
  128. package/templates/accepted-risks.yml +47 -0
  129. package/templates/brand-tokens-example.json +13 -0
  130. package/templates/brand-voice-example.md +22 -0
  131. package/templates/constraints.md +25 -0
  132. package/templates/design-tool-setup-stub.md +59 -0
  133. package/dist/commands/archive.d.ts +0 -3
  134. package/dist/commands/archive.d.ts.map +0 -1
  135. package/dist/commands/archive.js +0 -22
  136. package/dist/commands/archive.js.map +0 -1
  137. package/dist/commands/log.d.ts +0 -3
  138. package/dist/commands/log.d.ts.map +0 -1
  139. package/dist/commands/log.js +0 -15
  140. package/dist/commands/log.js.map +0 -1
  141. package/dist/commands/map.d.ts +0 -3
  142. package/dist/commands/map.d.ts.map +0 -1
  143. package/dist/commands/map.js +0 -17
  144. package/dist/commands/map.js.map +0 -1
  145. package/dist/core/archive.d.ts +0 -9
  146. package/dist/core/archive.d.ts.map +0 -1
  147. package/dist/core/archive.js +0 -92
  148. package/dist/core/archive.js.map +0 -1
  149. package/dist/core/log.d.ts +0 -8
  150. package/dist/core/log.d.ts.map +0 -1
  151. package/dist/core/log.js +0 -150
  152. package/dist/core/log.js.map +0 -1
  153. package/dist/core/map.d.ts +0 -9
  154. package/dist/core/map.d.ts.map +0 -1
  155. package/dist/core/map.js +0 -302
  156. package/dist/core/map.js.map +0 -1
  157. package/templates/dupignore +0 -93
  158. package/templates/mapignore +0 -58
  159. package/templates/mapkeys +0 -65
@@ -0,0 +1,206 @@
1
+ # Visual Fidelity Reference
2
+
3
+ Shared visual-fidelity check engine used by `grimoire-review` (design-phase HTML previews), `grimoire-pr-review` (PR diff), and `grimoire-precommit-review` (staged diff).
4
+
5
+ The calling skill is responsible for:
6
+ - Resolving the **scope** (HTML preview files in `.grimoire/changes/<id>/designs/` vs changed CSS/markup in a diff)
7
+ - Invoking this engine at the appropriate workflow step (§5.5 in all three review skills)
8
+ - Folding the engine's report under the "Visual Fidelity" section of the final review report
9
+
10
+ This reference defines: when to run, scope per phase, the token-compliance lint algorithm, axe-core invocation, report format, gating rules, and edge-case handling.
11
+
12
+ ---
13
+
14
+ ## 1. When to Run
15
+
16
+ Engage the visual-fidelity engine when **either** is true:
17
+
18
+ - `.grimoire/brand/tokens.json` exists (brand tokens are defined; drift is checkable)
19
+ - The change has design artifacts: any file under `.grimoire/changes/<id>/designs/` (HTML preview, ASCII variants, problem.md, etc.)
20
+
21
+ If neither holds, skip silently — no report section, no noise. This is not an error state; it is a project that has not opted into brand tokens or generated designs.
22
+
23
+ ---
24
+
25
+ ## 2. Scope per Phase
26
+
27
+ The scope changes by which skill invokes the engine.
28
+
29
+ ### Design phase (`grimoire-review`)
30
+
31
+ - **Target**: HTML preview files in `.grimoire/changes/<id>/designs/preview.html` (and any `variant-{n}.html`)
32
+ - **Rationale**: No code exists yet — the design is the artifact under review. Token compliance and a11y are evaluated against the rendered HTML preview.
33
+ - **Skip when**: No `designs/*.html` files exist (e.g., ASCII-only or Figma-only variants — token compliance still runs against the variants markdown if hex values appear; a11y is N/A).
34
+
35
+ ### Code phase (`grimoire-precommit-review`, `grimoire-pr-review`)
36
+
37
+ - **Target**: Staged diff (precommit) or PR diff (pr-review) — specifically the hunks touching CSS files, SCSS, CSS-in-JS strings, inline `style=` attributes, and HTML/JSX with `class` or `style` content.
38
+ - **Rationale**: Brand drift is a code-time concern once implementation begins. Catch it before merge, not at design re-review.
39
+ - **Skip when**: Diff touches no styling surface (e.g., pure backend / config / docs change).
40
+
41
+ ---
42
+
43
+ ## 3. Token-Compliance Lint Algorithm
44
+
45
+ The algorithm is the same as `grimoire-design --lint`. The reference here is the canonical source — the design skill's lint mode and all three review skills run identical logic.
46
+
47
+ ### 3.1 Load tokens
48
+
49
+ 1. Read `.grimoire/brand/tokens.json`.
50
+ 2. Parse as DTCG (see `./brand-tokens-format.md`).
51
+ 3. Build a lookup index: `{ "#0066ff" → "color.primary", "Inter, sans-serif" → "font.family.base", "8px" → "spacing.base", ... }`. Normalize hex to lowercase, six-digit form; normalize px-as-integer where possible.
52
+ 4. On parse failure or any token missing `$value`: emit the malformed-token report (§6 Gating) and exit the engine. Do not proceed to scan.
53
+
54
+ ### 3.2 Scan target files
55
+
56
+ For each file in scope (per §2):
57
+
58
+ - **Hex colors**: regex `#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b` — capture every match with file path + line number.
59
+ - **px values**: regex `\b\d+(\.\d+)?px\b` — capture font-size, spacing, border, etc.
60
+ - **font-family strings**: parse CSS `font-family:` declarations and JSX `fontFamily:` props; capture the quoted family list.
61
+
62
+ ### 3.3 Edge-case suppression (false-positive prevention)
63
+
64
+ Skip the following matches — they are token-referencing CSS, not drift:
65
+
66
+ - Inside `var(--...)` — e.g., `color: var(--color-primary)` does not contain a literal hex.
67
+ - Inside an SCSS variable declaration that itself is the token source — e.g., `$color-primary: #0066ff;` in a generated tokens file. Detect: file path matches `**/tokens.{scss,css}` or `**/_tokens.scss`, or the file is the generated output of Style Dictionary.
68
+ - Inside a comment (`//`, `/* */`, `<!-- -->`) — the lint targets active rules, not annotations.
69
+ - Inside a string in a non-style context — e.g., a JS string literal `"see #0066ff for an example"` in a Markdown blockquote within JSX. Heuristic: skip matches whose surrounding context is not a CSS rule, inline `style=`, or known styling prop name (`color`, `background`, `borderColor`, `fill`, `stroke`, `fontFamily`, `fontSize`).
70
+ - Already-token CSS custom properties: `--color-primary: #0066ff;` in a stylesheet that defines the tokens is the source of truth, not drift. Same file-path heuristic as the SCSS variable case.
71
+
72
+ When in doubt, prefer false-negative over false-positive. A noisy lint gets disabled; a quiet one stays on.
73
+
74
+ ### 3.4 Suggestion synthesis
75
+
76
+ For each surviving hardcoded value, find the nearest token in the index:
77
+
78
+ - **Exact match**: `#0066ff` matches `color.primary` exactly → suggest `var(--color-primary)`.
79
+ - **Near match** (color): compute ΔE76 (Euclidean distance in Lab space) or a cheap Euclidean in sRGB; if any token is within 5% → suggest with a "near match" note ("`#0066fe` ~ `var(--color-primary)` (#0066ff)").
80
+ - **Px values**: nearest spacing or font-size token; suggest with the token name.
81
+ - **font-family**: substring match against any font-family token's value.
82
+ - **No match**: emit the finding but suggest "add a new token in `tokens.json` or pick the closest existing token manually" — do not invent a token name.
83
+
84
+ ### 3.5 Output format per finding
85
+
86
+ ```
87
+ - **[suggestion]** `<file>:<line>` hardcoded `<value>` — replace with `var(--<token-path>)` (<note if near match or no match>)
88
+ ```
89
+
90
+ Severity is **suggestion** by default. Promote to **blocker** only when the project's `tokens.json` is referenced by an active ADR as the canonical source (briefing axis — brand-system enforcement) AND the value appears in a primary surface (not a one-off test fixture or sandbox).
91
+
92
+ ### 3.6 Clean state
93
+
94
+ If zero drift findings: emit `No brand drift detected across N files scanned.` Do not emit an empty section header — keep the report clean.
95
+
96
+ ---
97
+
98
+ ## 4. axe-core Invocation
99
+
100
+ axe-core runs accessibility checks against rendered HTML. It is **opt-in** — never auto-installed by this engine.
101
+
102
+ ### 4.1 Availability check
103
+
104
+ Before invoking, check (in order):
105
+
106
+ 1. `npx --no-install axe-core --version` exits 0 → axe-core resolvable in the local `node_modules` or up the tree.
107
+ 2. `axe-core` listed in `package.json` `devDependencies` or `dependencies`.
108
+ 3. `@axe-core/cli` listed in `package.json`.
109
+
110
+ If none: emit a single line under the Visual Fidelity section and skip the a11y portion entirely:
111
+
112
+ ```
113
+ axe-core not installed — install `@axe-core/cli` for accessibility checks.
114
+ ```
115
+
116
+ Do NOT run `npm install`, do NOT prompt the user to install, do NOT fall back to a hosted service. The engine respects the user's tooling choices.
117
+
118
+ ### 4.2 Invocation
119
+
120
+ When axe-core is available and the scope includes HTML files:
121
+
122
+ - Design phase: `npx axe <designs/preview.html>` (and per-variant if multiple)
123
+ - Code phase: skip axe-core unless the diff modified a rendered preview file the project already maintains. Do not spin up a headless browser to render JSX from a diff — that is out of scope for the cheap tier.
124
+
125
+ ### 4.3 Output format per finding
126
+
127
+ Map axe-core's JSON output to the same finding shape:
128
+
129
+ ```
130
+ - **[<severity>]** [axe-<rule-id>] <file> — <description>. Impact: <minor|moderate|serious|critical>.
131
+ ```
132
+
133
+ axe-core severity maps directly: `minor`/`moderate` → suggestion; `serious`/`critical` → suggestion by default, blocker if `project.compliance` lists WCAG / ADA / EAA / Section 508 (regulator anchor — same rule as `./adversarial-personas.md` §Severity Calibration).
134
+
135
+ ### 4.4 Clean state
136
+
137
+ If axe-core ran and found nothing: `axe-core: no violations.`
138
+
139
+ ---
140
+
141
+ ## 5. Report-Section Format
142
+
143
+ The engine returns a single Markdown block the calling skill folds into the report under `## Visual Fidelity`:
144
+
145
+ ```markdown
146
+ ## Visual Fidelity
147
+
148
+ ### Token Compliance
149
+ - **[suggestion]** `src/components/Header.tsx:42` hardcoded `#0066ff` — replace with `var(--color-primary)`.
150
+ - **[suggestion]** `src/components/Header.tsx:58` hardcoded `16px` — replace with `var(--spacing-base-2x)`.
151
+ (or: "No brand drift detected across 12 files scanned.")
152
+
153
+ ### Accessibility (axe-core)
154
+ - **[suggestion]** [axe-color-contrast] `designs/preview.html` — Element has insufficient color contrast of 3.8 (foreground color: #888888, background color: #ffffff). Impact: serious.
155
+ (or: "axe-core: no violations.")
156
+ (or: "axe-core not installed — install `@axe-core/cli` for accessibility checks.")
157
+ ```
158
+
159
+ Omit subsections that have nothing to report (no findings + skip-state). If the entire section has nothing to report (clean tokens + axe-core unavailable + nothing in scope), omit the `## Visual Fidelity` header from the report entirely.
160
+
161
+ ---
162
+
163
+ ## 6. Gating Rules
164
+
165
+ ### 6.1 Absent tokens.json
166
+
167
+ If `.grimoire/brand/tokens.json` does not exist AND the change has design artifacts:
168
+
169
+ - Token-compliance section: skip silently. Do not emit "no tokens — skipped" noise.
170
+ - Accessibility section: still runs (axe-core works without tokens).
171
+ - This is the standard greenfield-design state.
172
+
173
+ If `.grimoire/brand/tokens.json` does not exist AND there are no design artifacts: the engine should not have been invoked at all (per §1). The calling skill is responsible for the gate; the engine assumes the gate already passed.
174
+
175
+ ### 6.2 Malformed tokens.json
176
+
177
+ If `tokens.json` exists but fails to parse, or any token is missing `$value`:
178
+
179
+ ```markdown
180
+ ## Visual Fidelity
181
+
182
+ tokens.json malformed at `.grimoire/brand/tokens.json` — <parse error description>. Fix or remove to enable visual-fidelity checks.
183
+ ```
184
+
185
+ Exit the engine for the code-phase invocations (this is a misconfiguration the user must fix; downstream lint cannot proceed). For the design-phase invocation, continue with the accessibility section only — a malformed tokens file should not block reviewing a freshly generated design.
186
+
187
+ This mirrors `grimoire-design --lint` malformed-token behavior (one-line error + parse description, suggest fix). Single source of truth — same behavior in all four invocation sites (design --lint, review §5.5, precommit-review §5.5, pr-review §5.5).
188
+
189
+ ### 6.3 Empty tokens.json
190
+
191
+ A valid-JSON but token-less file (`{}`) is treated as "no tokens defined" — token-compliance section emits `No brand tokens defined in tokens.json — token compliance skipped.` and proceeds to accessibility.
192
+
193
+ ### 6.4 Surface gating
194
+
195
+ This engine does NOT consult `project.surface`. Surface gating belongs to the adversarial personas (`./adversarial-personas.md` activation matrix). Visual fidelity runs whenever the §1 conditions hold — a TUI project that has somehow generated an HTML preview will still get linted. The user can skip via the standard "skip visual-fidelity" conversational override.
196
+
197
+ ---
198
+
199
+ ## 7. Edge Cases
200
+
201
+ - **Multiple preview files**: lint each independently; merge findings into one section, group by file in the report.
202
+ - **Tokens defined but no styling files in scope**: emit `No styling files in scope for token compliance.` Do not pretend to have scanned.
203
+ - **Generated stylesheet committed in the diff** (e.g., a Tailwind-built CSS file): include in scan only when the file is hand-authored. Auto-detect generated files via standard banner comments (`/* Generated by Tailwind */`, `/* Generated by Style Dictionary */`) and skip; note skipped count in the report.
204
+ - **Color in image asset (SVG)**: out of scope for the cheap tier — do not parse SVGs for fill/stroke hex values. The premium tier (future) may add this; v1 documents the gap and moves on.
205
+ - **CSS custom property defined in a non-tokens file**: e.g., `--local-padding: 4px` in a component-local stylesheet. Lint the value (`4px` here) against tokens; suggest replacing the local declaration with a token reference if a match exists.
206
+ - **Theme variants (light/dark)**: if `tokens.json` defines mode variants per DTCG, the lookup index includes both; a hardcoded value matching either mode is accepted.
@@ -0,0 +1,47 @@
1
+ # Grimoire Risk-Accepted Vulnerabilities
2
+ # Vulnerabilities triaged as `affected` but consciously accepted — because no fix
3
+ # exists yet, the residual risk is low, or the fix isn't worth it right now.
4
+ #
5
+ # Written by: grimoire-vuln-remediate (from a grimoire-vuln-triage `accept` verdict)
6
+ # Read by: grimoire-vuln-triage — an UNEXPIRED entry auto-suppresses that CVE as
7
+ # known-accepted so it doesn't re-flood the queue. An EXPIRED entry is
8
+ # re-surfaced for re-triage.
9
+ #
10
+ # Each entry requires: a CVE, the component, the VEX justification, a reason, an
11
+ # owner, an accepted date, and an expiry (when to re-evaluate).
12
+ #
13
+ # An accepted risk is NOT closed — it is scheduled for review. Don't accept the same
14
+ # CVE twice; update the existing entry.
15
+ #
16
+ # Created by: grimoire init
17
+ # Last updated: YYYY-MM-DD
18
+
19
+ accepted: []
20
+
21
+ # --- Examples ---
22
+ #
23
+ # No upstream fix available — low residual risk, reachable but damped:
24
+ #
25
+ # - cve: CVE-2026-44405
26
+ # component: paramiko
27
+ # component_type: library
28
+ # vex_justification: inline_mitigations_already_exist
29
+ # reason: "SHA-1 accepted in rsakey; outbound SFTP only, to tenant-configured
30
+ # trusted hosts. No upstream fix. EPSS ~0, not in KEV. Blast radius:
31
+ # low (integration, not the public API)."
32
+ # owner: fred
33
+ # accepted: 2026-06-04
34
+ # expires: 2026-09-04
35
+ #
36
+ # Base-image OS package with no patched version yet (not removable — transitive):
37
+ #
38
+ # - cve: CVE-2026-40356
39
+ # component: krb5 (libgssapi-krb5-2, libk5crypto3, libkrb5-3, libkrb5support0)
40
+ # component_type: os-package
41
+ # vex_justification: vulnerable_code_not_in_execute_path
42
+ # reason: "Kerberos DoS. No gssapi/kerberos usage in app; pulled transitively
43
+ # via libpq5 (Postgres). Not removable without breaking libpq.
44
+ # status=affected, no FixedVersion. Re-check on base-image bump."
45
+ # owner: fred
46
+ # accepted: 2026-06-04
47
+ # expires: 2026-09-04
@@ -0,0 +1,13 @@
1
+ {
2
+ "color": {
3
+ "primary": { "$value": "#0066ff", "$type": "color" }
4
+ },
5
+ "font": {
6
+ "family": {
7
+ "base": { "$value": "Inter, sans-serif", "$type": "fontFamily" }
8
+ }
9
+ },
10
+ "spacing": {
11
+ "base": { "$value": "8px", "$type": "dimension" }
12
+ }
13
+ }
@@ -0,0 +1,22 @@
1
+ # Brand Voice & Tone
2
+
3
+ One-line summary of your brand voice (e.g., "Confident, direct, and human — never corporate.").
4
+
5
+ ## Do
6
+
7
+ - Speak plainly. Short sentences. Active voice.
8
+ - Lead with the user's goal, not the product's feature.
9
+ - Use specific numbers and concrete examples over vague claims.
10
+
11
+ ## Don't
12
+
13
+ - Don't hedge ("might", "perhaps", "we think") when stating capability.
14
+ - Don't use jargon or acronyms without a one-line gloss on first use.
15
+ - Don't write like a press release — no "world-class", "best-in-class", "synergies".
16
+
17
+ ## Examples
18
+
19
+ | Context | Do | Don't |
20
+ | --- | --- | --- |
21
+ | Empty state | "No invoices yet. Create one to get started." | "Your invoice journey awaits!" |
22
+ | Error | "Couldn't reach the server. Retry in 30 seconds." | "Oops! Something went wrong." |
@@ -0,0 +1,25 @@
1
+ # Constraints
2
+
3
+ > Invariants that must always hold. These are **not** behaviors (no external actor,
4
+ > not observable in a scenario) — they are guarantees. Anything that failed the
5
+ > feature-file admission test in `grimoire-draft` because it is a security control,
6
+ > NFR, performance budget, observability guarantee, or compliance rule lives here,
7
+ > **not** in a `.feature`.
8
+ >
9
+ > Each constraint is verified by a `unit-invariant` test (created at plan/apply),
10
+ > never by a Gherkin scenario. Keep this register narrow: assert, justify, point to
11
+ > the proof. Don't let it grow into an issue tracker — open work belongs in your
12
+ > tracker, not here.
13
+
14
+ | Constraint (assertion) | Rationale | How verified | Links |
15
+ |------------------------|-----------|--------------|-------|
16
+ | _e.g._ Log output never contains PII or secrets | Confidential data must not leak to logs/stdout | `tests/test_log_scrubbing.py::test_pii_redacted` | [ADR-0008](.grimoire/decisions/0008-...) |
17
+ | _e.g._ Every request is isolated to its tenant | Multi-tenant data separation | `tests/test_tenant_isolation.py` | — |
18
+
19
+ <!--
20
+ Add one row per constraint. Guidance:
21
+ - Assertion: a flat "X always holds" statement. No Given/When/Then.
22
+ - Rationale: why it matters, in one line.
23
+ - How verified: the exact test id that proves it. If none yet, write "TODO: unit-invariant test" — the plan stage will create it.
24
+ - Links: the MADR that decided it (don't restate the decision here — DRY).
25
+ -->
@@ -0,0 +1,59 @@
1
+ # Design Tool MCP Setup ({{tool}})
2
+
3
+ `{{tool}}` does not currently have a first-class MCP server in the grimoire registry.
4
+ Use this checklist to wire one up manually so AI agents can read your designs.
5
+
6
+ ## 1. Install an MCP server for your tool
7
+
8
+ Search for an MCP server compatible with `{{tool}}` (e.g., `mcp-{{tool}}` on
9
+ npm, GitHub, or the MCP server registry at https://github.com/modelcontextprotocol).
10
+
11
+ If none exists, fall back to the HTML/ASCII path: `grimoire-design` will render
12
+ previews from a textual description and lint them against `.grimoire/brand/tokens.json`.
13
+
14
+ ## 2. Set environment variables
15
+
16
+ Most design-tool MCPs require an API token. Export it in your shell, never in
17
+ `.grimoire/config.yaml`:
18
+
19
+ ```bash
20
+ export {{tool}}_ACCESS_TOKEN=...
21
+ ```
22
+
23
+ ## 3. Register the server in your agent config
24
+
25
+ For Claude Code, add to `.mcp.json` at the repo root:
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "{{tool}}": {
31
+ "command": "npx",
32
+ "args": ["-y", "<mcp-package-name>"]
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ For other agents, see their MCP documentation.
39
+
40
+ ## 4. Restart your agent and verify
41
+
42
+ Restart the agent. In `grimoire-design`, run a small request like "fetch the
43
+ homepage frame" to confirm the MCP responds.
44
+
45
+ ## 5. Update `.grimoire/config.yaml`
46
+
47
+ Once the MCP is working, add it under `project.design_tool.mcp`:
48
+
49
+ ```yaml
50
+ project:
51
+ design_tool:
52
+ name: {{tool}}
53
+ mcp:
54
+ name: {{tool}}-mcp
55
+ command: npx
56
+ args: ["-y", "<mcp-package-name>"]
57
+ ```
58
+
59
+ Re-run `grimoire init` is not necessary — just save the file.
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const archiveCommand: Command;
3
- //# sourceMappingURL=archive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAgBvB,CAAC"}
@@ -1,22 +0,0 @@
1
- import { Command } from "commander";
2
- import { archiveChange, ArchiveError } from "../core/archive.js";
3
- import chalk from "chalk";
4
- export const archiveCommand = new Command("archive")
5
- .description("Archive a completed change")
6
- .argument("<change-id>", "Change to archive")
7
- .option("-y, --yes", "Skip confirmation prompt")
8
- .action(async (changeId, options) => {
9
- try {
10
- await archiveChange(changeId, {
11
- yes: options.yes ?? false,
12
- });
13
- }
14
- catch (err) {
15
- if (err instanceof ArchiveError) {
16
- console.error(chalk.red(err.message));
17
- process.exit(1);
18
- }
19
- throw err;
20
- }
21
- });
22
- //# sourceMappingURL=archive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;KAC5C,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAO,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,QAAQ,EAAE;YAC5B,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const logCommand: Command;
3
- //# sourceMappingURL=log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,UAAU,SAWnB,CAAC"}
@@ -1,15 +0,0 @@
1
- import { Command } from "commander";
2
- import { generateLog } from "../core/log.js";
3
- export const logCommand = new Command("log")
4
- .description("Generate change log from archived grimoire changes")
5
- .option("--from <ref>", "Start date or git tag (inclusive)")
6
- .option("--to <ref>", "End date or git tag (inclusive)")
7
- .option("--json", "Output as JSON")
8
- .action(async (options) => {
9
- await generateLog({
10
- from: options.from,
11
- to: options.to,
12
- json: options.json ?? false,
13
- });
14
- });
15
- //# sourceMappingURL=log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,YAAY,EAAE,iCAAiC,CAAC;KACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;KAC5B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const mapCommand: Command;
3
- //# sourceMappingURL=map.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,UAAU,SAanB,CAAC"}
@@ -1,17 +0,0 @@
1
- import { Command } from "commander";
2
- import { generateMap } from "../core/map.js";
3
- export const mapCommand = new Command("map")
4
- .description("Scan codebase structure and detect undocumented areas")
5
- .option("--json", "Output as JSON")
6
- .option("--refresh", "Compare against existing docs and show gaps")
7
- .option("--duplicates", "Run jscpd to detect code duplication")
8
- .option("--depth <n>", "Max directory depth to scan", "4")
9
- .action(async (options) => {
10
- await generateMap({
11
- json: options.json ?? false,
12
- refresh: options.refresh ?? false,
13
- duplicates: options.duplicates ?? false,
14
- maxDepth: parseInt(options.depth, 10),
15
- });
16
- });
17
- //# sourceMappingURL=map.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,aAAa,EAAE,6BAA6B,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACjC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;QACvC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;KACtC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +0,0 @@
1
- interface ArchiveOptions {
2
- yes: boolean;
3
- }
4
- export declare class ArchiveError extends Error {
5
- constructor(message: string);
6
- }
7
- export declare function archiveChange(changeId: string, options: ArchiveOptions): Promise<void>;
8
- export {};
9
- //# sourceMappingURL=archive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAgHf"}
@@ -1,92 +0,0 @@
1
- import { readFile, mkdir, cp, rm } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import chalk from "chalk";
4
- import { findProjectRoot, resolveChangePath } from "../utils/paths.js";
5
- export class ArchiveError extends Error {
6
- constructor(message) {
7
- super(message);
8
- this.name = "ArchiveError";
9
- }
10
- }
11
- export async function archiveChange(changeId, options) {
12
- const root = await findProjectRoot();
13
- const changePath = resolveChangePath(root, changeId);
14
- // Check change exists
15
- try {
16
- await readFile(join(changePath, "manifest.md"), "utf-8");
17
- }
18
- catch {
19
- throw new ArchiveError(`Change "${changeId}" not found or missing manifest.`);
20
- }
21
- // Check tasks are complete
22
- try {
23
- const tasksContent = await readFile(join(changePath, "tasks.md"), "utf-8");
24
- const pending = tasksContent.match(/^- \[ \] .+$/gm) || [];
25
- if (pending.length > 0) {
26
- console.log(chalk.yellow(`Warning: ${pending.length} task(s) still pending.`));
27
- if (!options.yes) {
28
- throw new ArchiveError("Use --yes to archive anyway, or complete tasks first.");
29
- }
30
- }
31
- }
32
- catch (err) {
33
- if (err instanceof ArchiveError)
34
- throw err;
35
- // No tasks file — that's ok for archiving
36
- }
37
- // Confirmation
38
- if (!options.yes) {
39
- const readline = await import("node:readline/promises");
40
- const rl = readline.createInterface({
41
- input: process.stdin,
42
- output: process.stdout,
43
- });
44
- const answer = await rl.question(`Archive change "${changeId}"? (y/N) `);
45
- rl.close();
46
- if (answer.toLowerCase() !== "y") {
47
- console.log("Cancelled.");
48
- return;
49
- }
50
- }
51
- // Copy proposed features to baseline
52
- const proposedFeatures = join(changePath, "features");
53
- try {
54
- await cp(proposedFeatures, join(root, "features"), {
55
- recursive: true,
56
- force: true,
57
- });
58
- console.log(` ${chalk.green("synced")} features to baseline`);
59
- }
60
- catch {
61
- // No proposed features
62
- }
63
- // Copy proposed decisions to baseline
64
- const proposedDecisions = join(changePath, "decisions");
65
- try {
66
- // TODO: handle sequential numbering for new decisions
67
- await cp(proposedDecisions, join(root, ".grimoire", "decisions"), {
68
- recursive: true,
69
- force: true,
70
- });
71
- console.log(` ${chalk.green("synced")} decisions to baseline`);
72
- }
73
- catch {
74
- // No proposed decisions
75
- }
76
- // Move manifest to archive
77
- const date = new Date().toISOString().split("T")[0];
78
- const archiveDir = join(root, ".grimoire", "archive", `${date}-${changeId}`);
79
- await mkdir(archiveDir, { recursive: true });
80
- await cp(join(changePath, "manifest.md"), join(archiveDir, "manifest.md"));
81
- // Copy tasks.md to archive if it exists
82
- try {
83
- await cp(join(changePath, "tasks.md"), join(archiveDir, "tasks.md"));
84
- }
85
- catch {
86
- // no tasks
87
- }
88
- // Remove change directory
89
- await rm(changePath, { recursive: true });
90
- console.log(`\n${chalk.green("Archived")} ${changeId} → .grimoire/archive/${date}-${changeId}/`);
91
- }
92
- //# sourceMappingURL=archive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- interface LogOptions {
2
- from?: string;
3
- to?: string;
4
- json: boolean;
5
- }
6
- export declare function generateLog(options: LogOptions): Promise<void>;
7
- export {};
8
- //# sourceMappingURL=log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/core/log.ts"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf;AAYD,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EpE"}