@1agh/maude 0.15.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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/cli/bin/maude.exe +15 -0
  4. package/cli/bin/maude.mjs +45 -0
  5. package/cli/bin/mdcc.exe +10 -0
  6. package/cli/bin/mdcc.mjs +7 -0
  7. package/cli/cli-wrapper.cjs +67 -0
  8. package/cli/commands/config.mjs +94 -0
  9. package/cli/commands/design.mjs +386 -0
  10. package/cli/commands/help.mjs +57 -0
  11. package/cli/commands/init.mjs +178 -0
  12. package/cli/commands/version.mjs +7 -0
  13. package/cli/install.cjs +113 -0
  14. package/cli/lib/argv.mjs +37 -0
  15. package/cli/lib/argv.test.mjs +46 -0
  16. package/cli/lib/copy-tree.mjs +78 -0
  17. package/package.json +94 -0
  18. package/plugins/design/dev-server/annotations-context-toolbar.tsx +397 -0
  19. package/plugins/design/dev-server/annotations-layer.tsx +1717 -0
  20. package/plugins/design/dev-server/api.ts +674 -0
  21. package/plugins/design/dev-server/bin/_screenshot-playwright.mjs +50 -0
  22. package/plugins/design/dev-server/bin/bootstrap-check.sh +83 -0
  23. package/plugins/design/dev-server/bin/canvas-edit.sh +48 -0
  24. package/plugins/design/dev-server/bin/handoff.sh +27 -0
  25. package/plugins/design/dev-server/bin/screenshot.sh +232 -0
  26. package/plugins/design/dev-server/bin/server-up.sh +135 -0
  27. package/plugins/design/dev-server/bin/slug.sh +22 -0
  28. package/plugins/design/dev-server/bin/smoke.sh +272 -0
  29. package/plugins/design/dev-server/build.ts +267 -0
  30. package/plugins/design/dev-server/canvas-build.ts +219 -0
  31. package/plugins/design/dev-server/canvas-edit.ts +388 -0
  32. package/plugins/design/dev-server/canvas-header.ts +165 -0
  33. package/plugins/design/dev-server/canvas-icons.tsx +131 -0
  34. package/plugins/design/dev-server/canvas-lib-inline.ts +260 -0
  35. package/plugins/design/dev-server/canvas-lib-resolver.ts +85 -0
  36. package/plugins/design/dev-server/canvas-lib.tsx +1995 -0
  37. package/plugins/design/dev-server/canvas-meta.schema.json +181 -0
  38. package/plugins/design/dev-server/canvas-pipeline.ts +270 -0
  39. package/plugins/design/dev-server/canvas-shell.tsx +813 -0
  40. package/plugins/design/dev-server/client/app.jsx +2027 -0
  41. package/plugins/design/dev-server/client/hmr.mjs +85 -0
  42. package/plugins/design/dev-server/client/iframe-lazy.mjs +121 -0
  43. package/plugins/design/dev-server/client/index.html +15 -0
  44. package/plugins/design/dev-server/client/styles/0-reset.css +18 -0
  45. package/plugins/design/dev-server/client/styles/1-tokens.css +297 -0
  46. package/plugins/design/dev-server/client/styles/2-layout.css +35 -0
  47. package/plugins/design/dev-server/client/styles/3-shell.css +906 -0
  48. package/plugins/design/dev-server/client/styles/4-components.css +1268 -0
  49. package/plugins/design/dev-server/client/styles/5-utilities.css +4 -0
  50. package/plugins/design/dev-server/client/styles/_index.css +24 -0
  51. package/plugins/design/dev-server/client/styles.css +1419 -0
  52. package/plugins/design/dev-server/config.schema.json +147 -0
  53. package/plugins/design/dev-server/context-menu.tsx +343 -0
  54. package/plugins/design/dev-server/context.ts +173 -0
  55. package/plugins/design/dev-server/dist/client.bundle.js +20323 -0
  56. package/plugins/design/dev-server/dist/styles.css +2875 -0
  57. package/plugins/design/dev-server/examples/README.md +9 -0
  58. package/plugins/design/dev-server/examples/perf-100-artboards.tsx +113 -0
  59. package/plugins/design/dev-server/fs-watch.ts +63 -0
  60. package/plugins/design/dev-server/handoff.ts +721 -0
  61. package/plugins/design/dev-server/history.ts +125 -0
  62. package/plugins/design/dev-server/hmr-broadcast.ts +114 -0
  63. package/plugins/design/dev-server/http.ts +413 -0
  64. package/plugins/design/dev-server/input-router.tsx +485 -0
  65. package/plugins/design/dev-server/inspect.ts +365 -0
  66. package/plugins/design/dev-server/locator.ts +159 -0
  67. package/plugins/design/dev-server/mem.ts +97 -0
  68. package/plugins/design/dev-server/runtime-bundle.ts +235 -0
  69. package/plugins/design/dev-server/server.mjs +1246 -0
  70. package/plugins/design/dev-server/server.ts +131 -0
  71. package/plugins/design/dev-server/test/_helpers.ts +81 -0
  72. package/plugins/design/dev-server/test/active-state.test.ts +145 -0
  73. package/plugins/design/dev-server/test/annotations-api.test.ts +146 -0
  74. package/plugins/design/dev-server/test/annotations-layer.test.ts +419 -0
  75. package/plugins/design/dev-server/test/binary-smoke.test.ts +47 -0
  76. package/plugins/design/dev-server/test/bundle-smoke.test.ts +29 -0
  77. package/plugins/design/dev-server/test/canvas-build.test.ts +78 -0
  78. package/plugins/design/dev-server/test/canvas-edit.test.ts +139 -0
  79. package/plugins/design/dev-server/test/canvas-header.test.ts +127 -0
  80. package/plugins/design/dev-server/test/canvas-lib-inline.test.ts +146 -0
  81. package/plugins/design/dev-server/test/canvas-lib-resolver.test.ts +112 -0
  82. package/plugins/design/dev-server/test/canvas-meta-api.test.ts +236 -0
  83. package/plugins/design/dev-server/test/canvas-pipeline.test.ts +180 -0
  84. package/plugins/design/dev-server/test/canvas-route.test.ts +176 -0
  85. package/plugins/design/dev-server/test/fs-watch.test.ts +41 -0
  86. package/plugins/design/dev-server/test/handoff-static-frames.test.ts +215 -0
  87. package/plugins/design/dev-server/test/handoff.test.ts +281 -0
  88. package/plugins/design/dev-server/test/history-rollback.test.ts +62 -0
  89. package/plugins/design/dev-server/test/hmr-broadcast.test.ts +108 -0
  90. package/plugins/design/dev-server/test/input-router.test.ts +316 -0
  91. package/plugins/design/dev-server/test/locator.test.ts +214 -0
  92. package/plugins/design/dev-server/test/perf-harness.ts +193 -0
  93. package/plugins/design/dev-server/test/phase-3.6-smoke.test.ts +77 -0
  94. package/plugins/design/dev-server/test/runtime-bundle.test.ts +69 -0
  95. package/plugins/design/dev-server/test/server-lifecycle.test.ts +28 -0
  96. package/plugins/design/dev-server/test/tool-palette.test.tsx +55 -0
  97. package/plugins/design/dev-server/test/use-annotation-selection.test.tsx +77 -0
  98. package/plugins/design/dev-server/test/use-artboard-drag.test.ts +325 -0
  99. package/plugins/design/dev-server/test/use-selection-set.test.tsx +166 -0
  100. package/plugins/design/dev-server/test/use-snap-guides.test.ts +190 -0
  101. package/plugins/design/dev-server/test/use-tool-mode.test.tsx +93 -0
  102. package/plugins/design/dev-server/test/ws-handshake.test.ts +33 -0
  103. package/plugins/design/dev-server/tool-palette.tsx +278 -0
  104. package/plugins/design/dev-server/tsconfig.json +26 -0
  105. package/plugins/design/dev-server/use-annotation-selection.tsx +92 -0
  106. package/plugins/design/dev-server/use-annotations-visibility.tsx +43 -0
  107. package/plugins/design/dev-server/use-artboard-drag.tsx +445 -0
  108. package/plugins/design/dev-server/use-selection-set.tsx +224 -0
  109. package/plugins/design/dev-server/use-snap-guides.tsx +215 -0
  110. package/plugins/design/dev-server/use-tool-mode.tsx +114 -0
  111. package/plugins/design/dev-server/ws.ts +90 -0
  112. package/plugins/design/templates/_shell.html +177 -0
  113. package/plugins/design/templates/canvas.tsx.template +54 -0
  114. package/plugins/design/templates/design-system-inspiration/_MAPPING.md +277 -0
  115. package/plugins/design/templates/design-system-inspiration/_README.md +71 -0
  116. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-banner.html +68 -0
  117. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-empty-state-generous.html +39 -0
  118. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-feature-grid.html +62 -0
  119. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-marketing-card.html +63 -0
  120. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-testimonial.html +80 -0
  121. package/plugins/design/templates/design-system-inspiration/audience-developer/components-code-block.html +71 -0
  122. package/plugins/design/templates/design-system-inspiration/audience-developer/components-diff-view.html +65 -0
  123. package/plugins/design/templates/design-system-inspiration/audience-developer/components-log-stream.html +62 -0
  124. package/plugins/design/templates/design-system-inspiration/audience-developer/components-monospace-table.html +57 -0
  125. package/plugins/design/templates/design-system-inspiration/audience-developer/components-terminal-pane.html +67 -0
  126. package/plugins/design/templates/design-system-inspiration/audience-developer/type-mono.html +57 -0
  127. package/plugins/design/templates/design-system-inspiration/audience-pro/colors-presence.html +74 -0
  128. package/plugins/design/templates/design-system-inspiration/audience-pro/components-command-palette.html +90 -0
  129. package/plugins/design/templates/design-system-inspiration/audience-pro/components-keyboard.html +51 -0
  130. package/plugins/design/templates/design-system-inspiration/audience-pro/components-list.html +89 -0
  131. package/plugins/design/templates/design-system-inspiration/audience-pro/components-shortcuts-overlay.html +85 -0
  132. package/plugins/design/templates/design-system-inspiration/audience-pro/components-toast-menu.html +80 -0
  133. package/plugins/design/templates/design-system-inspiration/core/INDEX.md.tpl +25 -0
  134. package/plugins/design/templates/design-system-inspiration/core/README.orchestration.md.tpl +71 -0
  135. package/plugins/design/templates/design-system-inspiration/core/README.philosophy.md.tpl +77 -0
  136. package/plugins/design/templates/design-system-inspiration/core/SKILL.md.tpl +50 -0
  137. package/plugins/design/templates/design-system-inspiration/core/colors_and_type.css.tpl +111 -0
  138. package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +28 -0
  139. package/plugins/design/templates/design-system-inspiration/core/preview/_layout.css +113 -0
  140. package/plugins/design/templates/design-system-inspiration/core/preview/colors-accent.html +48 -0
  141. package/plugins/design/templates/design-system-inspiration/core/preview/colors-surfaces.html +49 -0
  142. package/plugins/design/templates/design-system-inspiration/core/preview/colors-text.html +52 -0
  143. package/plugins/design/templates/design-system-inspiration/core/preview/components-buttons.html +83 -0
  144. package/plugins/design/templates/design-system-inspiration/core/preview/components-cards.html +79 -0
  145. package/plugins/design/templates/design-system-inspiration/core/preview/components-inputs.html +82 -0
  146. package/plugins/design/templates/design-system-inspiration/core/preview/motion.html +66 -0
  147. package/plugins/design/templates/design-system-inspiration/core/preview/spacing-scale.html +53 -0
  148. package/plugins/design/templates/design-system-inspiration/core/preview/type-scale.html +62 -0
  149. package/plugins/design/templates/design-system-inspiration/foundations/borders.html +39 -0
  150. package/plugins/design/templates/design-system-inspiration/foundations/elevation.html +46 -0
  151. package/plugins/design/templates/design-system-inspiration/foundations/focus.html +48 -0
  152. package/plugins/design/templates/design-system-inspiration/foundations/grid.html +51 -0
  153. package/plugins/design/templates/design-system-inspiration/foundations/iconography.html +73 -0
  154. package/plugins/design/templates/design-system-inspiration/foundations/opacity.html +45 -0
  155. package/plugins/design/templates/design-system-inspiration/foundations/radii.html +40 -0
  156. package/plugins/design/templates/design-system-inspiration/foundations/selection.html +45 -0
  157. package/plugins/design/templates/design-system-inspiration/meta/accessibility.html +62 -0
  158. package/plugins/design/templates/design-system-inspiration/meta/i18n.html +73 -0
  159. package/plugins/design/templates/design-system-inspiration/meta/presence-multiplayer.html +71 -0
  160. package/plugins/design/templates/design-system-inspiration/meta/tokens-index.html +80 -0
  161. package/plugins/design/templates/design-system-inspiration/patterns/patterns-auth.html +78 -0
  162. package/plugins/design/templates/design-system-inspiration/patterns/patterns-data-density.html +61 -0
  163. package/plugins/design/templates/design-system-inspiration/patterns/patterns-error-pages.html +70 -0
  164. package/plugins/design/templates/design-system-inspiration/patterns/patterns-form-layouts.html +70 -0
  165. package/plugins/design/templates/design-system-inspiration/patterns/patterns-onboarding.html +71 -0
  166. package/plugins/design/templates/design-system-inspiration/patterns/patterns-pricing.html +83 -0
  167. package/plugins/design/templates/design-system-inspiration/platform-desktop/components-resize-panels.html +63 -0
  168. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-index.html +55 -0
  169. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-showcase.html +302 -0
  170. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-bottom-sheet.html +63 -0
  171. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-pull-to-refresh.html +74 -0
  172. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-segmented-control.html +51 -0
  173. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-tab-bar.html +57 -0
  174. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-index.html +58 -0
  175. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-showcase.html +237 -0
  176. package/plugins/design/templates/design-system-inspiration/status/colors-status.html +49 -0
  177. package/plugins/design/templates/design-system-inspiration/status/components-status.html +63 -0
  178. package/plugins/design/templates/design-system-inspiration/status/skeletons.html +74 -0
  179. package/plugins/design/templates/design-system-inspiration/theme-both/colors-themes-side-by-side.html +59 -0
  180. package/plugins/design/templates/design-system-inspiration/universal/components-callout.html +74 -0
  181. package/plugins/design/templates/design-system-inspiration/universal/components-dialogs.html +81 -0
  182. package/plugins/design/templates/design-system-inspiration/universal/components-tables.html +101 -0
  183. package/plugins/design/templates/design-system-inspiration/universal/components-toggles.html +74 -0
  184. package/plugins/design/templates/design-system-inspiration/universal/components-tooltips.html +74 -0
  185. package/plugins/design/templates/design-system-inspiration/universal/empty-state.html.tpl +34 -0
  186. package/plugins/design/templates/design-system-inspiration/universal/logo.html +42 -0
  187. package/plugins/design/templates/ds-specimen.tsx.template +59 -0
  188. package/plugins/flow/.claude-plugin/config.schema.json +398 -0
  189. package/plugins/flow/README.md +45 -0
  190. package/plugins/flow/templates/ai-skeleton/INDEX.md +50 -0
  191. package/plugins/flow/templates/ai-skeleton/README.md +46 -0
  192. package/plugins/flow/templates/ai-skeleton/browser/har/.gitkeep +0 -0
  193. package/plugins/flow/templates/ai-skeleton/browser/snapshots/.gitkeep +0 -0
  194. package/plugins/flow/templates/ai-skeleton/business/README.md +12 -0
  195. package/plugins/flow/templates/ai-skeleton/context/README.md +12 -0
  196. package/plugins/flow/templates/ai-skeleton/decisions/README.md +20 -0
  197. package/plugins/flow/templates/ai-skeleton/design-import/.gitkeep +0 -0
  198. package/plugins/flow/templates/ai-skeleton/dev-logs/.gitkeep +0 -0
  199. package/plugins/flow/templates/ai-skeleton/device/.gitkeep +0 -0
  200. package/plugins/flow/templates/ai-skeleton/docs/README.md +5 -0
  201. package/plugins/flow/templates/ai-skeleton/logs/.gitkeep +0 -0
  202. package/plugins/flow/templates/ai-skeleton/logs/README.md +13 -0
  203. package/plugins/flow/templates/ai-skeleton/plans/README.md +16 -0
  204. package/plugins/flow/templates/ai-skeleton/plans/archive/.gitkeep +0 -0
  205. package/plugins/flow/templates/ai-skeleton/release-guide.md +35 -0
  206. package/plugins/flow/templates/ai-skeleton/reviews/README.md +15 -0
  207. package/plugins/flow/templates/ai-skeleton/scenarios/README.md +26 -0
  208. package/plugins/flow/templates/ai-skeleton/scenarios/_lib/.gitkeep +0 -0
  209. package/plugins/flow/templates/ai-skeleton/state/STATE.md +25 -0
  210. package/plugins/flow/templates/ai-skeleton/templates/HANDOFF.md +32 -0
  211. package/plugins/flow/templates/ai-skeleton/workflows.config.json +74 -0
