@arimakouyou/spec-workflow-mcp 2.2.7
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/.claude-plugin/.mcp.json +8 -0
- package/.claude-plugin/agents/code-simplifier.md +80 -0
- package/.claude-plugin/agents/integ-test-auditor.md +91 -0
- package/.claude-plugin/agents/integ-test-worker.md +73 -0
- package/.claude-plugin/agents/parallel-worker.md +136 -0
- package/.claude-plugin/agents/review-worker.md +279 -0
- package/.claude-plugin/agents/unit-test-engineer.md +148 -0
- package/.claude-plugin/agents/wave-harness-worker.md +158 -0
- package/.claude-plugin/hooks/hooks.json +16 -0
- package/.claude-plugin/hooks/tasks-read-guard.sh +17 -0
- package/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.claude-plugin/rules/axum.md +154 -0
- package/.claude-plugin/rules/cargo-toml.md +63 -0
- package/.claude-plugin/rules/context7.md +17 -0
- package/.claude-plugin/rules/design-conformance.md +82 -0
- package/.claude-plugin/rules/design-principles.md +53 -0
- package/.claude-plugin/rules/diesel.md +176 -0
- package/.claude-plugin/rules/feedback-loop.md +33 -0
- package/.claude-plugin/rules/leptos.md +319 -0
- package/.claude-plugin/rules/project-architecture.md +134 -0
- package/.claude-plugin/rules/quality-checks.md +265 -0
- package/.claude-plugin/rules/rust-style.md +242 -0
- package/.claude-plugin/rules/security.md +67 -0
- package/.claude-plugin/rules/spec-workflow-enforcement.md +47 -0
- package/.claude-plugin/rules/valkey.md +167 -0
- package/.claude-plugin/skills/integration-test/SKILL.md +230 -0
- package/.claude-plugin/skills/integration-test/references/auditor-prompt.md +78 -0
- package/.claude-plugin/skills/integration-test/references/external-api-mock.md +98 -0
- package/.claude-plugin/skills/integration-test/references/fixture-catalog.md +155 -0
- package/.claude-plugin/skills/integration-test/references/parallel-execution.md +124 -0
- package/.claude-plugin/skills/integration-test/references/quality-gate.md +80 -0
- package/.claude-plugin/skills/integration-test/references/test-case-design.md +88 -0
- package/.claude-plugin/skills/integration-test/references/test-patterns.md +215 -0
- package/.claude-plugin/skills/integration-test/references/whiteboard-template.md +81 -0
- package/.claude-plugin/skills/integration-test/references/worker-prompt.md +70 -0
- package/.claude-plugin/skills/knowhow-capture/SKILL.md +143 -0
- package/.claude-plugin/skills/phase-review-team/SKILL.md +380 -0
- package/.claude-plugin/skills/spec-design/SKILL.md +282 -0
- package/.claude-plugin/skills/spec-e2e-implement/SKILL.md +259 -0
- package/.claude-plugin/skills/spec-impl-code/SKILL.md +101 -0
- package/.claude-plugin/skills/spec-impl-review/SKILL.md +115 -0
- package/.claude-plugin/skills/spec-impl-test-run/SKILL.md +98 -0
- package/.claude-plugin/skills/spec-impl-test-write/SKILL.md +121 -0
- package/.claude-plugin/skills/spec-implement/SKILL.md +822 -0
- package/.claude-plugin/skills/spec-requirements/SKILL.md +130 -0
- package/.claude-plugin/skills/spec-review/SKILL.md +274 -0
- package/.claude-plugin/skills/spec-tasks/SKILL.md +372 -0
- package/.claude-plugin/skills/spec-test-design/SKILL.md +233 -0
- package/.claude-plugin/skills/tdd-skills/SKILL.md +95 -0
- package/.claude-plugin/skills/tdd-skills/references/advanced-techniques.md +49 -0
- package/.claude-plugin/skills/tdd-skills/references/green-strategies.md +70 -0
- package/.claude-plugin/skills/tdd-skills/references/tdd-and-design.md +48 -0
- package/.claude-plugin/skills/tdd-skills/references/test-design.md +43 -0
- package/.claude-plugin/skills/tdd-skills/references/test-doubles.md +53 -0
- package/.claude-plugin/skills/tdd-skills/references/test-patterns.md +40 -0
- package/.claude-plugin/skills/tdd-skills-rust/SKILL.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/advanced-techniques.md +205 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/green-strategies.md +166 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/tdd-and-design.md +215 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-design.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-doubles.md +208 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-patterns.md +223 -0
- package/.claude-plugin/with-dashboard/.mcp.json +8 -0
- package/.claude-plugin/with-dashboard/plugin.json +10 -0
- package/CHANGELOG.md +1007 -0
- package/LICENSE +674 -0
- package/README.ja.md +380 -0
- package/README.md +437 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +264 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/index-args.test.d.ts +2 -0
- package/dist/__tests__/index-args.test.d.ts.map +1 -0
- package/dist/__tests__/index-args.test.js +43 -0
- package/dist/__tests__/index-args.test.js.map +1 -0
- package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
- package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
- package/dist/__tests__/index-entrypoint.test.js +23 -0
- package/dist/__tests__/index-entrypoint.test.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +188 -0
- package/dist/config.js.map +1 -0
- package/dist/core/__tests__/git-utils.test.d.ts +2 -0
- package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/git-utils.test.js +179 -0
- package/dist/core/__tests__/git-utils.test.js.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.js +42 -0
- package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
- package/dist/core/__tests__/path-utils.test.d.ts +2 -0
- package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/path-utils.test.js +342 -0
- package/dist/core/__tests__/path-utils.test.js.map +1 -0
- package/dist/core/__tests__/project-registry.test.d.ts +2 -0
- package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
- package/dist/core/__tests__/project-registry.test.js +62 -0
- package/dist/core/__tests__/project-registry.test.js.map +1 -0
- package/dist/core/__tests__/security-utils.test.d.ts +2 -0
- package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/security-utils.test.js +657 -0
- package/dist/core/__tests__/security-utils.test.js.map +1 -0
- package/dist/core/__tests__/task-parser.test.d.ts +2 -0
- package/dist/core/__tests__/task-parser.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-parser.test.js +222 -0
- package/dist/core/__tests__/task-parser.test.js.map +1 -0
- package/dist/core/__tests__/task-validator.test.d.ts +2 -0
- package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-validator.test.js +308 -0
- package/dist/core/__tests__/task-validator.test.js.map +1 -0
- package/dist/core/archive-service.d.ts +10 -0
- package/dist/core/archive-service.d.ts.map +1 -0
- package/dist/core/archive-service.js +99 -0
- package/dist/core/archive-service.js.map +1 -0
- package/dist/core/dashboard-session.d.ts +49 -0
- package/dist/core/dashboard-session.d.ts.map +1 -0
- package/dist/core/dashboard-session.js +132 -0
- package/dist/core/dashboard-session.js.map +1 -0
- package/dist/core/git-utils.d.ts +25 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +87 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/global-dir.d.ts +44 -0
- package/dist/core/global-dir.d.ts.map +1 -0
- package/dist/core/global-dir.js +74 -0
- package/dist/core/global-dir.js.map +1 -0
- package/dist/core/implementation-log-migrator.d.ts +41 -0
- package/dist/core/implementation-log-migrator.d.ts.map +1 -0
- package/dist/core/implementation-log-migrator.js +258 -0
- package/dist/core/implementation-log-migrator.js.map +1 -0
- package/dist/core/mdx-validator.d.ts +14 -0
- package/dist/core/mdx-validator.d.ts.map +1 -0
- package/dist/core/mdx-validator.js +34 -0
- package/dist/core/mdx-validator.js.map +1 -0
- package/dist/core/parser.d.ts +11 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +128 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/path-utils.d.ts +68 -0
- package/dist/core/path-utils.d.ts.map +1 -0
- package/dist/core/path-utils.js +302 -0
- package/dist/core/path-utils.js.map +1 -0
- package/dist/core/project-registry.d.ts +94 -0
- package/dist/core/project-registry.d.ts.map +1 -0
- package/dist/core/project-registry.js +297 -0
- package/dist/core/project-registry.js.map +1 -0
- package/dist/core/security-utils.d.ts +99 -0
- package/dist/core/security-utils.d.ts.map +1 -0
- package/dist/core/security-utils.js +275 -0
- package/dist/core/security-utils.js.map +1 -0
- package/dist/core/task-parser.d.ts +90 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +477 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-validator.d.ts +37 -0
- package/dist/core/task-validator.d.ts.map +1 -0
- package/dist/core/task-validator.js +499 -0
- package/dist/core/task-validator.js.map +1 -0
- package/dist/core/workspace-initializer.d.ts +16 -0
- package/dist/core/workspace-initializer.d.ts.map +1 -0
- package/dist/core/workspace-initializer.js +168 -0
- package/dist/core/workspace-initializer.js.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +78 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +115 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
- package/dist/dashboard/approval-storage.d.ts +139 -0
- package/dist/dashboard/approval-storage.d.ts.map +1 -0
- package/dist/dashboard/approval-storage.js +608 -0
- package/dist/dashboard/approval-storage.js.map +1 -0
- package/dist/dashboard/execution-history-manager.d.ts +52 -0
- package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
- package/dist/dashboard/execution-history-manager.js +161 -0
- package/dist/dashboard/execution-history-manager.js.map +1 -0
- package/dist/dashboard/implementation-log-manager.d.ts +97 -0
- package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
- package/dist/dashboard/implementation-log-manager.js +617 -0
- package/dist/dashboard/implementation-log-manager.js.map +1 -0
- package/dist/dashboard/job-scheduler.d.ts +91 -0
- package/dist/dashboard/job-scheduler.d.ts.map +1 -0
- package/dist/dashboard/job-scheduler.js +321 -0
- package/dist/dashboard/job-scheduler.js.map +1 -0
- package/dist/dashboard/multi-server.d.ts +42 -0
- package/dist/dashboard/multi-server.d.ts.map +1 -0
- package/dist/dashboard/multi-server.js +1460 -0
- package/dist/dashboard/multi-server.js.map +1 -0
- package/dist/dashboard/parser.d.ts +18 -0
- package/dist/dashboard/parser.d.ts.map +1 -0
- package/dist/dashboard/parser.js +269 -0
- package/dist/dashboard/parser.js.map +1 -0
- package/dist/dashboard/project-manager.d.ts +82 -0
- package/dist/dashboard/project-manager.d.ts.map +1 -0
- package/dist/dashboard/project-manager.js +257 -0
- package/dist/dashboard/project-manager.js.map +1 -0
- package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
- package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
- package/dist/dashboard/public/assets/arc-a5wW942W.js +1 -0
- package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
- package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
- package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
- package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
- package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CvjTuK-w.js +118 -0
- package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/dist/dashboard/public/assets/c4Diagram-c83219d4-NwVQo5kf.js +10 -0
- package/dist/dashboard/public/assets/channel-Bi16YZhk.js +1 -0
- package/dist/dashboard/public/assets/classDiagram-beda092f-BmSeXDdU.js +2 -0
- package/dist/dashboard/public/assets/classDiagram-v2-2358418a-D7GvvuPr.js +2 -0
- package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
- package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
- package/dist/dashboard/public/assets/clone-BpKTiq7P.js +1 -0
- package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
- package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
- package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
- package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
- package/dist/dashboard/public/assets/createText-1719965b-qASbqHUP.js +7 -0
- package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
- package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
- package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
- package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
- package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
- package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
- package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
- package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
- package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
- package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
- package/dist/dashboard/public/assets/edges-96097737-BItTSnH7.js +4 -0
- package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
- package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
- package/dist/dashboard/public/assets/erDiagram-0228fc6a-DT224olg.js +51 -0
- package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
- package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
- package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
- package/dist/dashboard/public/assets/flowDb-c6c81e3f-D9_ukKtv.js +10 -0
- package/dist/dashboard/public/assets/flowDiagram-50d868cf-CylE8siG.js +4 -0
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-B2O3JN7Y.js +1 -0
- package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-BCaqFKf3.js +139 -0
- package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
- package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
- package/dist/dashboard/public/assets/ganttDiagram-a2739b55-WQUL1QW_.js +257 -0
- package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
- package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
- package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-CttZrdmr.js +70 -0
- package/dist/dashboard/public/assets/graph-Ch-rVueN.js +1 -0
- package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
- package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
- package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
- package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
- package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
- package/dist/dashboard/public/assets/index--kbPpDKv.js +1 -0
- package/dist/dashboard/public/assets/index-3scDwWm6.js +1 -0
- package/dist/dashboard/public/assets/index-5325376f-BL2zVOJU.js +1 -0
- package/dist/dashboard/public/assets/index-BZdjbO25.js +1 -0
- package/dist/dashboard/public/assets/index-BmA_batZ.js +1 -0
- package/dist/dashboard/public/assets/index-Bu0u99kF.js +2 -0
- package/dist/dashboard/public/assets/index-Ch-lr7F4.js +1 -0
- package/dist/dashboard/public/assets/index-ClgWbdoq.js +1 -0
- package/dist/dashboard/public/assets/index-CzLwOMQ_.js +3 -0
- package/dist/dashboard/public/assets/index-DAOEjGO7.js +1 -0
- package/dist/dashboard/public/assets/index-DXqf0B9c.js +1 -0
- package/dist/dashboard/public/assets/index-DegWdR16.js +1 -0
- package/dist/dashboard/public/assets/index-DiHyYGim.js +1 -0
- package/dist/dashboard/public/assets/index-DlZtG7I5.js +1 -0
- package/dist/dashboard/public/assets/index-DmhGE2M8.js +1 -0
- package/dist/dashboard/public/assets/index-QEGvld4x.js +1 -0
- package/dist/dashboard/public/assets/index-RfZPGAJu.js +1 -0
- package/dist/dashboard/public/assets/index-UybBj_7u.js +319 -0
- package/dist/dashboard/public/assets/index-bVekzPnl.js +7 -0
- package/dist/dashboard/public/assets/index-f5bysQzW.css +1 -0
- package/dist/dashboard/public/assets/infoDiagram-8eee0895-DjzkkE3o.js +7 -0
- package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
- package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
- package/dist/dashboard/public/assets/journeyDiagram-c64418c1-CxPZkNdB.js +139 -0
- package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
- package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
- package/dist/dashboard/public/assets/layout-DX7DNTRm.js +1 -0
- package/dist/dashboard/public/assets/line-DfvpmKOn.js +1 -0
- package/dist/dashboard/public/assets/linear-gQbBPHO5.js +1 -0
- package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
- package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
- package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
- package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
- package/dist/dashboard/public/assets/mindmap-definition-8da855dc-CNxmpyG6.js +415 -0
- package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
- package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
- package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
- package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
- package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
- package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
- package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
- package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
- package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
- package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
- package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
- package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
- package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
- package/dist/dashboard/public/assets/pieDiagram-a8764435-D-xy_NSA.js +35 -0
- package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
- package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
- package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
- package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
- package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
- package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
- package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
- package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
- package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-BoL2wzz0.js +7 -0
- package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
- package/dist/dashboard/public/assets/requirementDiagram-08caed73-BujFz0q1.js +52 -0
- package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
- package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
- package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-D03_NARm.js +8 -0
- package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
- package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
- package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-B65eFcaT.js +122 -0
- package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
- package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
- package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
- package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
- package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
- package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
- package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BDbqu0Vl.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-CBHvk4b8.js +1 -0
- package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
- package/dist/dashboard/public/assets/styles-b4e223ce-CELsPqaO.js +160 -0
- package/dist/dashboard/public/assets/styles-ca3715f6-BRqMqT6F.js +207 -0
- package/dist/dashboard/public/assets/styles-d45a18b0-e8N-oLPy.js +116 -0
- package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
- package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-vNDtmQc-.js +1 -0
- package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
- package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
- package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
- package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
- package/dist/dashboard/public/assets/timeline-definition-faaaa080-Dh2_A5VU.js +61 -0
- package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
- package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
- package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
- package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
- package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
- package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
- package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
- package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
- package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
- package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
- package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
- package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-B76v1AVF.js +7 -0
- package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
- package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
- package/dist/dashboard/public/claude-icon-dark.svg +1 -0
- package/dist/dashboard/public/claude-icon.svg +1 -0
- package/dist/dashboard/public/index.html +16 -0
- package/dist/dashboard/settings-manager.d.ts +47 -0
- package/dist/dashboard/settings-manager.d.ts.map +1 -0
- package/dist/dashboard/settings-manager.js +180 -0
- package/dist/dashboard/settings-manager.js.map +1 -0
- package/dist/dashboard/utils.d.ts +31 -0
- package/dist/dashboard/utils.d.ts.map +1 -0
- package/dist/dashboard/utils.js +102 -0
- package/dist/dashboard/utils.js.map +1 -0
- package/dist/dashboard/watcher.d.ts +32 -0
- package/dist/dashboard/watcher.d.ts.map +1 -0
- package/dist/dashboard/watcher.js +173 -0
- package/dist/dashboard/watcher.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/templates/design-template.md +126 -0
- package/dist/markdown/templates/product-template.md +51 -0
- package/dist/markdown/templates/requirements-template.md +50 -0
- package/dist/markdown/templates/structure-template.md +145 -0
- package/dist/markdown/templates/tasks-template.md +100 -0
- package/dist/markdown/templates/tech-template.md +99 -0
- package/dist/markdown/templates/test-design-template.md +221 -0
- package/dist/prompts/create-spec.d.ts +3 -0
- package/dist/prompts/create-spec.d.ts.map +1 -0
- package/dist/prompts/create-spec.js +97 -0
- package/dist/prompts/create-spec.js.map +1 -0
- package/dist/prompts/create-steering-doc.d.ts +3 -0
- package/dist/prompts/create-steering-doc.d.ts.map +1 -0
- package/dist/prompts/create-steering-doc.js +75 -0
- package/dist/prompts/create-steering-doc.js.map +1 -0
- package/dist/prompts/implement-task.d.ts +3 -0
- package/dist/prompts/implement-task.d.ts.map +1 -0
- package/dist/prompts/implement-task.js +174 -0
- package/dist/prompts/implement-task.js.map +1 -0
- package/dist/prompts/index.d.ts +20 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.js +60 -0
- package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
- package/dist/prompts/inject-steering-guide.d.ts +3 -0
- package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
- package/dist/prompts/inject-steering-guide.js +64 -0
- package/dist/prompts/inject-steering-guide.js.map +1 -0
- package/dist/prompts/refresh-tasks.d.ts +3 -0
- package/dist/prompts/refresh-tasks.d.ts.map +1 -0
- package/dist/prompts/refresh-tasks.js +237 -0
- package/dist/prompts/refresh-tasks.js.map +1 -0
- package/dist/prompts/spec-status.d.ts +3 -0
- package/dist/prompts/spec-status.d.ts.map +1 -0
- package/dist/prompts/spec-status.js +77 -0
- package/dist/prompts/spec-status.js.map +1 -0
- package/dist/prompts/types.d.ts +13 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +2 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts +2 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js +190 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js.map +1 -0
- package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
- package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
- package/dist/tools/__tests__/projectPath.test.js +187 -0
- package/dist/tools/__tests__/projectPath.test.js.map +1 -0
- package/dist/tools/approvals.d.ts +14 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +505 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/log-implementation.d.ts +5 -0
- package/dist/tools/log-implementation.d.ts.map +1 -0
- package/dist/tools/log-implementation.js +498 -0
- package/dist/tools/log-implementation.js.map +1 -0
- package/dist/tools/spec-status.d.ts +5 -0
- package/dist/tools/spec-status.d.ts.map +1 -0
- package/dist/tools/spec-status.js +192 -0
- package/dist/tools/spec-status.js.map +1 -0
- package/dist/tools/spec-workflow-guide.d.ts +5 -0
- package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
- package/dist/tools/spec-workflow-guide.js +116 -0
- package/dist/tools/spec-workflow-guide.js.map +1 -0
- package/dist/tools/steering-guide.d.ts +5 -0
- package/dist/tools/steering-guide.d.ts.map +1 -0
- package/dist/tools/steering-guide.js +192 -0
- package/dist/tools/steering-guide.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-test-engineer
|
|
3
|
+
description: Rust unit testing specialist. Designs and implements tests based on Design by Contract.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
color: green
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Unit Test Engineer
|
|
9
|
+
|
|
10
|
+
> A unit testing specialist who expresses specifications (contracts) as executable tests at the unit level and contains defects early.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Role
|
|
15
|
+
Act as a specialist in the following areas:
|
|
16
|
+
- Rust test code design and implementation
|
|
17
|
+
- Design by Contract (preconditions, postconditions, invariants)
|
|
18
|
+
- Trait-based test double design
|
|
19
|
+
|
|
20
|
+
# Purpose
|
|
21
|
+
- Implement test code
|
|
22
|
+
- When `Test design doc path` is provided, verify coverage against test-design.md UT specifications and add any missing test cases defined there
|
|
23
|
+
|
|
24
|
+
# Constraints
|
|
25
|
+
- Tests must verify the preconditions, postconditions, and invariants of methods
|
|
26
|
+
- Implement following the Given-When-Then pattern
|
|
27
|
+
- Do not modify the production code under test
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Triggers
|
|
32
|
+
- Requests to define unit test policies or design test cases
|
|
33
|
+
- Requirements to guarantee preconditions/postconditions/invariants through tests
|
|
34
|
+
- Requests to create or expand test skeletons for new functions/methods
|
|
35
|
+
- Improving the readability, maintainability, or reliability of existing unit tests
|
|
36
|
+
- Test double (Mock/Stub/Fake) design or dependency isolation
|
|
37
|
+
|
|
38
|
+
## Approach
|
|
39
|
+
- **Think in terms of contracts**: Clarify specifications through pre/post/invariant conditions and make them visible in tests
|
|
40
|
+
- **Strong against failure modes outside the happy path**: Deliberately probe boundary values, errors, None/Some, and empty collections
|
|
41
|
+
- **Fast feedback at the smallest unit**: Keep feedback loops short at the unit granularity and detect regressions immediately
|
|
42
|
+
- **Tests as documentation**: Readable via GWT, with naming and structure that makes intent clear at a glance
|
|
43
|
+
|
|
44
|
+
## Focus Areas
|
|
45
|
+
- **Design by Contract verification**: Documenting and testing preconditions, postconditions, and invariants
|
|
46
|
+
- **Test design techniques**: Equivalence partitioning, boundary value analysis, state transition testing
|
|
47
|
+
- **Implementation via GWT**: Strict adherence to the Given/When/Then structure
|
|
48
|
+
- **Test doubles**: Trait-based DI + `mockall` to isolate side effects
|
|
49
|
+
- **Maintainability**: Test naming conventions, data builders, `rstest` parameterization, deduplication
|
|
50
|
+
|
|
51
|
+
## Primary Actions
|
|
52
|
+
1. **Extract contracts**: Clarify preconditions, postconditions, and invariants of the target function/method
|
|
53
|
+
2. **Test design**: Draft cases that cover all categories in the "Required Test Aspects" below without omission
|
|
54
|
+
3. **GWT implementation**: Implement each case with GWT and enforce contracts with `assert_eq!` / `assert!` / `matches!`
|
|
55
|
+
4. **Dependency isolation**: Make tests deterministic with trait + `mockall` / manual Stub / Fake
|
|
56
|
+
5. **Refactoring**: Improve readability and reusability (naming, data builders, helpers)
|
|
57
|
+
|
|
58
|
+
## Required Test Aspects
|
|
59
|
+
|
|
60
|
+
Cover all of the following aspects without omission. Items that do not apply to the target code may be skipped, but leave a comment explaining why.
|
|
61
|
+
|
|
62
|
+
### 1. Happy Path Tests
|
|
63
|
+
- Verify behavior with representative valid inputs
|
|
64
|
+
- If multiple valid patterns exist, cover each one
|
|
65
|
+
|
|
66
|
+
### 2. Boundary Value Tests
|
|
67
|
+
Identify the following boundaries and create a test case for each:
|
|
68
|
+
- **Minimum / Maximum**: Values exactly at the lower and upper limits of the allowed range
|
|
69
|
+
- **Just before / just after the boundary**: lower-1, lower, lower+1 / upper-1, upper, upper+1
|
|
70
|
+
- **Zero boundary**: The transition between 0, negative numbers, and positive numbers
|
|
71
|
+
- **Empty vs. non-empty boundary**: Empty string ↔ 1 character, empty array ↔ 1 element
|
|
72
|
+
- **Type boundaries**: Integer overflow, floating-point precision limits (where applicable)
|
|
73
|
+
- **String length boundaries**: Minimum length, maximum length, exceeding maximum (where applicable)
|
|
74
|
+
|
|
75
|
+
### 3. Exception Handling Tests
|
|
76
|
+
Create test cases for each of the following categories:
|
|
77
|
+
- **None / uninitialized input**: Passing `None` for each argument (`Option<T>` parameters)
|
|
78
|
+
- **Wrong types**: Values of a different type than expected (for deserialization paths)
|
|
79
|
+
- **Out-of-range values**: Inputs that exceed the allowed range
|
|
80
|
+
- **Invalid formats**: Invalid date, email, URL, and similar formats (where applicable)
|
|
81
|
+
- **Empty input**: Empty strings, empty `Vec`, empty structs
|
|
82
|
+
- **External dependency failures**: DB connection errors, API communication errors, missing files, etc. (where applicable)
|
|
83
|
+
- **Verification of error type and content**: Confirm that the returned `Err` type and message are correct using `matches!` or similar
|
|
84
|
+
|
|
85
|
+
### 4. Edge Case Tests
|
|
86
|
+
- When there is only one element
|
|
87
|
+
- When duplicate values exist
|
|
88
|
+
- Special characters and multibyte character input
|
|
89
|
+
- Very large or very long input (performance boundary)
|
|
90
|
+
|
|
91
|
+
## Rust-Specific Test Structure
|
|
92
|
+
|
|
93
|
+
```rust
|
|
94
|
+
#[cfg(test)]
|
|
95
|
+
mod tests {
|
|
96
|
+
use super::*;
|
|
97
|
+
|
|
98
|
+
// Given-When-Then structure
|
|
99
|
+
#[test]
|
|
100
|
+
fn returns_error_when_invalid_input() {
|
|
101
|
+
// Given: invalid input
|
|
102
|
+
let input = CreateUserRequest { name: "".into(), email: "invalid".into() };
|
|
103
|
+
|
|
104
|
+
// When: run validation
|
|
105
|
+
let result = validate_user(&input);
|
|
106
|
+
|
|
107
|
+
// Then: an error is returned (postcondition)
|
|
108
|
+
assert!(result.is_err());
|
|
109
|
+
assert!(matches!(result.unwrap_err(), ValidationError::EmptyName));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Dependency isolation with mockall
|
|
113
|
+
#[test]
|
|
114
|
+
fn service_calls_repository() {
|
|
115
|
+
// Given
|
|
116
|
+
let mut mock_repo = MockUserRepository::new();
|
|
117
|
+
mock_repo.expect_save()
|
|
118
|
+
.times(1)
|
|
119
|
+
.returning(|u| Ok(User { id: 1, ..u }));
|
|
120
|
+
let service = UserService::new(Box::new(mock_repo));
|
|
121
|
+
|
|
122
|
+
// When
|
|
123
|
+
let result = service.create_user(&new_user);
|
|
124
|
+
|
|
125
|
+
// Then
|
|
126
|
+
assert!(result.is_ok());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Guidelines
|
|
132
|
+
- **Naming**: `{behavior}_when_{condition}` (e.g., `returns_error_when_empty_name`)
|
|
133
|
+
- **One concept per test**: Multiple asserts are fine as long as they verify "one concept"
|
|
134
|
+
- **State verification**: Verify postconditions/invariants through behavior observable from the public API
|
|
135
|
+
- **Error verification**: Verify using `Result` patterns. Use `#[should_panic]` only when a panic is the intended behavior
|
|
136
|
+
- **Determinism**: Fix time with a Clock trait, randomness with a Generator trait
|
|
137
|
+
|
|
138
|
+
## Boundaries
|
|
139
|
+
|
|
140
|
+
### Will Do
|
|
141
|
+
- Design, implementation, and refactoring specialized for unit tests
|
|
142
|
+
- Documenting contracts (pre/post/invariants) and verifying them through tests
|
|
143
|
+
- Test double design, visibility of quality metrics, and improvement suggestions
|
|
144
|
+
|
|
145
|
+
### Will Not Do
|
|
146
|
+
- Implementing business logic in production features
|
|
147
|
+
- Implementing integration/system/load tests (advisory input is acceptable when needed)
|
|
148
|
+
- Unilaterally deciding architecture without impact analysis on quality
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wave-harness-worker
|
|
3
|
+
description: Implementation worker dedicated to wave-harness. Executes implementation and verification per Task unit, and returns schema-compliant JSON.
|
|
4
|
+
tools: Read, Edit, Write, Bash, Grep, Glob, Skill
|
|
5
|
+
skills:
|
|
6
|
+
- tdd-skills
|
|
7
|
+
memory: project
|
|
8
|
+
permissionMode: bypassPermissions
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# wave-harness-worker
|
|
12
|
+
|
|
13
|
+
## Role
|
|
14
|
+
|
|
15
|
+
- Implement 1 work_item.
|
|
16
|
+
- Run verification.
|
|
17
|
+
- Return schema-compliant JSON.
|
|
18
|
+
|
|
19
|
+
## Input
|
|
20
|
+
|
|
21
|
+
- `session_id`
|
|
22
|
+
- `attempt`
|
|
23
|
+
- `retry_mode` (optional, default: false)
|
|
24
|
+
- `work_item_id`
|
|
25
|
+
- `worktree_path` (required)
|
|
26
|
+
- `whiteboard_path` (required) — path to the shared whiteboard file
|
|
27
|
+
- `title`, `description`, `plan`
|
|
28
|
+
- `affected_files`
|
|
29
|
+
- `test_targets` (optional)
|
|
30
|
+
- `previous_error` (optional)
|
|
31
|
+
|
|
32
|
+
## Rules
|
|
33
|
+
|
|
34
|
+
- All work must be done inside the specified `worktree_path`.
|
|
35
|
+
- Do not run git add / commit / checkout -b. File editing only.
|
|
36
|
+
- If there are no changes, use `status="no_op"`.
|
|
37
|
+
- `started_at` / `ended_at` must be in RFC3339 UTC format.
|
|
38
|
+
|
|
39
|
+
## Deterministic checks
|
|
40
|
+
|
|
41
|
+
When `test_targets` is provided:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
cargo test ${test_targets} -- --nocapture
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
When `test_targets` is not provided:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Infer and run the tests corresponding to affected_files
|
|
51
|
+
# Example: src/handlers/users.rs → tests/unit/test_users.rs
|
|
52
|
+
# If no corresponding test is found, run only cargo test --lib
|
|
53
|
+
cargo test --lib --quiet
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Note:** Running all tests without `test_targets` risks timeout, so avoid it.
|
|
57
|
+
> Running all tests is the orchestrator's responsibility in Phase 4 (final quality gate).
|
|
58
|
+
|
|
59
|
+
Common:
|
|
60
|
+
|
|
61
|
+
> **Intentional deviation from quality-checks.md**: wave-harness-worker uses scoped checks (affected files only) for performance. `--all-targets` is omitted because full-project checks are the orchestrator's responsibility at Phase Review. Similarly, `rustfmt --check ${affected_files}` targets only changed files instead of `cargo fmt --all -- --check`.
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
cargo clippy --quiet -- -D warnings
|
|
65
|
+
rustfmt --check ${affected_files}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Procedure
|
|
69
|
+
|
|
70
|
+
1. `cd {worktree_path}` (do not create the worktree).
|
|
71
|
+
2. Read `whiteboard_path` and obtain shared context from Goal, How Our Work Connects, and Key Questions.
|
|
72
|
+
3. Implement (file editing only).
|
|
73
|
+
4. Verify (run clippy/rustfmt scoped to affected_files; run cargo test only if test_targets is provided).
|
|
74
|
+
5. Edit the `### {work_item_id}: ...` section of the whiteboard with implementation insights, decisions, and impacts. Edit only your own section.
|
|
75
|
+
6. Return the `changed_files` list (do not commit). Do not include `whiteboard_path` in `changed_files`.
|
|
76
|
+
7. If there are no changes, return `no_op`.
|
|
77
|
+
8. Return JSON.
|
|
78
|
+
|
|
79
|
+
## Output schema (v3)
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"schema_version": "taskflow-worker.v3",
|
|
84
|
+
"worker": "wave-harness-worker",
|
|
85
|
+
"session_id": "wh-20260226T190000",
|
|
86
|
+
"attempt": 1,
|
|
87
|
+
"work_item_id": "issue-123",
|
|
88
|
+
"status": "completed",
|
|
89
|
+
"changed_files": ["src/handlers/users.rs"],
|
|
90
|
+
"checks": {
|
|
91
|
+
"clippy": "pass",
|
|
92
|
+
"rustfmt": "pass",
|
|
93
|
+
"cargo_test": "pass"
|
|
94
|
+
},
|
|
95
|
+
"no_op_reason": null,
|
|
96
|
+
"started_at": "2026-02-26T19:00:00Z",
|
|
97
|
+
"ended_at": "2026-02-26T19:10:00Z",
|
|
98
|
+
"error": null
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## no_op schema
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"schema_version": "taskflow-worker.v3",
|
|
107
|
+
"worker": "wave-harness-worker",
|
|
108
|
+
"session_id": "wh-20260226T190000",
|
|
109
|
+
"attempt": 1,
|
|
110
|
+
"work_item_id": "issue-123",
|
|
111
|
+
"status": "no_op",
|
|
112
|
+
"changed_files": [],
|
|
113
|
+
"checks": {
|
|
114
|
+
"clippy": "pass",
|
|
115
|
+
"rustfmt": "pass",
|
|
116
|
+
"cargo_test": "pass"
|
|
117
|
+
},
|
|
118
|
+
"no_op_reason": "No code changes were required",
|
|
119
|
+
"started_at": "2026-02-26T19:00:00Z",
|
|
120
|
+
"ended_at": "2026-02-26T19:03:00Z",
|
|
121
|
+
"error": null
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Failure schema
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"schema_version": "taskflow-worker.v3",
|
|
130
|
+
"worker": "wave-harness-worker",
|
|
131
|
+
"session_id": "wh-20260226T190000",
|
|
132
|
+
"attempt": 1,
|
|
133
|
+
"work_item_id": "issue-123",
|
|
134
|
+
"status": "failed",
|
|
135
|
+
"changed_files": [],
|
|
136
|
+
"checks": {
|
|
137
|
+
"clippy": "not_run",
|
|
138
|
+
"rustfmt": "not_run",
|
|
139
|
+
"cargo_test": "not_run"
|
|
140
|
+
},
|
|
141
|
+
"no_op_reason": null,
|
|
142
|
+
"started_at": "2026-02-26T19:00:00Z",
|
|
143
|
+
"ended_at": "2026-02-26T19:01:00Z",
|
|
144
|
+
"error": {
|
|
145
|
+
"code": "CHECK_FAILED",
|
|
146
|
+
"message": "cargo test failed",
|
|
147
|
+
"details": "..."
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Error codes
|
|
153
|
+
|
|
154
|
+
- `INPUT_INVALID`
|
|
155
|
+
- `IMPLEMENTATION_FAILED`
|
|
156
|
+
- `CHECK_FAILED`
|
|
157
|
+
- `SCHEMA_VIOLATION`
|
|
158
|
+
- `TIMEOUT`
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# spec-workflow: guardrail triggered after reading tasks.md
|
|
3
|
+
# Called from the PostToolUse(Read) hook
|
|
4
|
+
|
|
5
|
+
FILE_PATH=$(jq -r '.tool_input.file_path // .tool_response.filePath // empty' 2>/dev/null || echo '')
|
|
6
|
+
|
|
7
|
+
if echo "$FILE_PATH" | grep -qE '[.]spec-workflow/specs/[^/]+/tasks[.]md$'; then
|
|
8
|
+
echo "⛔ [spec-workflow] STOP — tasks.md has been read."
|
|
9
|
+
echo ""
|
|
10
|
+
echo "You must not write code directly for any reason after this point."
|
|
11
|
+
echo "Next action: Guide the user with 'Please run /spec-implement' and stop immediately."
|
|
12
|
+
echo ""
|
|
13
|
+
echo "Prohibited (no exceptions):"
|
|
14
|
+
echo " - Writing code via Edit / Write / Bash"
|
|
15
|
+
echo " - Launching /spec-implement yourself"
|
|
16
|
+
echo " - Starting implementation in response to 'yes', 'go ahead', 'OK', etc."
|
|
17
|
+
fi
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spec-workflow-mcp-marketplace",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "arimakouyou"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "Spec Workflow MCP provides structured spec-driven development with a sequential workflow (Requirements → Design → Tasks), real-time web dashboard, and VSCode extension support. Includes human approval gates at each stage and project steering guidance."
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "spec-workflow-mcp",
|
|
12
|
+
"version": "2.2.7",
|
|
13
|
+
"description": "MCP server for structured spec-driven development with real-time web dashboard and VSCode extension.",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "arimakouyou"
|
|
16
|
+
},
|
|
17
|
+
"license": "GPL-3.0",
|
|
18
|
+
"homepage": "https://github.com/arimakouyou/spec-workflow-mcp",
|
|
19
|
+
"source": "./.claude-plugin"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "spec-workflow-mcp-with-dashboard",
|
|
23
|
+
"version": "2.2.7",
|
|
24
|
+
"description": "Lightweight MCP server for structured spec-driven development (no skills/agents/rules/hooks). Start the dashboard separately with --dashboard.",
|
|
25
|
+
"author": {
|
|
26
|
+
"name": "arimakouyou"
|
|
27
|
+
},
|
|
28
|
+
"license": "GPL-3.0",
|
|
29
|
+
"homepage": "https://github.com/arimakouyou/spec-workflow-mcp",
|
|
30
|
+
"source": "./.claude-plugin/with-dashboard"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spec-workflow-mcp",
|
|
3
|
+
"version": "2.2.7",
|
|
4
|
+
"description": "MCP server for structured spec-driven development with real-time web dashboard and VSCode extension.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "arimakouyou"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/arimakouyou/spec-workflow-mcp",
|
|
9
|
+
"license": "GPL-3.0",
|
|
10
|
+
"hooks": "./hooks/hooks.json"
|
|
11
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.rs"
|
|
4
|
+
globs:
|
|
5
|
+
- "**/Cargo.toml"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Axum Best Practices
|
|
9
|
+
|
|
10
|
+
## Router Configuration
|
|
11
|
+
|
|
12
|
+
- Create routers with `Router::new()` and register routes with `route()`
|
|
13
|
+
- Split related routes into separate `Router` modules and combine them with `merge()` or `nest()`
|
|
14
|
+
- Use `nest("/api/v1", api_routes())` to group routes under a common prefix
|
|
15
|
+
- Keep route definition files and handler implementation files separate
|
|
16
|
+
|
|
17
|
+
```rust
|
|
18
|
+
// routes/mod.rs
|
|
19
|
+
pub fn routes() -> Router<AppState> {
|
|
20
|
+
Router::new()
|
|
21
|
+
.merge(users::routes())
|
|
22
|
+
.merge(posts::routes())
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// routes/users.rs
|
|
26
|
+
pub fn routes() -> Router<AppState> {
|
|
27
|
+
Router::new()
|
|
28
|
+
.route("/users", get(list_users).post(create_user))
|
|
29
|
+
.route("/users/{id}", get(get_user).put(update_user).delete(delete_user))
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## State Management
|
|
34
|
+
|
|
35
|
+
- Define application state as a `#[derive(Clone)]` struct and pass it with `Router::with_state()`
|
|
36
|
+
- Consolidate shared resources such as DB pools and configuration values into `AppState`
|
|
37
|
+
- Use `Arc<RwLock<T>>` or `Arc<Mutex<T>>` when mutable shared state is required
|
|
38
|
+
- Retrieve state in handlers via the `State` extractor
|
|
39
|
+
|
|
40
|
+
```rust
|
|
41
|
+
#[derive(Clone)]
|
|
42
|
+
struct AppState {
|
|
43
|
+
db_pool: Pool<AsyncPgConnection>,
|
|
44
|
+
valkey_pool: redis::aio::MultiplexedConnection,
|
|
45
|
+
config: Arc<AppConfig>,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async fn handler(State(state): State<AppState>) -> impl IntoResponse {
|
|
49
|
+
// use state.db_pool, state.valkey_pool
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Extractors
|
|
54
|
+
|
|
55
|
+
- Extractor argument order matters. Place extractors that consume the request body (`Json`, `Form`, etc.) last
|
|
56
|
+
- Place `Path`, `Query`, and `State` first since they do not consume the body
|
|
57
|
+
- Implement `FromRequest` / `FromRequestParts` when creating custom extractors
|
|
58
|
+
- Perform validation at the extractor level
|
|
59
|
+
|
|
60
|
+
```rust
|
|
61
|
+
async fn update_user(
|
|
62
|
+
State(state): State<AppState>,
|
|
63
|
+
Path(user_id): Path<i64>,
|
|
64
|
+
Json(payload): Json<UpdateUserRequest>, // body-consuming extractor goes last
|
|
65
|
+
) -> Result<Json<User>, AppError> {
|
|
66
|
+
// ...
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Error Handling
|
|
71
|
+
|
|
72
|
+
- Define an application-wide error type that implements `IntoResponse`
|
|
73
|
+
- Use `Result<T, AppError>` as the return type of handlers
|
|
74
|
+
- Implement `From` conversions from each error type (diesel, redis, etc.) to `AppError`
|
|
75
|
+
- Manage the mapping between HTTP status codes and error messages in a single place
|
|
76
|
+
|
|
77
|
+
```rust
|
|
78
|
+
enum AppError {
|
|
79
|
+
NotFound,
|
|
80
|
+
BadRequest(String),
|
|
81
|
+
Internal(anyhow::Error),
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
impl IntoResponse for AppError {
|
|
85
|
+
fn into_response(self) -> Response {
|
|
86
|
+
let (status, message) = match self {
|
|
87
|
+
AppError::NotFound => (StatusCode::NOT_FOUND, "Not found".to_string()),
|
|
88
|
+
AppError::BadRequest(msg) => (StatusCode::BAD_REQUEST, msg),
|
|
89
|
+
AppError::Internal(err) => {
|
|
90
|
+
tracing::error!(%err, "Internal error");
|
|
91
|
+
(StatusCode::INTERNAL_SERVER_ERROR, "Internal server error".to_string())
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
(status, Json(json!({ "error": message }))).into_response()
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Middleware
|
|
100
|
+
|
|
101
|
+
- Use `tower::ServiceBuilder` to apply middleware in bulk (executed top to bottom)
|
|
102
|
+
- Implement authentication and authorization with `middleware::from_fn` or `middleware::from_fn_with_state`
|
|
103
|
+
- Use `TraceLayer` (tower-http) for request logging
|
|
104
|
+
- Configure timeouts with `HandleErrorLayer` + `tower::timeout`
|
|
105
|
+
- Apply middleware to all routes with `.layer()`, and only to authenticated routes with `.route_layer()`
|
|
106
|
+
|
|
107
|
+
```rust
|
|
108
|
+
let app = Router::new()
|
|
109
|
+
.route("/protected", get(protected_handler))
|
|
110
|
+
.route_layer(middleware::from_fn_with_state(state.clone(), auth))
|
|
111
|
+
.route("/public", get(public_handler))
|
|
112
|
+
.layer(
|
|
113
|
+
ServiceBuilder::new()
|
|
114
|
+
.layer(TraceLayer::new_for_http())
|
|
115
|
+
.layer(HandleErrorLayer::new(handle_timeout))
|
|
116
|
+
.timeout(Duration::from_secs(30))
|
|
117
|
+
.layer(
|
|
118
|
+
CorsLayer::new()
|
|
119
|
+
.allow_origin("https://example.com".parse::<HeaderValue>().unwrap())
|
|
120
|
+
.allow_methods([Method::GET, Method::POST])
|
|
121
|
+
.allow_headers([AUTHORIZATION, CONTENT_TYPE]),
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
.with_state(state);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Responses
|
|
128
|
+
|
|
129
|
+
- Return successful responses as `Json<T>` (where `T: Serialize`)
|
|
130
|
+
- Use a tuple `(StatusCode, Json<T>)` when an explicit status code is needed
|
|
131
|
+
- Return `StatusCode::NO_CONTENT` for empty responses
|
|
132
|
+
- Use `axum::body::Body` for streaming responses
|
|
133
|
+
|
|
134
|
+
## Graceful Shutdown
|
|
135
|
+
|
|
136
|
+
- Configure `with_graceful_shutdown` on `axum::serve`
|
|
137
|
+
- Handle SIGTERM/SIGINT with `tokio::signal`
|
|
138
|
+
|
|
139
|
+
```rust
|
|
140
|
+
let listener = TcpListener::bind("0.0.0.0:3000").await?;
|
|
141
|
+
axum::serve(listener, app)
|
|
142
|
+
.with_graceful_shutdown(shutdown_signal())
|
|
143
|
+
.await?;
|
|
144
|
+
|
|
145
|
+
async fn shutdown_signal() {
|
|
146
|
+
tokio::signal::ctrl_c().await.expect("failed to listen for ctrl_c");
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Testing
|
|
151
|
+
|
|
152
|
+
- Test handlers directly using `axum::body::Body` and `tower::ServiceExt`
|
|
153
|
+
- Construct a test `AppState` to inject test DBs or mocks
|
|
154
|
+
- Send actual HTTP requests in integration tests
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/Cargo.toml"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cargo.toml Style Rules
|
|
7
|
+
|
|
8
|
+
Follow the official Rust Style Guide conventions for Cargo.toml.
|
|
9
|
+
|
|
10
|
+
## Formatting
|
|
11
|
+
|
|
12
|
+
- Indentation: 4 spaces (same as Rust code)
|
|
13
|
+
- Max line width: 100 characters
|
|
14
|
+
- One blank line between sections (no blank line between a section header and its key-value pairs)
|
|
15
|
+
|
|
16
|
+
## Section Order
|
|
17
|
+
|
|
18
|
+
- Place `[package]` at the top of the file
|
|
19
|
+
- Within `[package]`: `name` → `version` → other keys → `description` (last)
|
|
20
|
+
- Within other sections: sort key names alphabetically (version sort)
|
|
21
|
+
|
|
22
|
+
## Key-Value Pairs
|
|
23
|
+
|
|
24
|
+
- Use bare keys for standard key names (no quotes)
|
|
25
|
+
- Single space around `=`: `name = "my-crate"`
|
|
26
|
+
- No indentation on key names (start at the beginning of the line)
|
|
27
|
+
|
|
28
|
+
## Array Values
|
|
29
|
+
|
|
30
|
+
```toml
|
|
31
|
+
# Fits on one line
|
|
32
|
+
default = ["feature1", "feature2"]
|
|
33
|
+
|
|
34
|
+
# Does not fit: block indent + trailing comma
|
|
35
|
+
some_feature = [
|
|
36
|
+
"another_feature",
|
|
37
|
+
"yet_another_feature",
|
|
38
|
+
"some_dependency?/some_feature",
|
|
39
|
+
]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Table Values
|
|
43
|
+
|
|
44
|
+
```toml
|
|
45
|
+
# Fits on one line: inline
|
|
46
|
+
[dependencies]
|
|
47
|
+
crate1 = { path = "crate1", version = "1.2.3" }
|
|
48
|
+
|
|
49
|
+
# Does not fit: expanded form
|
|
50
|
+
[dependencies.long_crate_name]
|
|
51
|
+
path = "long_path_name"
|
|
52
|
+
version = "4.5.6"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Strings
|
|
56
|
+
|
|
57
|
+
- Use multi-line strings for values containing newlines (not `\n` escapes)
|
|
58
|
+
|
|
59
|
+
## Metadata
|
|
60
|
+
|
|
61
|
+
- `authors`: use `Full Name <email@address>` format
|
|
62
|
+
- `license`: use valid SPDX expressions (e.g., `MIT OR Apache-2.0`)
|
|
63
|
+
- `description`: wrap at 80 columns, do not start with the crate name
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Rules for using Context7 MCP to retrieve up-to-date information about libraries and tools. Applies when using libraries, configuring external tools, and handling errors.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Context7 MCP Usage Rules
|
|
6
|
+
|
|
7
|
+
## When Using Libraries
|
|
8
|
+
|
|
9
|
+
When using APIs from libraries or frameworks, always fetch the latest documentation and code examples via Context7 MCP before implementing. Avoid writing code based on memory of older usage patterns; always base your implementation on the latest correct usage.
|
|
10
|
+
|
|
11
|
+
## External Tool Configuration and Syntax
|
|
12
|
+
|
|
13
|
+
When writing configuration files (tsconfig, vite.config, eslint, etc.) or CLI tool syntax, verify the correct options and format in advance using Context7 MCP. Do not write configurations based on guesswork.
|
|
14
|
+
|
|
15
|
+
## When Handling Errors
|
|
16
|
+
|
|
17
|
+
When an error caused by a library or tool occurs, immediately check the correct usage via Context7 MCP and fix it based on the official documentation. Avoid fixes based on outdated Stack Overflow answers or memory-based guesswork.
|