@zigrivers/scaffold 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/commands/adopt.d.ts +12 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -0
- package/dist/cli/commands/adopt.js +107 -0
- package/dist/cli/commands/adopt.js.map +1 -0
- package/dist/cli/commands/adopt.test.d.ts +2 -0
- package/dist/cli/commands/adopt.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.test.js +277 -0
- package/dist/cli/commands/adopt.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts +12 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +105 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/build.test.d.ts +2 -0
- package/dist/cli/commands/build.test.d.ts.map +1 -0
- package/dist/cli/commands/build.test.js +272 -0
- package/dist/cli/commands/build.test.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +14 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +102 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/dashboard.test.d.ts +2 -0
- package/dist/cli/commands/dashboard.test.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.test.js +142 -0
- package/dist/cli/commands/dashboard.test.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts +13 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +62 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/decisions.test.d.ts +2 -0
- package/dist/cli/commands/decisions.test.d.ts.map +1 -0
- package/dist/cli/commands/decisions.test.js +154 -0
- package/dist/cli/commands/decisions.test.js.map +1 -0
- package/dist/cli/commands/info.d.ts +12 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +110 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/info.test.d.ts +2 -0
- package/dist/cli/commands/info.test.d.ts.map +1 -0
- package/dist/cli/commands/info.test.js +392 -0
- package/dist/cli/commands/info.test.js.map +1 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +46 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.test.d.ts +2 -0
- package/dist/cli/commands/init.test.d.ts.map +1 -0
- package/dist/cli/commands/init.test.js +156 -0
- package/dist/cli/commands/init.test.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +4 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +346 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/knowledge.test.d.ts +2 -0
- package/dist/cli/commands/knowledge.test.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.test.js +293 -0
- package/dist/cli/commands/knowledge.test.js.map +1 -0
- package/dist/cli/commands/list.d.ts +12 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +73 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/list.test.d.ts +2 -0
- package/dist/cli/commands/list.test.d.ts.map +1 -0
- package/dist/cli/commands/list.test.js +166 -0
- package/dist/cli/commands/list.test.js.map +1 -0
- package/dist/cli/commands/next.d.ts +12 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +75 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/next.test.d.ts +2 -0
- package/dist/cli/commands/next.test.d.ts.map +1 -0
- package/dist/cli/commands/next.test.js +236 -0
- package/dist/cli/commands/next.test.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +13 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +105 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/reset.test.d.ts +2 -0
- package/dist/cli/commands/reset.test.d.ts.map +1 -0
- package/dist/cli/commands/reset.test.js +211 -0
- package/dist/cli/commands/reset.test.js.map +1 -0
- package/dist/cli/commands/run.d.ts +14 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +379 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/run.test.d.ts +2 -0
- package/dist/cli/commands/run.test.d.ts.map +1 -0
- package/dist/cli/commands/run.test.js +535 -0
- package/dist/cli/commands/run.test.js.map +1 -0
- package/dist/cli/commands/skip.d.ts +13 -0
- package/dist/cli/commands/skip.d.ts.map +1 -0
- package/dist/cli/commands/skip.js +123 -0
- package/dist/cli/commands/skip.js.map +1 -0
- package/dist/cli/commands/skip.test.d.ts +2 -0
- package/dist/cli/commands/skip.test.d.ts.map +1 -0
- package/dist/cli/commands/skip.test.js +339 -0
- package/dist/cli/commands/skip.test.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +79 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/status.test.d.ts +2 -0
- package/dist/cli/commands/status.test.d.ts.map +1 -0
- package/dist/cli/commands/status.test.js +245 -0
- package/dist/cli/commands/status.test.js.map +1 -0
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +159 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/update.test.d.ts +2 -0
- package/dist/cli/commands/update.test.d.ts.map +1 -0
- package/dist/cli/commands/update.test.js +140 -0
- package/dist/cli/commands/update.test.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +65 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/validate.test.d.ts +2 -0
- package/dist/cli/commands/validate.test.d.ts.map +1 -0
- package/dist/cli/commands/validate.test.js +159 -0
- package/dist/cli/commands/validate.test.js.map +1 -0
- package/dist/cli/commands/version.d.ts +13 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +89 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/version.test.d.ts +2 -0
- package/dist/cli/commands/version.test.d.ts.map +1 -0
- package/dist/cli/commands/version.test.js +63 -0
- package/dist/cli/commands/version.test.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +72 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.test.d.ts +2 -0
- package/dist/cli/index.test.d.ts.map +1 -0
- package/dist/cli/index.test.js +8 -0
- package/dist/cli/index.test.js.map +1 -0
- package/dist/cli/middleware/output-mode.d.ts +21 -0
- package/dist/cli/middleware/output-mode.d.ts.map +1 -0
- package/dist/cli/middleware/output-mode.js +27 -0
- package/dist/cli/middleware/output-mode.js.map +1 -0
- package/dist/cli/middleware/output-mode.test.d.ts +2 -0
- package/dist/cli/middleware/output-mode.test.d.ts.map +1 -0
- package/dist/cli/middleware/output-mode.test.js +41 -0
- package/dist/cli/middleware/output-mode.test.js.map +1 -0
- package/dist/cli/middleware/project-root.d.ts +21 -0
- package/dist/cli/middleware/project-root.d.ts.map +1 -0
- package/dist/cli/middleware/project-root.js +54 -0
- package/dist/cli/middleware/project-root.js.map +1 -0
- package/dist/cli/middleware/project-root.test.d.ts +2 -0
- package/dist/cli/middleware/project-root.test.d.ts.map +1 -0
- package/dist/cli/middleware/project-root.test.js +112 -0
- package/dist/cli/middleware/project-root.test.js.map +1 -0
- package/dist/cli/output/auto.d.ts +18 -0
- package/dist/cli/output/auto.d.ts.map +1 -0
- package/dist/cli/output/auto.js +43 -0
- package/dist/cli/output/auto.js.map +1 -0
- package/dist/cli/output/context.d.ts +19 -0
- package/dist/cli/output/context.d.ts.map +1 -0
- package/dist/cli/output/context.js +15 -0
- package/dist/cli/output/context.js.map +1 -0
- package/dist/cli/output/context.test.d.ts +2 -0
- package/dist/cli/output/context.test.d.ts.map +1 -0
- package/dist/cli/output/context.test.js +335 -0
- package/dist/cli/output/context.test.js.map +1 -0
- package/dist/cli/output/error-display.d.ts +31 -0
- package/dist/cli/output/error-display.d.ts.map +1 -0
- package/dist/cli/output/error-display.js +79 -0
- package/dist/cli/output/error-display.js.map +1 -0
- package/dist/cli/output/error-display.test.d.ts +2 -0
- package/dist/cli/output/error-display.test.d.ts.map +1 -0
- package/dist/cli/output/error-display.test.js +230 -0
- package/dist/cli/output/error-display.test.js.map +1 -0
- package/dist/cli/output/interactive.d.ts +22 -0
- package/dist/cli/output/interactive.d.ts.map +1 -0
- package/dist/cli/output/interactive.js +126 -0
- package/dist/cli/output/interactive.js.map +1 -0
- package/dist/cli/output/json.d.ts +17 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +62 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/types.d.ts +11 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +159 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +226 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/migration.d.ts +15 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +39 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migration.test.d.ts +2 -0
- package/dist/config/migration.test.d.ts.map +1 -0
- package/dist/config/migration.test.js +44 -0
- package/dist/config/migration.test.js.map +1 -0
- package/dist/config/schema.d.ts +121 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +22 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/schema.test.d.ts +2 -0
- package/dist/config/schema.test.d.ts.map +1 -0
- package/dist/config/schema.test.js +126 -0
- package/dist/config/schema.test.js.map +1 -0
- package/dist/core/adapters/adapter.d.ts +64 -0
- package/dist/core/adapters/adapter.d.ts.map +1 -0
- package/dist/core/adapters/adapter.js +25 -0
- package/dist/core/adapters/adapter.js.map +1 -0
- package/dist/core/adapters/adapter.test.d.ts +2 -0
- package/dist/core/adapters/adapter.test.d.ts.map +1 -0
- package/dist/core/adapters/adapter.test.js +175 -0
- package/dist/core/adapters/adapter.test.js.map +1 -0
- package/dist/core/adapters/claude-code.d.ts +9 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -0
- package/dist/core/adapters/claude-code.js +34 -0
- package/dist/core/adapters/claude-code.js.map +1 -0
- package/dist/core/adapters/claude-code.test.d.ts +2 -0
- package/dist/core/adapters/claude-code.test.d.ts.map +1 -0
- package/dist/core/adapters/claude-code.test.js +100 -0
- package/dist/core/adapters/claude-code.test.js.map +1 -0
- package/dist/core/adapters/codex.d.ts +10 -0
- package/dist/core/adapters/codex.d.ts.map +1 -0
- package/dist/core/adapters/codex.js +61 -0
- package/dist/core/adapters/codex.js.map +1 -0
- package/dist/core/adapters/codex.test.d.ts +2 -0
- package/dist/core/adapters/codex.test.d.ts.map +1 -0
- package/dist/core/adapters/codex.test.js +122 -0
- package/dist/core/adapters/codex.test.js.map +1 -0
- package/dist/core/adapters/universal.d.ts +10 -0
- package/dist/core/adapters/universal.d.ts.map +1 -0
- package/dist/core/adapters/universal.js +45 -0
- package/dist/core/adapters/universal.js.map +1 -0
- package/dist/core/adapters/universal.test.d.ts +2 -0
- package/dist/core/adapters/universal.test.d.ts.map +1 -0
- package/dist/core/adapters/universal.test.js +121 -0
- package/dist/core/adapters/universal.test.js.map +1 -0
- package/dist/core/assembly/context-gatherer.d.ts +17 -0
- package/dist/core/assembly/context-gatherer.d.ts.map +1 -0
- package/dist/core/assembly/context-gatherer.js +49 -0
- package/dist/core/assembly/context-gatherer.js.map +1 -0
- package/dist/core/assembly/context-gatherer.test.d.ts +2 -0
- package/dist/core/assembly/context-gatherer.test.d.ts.map +1 -0
- package/dist/core/assembly/context-gatherer.test.js +252 -0
- package/dist/core/assembly/context-gatherer.test.js.map +1 -0
- package/dist/core/assembly/depth-resolver.d.ts +11 -0
- package/dist/core/assembly/depth-resolver.d.ts.map +1 -0
- package/dist/core/assembly/depth-resolver.js +23 -0
- package/dist/core/assembly/depth-resolver.js.map +1 -0
- package/dist/core/assembly/depth-resolver.test.d.ts +2 -0
- package/dist/core/assembly/depth-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/depth-resolver.test.js +100 -0
- package/dist/core/assembly/depth-resolver.test.js.map +1 -0
- package/dist/core/assembly/engine.d.ts +22 -0
- package/dist/core/assembly/engine.d.ts.map +1 -0
- package/dist/core/assembly/engine.js +215 -0
- package/dist/core/assembly/engine.js.map +1 -0
- package/dist/core/assembly/engine.test.d.ts +2 -0
- package/dist/core/assembly/engine.test.d.ts.map +1 -0
- package/dist/core/assembly/engine.test.js +462 -0
- package/dist/core/assembly/engine.test.js.map +1 -0
- package/dist/core/assembly/instruction-loader.d.ts +16 -0
- package/dist/core/assembly/instruction-loader.d.ts.map +1 -0
- package/dist/core/assembly/instruction-loader.js +40 -0
- package/dist/core/assembly/instruction-loader.js.map +1 -0
- package/dist/core/assembly/instruction-loader.test.d.ts +2 -0
- package/dist/core/assembly/instruction-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/instruction-loader.test.js +109 -0
- package/dist/core/assembly/instruction-loader.test.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.d.ts +34 -0
- package/dist/core/assembly/knowledge-loader.d.ts.map +1 -0
- package/dist/core/assembly/knowledge-loader.js +204 -0
- package/dist/core/assembly/knowledge-loader.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.test.d.ts +2 -0
- package/dist/core/assembly/knowledge-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/knowledge-loader.test.js +205 -0
- package/dist/core/assembly/knowledge-loader.test.js.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.d.ts +13 -0
- package/dist/core/assembly/meta-prompt-loader.d.ts.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.js +91 -0
- package/dist/core/assembly/meta-prompt-loader.js.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.test.d.ts +2 -0
- package/dist/core/assembly/meta-prompt-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.test.js +232 -0
- package/dist/core/assembly/meta-prompt-loader.test.js.map +1 -0
- package/dist/core/assembly/methodology-change.d.ts +27 -0
- package/dist/core/assembly/methodology-change.d.ts.map +1 -0
- package/dist/core/assembly/methodology-change.js +41 -0
- package/dist/core/assembly/methodology-change.js.map +1 -0
- package/dist/core/assembly/methodology-change.test.d.ts +2 -0
- package/dist/core/assembly/methodology-change.test.d.ts.map +1 -0
- package/dist/core/assembly/methodology-change.test.js +145 -0
- package/dist/core/assembly/methodology-change.test.js.map +1 -0
- package/dist/core/assembly/methodology-resolver.d.ts +11 -0
- package/dist/core/assembly/methodology-resolver.d.ts.map +1 -0
- package/dist/core/assembly/methodology-resolver.js +19 -0
- package/dist/core/assembly/methodology-resolver.js.map +1 -0
- package/dist/core/assembly/methodology-resolver.test.d.ts +2 -0
- package/dist/core/assembly/methodology-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/methodology-resolver.test.js +87 -0
- package/dist/core/assembly/methodology-resolver.test.js.map +1 -0
- package/dist/core/assembly/preset-loader.d.ts +26 -0
- package/dist/core/assembly/preset-loader.d.ts.map +1 -0
- package/dist/core/assembly/preset-loader.js +146 -0
- package/dist/core/assembly/preset-loader.js.map +1 -0
- package/dist/core/assembly/preset-loader.test.d.ts +2 -0
- package/dist/core/assembly/preset-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/preset-loader.test.js +107 -0
- package/dist/core/assembly/preset-loader.test.js.map +1 -0
- package/dist/core/assembly/update-mode.d.ts +25 -0
- package/dist/core/assembly/update-mode.d.ts.map +1 -0
- package/dist/core/assembly/update-mode.js +70 -0
- package/dist/core/assembly/update-mode.js.map +1 -0
- package/dist/core/assembly/update-mode.test.d.ts +2 -0
- package/dist/core/assembly/update-mode.test.d.ts.map +1 -0
- package/dist/core/assembly/update-mode.test.js +235 -0
- package/dist/core/assembly/update-mode.test.js.map +1 -0
- package/dist/core/dependency/dependency.d.ts +20 -0
- package/dist/core/dependency/dependency.d.ts.map +1 -0
- package/dist/core/dependency/dependency.js +104 -0
- package/dist/core/dependency/dependency.js.map +1 -0
- package/dist/core/dependency/dependency.test.d.ts +2 -0
- package/dist/core/dependency/dependency.test.d.ts.map +1 -0
- package/dist/core/dependency/dependency.test.js +166 -0
- package/dist/core/dependency/dependency.test.js.map +1 -0
- package/dist/core/dependency/eligibility.d.ts +17 -0
- package/dist/core/dependency/eligibility.d.ts.map +1 -0
- package/dist/core/dependency/eligibility.js +60 -0
- package/dist/core/dependency/eligibility.js.map +1 -0
- package/dist/core/dependency/eligibility.test.d.ts +2 -0
- package/dist/core/dependency/eligibility.test.d.ts.map +1 -0
- package/dist/core/dependency/eligibility.test.js +198 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -0
- package/dist/core/dependency/graph.d.ts +12 -0
- package/dist/core/dependency/graph.d.ts.map +1 -0
- package/dist/core/dependency/graph.js +34 -0
- package/dist/core/dependency/graph.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.d.ts +24 -0
- package/dist/core/knowledge/knowledge-update-assembler.d.ts.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.js +46 -0
- package/dist/core/knowledge/knowledge-update-assembler.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.d.ts +2 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.d.ts.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.js +93 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-template.md +55 -0
- package/dist/dashboard/generator.d.ts +37 -0
- package/dist/dashboard/generator.d.ts.map +1 -0
- package/dist/dashboard/generator.js +42 -0
- package/dist/dashboard/generator.js.map +1 -0
- package/dist/dashboard/generator.test.d.ts +2 -0
- package/dist/dashboard/generator.test.d.ts.map +1 -0
- package/dist/dashboard/generator.test.js +186 -0
- package/dist/dashboard/generator.test.js.map +1 -0
- package/dist/dashboard/template.d.ts +4 -0
- package/dist/dashboard/template.d.ts.map +1 -0
- package/dist/dashboard/template.js +190 -0
- package/dist/dashboard/template.js.map +1 -0
- package/dist/e2e/commands.test.d.ts +9 -0
- package/dist/e2e/commands.test.d.ts.map +1 -0
- package/dist/e2e/commands.test.js +499 -0
- package/dist/e2e/commands.test.js.map +1 -0
- package/dist/e2e/init.test.d.ts +10 -0
- package/dist/e2e/init.test.d.ts.map +1 -0
- package/dist/e2e/init.test.js +180 -0
- package/dist/e2e/init.test.js.map +1 -0
- package/dist/e2e/knowledge.test.d.ts +2 -0
- package/dist/e2e/knowledge.test.d.ts.map +1 -0
- package/dist/e2e/knowledge.test.js +103 -0
- package/dist/e2e/knowledge.test.js.map +1 -0
- package/dist/e2e/pipeline.test.d.ts +8 -0
- package/dist/e2e/pipeline.test.d.ts.map +1 -0
- package/dist/e2e/pipeline.test.js +295 -0
- package/dist/e2e/pipeline.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/project/adopt.d.ts +28 -0
- package/dist/project/adopt.d.ts.map +1 -0
- package/dist/project/adopt.js +49 -0
- package/dist/project/adopt.js.map +1 -0
- package/dist/project/adopt.test.d.ts +2 -0
- package/dist/project/adopt.test.d.ts.map +1 -0
- package/dist/project/adopt.test.js +220 -0
- package/dist/project/adopt.test.js.map +1 -0
- package/dist/project/claude-md.d.ts +33 -0
- package/dist/project/claude-md.d.ts.map +1 -0
- package/dist/project/claude-md.js +112 -0
- package/dist/project/claude-md.js.map +1 -0
- package/dist/project/claude-md.test.d.ts +2 -0
- package/dist/project/claude-md.test.d.ts.map +1 -0
- package/dist/project/claude-md.test.js +151 -0
- package/dist/project/claude-md.test.js.map +1 -0
- package/dist/project/detector.d.ts +7 -0
- package/dist/project/detector.d.ts.map +1 -0
- package/dist/project/detector.js +78 -0
- package/dist/project/detector.js.map +1 -0
- package/dist/project/detector.test.d.ts +2 -0
- package/dist/project/detector.test.d.ts.map +1 -0
- package/dist/project/detector.test.js +137 -0
- package/dist/project/detector.test.js.map +1 -0
- package/dist/project/frontmatter.d.ts +17 -0
- package/dist/project/frontmatter.d.ts.map +1 -0
- package/dist/project/frontmatter.js +236 -0
- package/dist/project/frontmatter.js.map +1 -0
- package/dist/project/frontmatter.test.d.ts +2 -0
- package/dist/project/frontmatter.test.d.ts.map +1 -0
- package/dist/project/frontmatter.test.js +218 -0
- package/dist/project/frontmatter.test.js.map +1 -0
- package/dist/project/signals.d.ts +12 -0
- package/dist/project/signals.d.ts.map +1 -0
- package/dist/project/signals.js +2 -0
- package/dist/project/signals.js.map +1 -0
- package/dist/state/completion.d.ts +22 -0
- package/dist/state/completion.d.ts.map +1 -0
- package/dist/state/completion.js +82 -0
- package/dist/state/completion.js.map +1 -0
- package/dist/state/completion.test.d.ts +2 -0
- package/dist/state/completion.test.d.ts.map +1 -0
- package/dist/state/completion.test.js +246 -0
- package/dist/state/completion.test.js.map +1 -0
- package/dist/state/decision-logger.d.ts +16 -0
- package/dist/state/decision-logger.d.ts.map +1 -0
- package/dist/state/decision-logger.js +80 -0
- package/dist/state/decision-logger.js.map +1 -0
- package/dist/state/decision-logger.test.d.ts +2 -0
- package/dist/state/decision-logger.test.d.ts.map +1 -0
- package/dist/state/decision-logger.test.js +182 -0
- package/dist/state/decision-logger.test.js.map +1 -0
- package/dist/state/lock-manager.d.ts +18 -0
- package/dist/state/lock-manager.d.ts.map +1 -0
- package/dist/state/lock-manager.js +134 -0
- package/dist/state/lock-manager.js.map +1 -0
- package/dist/state/lock-manager.test.d.ts +2 -0
- package/dist/state/lock-manager.test.d.ts.map +1 -0
- package/dist/state/lock-manager.test.js +190 -0
- package/dist/state/lock-manager.test.js.map +1 -0
- package/dist/state/state-manager.d.ts +37 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +125 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/state/state-manager.test.d.ts +2 -0
- package/dist/state/state-manager.test.d.ts.map +1 -0
- package/dist/state/state-manager.test.js +240 -0
- package/dist/state/state-manager.test.js.map +1 -0
- package/dist/types/adapter.d.ts +24 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +2 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/assembly.d.ts +89 -0
- package/dist/types/assembly.d.ts.map +1 -0
- package/dist/types/assembly.js +2 -0
- package/dist/types/assembly.js.map +1 -0
- package/dist/types/claude-md.d.ts +11 -0
- package/dist/types/claude-md.d.ts.map +1 -0
- package/dist/types/claude-md.js +2 -0
- package/dist/types/claude-md.js.map +1 -0
- package/dist/types/cli.d.ts +15 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +40 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/decision.d.ts +14 -0
- package/dist/types/decision.d.ts.map +1 -0
- package/dist/types/decision.js +2 -0
- package/dist/types/decision.js.map +1 -0
- package/dist/types/dependency.d.ts +12 -0
- package/dist/types/dependency.d.ts.map +1 -0
- package/dist/types/dependency.js +2 -0
- package/dist/types/dependency.js.map +1 -0
- package/dist/types/enums.d.ts +23 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +11 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/enums.test.d.ts +2 -0
- package/dist/types/enums.test.d.ts.map +1 -0
- package/dist/types/enums.test.js +13 -0
- package/dist/types/enums.test.js.map +1 -0
- package/dist/types/errors.d.ts +24 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +2 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/frontmatter.d.ts +43 -0
- package/dist/types/frontmatter.d.ts.map +1 -0
- package/dist/types/frontmatter.js +2 -0
- package/dist/types/frontmatter.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +10 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +2 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/state.d.ts +49 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +2 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/wizard.d.ts +14 -0
- package/dist/types/wizard.d.ts.map +1 -0
- package/dist/types/wizard.js +2 -0
- package/dist/types/wizard.js.map +1 -0
- package/dist/utils/errors.d.ts +42 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +232 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/errors.test.d.ts +2 -0
- package/dist/utils/errors.test.d.ts.map +1 -0
- package/dist/utils/errors.test.js +91 -0
- package/dist/utils/errors.test.js.map +1 -0
- package/dist/utils/fs.d.ts +11 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +20 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.test.d.ts +2 -0
- package/dist/utils/fs.test.d.ts.map +1 -0
- package/dist/utils/fs.test.js +93 -0
- package/dist/utils/fs.test.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/levenshtein.d.ts +11 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +37 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/dist/utils/levenshtein.test.d.ts +2 -0
- package/dist/utils/levenshtein.test.d.ts.map +1 -0
- package/dist/utils/levenshtein.test.js +34 -0
- package/dist/utils/levenshtein.test.js.map +1 -0
- package/dist/validation/config-validator.d.ts +10 -0
- package/dist/validation/config-validator.d.ts.map +1 -0
- package/dist/validation/config-validator.js +11 -0
- package/dist/validation/config-validator.js.map +1 -0
- package/dist/validation/dependency-validator.d.ts +10 -0
- package/dist/validation/dependency-validator.d.ts.map +1 -0
- package/dist/validation/dependency-validator.js +34 -0
- package/dist/validation/dependency-validator.js.map +1 -0
- package/dist/validation/frontmatter-validator.d.ts +12 -0
- package/dist/validation/frontmatter-validator.d.ts.map +1 -0
- package/dist/validation/frontmatter-validator.js +50 -0
- package/dist/validation/frontmatter-validator.js.map +1 -0
- package/dist/validation/index.d.ts +19 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +64 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.test.d.ts +2 -0
- package/dist/validation/index.test.d.ts.map +1 -0
- package/dist/validation/index.test.js +241 -0
- package/dist/validation/index.test.js.map +1 -0
- package/dist/validation/state-validator.d.ts +15 -0
- package/dist/validation/state-validator.d.ts.map +1 -0
- package/dist/validation/state-validator.js +104 -0
- package/dist/validation/state-validator.js.map +1 -0
- package/dist/wizard/questions.d.ts +18 -0
- package/dist/wizard/questions.d.ts.map +1 -0
- package/dist/wizard/questions.js +46 -0
- package/dist/wizard/questions.js.map +1 -0
- package/dist/wizard/suggestion.d.ts +10 -0
- package/dist/wizard/suggestion.d.ts.map +1 -0
- package/dist/wizard/suggestion.js +17 -0
- package/dist/wizard/suggestion.js.map +1 -0
- package/dist/wizard/wizard.d.ts +19 -0
- package/dist/wizard/wizard.d.ts.map +1 -0
- package/dist/wizard/wizard.js +104 -0
- package/dist/wizard/wizard.js.map +1 -0
- package/dist/wizard/wizard.test.d.ts +2 -0
- package/dist/wizard/wizard.test.d.ts.map +1 -0
- package/dist/wizard/wizard.test.js +167 -0
- package/dist/wizard/wizard.test.js.map +1 -0
- package/knowledge/core/adr-craft.md +281 -0
- package/knowledge/core/api-design.md +501 -0
- package/knowledge/core/database-design.md +380 -0
- package/knowledge/core/domain-modeling.md +317 -0
- package/knowledge/core/operations-runbook.md +513 -0
- package/knowledge/core/security-review.md +523 -0
- package/knowledge/core/system-architecture.md +402 -0
- package/knowledge/core/task-decomposition.md +372 -0
- package/knowledge/core/testing-strategy.md +409 -0
- package/knowledge/core/user-stories.md +337 -0
- package/knowledge/core/user-story-innovation.md +171 -0
- package/knowledge/core/ux-specification.md +380 -0
- package/knowledge/finalization/apply-fixes-and-freeze.md +93 -0
- package/knowledge/finalization/developer-onboarding.md +376 -0
- package/knowledge/finalization/implementation-playbook.md +404 -0
- package/knowledge/product/gap-analysis.md +305 -0
- package/knowledge/product/prd-craft.md +324 -0
- package/knowledge/product/prd-innovation.md +204 -0
- package/knowledge/review/review-adr.md +203 -0
- package/knowledge/review/review-api-contracts.md +233 -0
- package/knowledge/review/review-database-schema.md +229 -0
- package/knowledge/review/review-domain-modeling.md +288 -0
- package/knowledge/review/review-implementation-tasks.md +202 -0
- package/knowledge/review/review-methodology.md +215 -0
- package/knowledge/review/review-operations.md +212 -0
- package/knowledge/review/review-prd.md +235 -0
- package/knowledge/review/review-security.md +213 -0
- package/knowledge/review/review-system-architecture.md +296 -0
- package/knowledge/review/review-testing-strategy.md +176 -0
- package/knowledge/review/review-user-stories.md +172 -0
- package/knowledge/review/review-ux-spec.md +208 -0
- package/knowledge/validation/critical-path-analysis.md +203 -0
- package/knowledge/validation/cross-phase-consistency.md +181 -0
- package/knowledge/validation/decision-completeness.md +218 -0
- package/knowledge/validation/dependency-validation.md +233 -0
- package/knowledge/validation/implementability-review.md +252 -0
- package/knowledge/validation/scope-management.md +223 -0
- package/knowledge/validation/traceability.md +198 -0
- package/methodology/custom-defaults.yml +43 -0
- package/methodology/deep.yml +42 -0
- package/methodology/mvp.yml +42 -0
- package/package.json +58 -0
- package/pipeline/architecture/review-architecture.md +44 -0
- package/pipeline/architecture/system-architecture.md +45 -0
- package/pipeline/decisions/adrs.md +45 -0
- package/pipeline/decisions/review-adrs.md +39 -0
- package/pipeline/finalization/apply-fixes-and-freeze.md +39 -0
- package/pipeline/finalization/developer-onboarding-guide.md +36 -0
- package/pipeline/finalization/implementation-playbook.md +45 -0
- package/pipeline/modeling/domain-modeling.md +57 -0
- package/pipeline/modeling/review-domain-modeling.md +41 -0
- package/pipeline/planning/implementation-tasks.md +57 -0
- package/pipeline/planning/review-tasks.md +38 -0
- package/pipeline/pre/create-prd.md +45 -0
- package/pipeline/pre/innovate-prd.md +47 -0
- package/pipeline/pre/innovate-user-stories.md +47 -0
- package/pipeline/pre/review-prd.md +44 -0
- package/pipeline/pre/review-user-stories.md +43 -0
- package/pipeline/pre/user-stories.md +48 -0
- package/pipeline/quality/operations.md +42 -0
- package/pipeline/quality/review-operations.md +37 -0
- package/pipeline/quality/review-security.md +40 -0
- package/pipeline/quality/review-testing.md +39 -0
- package/pipeline/quality/security.md +44 -0
- package/pipeline/quality/testing-strategy.md +42 -0
- package/pipeline/specification/api-contracts.md +44 -0
- package/pipeline/specification/database-schema.md +41 -0
- package/pipeline/specification/review-api.md +40 -0
- package/pipeline/specification/review-database.md +39 -0
- package/pipeline/specification/review-ux.md +38 -0
- package/pipeline/specification/ux-spec.md +43 -0
- package/pipeline/validation/critical-path-walkthrough.md +37 -0
- package/pipeline/validation/cross-phase-consistency.md +35 -0
- package/pipeline/validation/decision-completeness.md +36 -0
- package/pipeline/validation/dependency-graph-validation.md +36 -0
- package/pipeline/validation/implementability-dry-run.md +36 -0
- package/pipeline/validation/scope-creep-check.md +38 -0
- package/pipeline/validation/traceability-matrix.md +36 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-stories
|
|
3
|
+
description: Expert knowledge for translating product requirements into well-formed user stories
|
|
4
|
+
topics: [user-stories, personas, acceptance-criteria, story-splitting, INVEST, epics, traceability]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Story Anatomy
|
|
8
|
+
|
|
9
|
+
The standard user story template captures who wants what and why:
|
|
10
|
+
|
|
11
|
+
**"As a [persona], I want [action], so that [outcome]."**
|
|
12
|
+
|
|
13
|
+
Each part serves a purpose:
|
|
14
|
+
- **Persona** — the specific user role, not "a user." Personas come from the PRD.
|
|
15
|
+
- **Action** — what the user wants to do, described in their language, not implementation terms.
|
|
16
|
+
- **Outcome** — the value they get. This is the most important part — it answers "why bother?"
|
|
17
|
+
|
|
18
|
+
**Good stories:**
|
|
19
|
+
- "As a teacher, I want to assign homework to a class, so that students have practice material outside of class."
|
|
20
|
+
- "As a new user, I want to see a guided tour on first login, so that I understand the core features without reading documentation."
|
|
21
|
+
|
|
22
|
+
**Bad stories:**
|
|
23
|
+
- "As a user, I want the system to work." — No specific persona, no specific action, no testable outcome.
|
|
24
|
+
- "As a developer, I want a REST endpoint for user creation." — Implementation story. The developer is not the user. Rewrite as: "As a new visitor, I want to create an account, so that I can save my preferences."
|
|
25
|
+
- "As a user, I want good performance." — Not actionable. Rewrite with specifics: "As a returning user, I want the dashboard to load within 2 seconds, so that I can start my daily workflow immediately."
|
|
26
|
+
|
|
27
|
+
**When to deviate from the template:**
|
|
28
|
+
- **System stories** describe behavior with no direct user action: "When a payment fails, the system retries twice with exponential backoff and notifies the user after final failure." These are acceptable for background processes, scheduled jobs, and automated workflows.
|
|
29
|
+
- **Constraint stories** capture non-functional requirements: "All API responses must complete within 500ms at p95 under normal load." These complement functional stories rather than replacing them.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## INVEST Criteria
|
|
34
|
+
|
|
35
|
+
Every story should satisfy INVEST. Use these criteria to evaluate story quality.
|
|
36
|
+
|
|
37
|
+
### Independent
|
|
38
|
+
|
|
39
|
+
The story can be developed and delivered without requiring another story to be done first. Stories with hard dependencies should be split or reordered.
|
|
40
|
+
|
|
41
|
+
- **Pass:** "As a user, I want to search products by name" — works regardless of whether filtering or sorting stories are done.
|
|
42
|
+
- **Fail:** "As a user, I want to edit my profile photo" that silently depends on "As a user, I want to upload files" — if upload isn't done, this story is blocked.
|
|
43
|
+
- **Fix:** Make the dependency explicit and consider whether the stories should be combined or the shared functionality extracted.
|
|
44
|
+
|
|
45
|
+
### Negotiable
|
|
46
|
+
|
|
47
|
+
The story describes what and why, not how. Implementation details are negotiated during development, not locked in the story.
|
|
48
|
+
|
|
49
|
+
- **Pass:** "As a user, I want to receive notifications about order status changes."
|
|
50
|
+
- **Fail:** "As a user, I want to receive WebSocket push notifications rendered as toast components in the bottom-right corner using the Sonner library."
|
|
51
|
+
- **Fix:** Move implementation details to technical notes. The story stays focused on user value.
|
|
52
|
+
|
|
53
|
+
### Valuable
|
|
54
|
+
|
|
55
|
+
The story delivers value to a user or stakeholder. Every story should have a clear beneficiary.
|
|
56
|
+
|
|
57
|
+
- **Pass:** "As a shopper, I want to save items for later, so that I can return and purchase them without searching again."
|
|
58
|
+
- **Fail:** "As a developer, I want to refactor the authentication module." — No user value. This is a technical task, not a story.
|
|
59
|
+
- **Fix:** Frame technical work in terms of user value, or track it as a task rather than a story.
|
|
60
|
+
|
|
61
|
+
### Estimable
|
|
62
|
+
|
|
63
|
+
The team (or agent) can estimate the effort. If a story is too vague to estimate, it needs more conversation or splitting.
|
|
64
|
+
|
|
65
|
+
- **Pass:** "As a user, I want to reset my password via email" — well-understood pattern, estimable.
|
|
66
|
+
- **Fail:** "As a user, I want AI-powered recommendations" — too vague. What data? What algorithm? What UI?
|
|
67
|
+
- **Fix:** Split into smaller, more specific stories until each is estimable.
|
|
68
|
+
|
|
69
|
+
### Small
|
|
70
|
+
|
|
71
|
+
A story should be implementable in 1-3 focused agent sessions. Larger stories need splitting.
|
|
72
|
+
|
|
73
|
+
- **Pass:** "As a user, I want to update my display name."
|
|
74
|
+
- **Fail:** "As a user, I want a complete e-commerce checkout flow with cart, address, payment, confirmation, and order tracking."
|
|
75
|
+
- **Fix:** Split by workflow step: cart management, address entry, payment processing, order confirmation, order tracking.
|
|
76
|
+
|
|
77
|
+
### Testable
|
|
78
|
+
|
|
79
|
+
Acceptance criteria have clear pass/fail outcomes. If you can't write a test for it, the story isn't ready.
|
|
80
|
+
|
|
81
|
+
- **Pass:** "Given a user with items in cart, when they click checkout, then they see the address form with their saved addresses pre-populated."
|
|
82
|
+
- **Fail:** "The checkout should be intuitive." — Not testable.
|
|
83
|
+
- **Fix:** Replace subjective language with observable behavior.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Persona Definition
|
|
88
|
+
|
|
89
|
+
Personas are extracted from the PRD's user/stakeholder descriptions. Each persona is a specific user type with distinct goals, not a generic role label.
|
|
90
|
+
|
|
91
|
+
**Goal-driven personas vs. role labels:**
|
|
92
|
+
- Role label: "Admin" — too generic. What does the admin want?
|
|
93
|
+
- Goal-driven: "School Administrator (Ms. Chen) — manages teacher accounts, reviews class assignments, generates progress reports for the district. Goals: minimize time on administrative tasks, ensure compliance with district reporting requirements."
|
|
94
|
+
|
|
95
|
+
**When personas collapse:**
|
|
96
|
+
- If two personas have identical goals and workflows, they're the same persona. An "Admin" who is also a regular "User" is two personas only if their goals differ when wearing each hat.
|
|
97
|
+
- Don't create personas for system actors (database, scheduler, API consumer) — these are system stories, not persona stories.
|
|
98
|
+
|
|
99
|
+
**Persona template:**
|
|
100
|
+
- **Name** — a human name for memorability (e.g., "Alex the Admin")
|
|
101
|
+
- **Role** — their relationship to the product
|
|
102
|
+
- **Goals** — what they're trying to accomplish (2-3 primary goals)
|
|
103
|
+
- **Pain points** — what frustrates them today (informs acceptance criteria)
|
|
104
|
+
- **Context** — when, where, how they use the product (informs UX decisions)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Epic Structure
|
|
109
|
+
|
|
110
|
+
Epics group related stories by user journey, not by system component.
|
|
111
|
+
|
|
112
|
+
**Group by journey, not by layer:**
|
|
113
|
+
- **Good:** "Account Setup" epic (registration, email verification, profile creation, preferences) — follows the user's path.
|
|
114
|
+
- **Bad:** "API Endpoints" epic (user CRUD, product CRUD, order CRUD) — groups by technical layer, not user value.
|
|
115
|
+
|
|
116
|
+
**Epic sizing:**
|
|
117
|
+
- A typical epic contains 3-8 stories. Fewer than 3 suggests the epic is too narrow — consider merging with a related epic. More than 8 suggests the epic covers too much — look for natural split points.
|
|
118
|
+
|
|
119
|
+
**When to split epics:**
|
|
120
|
+
- Different personas drive different parts of the epic
|
|
121
|
+
- The epic spans distinct phases of the user journey (onboarding vs. daily use vs. administration)
|
|
122
|
+
- Half the stories have no dependencies on the other half
|
|
123
|
+
|
|
124
|
+
**Epic naming:**
|
|
125
|
+
- Use verb phrases that describe the user goal: "Managing Team Members," "Processing Payments," "Onboarding New Users."
|
|
126
|
+
- Avoid technical names: "REST API," "Database Layer," "Auth Module."
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Acceptance Criteria Patterns
|
|
131
|
+
|
|
132
|
+
Acceptance criteria define when a story is done. They are the contract between story and implementation.
|
|
133
|
+
|
|
134
|
+
### Given/When/Then Format
|
|
135
|
+
|
|
136
|
+
The standard format for acceptance criteria scenarios:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Given [precondition/context]
|
|
140
|
+
When [action/trigger]
|
|
141
|
+
Then [expected outcome]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Example:**
|
|
145
|
+
```
|
|
146
|
+
Given a registered user on the login page
|
|
147
|
+
When they enter valid credentials and click "Sign In"
|
|
148
|
+
Then they are redirected to the dashboard and see a welcome message with their name
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Parameterized Scenarios
|
|
152
|
+
|
|
153
|
+
When the same behavior applies to multiple variations, use parameterized scenarios:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
Given a user with role [admin | member | viewer]
|
|
157
|
+
When they access the settings page
|
|
158
|
+
Then they see [all settings | team settings only | read-only view]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Negative Scenarios
|
|
162
|
+
|
|
163
|
+
Every happy path should have corresponding error scenarios:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
Given a registered user on the login page
|
|
167
|
+
When they enter an incorrect password
|
|
168
|
+
Then they see "Invalid credentials" and the password field is cleared
|
|
169
|
+
And after 5 failed attempts, the account is locked for 15 minutes
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Boundary Conditions
|
|
173
|
+
|
|
174
|
+
Test edges, not just middles:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Given a user creating a project name
|
|
178
|
+
When they enter exactly 100 characters (the maximum)
|
|
179
|
+
Then the name is accepted
|
|
180
|
+
When they enter 101 characters
|
|
181
|
+
Then they see "Name must be 100 characters or fewer" and the extra character is rejected
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Acceptance Criteria vs. Test Cases
|
|
185
|
+
|
|
186
|
+
- **Acceptance criteria** define WHAT should happen (business-level behavior)
|
|
187
|
+
- **Test cases** define HOW to verify it (technical-level steps)
|
|
188
|
+
- Stories contain acceptance criteria. Test cases are derived later during implementation.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Story Splitting Heuristics
|
|
193
|
+
|
|
194
|
+
When a story is too large, use these patterns to split it into smaller, independently valuable stories.
|
|
195
|
+
|
|
196
|
+
### By Workflow Step
|
|
197
|
+
|
|
198
|
+
Before: "As a user, I want to complete the checkout process."
|
|
199
|
+
After:
|
|
200
|
+
- "As a shopper, I want to review my cart before checkout."
|
|
201
|
+
- "As a shopper, I want to enter my shipping address."
|
|
202
|
+
- "As a shopper, I want to select a payment method and pay."
|
|
203
|
+
- "As a shopper, I want to see an order confirmation."
|
|
204
|
+
|
|
205
|
+
### By Data Variation
|
|
206
|
+
|
|
207
|
+
Before: "As a user, I want to create posts."
|
|
208
|
+
After:
|
|
209
|
+
- "As a user, I want to create text posts."
|
|
210
|
+
- "As a user, I want to create posts with images."
|
|
211
|
+
- "As a user, I want to create posts with embedded videos."
|
|
212
|
+
|
|
213
|
+
### By Operation (CRUD)
|
|
214
|
+
|
|
215
|
+
Before: "As an admin, I want to manage users."
|
|
216
|
+
After:
|
|
217
|
+
- "As an admin, I want to invite new users."
|
|
218
|
+
- "As an admin, I want to view the user list with search and filters."
|
|
219
|
+
- "As an admin, I want to edit user roles."
|
|
220
|
+
- "As an admin, I want to deactivate user accounts."
|
|
221
|
+
|
|
222
|
+
### By User Role
|
|
223
|
+
|
|
224
|
+
Before: "As a user, I want to access the dashboard."
|
|
225
|
+
After:
|
|
226
|
+
- "As a team member, I want to see my assigned tasks on the dashboard."
|
|
227
|
+
- "As a team lead, I want to see team progress metrics on the dashboard."
|
|
228
|
+
- "As an admin, I want to see system health and usage stats on the dashboard."
|
|
229
|
+
|
|
230
|
+
### By Happy/Sad Path
|
|
231
|
+
|
|
232
|
+
Before: "As a user, I want to upload a document."
|
|
233
|
+
After:
|
|
234
|
+
- "As a user, I want to upload a PDF or Word document."
|
|
235
|
+
- "As a user, I want to see clear error messages when upload fails (wrong format, too large, network error)."
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Scope Boundaries
|
|
240
|
+
|
|
241
|
+
Every story should explicitly state what it does NOT include to prevent scope creep.
|
|
242
|
+
|
|
243
|
+
**Format:**
|
|
244
|
+
```
|
|
245
|
+
**Scope Boundary:** This story does NOT include:
|
|
246
|
+
- Bulk assignment (covered by US-045)
|
|
247
|
+
- Email notifications for assignments (covered by US-023)
|
|
248
|
+
- Grading submitted assignments (separate epic)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Why scope boundaries matter:**
|
|
252
|
+
- During implementation, agents can confidently stop when they hit a boundary
|
|
253
|
+
- Stories that overlap are discovered early (and consolidated or clarified)
|
|
254
|
+
- Scope boundaries flow downstream into task boundaries
|
|
255
|
+
|
|
256
|
+
**Relationship to MoSCoW:**
|
|
257
|
+
- "Won't" items in MoSCoW are scope boundaries at the PRD level
|
|
258
|
+
- Story-level scope boundaries are more granular — they clarify what THIS story excludes even if another story covers it
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## PRD-to-Story Traceability
|
|
263
|
+
|
|
264
|
+
Every PRD feature must map to at least one user story. This is a non-negotiable coverage requirement.
|
|
265
|
+
|
|
266
|
+
**How to ensure coverage:**
|
|
267
|
+
1. Extract every distinct feature and requirement from the PRD
|
|
268
|
+
2. For each, identify the corresponding user story or stories
|
|
269
|
+
3. Flag any PRD feature with no story — these are coverage gaps
|
|
270
|
+
4. Flag any story that doesn't trace back to a PRD feature — these may be scope creep
|
|
271
|
+
|
|
272
|
+
**Handling compound requirements:**
|
|
273
|
+
- PRD: "Users can create, edit, and delete projects." → Split into 3 stories (one per operation).
|
|
274
|
+
- PRD: "The system supports SSO and email/password authentication." → Two stories (one per auth method).
|
|
275
|
+
|
|
276
|
+
**Surfacing implicit requirements:**
|
|
277
|
+
- Every user action that can fail needs an error handling story or acceptance criteria
|
|
278
|
+
- Every data entry point needs validation acceptance criteria
|
|
279
|
+
- Accessibility requirements (keyboard navigation, screen readers) apply to all UI stories
|
|
280
|
+
- Loading states, empty states, and offline behavior are often implied but not stated
|
|
281
|
+
|
|
282
|
+
**Traceability notation:**
|
|
283
|
+
- Use IDs to create a traceable chain: PRD-REQ-001 → US-001 → (downstream: Task BD-42)
|
|
284
|
+
- Story IDs (US-001, US-002, ...) are stable — they persist through updates and are referenced by downstream phases
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Story Dependencies
|
|
289
|
+
|
|
290
|
+
Some stories must be implemented before others. Document these explicitly.
|
|
291
|
+
|
|
292
|
+
**Blocked-by vs. informed-by:**
|
|
293
|
+
- **Blocked-by:** Story B cannot start until Story A is complete. A produces something B requires (a database table, an API endpoint, a shared component).
|
|
294
|
+
- **Informed-by:** Story B benefits from knowing how Story A was implemented, but can proceed independently with reasonable assumptions.
|
|
295
|
+
|
|
296
|
+
Only blocked-by dependencies should be formal constraints. Informed-by relationships are noted but don't block.
|
|
297
|
+
|
|
298
|
+
**How dependencies feed into task decomposition:**
|
|
299
|
+
- Story dependencies become task dependencies in the implementation tasks step
|
|
300
|
+
- Chains of 3+ dependent stories should be reviewed — long chains limit parallelization
|
|
301
|
+
- If many stories depend on the same story, that story is on the critical path and should be prioritized
|
|
302
|
+
|
|
303
|
+
**Keeping dependency chains short:**
|
|
304
|
+
- If Story C depends on B which depends on A, ask: can C depend directly on A instead? Can C's dependency be satisfied with a mock or interface?
|
|
305
|
+
- Extract shared infrastructure into its own story at the front of the chain rather than letting it hide inside a feature story
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Common Pitfalls
|
|
310
|
+
|
|
311
|
+
### Implementation Stories
|
|
312
|
+
- **Problem:** "As a developer, I want a REST endpoint for user CRUD."
|
|
313
|
+
- **Fix:** Rewrite from the user's perspective: "As a new visitor, I want to create an account with my email." The REST endpoint is an implementation detail, not a user story.
|
|
314
|
+
|
|
315
|
+
### Stories Too Large
|
|
316
|
+
- **Problem:** A story with 10+ acceptance criteria spanning multiple workflows.
|
|
317
|
+
- **Fix:** Split using the heuristics above. Each resulting story should have 3-5 acceptance criteria.
|
|
318
|
+
|
|
319
|
+
### Vague Acceptance Criteria
|
|
320
|
+
- **Problem:** "The feature works correctly and is user-friendly."
|
|
321
|
+
- **Fix:** Replace with Given/When/Then scenarios. Define "correctly" and "user-friendly" in observable terms.
|
|
322
|
+
|
|
323
|
+
### Missing Personas
|
|
324
|
+
- **Problem:** Stories reference undefined personas ("a power user," "the operator").
|
|
325
|
+
- **Fix:** Map back to PRD personas. If the PRD doesn't define this persona, either add it to the PRD or use an existing persona.
|
|
326
|
+
|
|
327
|
+
### Stories Without Value Statements
|
|
328
|
+
- **Problem:** "As a user, I want to click the submit button."
|
|
329
|
+
- **Fix:** Add the "so that" clause: "As a user, I want to submit my feedback form, so that the support team can address my issue."
|
|
330
|
+
|
|
331
|
+
### Duplicate Stories Across Epics
|
|
332
|
+
- **Problem:** "Upload profile photo" appears in both "Account Setup" and "Profile Management" epics.
|
|
333
|
+
- **Fix:** Choose one epic. Add a scope boundary in the other epic referencing the canonical story.
|
|
334
|
+
|
|
335
|
+
### Confusing Acceptance Criteria with Implementation Steps
|
|
336
|
+
- **Problem:** "1. Create a POST /api/users endpoint. 2. Validate email format with regex. 3. Hash password with bcrypt."
|
|
337
|
+
- **Fix:** These are implementation steps, not acceptance criteria. Rewrite as: "Given a valid email and password, when the user submits registration, then their account is created and they receive a confirmation email."
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-story-innovation
|
|
3
|
+
description: Techniques for discovering UX enhancements and innovation opportunities in user stories
|
|
4
|
+
topics: [innovation, ux-enhancements, user-stories, gap-analysis, differentiators]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Scope Boundary
|
|
8
|
+
|
|
9
|
+
This knowledge covers UX-level improvements only — making existing features better, not adding new features. Feature-level innovation belongs in PRD innovation (`innovate-prd`). If an enhancement requires a new PRD section, it is out of scope for user story innovation.
|
|
10
|
+
|
|
11
|
+
**In scope:**
|
|
12
|
+
- Smart defaults that reduce user effort on existing features
|
|
13
|
+
- Better error handling and recovery within existing flows
|
|
14
|
+
- Accessibility improvements to existing stories
|
|
15
|
+
- Progressive disclosure within existing interfaces
|
|
16
|
+
- AI-native enhancements to existing workflows
|
|
17
|
+
|
|
18
|
+
**Out of scope:**
|
|
19
|
+
- New features not covered by any PRD requirement
|
|
20
|
+
- New user personas not defined in the PRD
|
|
21
|
+
- Major architectural additions (new services, new databases)
|
|
22
|
+
- Scope expansion that changes the product's purpose
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## High-Value Low-Effort Enhancements
|
|
27
|
+
|
|
28
|
+
These patterns add significant user value for minimal implementation effort. Look for them in every story.
|
|
29
|
+
|
|
30
|
+
### Smart Defaults
|
|
31
|
+
Pre-fill fields based on context, history, or the most common choice. Users should only need to change what's different, not re-enter what's predictable.
|
|
32
|
+
- Forms pre-populated from user profile or previous submissions
|
|
33
|
+
- Timezone auto-detected from browser
|
|
34
|
+
- Default selections based on user's most frequent choice
|
|
35
|
+
- "Same as billing address" for shipping
|
|
36
|
+
|
|
37
|
+
### Inline Validation
|
|
38
|
+
Give immediate feedback on input rather than waiting for form submission. Catches errors early and reduces frustration.
|
|
39
|
+
- Email format validation as you type
|
|
40
|
+
- Password strength indicator
|
|
41
|
+
- Username availability check before submission
|
|
42
|
+
- Character count approaching limit
|
|
43
|
+
|
|
44
|
+
### Keyboard Shortcuts
|
|
45
|
+
Power users want to move fast. Keyboard shortcuts for frequent actions reduce friction.
|
|
46
|
+
- Common patterns: Ctrl/Cmd+S (save), Ctrl/Cmd+K (search), Escape (close/cancel)
|
|
47
|
+
- Arrow keys for list navigation
|
|
48
|
+
- Tab through form fields with logical ordering
|
|
49
|
+
|
|
50
|
+
### Progressive Disclosure
|
|
51
|
+
Don't overwhelm users on first encounter. Reveal complexity as they need it.
|
|
52
|
+
- "Advanced options" expandable sections
|
|
53
|
+
- Onboarding wizards that introduce features over time
|
|
54
|
+
- Contextual help that appears when users hover or focus
|
|
55
|
+
- Default simple view with "show more" for detail
|
|
56
|
+
|
|
57
|
+
### Leveraging Existing Data
|
|
58
|
+
Data already being collected that could power useful features without new infrastructure.
|
|
59
|
+
- Activity data → streak tracking, usage insights, "you did X this week" summaries
|
|
60
|
+
- Search history → suggested searches, "recently viewed"
|
|
61
|
+
- Error patterns → proactive warnings ("this field usually causes issues — here's a tip")
|
|
62
|
+
|
|
63
|
+
### Undo/Redo
|
|
64
|
+
Where destructive actions exist, add undo before requiring confirmation dialogs.
|
|
65
|
+
- Soft delete with "undo" toast (better UX than "are you sure?" dialogs)
|
|
66
|
+
- Undo last edit in text/content editing
|
|
67
|
+
- "Restore defaults" for settings changes
|
|
68
|
+
|
|
69
|
+
### Batch Operations
|
|
70
|
+
Where users repeat the same single action multiple times, offer batch alternatives.
|
|
71
|
+
- Select multiple items → bulk delete, bulk archive, bulk assign
|
|
72
|
+
- "Apply to all" option in settings
|
|
73
|
+
- Bulk import/export for data entry
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Differentiators
|
|
78
|
+
|
|
79
|
+
These make the product stand out from alternatives. Not every product needs them, but they're worth considering.
|
|
80
|
+
|
|
81
|
+
### "Wow" Moments
|
|
82
|
+
Small touches that make users want to share the product.
|
|
83
|
+
- Satisfying animations on task completion
|
|
84
|
+
- Personalized empty states that don't feel like error pages
|
|
85
|
+
- Easter eggs for power users who discover hidden features
|
|
86
|
+
- Thoughtful microcopy that shows personality
|
|
87
|
+
|
|
88
|
+
### AI-Native Features
|
|
89
|
+
Capabilities that wouldn't exist without AI, not AI bolted onto traditional features.
|
|
90
|
+
- Natural language search that understands intent, not just keywords
|
|
91
|
+
- Auto-categorization of user-created content
|
|
92
|
+
- Smart suggestions based on context ("users who did X often do Y next")
|
|
93
|
+
- Draft generation or auto-completion for text-heavy inputs
|
|
94
|
+
|
|
95
|
+
### Personalization Without Configuration
|
|
96
|
+
The product adapts to the user without them having to set preferences.
|
|
97
|
+
- Recently used items surfaced first
|
|
98
|
+
- Layout adapts to usage patterns
|
|
99
|
+
- Notification frequency auto-tuned based on engagement
|
|
100
|
+
- Content ordering reflects individual priorities
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Defensive Gaps
|
|
105
|
+
|
|
106
|
+
Things users expect but specs often miss. These are especially important for v1 launches.
|
|
107
|
+
|
|
108
|
+
### Accessibility
|
|
109
|
+
- WCAG AA compliance as minimum baseline
|
|
110
|
+
- Keyboard navigation for all interactive elements
|
|
111
|
+
- Screen reader compatibility with proper ARIA labels
|
|
112
|
+
- Sufficient color contrast (4.5:1 for normal text, 3:1 for large text)
|
|
113
|
+
- Focus indicators visible in all themes
|
|
114
|
+
|
|
115
|
+
### Mobile Responsiveness (if web)
|
|
116
|
+
- Touch targets minimum 44x44px
|
|
117
|
+
- Readable text without zooming
|
|
118
|
+
- Forms that work with mobile keyboards
|
|
119
|
+
- Navigation patterns that work with one hand
|
|
120
|
+
|
|
121
|
+
### Offline/Degraded Mode
|
|
122
|
+
- What happens when the network drops mid-action?
|
|
123
|
+
- Queue writes for sync when connection returns
|
|
124
|
+
- Show stale data with "last updated" indicator rather than blank screens
|
|
125
|
+
- Graceful error messages that explain what happened and what to do
|
|
126
|
+
|
|
127
|
+
### Performance Under Load
|
|
128
|
+
- Loading states for every async operation (never leave users staring at nothing)
|
|
129
|
+
- Pagination or virtual scrolling for large lists
|
|
130
|
+
- Image lazy loading and appropriate sizing
|
|
131
|
+
- Optimistic UI updates where safe
|
|
132
|
+
|
|
133
|
+
### Error Recovery
|
|
134
|
+
- Never lose user work — auto-save drafts, preserve form state on error
|
|
135
|
+
- Clear error messages that say what happened AND what to do next
|
|
136
|
+
- Retry logic for transient failures with user feedback
|
|
137
|
+
- Graceful degradation when a non-critical feature fails
|
|
138
|
+
|
|
139
|
+
### Empty States
|
|
140
|
+
- First-time experience should guide, not confuse
|
|
141
|
+
- Empty lists show "here's how to add your first X" rather than blank space
|
|
142
|
+
- Zero-data dashboards show sample data or onboarding steps
|
|
143
|
+
- Search with no results suggests alternatives
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Evaluation Framework
|
|
148
|
+
|
|
149
|
+
For each innovation suggestion, evaluate before proposing to the user.
|
|
150
|
+
|
|
151
|
+
### Cost Assessment
|
|
152
|
+
- **Trivial** (< 1 task): Can be added to an existing story's acceptance criteria. No new stories needed.
|
|
153
|
+
- **Moderate** (1-3 tasks): Requires new stories or significant additions to existing stories. Scoped to a single epic.
|
|
154
|
+
- **Significant** (4+ tasks): Requires multiple new stories, possibly a new epic. May affect architecture.
|
|
155
|
+
|
|
156
|
+
### Impact Assessment
|
|
157
|
+
- **Nice-to-have**: Polishes the experience but users wouldn't notice if absent.
|
|
158
|
+
- **Noticeable improvement**: Users would appreciate it. Reduces friction in common workflows.
|
|
159
|
+
- **Significant differentiator**: Sets the product apart. Users would choose this product partly because of this feature.
|
|
160
|
+
|
|
161
|
+
### Decision Framework
|
|
162
|
+
- **Must-have for v1**: High impact + trivial or moderate cost. Not adding it would be a visible gap.
|
|
163
|
+
- **Backlog for later**: High impact + significant cost, or moderate impact at any cost. Valuable but not blocking launch.
|
|
164
|
+
- **Reject**: Low impact regardless of cost, or out of scope for the PRD.
|
|
165
|
+
|
|
166
|
+
### Presenting to the User
|
|
167
|
+
Group related suggestions for efficient decision-making. For each group:
|
|
168
|
+
1. Describe the enhancement and its user benefit
|
|
169
|
+
2. State the cost (trivial/moderate/significant)
|
|
170
|
+
3. State your recommendation (must-have/backlog/reject)
|
|
171
|
+
4. Wait for approval before integrating into stories
|