@@ -0,0 +1,34 @@
1
+ <!--
2
+ SPECIMEN: empty-state
3
+ DEMONSTRATES: --bg-1, --fg-0..2, --accent, --accent-fg, --radius-md, --space-4/5
4
+ COMPOSITION: generic empty state — icon, title, supporting sentence, primary action
5
+ COPY VOICE: title is the situation ("No matches yet"), supporting sentence is what to do next ("Log your first match"), action verb on the CTA ("Log a match", never "Get Started")
6
+ WHEN SCAFFOLDED: universal (default-on)
7
+ NOTES: Replace {{empty_subject}} with the actual project subject during scaffold. Empty states should feel earned, not generic — name the actual thing that's missing.
8
+ -->
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <title>Empty state — {{project_label}}</title>
14
+ <link rel="stylesheet" href="../core/colors_and_type.css" />
15
+ <link rel="stylesheet" href="../core/preview/_layout.css" />
16
+ </head>
17
+ <body class="app" data-theme="{{theme_default}}">
18
+ <main class="specimen">
19
+ <h1>Empty state</h1>
20
+ <p class="lede">Empty states are an opportunity. Don't waste them on "Nothing here yet" — name the thing that's missing, then offer the next step.</p>
21
+
22
+ <div style="background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 48px; text-align: center; max-width: 480px;">
23
+ <div style="font-size: 48px; line-height: 1; color: var(--fg-2); margin-bottom: 16px;" aria-hidden="true">∅</div>
24
+ <p style="margin: 0 0 4px; font-family: var(--font-display); font-size: var(--type-lg); font-weight: 600; color: var(--fg-0);">No {{empty_subject}} yet</p>
25
+ <p style="margin: 0 0 24px; color: var(--fg-1); font-size: var(--type-sm); max-width: 36ch; margin-left: auto; margin-right: auto;">{{empty_supporting}}</p>
26
+ <button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 16px; border-radius: var(--radius-md); font: inherit; cursor: pointer;">{{empty_cta}}</button>
27
+ </div>
28
+
29
+ <footer class="legend">
30
+ <p>Empty-state copy survives years. Spend the time to write a real sentence: "Log your first match" beats "Get started" every time.</p>
31
+ </footer>
32
+ </main>
33
+ </body>
34
+ </html>
@@ -0,0 +1,42 @@
1
+ <!--
2
+ SPECIMEN: logo
3
+ DEMONSTRATES: brand wordmark + mark in their canonical contexts (dark frame, light frame, mark-only)
4
+ COMPOSITION: 3 framed presentations — wordmark on --bg-1 (dark), wordmark on white (light), mark glyph alone
5
+ COPY VOICE: tiny labels under each frame ("Wordmark — dark", "Wordmark — light", "Mark — glyph")
6
+ WHEN SCAFFOLDED: conditional — scaffold IF assets/logos/ contains at least one *.svg (otherwise the specimen has nothing to display). The skill should ALSO generate a minimal placeholder SVG at scaffold time if a wordmark claim exists in copy.
7
+ NOTES:
8
+ - The asset files referenced are placeholder paths — the skill rewrites these to point at the actual SVGs in assets/logos/ at scaffold time.
9
+ - If no wordmark exists yet, skip this specimen entirely rather than rendering a broken-image placeholder.
10
+ - Light frame uses an explicit white bg so the light-variant wordmark contrast is verifiable.
11
+ -->
12
+ <!doctype html>
13
+ <html lang="en" data-theme="dark">
14
+ <head>
15
+ <meta charset="utf-8" />
16
+ <title>Logo</title>
17
+ <link rel="stylesheet" href="../core/colors_and_type.css" />
18
+ <link rel="stylesheet" href="../core/preview/_layout.css" />
19
+ <style>
20
+ body { padding: 24px; display: flex; gap: 20px; align-items: center; flex-wrap: wrap; }
21
+ .frame { padding: 18px 22px; border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); background: var(--bg-1); }
22
+ .light { background: #ffffff; }
23
+ .label { font-family: var(--font-mono); font-size: 11px; font-weight: 500; color: var(--fg-2); text-transform: uppercase; letter-spacing: 0.04em; margin-top: 10px; display: block; }
24
+ </style>
25
+ </head>
26
+ <body class="app">
27
+ <div>
28
+ <div class="frame"><img src="../assets/logos/wordmark.svg" alt="" style="display: block; height: 28px;" /></div>
29
+ <span class="label">Wordmark — dark</span>
30
+ </div>
31
+ <div>
32
+ <div class="frame light"><img src="../assets/logos/wordmark-light.svg" alt="" style="display: block; height: 28px;" /></div>
33
+ <span class="label">Wordmark — light</span>
34
+ </div>
35
+ <div>
36
+ <div class="frame" style="display: flex; align-items: center; justify-content: center; height: 64px; width: 64px; padding: 0;">
37
+ <img src="../assets/logos/mark.svg" alt="" style="display: block; width: 36px; height: 36px;" />
38
+ </div>
39
+ <span class="label">Mark — glyph</span>
40
+ </div>
41
+ </body>
42
+ </html>
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @canvas {{NAME}} — {{SUBTITLE}}
3
+ * @ds {{DS_NAME}}
4
+ * @platform {{PLATFORM}}
5
+ * @opt_out {{OPT_OUT_SCOPE}}
6
+ * @artboards primary
7
+ * @brief DS specimen — {{NAME}}
8
+ * @stack React 19 · TSX · Bun.build · css_mode={{CSS_MODE}}
9
+ * @history {{HISTORY_DIR}}
10
+ * @handoff bunx shadcn add file://./{{NAME}}.registry.json
11
+ *
12
+ * Specimen surface for the {{DS_NAME}} design system. Bare TSX — no canvas-
13
+ * lib envelope (DesignCanvas / DCSection / DCArtboard). Specimens are
14
+ * flowing reference pages styled by `_layout.css` (which assumes `<body>` is
15
+ * the outer flex column) and their own component CSS rules in
16
+ * `_components.css`. The `<header class="specimen-hd">` provides SKU +
17
+ * crumbs + theme toggle exactly like the original .html specimens did.
18
+ *
19
+ * Tokens + `_layout.css` + `_components.css` are loaded by the dev-server's
20
+ * `_shell.html` harness via the iframe's `?tokens=` / `?components=` /
21
+ * `?layout=` query.
22
+ *
23
+ * Per-specimen bespoke CSS lives in a sibling `<Slug>.css` — `import` it
24
+ * below; canvas-build.ts injects it as a `<style>` tag at module init so
25
+ * the drop stays self-contained. (No `<link>` needed.)
26
+ *
27
+ * `data-cd-id="<8 hex>"` attributes are injected at request time by the
28
+ * dev-server's canvas pipeline pass 1 — don't author them by hand.
29
+ */
30
+
31
+ import "./{{NAME}}.css";
32
+
33
+ export default function {{COMPONENT_NAME}}() {
34
+ return (
35
+ <>
36
+ <header className="specimen-hd">
37
+ <span className="sku">{{SKU}}</span>
38
+ <span className="crumbs">
39
+ {/* {{CRUMB_HINT}} */}
40
+ </span>
41
+ {/* Theme toggle is wired by the host page (matchMedia + localStorage),
42
+ mirroring the legacy .html specimens. Author static markup here. */}
43
+ <span className="theme-toggle" role="tablist" aria-label="Theme">
44
+ <button data-theme="light">LIGHT</button>
45
+ <button data-theme="dark">DARK</button>
46
+ </span>
47
+ </header>
48
+
49
+ <main className="specimen">
50
+ <section className="specimen-title">
51
+ <h1>{{NAME}}</h1>
52
+ <p className="lede">{{BRIEF}}</p>
53
+ </section>
54
+
55
+ {/* Replace this scaffold with the actual specimen content. */}
56
+ </main>
57
+ </>
58
+ );
59
+ }
@@ -0,0 +1,398 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "flow plugin — per-repo config",
4
+ "description": "Per-repo configuration consumed by the flow plugin's commands, skills, and subagents. Place at <repo>/.ai/workflows.config.json. Missing file = defaults; missing keys = same.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["name"],
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "Short project / product name. Resolves the `<project>` placeholder in commands and file paths (e.g. `.ai/<project>-prd.md` → `.ai/<name>-prd.md`)."
12
+ },
13
+ "language": {
14
+ "type": "string",
15
+ "description": "Primary language used in plans, decisions, and review notes. ISO 639-1 (e.g. `en`, `cs`). Cosmetic — does not change plugin behaviour, only signals the team's preferred tone.",
16
+ "default": "en"
17
+ },
18
+ "theme": {
19
+ "type": "string",
20
+ "enum": ["dark", "light", "agnostic"],
21
+ "description": "Default theme target. `dark` and `light` enable theme-first contrast validation in a11y-rules; `agnostic` checks both.",
22
+ "default": "agnostic"
23
+ },
24
+ "paths": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "description": "Where to find canonical project context files. Defaults follow `<project>` placeholder convention.",
28
+ "properties": {
29
+ "prd": {
30
+ "type": "string",
31
+ "description": "Project requirements / product brief. Default: `.ai/<name>-prd.md`."
32
+ },
33
+ "designSystem": {
34
+ "type": "string",
35
+ "description": "Design system reference. Default: `.ai/<name>-design-system.md`."
36
+ },
37
+ "codebaseMap": {
38
+ "type": "string",
39
+ "description": "Living codebase snapshot. Default: `.ai/context/codebase-map.md`.",
40
+ "default": ".ai/context/codebase-map.md"
41
+ }
42
+ }
43
+ },
44
+ "platforms": {
45
+ "type": "array",
46
+ "description": "Platform variants the project ships to. Drives scenario-runner matrix and responsive-rules density mapping.",
47
+ "items": {
48
+ "type": "string",
49
+ "enum": [
50
+ "web-desktop",
51
+ "web-mobile",
52
+ "ios-phone",
53
+ "ios-tablet",
54
+ "android-phone",
55
+ "android-tablet",
56
+ "macos",
57
+ "windows",
58
+ "linux"
59
+ ]
60
+ },
61
+ "default": ["web-desktop"],
62
+ "uniqueItems": true
63
+ },
64
+ "bundleIdPrefix": {
65
+ "type": "string",
66
+ "description": "Native app bundle ID prefix (e.g. `com.acme.myapp`). Used by `/flow:utils-verify` and `/flow:scenario` when launching native builds. Omit for web-only projects."
67
+ },
68
+ "stack": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "description": "Auto-detected technology stack snapshot. Populated by /flow:init, refreshed by /flow:setup-codebase-map. Flow commands read this for routing decisions (e.g. which test runner to invoke, whether to gate on monorepo workspace builds). Use `unknown` when detection fails — never invent a value.",
72
+ "properties": {
73
+ "language": {
74
+ "type": "string",
75
+ "description": "Primary language: typescript | javascript | python | go | rust | java | kotlin | swift | ruby | php | unknown"
76
+ },
77
+ "framework": {
78
+ "type": "string",
79
+ "description": "Primary UI/app framework: next.js | vite | remix | sveltekit | astro | nuxt | expo | spring-boot | django | rails | express | fastapi | none | unknown"
80
+ },
81
+ "packageManager": {
82
+ "type": "string",
83
+ "description": "pnpm | yarn | npm | bun | cargo | go | pip | poetry | uv | maven | gradle | unknown"
84
+ },
85
+ "buildTool": {
86
+ "type": "string",
87
+ "description": "turbo | nx | lerna | rush | make | bazel | none | unknown"
88
+ },
89
+ "monorepo": {
90
+ "type": "boolean",
91
+ "description": "True if pnpm-workspace.yaml, turbo.json, nx.json, lerna.json, or rush.json is present."
92
+ },
93
+ "ci": {
94
+ "type": "string",
95
+ "description": "github-actions | gitlab-ci | jenkins | azure-devops | circleci | bitbucket | none | unknown"
96
+ },
97
+ "tests": {
98
+ "type": "string",
99
+ "description": "vitest | jest | playwright | cypress | rspec | pytest | go-test | cargo-test | junit | none | unknown"
100
+ },
101
+ "css": {
102
+ "type": "string",
103
+ "description": "tailwind | css-modules | styled-components | emotion | vanilla-extract | sass | plain-css | none | unknown"
104
+ },
105
+ "router": {
106
+ "type": "string",
107
+ "description": "next-app | next-pages | react-router | tanstack-router | expo-router | sveltekit-router | none | unknown"
108
+ }
109
+ }
110
+ },
111
+ "conventions": {
112
+ "type": "object",
113
+ "additionalProperties": false,
114
+ "description": "Team conventions that flow commands enforce or display. Auto-detected where possible (e.g. `commits` from commitlint.config.*); otherwise asked once in /flow:init. Document non-obvious 'why' in `.ai/decisions/` as DDRs.",
115
+ "properties": {
116
+ "branchingModel": {
117
+ "type": "string",
118
+ "enum": ["github-flow", "trunk-based", "gitflow", "release-branch", "other"],
119
+ "description": "How feature branches relate to main. Drives /flow:done's push + PR behavior."
120
+ },
121
+ "commits": {
122
+ "type": "string",
123
+ "enum": ["conventional", "gitmoji", "free-form"],
124
+ "default": "conventional",
125
+ "description": "Commit message style. /flow:done formats commits to match."
126
+ },
127
+ "prohibited": {
128
+ "type": "array",
129
+ "items": { "type": "string" },
130
+ "default": [],
131
+ "description": "Packages, libraries, or APIs the project rejects (e.g. `lodash` because we use native ES; `moment` because we use date-fns). Flow commands flag accidental introduction."
132
+ },
133
+ "proxy": {
134
+ "type": "string",
135
+ "description": "Network constraint that commands must respect (e.g. `GODEBUG=x509negativeserial=1` for orgs with old certs)."
136
+ }
137
+ }
138
+ },
139
+ "boundaries": {
140
+ "type": "object",
141
+ "additionalProperties": false,
142
+ "description": "Integration boundaries the project crosses. debugging-rules and testing-rules treat these as no-mock zones and demand evidence at the seam.",
143
+ "properties": {
144
+ "realtime": { "type": "array", "items": { "type": "string" }, "default": [] },
145
+ "video": { "type": "array", "items": { "type": "string" }, "default": [] },
146
+ "api": { "type": "array", "items": { "type": "string" }, "default": [] },
147
+ "db": { "type": "array", "items": { "type": "string" }, "default": [] },
148
+ "auth": { "type": "array", "items": { "type": "string" }, "default": [] },
149
+ "telemetry": { "type": "array", "items": { "type": "string" }, "default": [] },
150
+ "payments": { "type": "array", "items": { "type": "string" }, "default": [] }
151
+ }
152
+ },
153
+ "motion": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "description": "Motion duration budgets in milliseconds. motion-rules enforces these as hard ceilings.",
157
+ "properties": {
158
+ "micro": {
159
+ "type": "integer",
160
+ "minimum": 0,
161
+ "default": 300,
162
+ "description": "Hover, focus, tooltip, icon swap."
163
+ },
164
+ "page": {
165
+ "type": "integer",
166
+ "minimum": 0,
167
+ "default": 500,
168
+ "description": "Route transition, modal open."
169
+ },
170
+ "complex": {
171
+ "type": "integer",
172
+ "minimum": 0,
173
+ "default": 1000,
174
+ "description": "Multi-step orchestrations, hero choreography."
175
+ },
176
+ "customPulses": {
177
+ "type": "object",
178
+ "description": "Named long-running ambient animations (e.g. `liveIndicator: 1500`). Exempt from the page/complex caps because they're loops, not transitions.",
179
+ "additionalProperties": { "type": "integer", "minimum": 0 },
180
+ "default": {}
181
+ }
182
+ }
183
+ },
184
+ "responsive": {
185
+ "type": "object",
186
+ "additionalProperties": false,
187
+ "description": "Responsive layout knobs. responsive-rules reads this to enforce density-per-platform.",
188
+ "properties": {
189
+ "approach": {
190
+ "type": "string",
191
+ "enum": ["mobile-first", "desktop-first"],
192
+ "default": "mobile-first"
193
+ },
194
+ "densityMap": {
195
+ "type": "object",
196
+ "description": "Maps each entry in `platforms` to a density preset (`command-center` | `sideline-tool` | `palm-friendly` | `cozy` | `compact` | custom). responsive-rules uses this to flag wrong density per platform.",
197
+ "additionalProperties": { "type": "string" },
198
+ "default": {}
199
+ },
200
+ "breakpoints": {
201
+ "type": "object",
202
+ "description": "Named breakpoint tokens (px). Override only if project differs from defaults.",
203
+ "additionalProperties": { "type": "integer", "minimum": 0 },
204
+ "default": { "sm": 480, "md": 768, "lg": 1024, "xl": 1280, "2xl": 1536 }
205
+ }
206
+ }
207
+ },
208
+ "ux": {
209
+ "type": "object",
210
+ "additionalProperties": false,
211
+ "description": "UX hard targets surfaced to design-system-guard and any project-local UX critic.",
212
+ "properties": {
213
+ "responseTargetMs": {
214
+ "type": "integer",
215
+ "minimum": 0,
216
+ "default": 100,
217
+ "description": "User-perceived response time ceiling for primary interactions."
218
+ },
219
+ "bilingual": {
220
+ "type": "array",
221
+ "items": { "type": "string" },
222
+ "default": [],
223
+ "description": "ISO 639-1 codes the UI ships in (e.g. `[\"cs\", \"en\"]`). Empty = monolingual."
224
+ }
225
+ }
226
+ },
227
+ "security": {
228
+ "type": "object",
229
+ "additionalProperties": false,
230
+ "description": "Security review knobs. security-auditor + ethical-hacker subagents read these. Skip the whole pass with skills.securityRules.enabled = false.",
231
+ "properties": {
232
+ "severityFloor": {
233
+ "type": "string",
234
+ "enum": ["low", "medium", "high", "critical"],
235
+ "default": "medium",
236
+ "description": "Lowest severity that blocks /flow:validate step 6.5 and /flow:validate-security. Findings below this rate as warnings, not blockers."
237
+ },
238
+ "scope": {
239
+ "type": "array",
240
+ "items": { "type": "string", "enum": ["classic", "ai", "supply-chain"] },
241
+ "default": ["classic", "ai", "supply-chain"],
242
+ "description": "Which rule families to evaluate. Drop \"ai\" if the project has no model / MCP surface; drop \"supply-chain\" for projects with no third-party deps."
243
+ },
244
+ "includeAi": {
245
+ "type": "boolean",
246
+ "default": true,
247
+ "description": "Shortcut to enable/disable §B AI-era rules in security-rules skill. When false, ethical-hacker still threat-models classic surface but the mandatory AI/MCP section reads \"N/A — disabled by config\"."
248
+ }
249
+ }
250
+ },
251
+ "skills": {
252
+ "type": "object",
253
+ "additionalProperties": false,
254
+ "description": "Per-skill toggles. Each enforcement skill respects its own `enabled` flag (default `true`).",
255
+ "properties": {
256
+ "motionRules": {
257
+ "type": "object",
258
+ "properties": { "enabled": { "type": "boolean", "default": true } },
259
+ "additionalProperties": false
260
+ },
261
+ "responsiveRules": {
262
+ "type": "object",
263
+ "properties": { "enabled": { "type": "boolean", "default": true } },
264
+ "additionalProperties": false
265
+ },
266
+ "a11yRules": {
267
+ "type": "object",
268
+ "properties": { "enabled": { "type": "boolean", "default": true } },
269
+ "additionalProperties": false
270
+ },
271
+ "testingRules": {
272
+ "type": "object",
273
+ "properties": { "enabled": { "type": "boolean", "default": true } },
274
+ "additionalProperties": false
275
+ },
276
+ "debuggingRules": {
277
+ "type": "object",
278
+ "properties": { "enabled": { "type": "boolean", "default": true } },
279
+ "additionalProperties": false
280
+ },
281
+ "securityRules": {
282
+ "type": "object",
283
+ "properties": { "enabled": { "type": "boolean", "default": true } },
284
+ "additionalProperties": false
285
+ },
286
+ "coverageTrend": {
287
+ "type": "object",
288
+ "description": "Optional coverage-trend warning in /flow:validate. Opt-in — disabled by default, because not every project has a stable coverage signal worth gating on. When enabled, /flow:validate parses the current run's coverage and compares against `.ai/state/coverage-baseline.json`; a drop greater than `warnThresholdPp` percentage points emits a soft warning (never blocks). Baseline is refreshed by /flow:done after a green run.",
289
+ "additionalProperties": false,
290
+ "properties": {
291
+ "enabled": { "type": "boolean", "default": false },
292
+ "warnThresholdPp": {
293
+ "type": "number",
294
+ "description": "Percentage-point drop that triggers the warning. e.g. `1.0` means a 1-point drop (78% → 77%) warns.",
295
+ "default": 1.0,
296
+ "minimum": 0
297
+ },
298
+ "baselineBranch": {
299
+ "type": "string",
300
+ "description": "Branch whose coverage is considered authoritative. /flow:done writes the baseline only when the active branch matches this value (typically `main`).",
301
+ "default": "main"
302
+ }
303
+ }
304
+ }
305
+ }
306
+ },
307
+ "integrations": {
308
+ "type": "object",
309
+ "additionalProperties": false,
310
+ "description": "Lightweight pointers to external services the project plugs into. Generic commands read `provider` and decide whether to offer integration actions; project-specific shape (list IDs, custom field names, milestone hierarchies) lives in `defaults`. Document non-obvious conventions in `.ai/decisions/` as DDRs.",
311
+ "properties": {
312
+ "tracker": {
313
+ "type": "object",
314
+ "additionalProperties": false,
315
+ "description": "Issue / task tracker. Used by /flow:done, /flow:bug-rca, /flow:bug-fix to optionally create or update tickets.",
316
+ "properties": {
317
+ "provider": {
318
+ "type": "string",
319
+ "enum": [
320
+ "clickup",
321
+ "linear",
322
+ "github",
323
+ "jira",
324
+ "notion",
325
+ "asana",
326
+ "shortcut",
327
+ "none"
328
+ ],
329
+ "default": "none"
330
+ },
331
+ "mcp": {
332
+ "type": "string",
333
+ "description": "MCP tool name prefix used to call the provider (e.g. `mcp__claude_ai_ClickUp`, `mcp__github`). Generic commands resolve tool names by appending the operation (`<mcp>_<op>`). Omit if no MCP server is configured — commands will print payloads for manual handling."
334
+ },
335
+ "defaults": {
336
+ "type": "object",
337
+ "description": "Free-form project-specific defaults (list IDs, milestone names, custom field IDs, status labels, …). Generic commands pass this object through to MCP calls untouched. Schema-free on purpose — your tracker's idiosyncrasies belong here, not in the plugin.",
338
+ "additionalProperties": true
339
+ }
340
+ }
341
+ },
342
+ "analytics": {
343
+ "type": "object",
344
+ "additionalProperties": false,
345
+ "description": "Product analytics provider (PostHog, Amplitude, Mixpanel, …). Currently informational — surfaces in scenario reports and DDRs as context.",
346
+ "properties": {
347
+ "provider": { "type": "string", "default": "none" },
348
+ "mcp": { "type": "string" },
349
+ "defaults": { "type": "object", "additionalProperties": true }
350
+ }
351
+ },
352
+ "ci": {
353
+ "type": "object",
354
+ "additionalProperties": false,
355
+ "description": "CI / deploy provider (GitHub Actions, Vercel, Netlify, EAS, …). Used by /flow:validate to know where to look for build status.",
356
+ "properties": {
357
+ "provider": { "type": "string", "default": "none" },
358
+ "mcp": { "type": "string" },
359
+ "defaults": { "type": "object", "additionalProperties": true }
360
+ }
361
+ },
362
+ "design": {
363
+ "type": "object",
364
+ "additionalProperties": false,
365
+ "description": "Design source-of-truth (Figma, Penpot, Sketch, …). Used by /flow:plan when the planning input references design.",
366
+ "properties": {
367
+ "provider": { "type": "string", "default": "none" },
368
+ "mcp": { "type": "string" },
369
+ "defaults": { "type": "object", "additionalProperties": true }
370
+ }
371
+ },
372
+ "changelog": {
373
+ "type": "object",
374
+ "additionalProperties": false,
375
+ "description": "Release-note / changelog tooling. Used by /flow:validate and /flow:done to remind (soft warning) about missing release notes, by /flow:release-changelog to author entries, and by /flow:release to walk the project-owned release runbook. Phase 3 implements the `changesets` provider; other enum values are accepted but treated as no-op until their providers land.",
376
+ "properties": {
377
+ "provider": {
378
+ "type": "string",
379
+ "enum": ["changesets", "git-cliff", "conventional", "custom", "none"],
380
+ "default": "none"
381
+ },
382
+ "scope": {
383
+ "type": "string",
384
+ "description": "Optional package scope for monorepos — e.g. \"@1agh/maude\". Passed to provider commands when they need to target a workspace member."
385
+ },
386
+ "releaseGuide": {
387
+ "type": "string",
388
+ "default": ".ai/release-guide.md",
389
+ "description": "Path (repo-relative) to the project-owned release runbook that /flow:release walks step-by-step. The runbook is plain Markdown — H2 sections become steps, ```bash``` blocks become candidate commands (run only after user confirmation). Scaffolded with a provider-appropriate stub during /flow:init."
390
+ },
391
+ "mcp": { "type": "string" },
392
+ "defaults": { "type": "object", "additionalProperties": true }
393
+ }
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
@@ -0,0 +1,45 @@
1
+ # flow — agentic workflow plugin
2
+
3
+ Generic agentic workflow loop with a second-brain `.ai/` workspace. Project-agnostic via `<project>` placeholders + per-repo `.ai/workflows.config.json`.
4
+
5
+ > For installation and the marketplace-level overview, see the [root README](../../README.md). For the canonical command catalog, see [`CATEGORIES.md`](./CATEGORIES.md).
6
+
7
+ ## Commands at a glance
8
+
9
+ 29 slash commands across 9 categories. Type **`/flow:help`** inside Claude Code for the live, auto-generated grouped index — it parses every command's `category:` frontmatter and prints the table fresh each time.
10
+
11
+ | Group | Count | What it does |
12
+ | ----- | ----- | ------------ |
13
+ | **daily** | 11 | Every-cycle workflow: `plan`, `execute`, `done`, `validate`, `release`, `status`, `pause`, `resume`, `scenario`, `quick`, `help`. |
14
+ | **setup-*** | 4 | One-shot bootstrapping: `init`, `setup-prd`, `setup-codebase-map`, `setup-context`. |
15
+ | **validate-*** | 2 | Specialized validators: `validate-a11y`, `validate-visual`. |
16
+ | **bug-*** | 2 | Incident workflow: `bug-rca`, `bug-fix`. |
17
+ | **record-*** | 3 | Knowledge capture: `record-ddr`, `record-retro`, `record-execution`. |
18
+ | **maintain-*** | 4 | Hygiene: `maintain-clean`, `maintain-docs`, `maintain-ai-health`, `maintain-discover`. |
19
+ | **review-*** | 1 | `review-code` (pre-commit self-review). |
20
+ | **release-*** | 1 | `release-changelog` (sibling of daily `release`). |
21
+ | **utils-*** | 1 | `utils-verify` (sub-step of `execute`). |
22
+
23
+ ## Naming convention
24
+
25
+ | Type | Pattern | Examples |
26
+ | ---- | ------- | -------- |
27
+ | **Daily** (called every feature cycle) | terse verb, no prefix | `plan`, `execute`, `done`, `validate`, `release` |
28
+ | **Everything else** | `<group>-<verb>` | `bug-fix`, `setup-prd`, `record-ddr`, `maintain-clean` |
29
+
30
+ The prefix is **load-bearing**: Claude Code does not support subdirectory namespacing for slash commands ([issue #2422](https://github.com/anthropics/claude-code/issues/2422)), so the `<group>-` prefix is what makes `/flow:bug-` autocomplete to only the bug-* commands. Every non-daily command carries a `category:` frontmatter field that matches its prefix — `/flow:help` reads those fields to render the grouped index.
31
+
32
+ For the full catalog (group definitions, member descriptions, rename history), see [`CATEGORIES.md`](./CATEGORIES.md).
33
+
34
+ ## Subagents
35
+
36
+ - `scenario-runner` — orchestrates cross-platform scenarios.
37
+ - `a11y-auditor` — WCAG 2.1 AA pass over changed UI.
38
+ - `design-system-guard` — compares rendered UI to the project's design system doc.
39
+ - `test-coverage` — flags untested logic paths.
40
+
41
+ ## Skills
42
+
43
+ `workflow-state`, `ddr-keeper`, `scenario`, `agent-browser`, `agent-device`, `codebase-intelligence`, `a11y-checker`, `question-protocol`, `make-skill-template`, `claude-md-keeper`, `debugging-rules`, `a11y-rules`, `motion-rules`, `responsive-rules`, `testing-rules`, `skill-loader`.
44
+
45
+ See [`skills/`](./skills/) for the full list and per-skill SKILL.md files.
@@ -0,0 +1,50 @@
1
+ # `.ai/` — Index
2
+
3
+ > Second-brain map. Auto-maintained by `/flow:status` and `/flow:setup-context`. Hand-edit additions are welcome.
4
+
5
+ ## Identity
6
+
7
+ - name: `<PROJECT_NAME>` — see `.ai/workflows.config.json` → `name`
8
+ - project conventions: see `CLAUDE.md` (or `.claude/CLAUDE.md`) at repo root — generated by Anthropic's `/init`
9
+ - PRD: `.ai/<project>-prd.md`
10
+ - design system: `.ai/<project>-design-system.md`
11
+ - config: `.ai/workflows.config.json`
12
+
13
+ ## Active work
14
+
15
+ > Updated by `/flow:status`. The single most useful screen for "where am I?".
16
+
17
+ - current phase: see `state/STATE.md`
18
+ - active plan: see `state/STATE.md` → Active plan
19
+ - last touched: see `state/STATE.md` → Updated
20
+
21
+ ## Recent decisions
22
+
23
+ > Last 5 DDRs. Full index in `decisions/README.md`.
24
+
25
+ - (none yet — write one with `/flow:record-ddr <title>`)
26
+
27
+ ## Recent plans
28
+
29
+ > Last 5 plans. Archive in `plans/archive/`.
30
+
31
+ - (none yet — write one with `/flow:plan <feature>`)
32
+
33
+ ## Recent scenarios
34
+
35
+ > Most recent run per scenario. Drill into `scenarios/<id>/` for the full history.
36
+
37
+ - (none yet — run with `/flow:scenario <flow>`)
38
+
39
+ ## Where to find things
40
+
41
+ | I want to know… | Look at |
42
+ | --------------- | ------- |
43
+ | What's the project's design rules? | `.ai/<project>-design-system.md` |
44
+ | What are we building? | `.ai/<project>-prd.md` |
45
+ | What did we decide and why? | `decisions/DDR-*.md` |
46
+ | What was the plan for feature X? | `plans/<feature>.md` or `plans/archive/` |
47
+ | How did scenario Y last run? | `scenarios/<flow>/<latest-date>/report.md` |
48
+ | What's the codebase architecture? | `context/codebase-map.md` |
49
+ | Where is the running TODO? | `state/STATE.md` → History tail |
50
+ | Why is the workflow paused? | `state/HANDOFF.md` (if exists) |