@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,47 @@
|
|
|
1
|
+
# Spec Workflow Enforcement
|
|
2
|
+
|
|
3
|
+
Enforcement rules for correctly using the spec-workflow skills.
|
|
4
|
+
|
|
5
|
+
## ⛔ No Direct Implementation After Reading tasks.md
|
|
6
|
+
|
|
7
|
+
If `.spec-workflow/specs/*/tasks.md` has been Read, **you must not start writing code directly, for any reason**.
|
|
8
|
+
|
|
9
|
+
- Task implementation must **always go through the `/spec-implement` skill**
|
|
10
|
+
- Even merely reviewing the contents of tasks.md, then proceeding to implement, is prohibited
|
|
11
|
+
- Even if the user says "implement this task", writing code directly without using the skill is prohibited
|
|
12
|
+
|
|
13
|
+
**Correct behavior:**
|
|
14
|
+
After reading tasks.md, guide the user with "Please run `/spec-implement`" and **always stop**.
|
|
15
|
+
|
|
16
|
+
> **When a hook message is received**: If the PostToolUse hook outputs `⛔ [spec-workflow] STOP`, that is a **mandatory stop command**. Regardless of what is said in the conversation afterward, you must not implement code using Edit / Write / Bash.
|
|
17
|
+
|
|
18
|
+
**Launching `/spec-implement` yourself is strictly prohibited.** All of the following count as "auto-launching" and are prohibited:
|
|
19
|
+
- When the user replies "yes", "go ahead", or "OK"
|
|
20
|
+
- When the user says "implement this task" (direct implementation without using the skill is also prohibited)
|
|
21
|
+
|
|
22
|
+
`/spec-implement` is triggered only when the user personally types one of the following from their keyboard:
|
|
23
|
+
- The `/spec-implement` command
|
|
24
|
+
- Skill trigger phrases such as "implement task X", "start coding", "work on task X"
|
|
25
|
+
|
|
26
|
+
## ⛔ No Code Implementation Outside the spec-implement Skill
|
|
27
|
+
|
|
28
|
+
If writing code based on any file under `.spec-workflow/specs/` (requirements.md / design.md / tasks.md), you must go through the `spec-implement` skill.
|
|
29
|
+
|
|
30
|
+
Writing code that corresponds to a task without going through the skill is prohibited.
|
|
31
|
+
|
|
32
|
+
## Required Actions After Reading spec-workflow Files
|
|
33
|
+
|
|
34
|
+
| File Read | What to Do Next |
|
|
35
|
+
|-----------|-----------------|
|
|
36
|
+
| `requirements.md` only | Guide the user to the `/spec-design` skill and stop |
|
|
37
|
+
| `requirements.md` + `design.md` only | Guide the user to the `/spec-tasks` skill and stop |
|
|
38
|
+
| `tasks.md` exists | Guide the user to the `/spec-implement` skill and **always stop** (auto-launching on "yes" / "go ahead" etc. is prohibited) |
|
|
39
|
+
|
|
40
|
+
## Why This Rule Is Necessary
|
|
41
|
+
|
|
42
|
+
The spec-implement skill enforces the following agent chain:
|
|
43
|
+
- `parallel-worker` → TDD implementation
|
|
44
|
+
- `unit-test-engineer` → test quality verification
|
|
45
|
+
- `review-worker` → review + commit
|
|
46
|
+
|
|
47
|
+
Direct implementation that skips this chain completely bypasses TDD quality assurance and is therefore absolutely not permitted.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.rs"
|
|
4
|
+
globs:
|
|
5
|
+
- "**/Cargo.toml"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Valkey (redis-rs) Best Practices
|
|
9
|
+
|
|
10
|
+
Valkey は Redis 互換のインメモリデータストア。Rust クライアントには `redis-rs` を使用する。
|
|
11
|
+
|
|
12
|
+
## 依存関係
|
|
13
|
+
|
|
14
|
+
```toml
|
|
15
|
+
[dependencies]
|
|
16
|
+
redis = { version = "0.27", features = ["tokio-comp", "connection-manager"] }
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- `tokio-comp` feature で非同期サポートを有効化する
|
|
20
|
+
- クラスター使用時は `cluster-async` feature を追加する
|
|
21
|
+
|
|
22
|
+
## 接続管理
|
|
23
|
+
|
|
24
|
+
- 非同期接続には `MultiplexedConnection` を使う (クローン可能、スレッドセーフ)
|
|
25
|
+
- 接続プールは通常不要。`MultiplexedConnection` が内部で多重化する
|
|
26
|
+
- 自動再接続には `ConnectionManager` (`connection-manager` feature) を使う
|
|
27
|
+
- ブロッキングコマンド (`BLPOP`, `BRPOP` 等) は専用の接続で実行する
|
|
28
|
+
|
|
29
|
+
```rust
|
|
30
|
+
use redis::Client;
|
|
31
|
+
|
|
32
|
+
let client = Client::open("redis://127.0.0.1:6379/")?;
|
|
33
|
+
let conn = client.get_multiplexed_async_connection().await?;
|
|
34
|
+
|
|
35
|
+
// conn は Clone 可能なので AppState に格納して共有できる
|
|
36
|
+
#[derive(Clone)]
|
|
37
|
+
struct AppState {
|
|
38
|
+
db_pool: DbPool,
|
|
39
|
+
valkey: redis::aio::MultiplexedConnection,
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## ConnectionManager による自動再接続
|
|
44
|
+
|
|
45
|
+
```rust
|
|
46
|
+
use redis::aio::ConnectionManager;
|
|
47
|
+
|
|
48
|
+
let client = Client::open("redis://127.0.0.1:6379/")?;
|
|
49
|
+
let conn = ConnectionManager::new(client).await?;
|
|
50
|
+
// conn は Clone 可能、接続断時に自動再接続する
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## コマンド実行
|
|
54
|
+
|
|
55
|
+
- `AsyncCommands` トレイトを import して高レベル API を使う
|
|
56
|
+
- 型パラメータで戻り値の型を指定する
|
|
57
|
+
- 存在しないキーの取得には `Option<T>` を使う
|
|
58
|
+
|
|
59
|
+
```rust
|
|
60
|
+
use redis::AsyncCommands;
|
|
61
|
+
|
|
62
|
+
// SET / GET
|
|
63
|
+
let _: () = conn.set("key", "value").await?;
|
|
64
|
+
let val: String = conn.get("key").await?;
|
|
65
|
+
|
|
66
|
+
// Option で存在チェック
|
|
67
|
+
let maybe: Option<String> = conn.get("maybe_missing").await?;
|
|
68
|
+
|
|
69
|
+
// 有効期限付き SET
|
|
70
|
+
let _: () = conn.set_ex("session:abc", session_data, 3600).await?;
|
|
71
|
+
|
|
72
|
+
// ハッシュ操作
|
|
73
|
+
let _: () = conn.hset("user:1", "name", "Alice").await?;
|
|
74
|
+
let name: String = conn.hget("user:1", "name").await?;
|
|
75
|
+
|
|
76
|
+
// DEL
|
|
77
|
+
let _: () = conn.del("key").await?;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## パイプライン
|
|
81
|
+
|
|
82
|
+
- 複数コマンドを一度に送信してネットワークラウンドトリップを削減する
|
|
83
|
+
- バッチ処理やキャッシュのウォームアップに使う
|
|
84
|
+
|
|
85
|
+
```rust
|
|
86
|
+
let (k1, k2): (i32, i32) = redis::pipe()
|
|
87
|
+
.set("key_1", 42).ignore()
|
|
88
|
+
.set("key_2", 43).ignore()
|
|
89
|
+
.get("key_1")
|
|
90
|
+
.get("key_2")
|
|
91
|
+
.query_async(&mut conn)
|
|
92
|
+
.await?;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## キー設計
|
|
96
|
+
|
|
97
|
+
- プレフィックスとコロン区切りで名前空間を作る: `{entity}:{id}:{attribute}`
|
|
98
|
+
- 例: `user:123:profile`, `session:abc123`, `cache:posts:page:1`
|
|
99
|
+
- キー名は短く、しかし読みやすく
|
|
100
|
+
- TTL (有効期限) を必ず設定する。期限なしキーはメモリリークの原因になる
|
|
101
|
+
|
|
102
|
+
## キャッシュパターン
|
|
103
|
+
|
|
104
|
+
- Cache-Aside パターンを基本とする
|
|
105
|
+
- キャッシュミス時にDBから取得してキャッシュに書き込む
|
|
106
|
+
- 更新時はキャッシュを削除する (更新ではなく削除が安全)
|
|
107
|
+
|
|
108
|
+
```rust
|
|
109
|
+
async fn get_user_cached(
|
|
110
|
+
conn: &mut impl AsyncCommands,
|
|
111
|
+
db: &mut AsyncPgConnection,
|
|
112
|
+
user_id: i64,
|
|
113
|
+
) -> Result<User, AppError> {
|
|
114
|
+
let cache_key = format!("user:{user_id}");
|
|
115
|
+
|
|
116
|
+
// キャッシュ確認
|
|
117
|
+
if let Some(cached) = conn.get::<_, Option<String>>(&cache_key).await? {
|
|
118
|
+
return Ok(serde_json::from_str(&cached)?);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// DB から取得
|
|
122
|
+
let user = users::table
|
|
123
|
+
.find(user_id)
|
|
124
|
+
.select(User::as_select())
|
|
125
|
+
.first(db)
|
|
126
|
+
.await?;
|
|
127
|
+
|
|
128
|
+
// キャッシュに保存 (TTL 付き)
|
|
129
|
+
let serialized = serde_json::to_string(&user)?;
|
|
130
|
+
let _: () = conn.set_ex(&cache_key, &serialized, 300).await?;
|
|
131
|
+
|
|
132
|
+
Ok(user)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async fn update_user(/* ... */) -> Result<User, AppError> {
|
|
136
|
+
// DB 更新
|
|
137
|
+
let user = diesel::update(users::table.find(user_id))
|
|
138
|
+
.set(&changes)
|
|
139
|
+
.get_result::<User>(db)
|
|
140
|
+
.await?;
|
|
141
|
+
|
|
142
|
+
// キャッシュ削除 (更新ではなく削除)
|
|
143
|
+
let _: () = conn.del(format!("user:{user_id}")).await?;
|
|
144
|
+
|
|
145
|
+
Ok(user)
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## セッション管理
|
|
150
|
+
|
|
151
|
+
- セッションデータは Valkey のハッシュ型で格納する
|
|
152
|
+
- セッション ID はランダム生成し、推測不可能にする
|
|
153
|
+
- TTL を必ず設定する (例: 24時間)
|
|
154
|
+
|
|
155
|
+
## エラーハンドリング
|
|
156
|
+
|
|
157
|
+
- `redis::RedisError` を `AppError` に変換する `From` 実装を用意する
|
|
158
|
+
- 接続エラー時はリトライロジックを入れる (`ConnectionManager` 使用時は自動)
|
|
159
|
+
- Valkey ダウン時にもアプリケーションが degraded mode で動作できるようにする
|
|
160
|
+
|
|
161
|
+
## やってはいけないこと
|
|
162
|
+
|
|
163
|
+
- `KEYS *` を本番で使わない → `SCAN` を使う
|
|
164
|
+
- 大きな値 (> 1MB) を単一キーに保存しない
|
|
165
|
+
- Lua スクリプトで長時間ブロックしない
|
|
166
|
+
- TTL なしでキャッシュを保存しない
|
|
167
|
+
- `FLUSHALL` / `FLUSHDB` を本番で使わない
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: integration-test
|
|
3
|
+
description: "Parallelizes integration test creation in Agent Teams. Workers (alpha/bravo) implement tests, and Pentagon performs quality review. Use for tasks related to integration test, Axum, Diesel, testcontainers, Agent Teams, and pentagon."
|
|
4
|
+
argument-hint: "<domain>[,<domain>...] [--dry-run] [--base-branch <branch>]"
|
|
5
|
+
user-invokable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# integration-test
|
|
9
|
+
|
|
10
|
+
A skill that uses Agent Teams to create integration tests under `tests/integration/` in parallel.
|
|
11
|
+
Workers (alpha/bravo) implement the tests, and Pentagon reviews them at the quality gate.
|
|
12
|
+
|
|
13
|
+
Tech stack: Axum + Diesel + diesel-async + Valkey (redis-rs) + testcontainers-rs
|
|
14
|
+
|
|
15
|
+
## Execution Environment Rules
|
|
16
|
+
|
|
17
|
+
| Rule | Description |
|
|
18
|
+
|--------|------|
|
|
19
|
+
| **No self-created branches/worktrees** | Do not directly run `git checkout -b` / `git worktree add` |
|
|
20
|
+
| **When `--base-branch` is not specified** | Work in the current directory on the current branch |
|
|
21
|
+
| **When `--base-branch` is specified** | Create a worktree via the `create-git-worktree` skill |
|
|
22
|
+
|
|
23
|
+
## Design Policy
|
|
24
|
+
|
|
25
|
+
| Dependency Type | Policy |
|
|
26
|
+
|----------|------|
|
|
27
|
+
| **DB (PostgreSQL)** | Use a real PostgreSQL container via testcontainers-rs (no mocking) |
|
|
28
|
+
| **External HTTP APIs** | Swap in test doubles via trait-based DI |
|
|
29
|
+
| **Valkey / Cache** | testcontainers-rs or trait DI override |
|
|
30
|
+
|
|
31
|
+
## Team Composition (always 3 roles)
|
|
32
|
+
|
|
33
|
+
| Role | Agent | Responsibility |
|
|
34
|
+
|------|------------|------|
|
|
35
|
+
| **Command** (Leader) | Main agent | Commander and strategy planner |
|
|
36
|
+
| **Workers** (alpha/bravo) | Sub-agent x 1-2 | Test implementation |
|
|
37
|
+
| **Pentagon** (Reviewer) | Sub-agent | Quality review and judgment |
|
|
38
|
+
|
|
39
|
+
## Arguments
|
|
40
|
+
|
|
41
|
+
`$ARGS` is specified as a comma-separated list of domain names (e.g., `users,posts`).
|
|
42
|
+
|
|
43
|
+
| Argument | Required | Description |
|
|
44
|
+
|------|:----:|------|
|
|
45
|
+
| `$ARGS` | YES | `{domain}[,{domain}...]` (comma-separated) |
|
|
46
|
+
| `--dry-run` | - | Print the assignment plan and exit |
|
|
47
|
+
| `--base-branch <branch>` | - | Branch to derive the worktree from |
|
|
48
|
+
| `--api <method>` | - | Only target a specific HTTP method |
|
|
49
|
+
|
|
50
|
+
### Usage Examples
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Parallel execution (2 targets)
|
|
54
|
+
/integration-test users,posts
|
|
55
|
+
|
|
56
|
+
# dry-run (show plan only)
|
|
57
|
+
/integration-test users,posts --dry-run
|
|
58
|
+
|
|
59
|
+
# Single target (alpha 1 + Pentagon 1)
|
|
60
|
+
/integration-test sessions
|
|
61
|
+
|
|
62
|
+
# Specific method only
|
|
63
|
+
/integration-test users --api GET
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Flow Overview
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
/integration-test users,posts
|
|
72
|
+
|
|
|
73
|
+
+-- [P0] Parse & Analyze
|
|
74
|
+
| +-- Parse arguments (comma-separated)
|
|
75
|
+
| +-- For each target: trace handler → repository → model
|
|
76
|
+
| +-- Worker assignment plan
|
|
77
|
+
| +-- --dry-run: show plan only and exit
|
|
78
|
+
|
|
|
79
|
+
+-- [P1] Setup Team
|
|
80
|
+
| +-- Pre-check test helpers and shared fixtures
|
|
81
|
+
| +-- Create whiteboard
|
|
82
|
+
|
|
|
83
|
+
+-- [P2] Launch Agents
|
|
84
|
+
| +-- Launch Workers (alpha/bravo) x 1-2
|
|
85
|
+
| +-- Launch Pentagon x 1
|
|
86
|
+
| +-- Assign initial tasks
|
|
87
|
+
|
|
|
88
|
+
+-- [P3] Monitor & Facilitate
|
|
89
|
+
| +-- Worker completes -> Request Pentagon review
|
|
90
|
+
| +-- PASS -> Update whiteboard, assign next task
|
|
91
|
+
| +-- FAIL -> Send back to Worker (max 3 times)
|
|
92
|
+
|
|
|
93
|
+
+-- [P4] Final Verification
|
|
94
|
+
| +-- Run cargo test across all test files
|
|
95
|
+
| +-- rustfmt + clippy
|
|
96
|
+
|
|
|
97
|
+
+-- [P5] Cleanup & Report
|
|
98
|
+
+-- Aggregate results
|
|
99
|
+
+-- Clean up whiteboard
|
|
100
|
+
+-- Output final report
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Executor Instructions
|
|
106
|
+
|
|
107
|
+
**You (Command) manage the team following the steps below.**
|
|
108
|
+
|
|
109
|
+
### P0: Parse & Analyze
|
|
110
|
+
|
|
111
|
+
1. Split `$ARGS` by comma to build the target list
|
|
112
|
+
2. **For each target**:
|
|
113
|
+
- Identify handler: trace routes and handlers from `src/handlers/{domain}.rs`
|
|
114
|
+
- Identify repository: analyze query logic from `src/db/repository/{domain}.rs`
|
|
115
|
+
- Identify model: check Diesel models from `src/models/{domain}.rs`
|
|
116
|
+
- Identify external dependencies: find trait-based dependencies (e.g., external API clients)
|
|
117
|
+
3. **Worker assignment**: assign to Workers per test file
|
|
118
|
+
|
|
119
|
+
| # of Targets | # of Workers | Assignment Method |
|
|
120
|
+
|:------:|:---------:|---------|
|
|
121
|
+
| 1 | 1 | All to alpha |
|
|
122
|
+
| 2 | 2 | One each to alpha / bravo |
|
|
123
|
+
| 3+ | 2 | Round-robin |
|
|
124
|
+
|
|
125
|
+
4. **On `--dry-run`**: output the following and exit
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
[dry-run] Assignment plan:
|
|
129
|
+
alpha: {domain_a} -> tests/integration/test_{domain_a}.rs
|
|
130
|
+
- {method} {path}
|
|
131
|
+
bravo: {domain_b} -> tests/integration/test_{domain_b}.rs
|
|
132
|
+
- {method} {path}
|
|
133
|
+
pentagon: quality review
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### P1: Setup Team
|
|
137
|
+
|
|
138
|
+
1. Check and update shared test helpers (`tests/integration/helpers/`)
|
|
139
|
+
2. Create whiteboard: Write following [whiteboard-template.md](references/whiteboard-template.md)
|
|
140
|
+
- **Always set Key Questions** (1-3 items)
|
|
141
|
+
|
|
142
|
+
### P2: Launch Agents
|
|
143
|
+
|
|
144
|
+
Launch Workers and Pentagon as sub-agents. Specify the agent definition under `.claude/agents/` via `subagent_type`.
|
|
145
|
+
|
|
146
|
+
**Launch Pentagon** (launch first to put it in a review-request waiting state):
|
|
147
|
+
```
|
|
148
|
+
Agent(
|
|
149
|
+
subagent_type: "integ-test-auditor",
|
|
150
|
+
prompt: "Whiteboard: {whiteboard_path}\nPlease wait for a review request from Command."
|
|
151
|
+
)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Launch Workers** (fill in variables from [worker-prompt.md](references/worker-prompt.md)):
|
|
155
|
+
```
|
|
156
|
+
Agent(
|
|
157
|
+
subagent_type: "integ-test-worker",
|
|
158
|
+
prompt: "Worker name: {worker_name}\nDomain: {domain}\nTest file: tests/integration/test_{domain}.rs\nTarget endpoints:\n{endpoint_list}\nWhiteboard: {whiteboard_path}"
|
|
159
|
+
)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
If there are 2 or more targets, launch alpha/bravo in parallel.
|
|
163
|
+
|
|
164
|
+
### P3: Monitor & Facilitate
|
|
165
|
+
|
|
166
|
+
Main loop: monitor until all tasks are complete.
|
|
167
|
+
|
|
168
|
+
**When a Worker completes**:
|
|
169
|
+
1. Copy Worker Findings to the whiteboard
|
|
170
|
+
2. Request a review from Pentagon
|
|
171
|
+
|
|
172
|
+
**When Pentagon returns PASS**:
|
|
173
|
+
1. Update the Quality Gate Results on the whiteboard
|
|
174
|
+
2. Assign the next unassigned task to a Worker if one exists
|
|
175
|
+
|
|
176
|
+
**When Pentagon returns FAIL**:
|
|
177
|
+
1. Count the number of reviews (per test file)
|
|
178
|
+
2. Under 3 times: re-run the Worker with a prompt including the review comments
|
|
179
|
+
3. 3rd time: mark as complete with remaining issues noted on the whiteboard
|
|
180
|
+
|
|
181
|
+
### P4: Final Verification
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Run across all test files
|
|
185
|
+
cargo test --test test_{domain} -- --nocapture
|
|
186
|
+
|
|
187
|
+
# Code quality
|
|
188
|
+
cargo fmt --all -- --check
|
|
189
|
+
cargo clippy --quiet --all-targets -- -D warnings
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
If verification fails, Command fixes it directly.
|
|
193
|
+
|
|
194
|
+
### P5: Cleanup & Report
|
|
195
|
+
|
|
196
|
+
1. Move the whiteboard to `.claude/_docs/deleted/`
|
|
197
|
+
2. Output the final report:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
integration-test parallel implementation complete
|
|
201
|
+
|
|
202
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
203
|
+
Targets: {targets}
|
|
204
|
+
|
|
205
|
+
Generated files:
|
|
206
|
+
{file_list}
|
|
207
|
+
|
|
208
|
+
Test results:
|
|
209
|
+
{test_summary}
|
|
210
|
+
|
|
211
|
+
Quality gate:
|
|
212
|
+
{quality_gate_results}
|
|
213
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## References
|
|
219
|
+
|
|
220
|
+
| Document | Purpose |
|
|
221
|
+
|------------|------|
|
|
222
|
+
| [quality-gate.md](references/quality-gate.md) | Pentagon's judgment criteria |
|
|
223
|
+
| [test-case-design.md](references/test-case-design.md) | 5 test case classifications |
|
|
224
|
+
| [test-patterns.md](references/test-patterns.md) | Test implementation patterns |
|
|
225
|
+
| [fixture-catalog.md](references/fixture-catalog.md) | Shared helpers and fixture catalog |
|
|
226
|
+
| [external-api-mock.md](references/external-api-mock.md) | External API mock patterns |
|
|
227
|
+
| [worker-prompt.md](references/worker-prompt.md) | Worker prompt template |
|
|
228
|
+
| [auditor-prompt.md](references/auditor-prompt.md) | Pentagon prompt template |
|
|
229
|
+
| [whiteboard-template.md](references/whiteboard-template.md) | Whiteboard template |
|
|
230
|
+
| [parallel-execution.md](references/parallel-execution.md) | Parallel execution flow details |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Pentagon プロンプトテンプレート
|
|
2
|
+
|
|
3
|
+
Pentagon(Reviewer)起動時に展開するプロンプト。
|
|
4
|
+
`{変数}` は Command が起動時に埋め込む。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
あなたは integration-test の品質レビュアー「Pentagon」です。
|
|
10
|
+
|
|
11
|
+
## 役割
|
|
12
|
+
Worker が作成したインテグレーションテストの品質を判定する。
|
|
13
|
+
判定基準は references/quality-gate.md に従う。
|
|
14
|
+
|
|
15
|
+
## 事前読み込み
|
|
16
|
+
以下のファイルを起動時に Read する:
|
|
17
|
+
1. references/quality-gate.md(判定基準)
|
|
18
|
+
2. references/test-case-design.md(5 分類体系)
|
|
19
|
+
3. {whiteboard_path}(ホワイトボード)
|
|
20
|
+
|
|
21
|
+
## レビュー依頼の受信
|
|
22
|
+
|
|
23
|
+
Command からレビュー依頼を受け取ったら以下の手順で審査する:
|
|
24
|
+
|
|
25
|
+
### 1. テストファイルを Read
|
|
26
|
+
対象のテストファイルと、関連する本番コード(handler, repository, model, dto)を Read する。
|
|
27
|
+
|
|
28
|
+
### 2. 判定基準に従いチェック
|
|
29
|
+
|
|
30
|
+
A. 5 分類カバレッジ
|
|
31
|
+
- 各エンドポイントに対して 5 分類が網羅されているか
|
|
32
|
+
- test-case-design.md の必須テストケースが含まれているか
|
|
33
|
+
|
|
34
|
+
B. 振る舞い契約の検証
|
|
35
|
+
- HTTP ステータスコード、レスポンスボディ、DB 状態変更が検証されているか
|
|
36
|
+
|
|
37
|
+
C. コード品質
|
|
38
|
+
- Given-When-Then 構造、命名、独立性
|
|
39
|
+
|
|
40
|
+
D. Hermetic & Deterministic
|
|
41
|
+
- testcontainers or トランザクション分離、trait DI、時刻制御
|
|
42
|
+
|
|
43
|
+
E. Rust 固有
|
|
44
|
+
- #[tokio::test]、clippy、rustfmt
|
|
45
|
+
|
|
46
|
+
### 3. 判定結果を報告
|
|
47
|
+
|
|
48
|
+
以下のフォーマットで報告する:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
[Pentagon Review] {test_file}
|
|
52
|
+
|
|
53
|
+
判定: PASS / FAIL
|
|
54
|
+
|
|
55
|
+
A. 5分類カバレッジ: PASS / FAIL
|
|
56
|
+
{詳細}
|
|
57
|
+
|
|
58
|
+
B. 振る舞い契約: PASS / FAIL
|
|
59
|
+
{詳細}
|
|
60
|
+
|
|
61
|
+
C. コード品質: PASS / FAIL
|
|
62
|
+
{詳細}
|
|
63
|
+
|
|
64
|
+
D. Hermetic: PASS / FAIL
|
|
65
|
+
{詳細}
|
|
66
|
+
|
|
67
|
+
E. Rust 固有: PASS / FAIL
|
|
68
|
+
{詳細}
|
|
69
|
+
|
|
70
|
+
修正指示:(FAIL の場合のみ)
|
|
71
|
+
1. {具体的な修正内容}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## レビューサイクル
|
|
75
|
+
- 最大 3 回のレビューサイクル
|
|
76
|
+
- 3 回目で FAIL の場合は残存指摘付きで完了扱いとし、Command に報告する
|
|
77
|
+
- PASS の場合はホワイトボードの Quality Gate Results 更新を Command に依頼する
|
|
78
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# 外部 API モックパターン
|
|
2
|
+
|
|
3
|
+
trait ベースの DI で外部 API クライアントをテストダブルに差し替えるパターン。
|
|
4
|
+
|
|
5
|
+
## 推奨パターン: trait DI override
|
|
6
|
+
|
|
7
|
+
```rust
|
|
8
|
+
// 本番コード: trait 定義
|
|
9
|
+
#[async_trait]
|
|
10
|
+
pub trait PaymentGateway: Send + Sync {
|
|
11
|
+
async fn charge(&self, amount: u64) -> Result<PaymentResult, PaymentError>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 本番実装
|
|
15
|
+
pub struct StripeGateway { /* ... */ }
|
|
16
|
+
|
|
17
|
+
#[async_trait]
|
|
18
|
+
impl PaymentGateway for StripeGateway {
|
|
19
|
+
async fn charge(&self, amount: u64) -> Result<PaymentResult, PaymentError> {
|
|
20
|
+
// 実際の API 呼び出し
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## テスト用テストダブル
|
|
26
|
+
|
|
27
|
+
### Stub(固定値を返す)
|
|
28
|
+
|
|
29
|
+
```rust
|
|
30
|
+
pub struct StubPaymentGateway {
|
|
31
|
+
pub result: Result<PaymentResult, PaymentError>,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[async_trait]
|
|
35
|
+
impl PaymentGateway for StubPaymentGateway {
|
|
36
|
+
async fn charge(&self, _amount: u64) -> Result<PaymentResult, PaymentError> {
|
|
37
|
+
self.result.clone()
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Spy(呼び出し記録 + 固定値)
|
|
43
|
+
|
|
44
|
+
```rust
|
|
45
|
+
pub struct SpyPaymentGateway {
|
|
46
|
+
pub calls: Arc<Mutex<Vec<u64>>>,
|
|
47
|
+
pub result: Result<PaymentResult, PaymentError>,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[async_trait]
|
|
51
|
+
impl PaymentGateway for SpyPaymentGateway {
|
|
52
|
+
async fn charge(&self, amount: u64) -> Result<PaymentResult, PaymentError> {
|
|
53
|
+
self.calls.lock().unwrap().push(amount);
|
|
54
|
+
self.result.clone()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 失敗する外部 API
|
|
60
|
+
|
|
61
|
+
```rust
|
|
62
|
+
pub struct FailingPaymentGateway;
|
|
63
|
+
|
|
64
|
+
#[async_trait]
|
|
65
|
+
impl PaymentGateway for FailingPaymentGateway {
|
|
66
|
+
async fn charge(&self, _amount: u64) -> Result<PaymentResult, PaymentError> {
|
|
67
|
+
Err(PaymentError::ServiceUnavailable)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## TestContext への組み込み
|
|
73
|
+
|
|
74
|
+
```rust
|
|
75
|
+
impl TestContext {
|
|
76
|
+
pub async fn with_failing_external_api() -> Self {
|
|
77
|
+
let (container, url) = create_pg_container().await;
|
|
78
|
+
run_migrations(&url).await;
|
|
79
|
+
let db_pool = create_pool(&url);
|
|
80
|
+
|
|
81
|
+
// 失敗する外部 API を注入
|
|
82
|
+
let state = AppState {
|
|
83
|
+
db_pool: db_pool.clone(),
|
|
84
|
+
payment: Arc::new(FailingPaymentGateway) as Arc<dyn PaymentGateway>,
|
|
85
|
+
// ...
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
let app = routes().with_state(state);
|
|
89
|
+
Self { app, db_pool, _pg_container: container, /* ... */ }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 禁止事項
|
|
95
|
+
|
|
96
|
+
- `#[cfg(test)]` で本番コードの振る舞いを変えない
|
|
97
|
+
- mockall で具象型を直接 mock しない → 必ず trait を経由する
|
|
98
|
+
- テスト内で `std::env::set_var` で環境変数を書き換えない(テスト間で干渉する)
|