@polymorphism-tech/morph-spec 8.44.0 → 8.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CLAUDE.md +10 -9
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +10 -10
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/statusline.sh +11 -11
  24. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  25. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  26. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  27. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  28. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  29. package/framework/hooks/shared/build-check.js +1 -1
  30. package/framework/hooks/shared/comment-scanner.js +1 -1
  31. package/framework/hooks/shared/phase-utils.js +0 -5
  32. package/framework/hooks/shared/stdin-reader.js +26 -26
  33. package/framework/phases.json +4 -6
  34. package/framework/rubrics/backend.json +1 -1
  35. package/framework/rubrics/default.json +1 -1
  36. package/framework/rubrics/frontend.json +1 -1
  37. package/framework/rules/morph-workflow.md +6 -6
  38. package/framework/schemas/feature.schema.json +2 -28
  39. package/framework/schemas/tasks.schema.json +6 -2
  40. package/framework/skills/README.md +1 -2
  41. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  42. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  43. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  44. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  45. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  46. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  47. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  48. package/framework/skills/core/morph-media/SKILL.md +1 -1
  49. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  50. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  51. package/framework/skills/core/morph-review/SKILL.md +109 -430
  52. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  53. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  54. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  55. package/framework/standards/STANDARDS.json +10 -10
  56. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  57. package/framework/standards/ai-agents/agent-session.md +1 -1
  58. package/framework/standards/ai-agents/agent-spec.md +1 -1
  59. package/framework/standards/ai-agents/batching.md +1 -1
  60. package/framework/standards/ai-agents/context-providers.md +1 -1
  61. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  62. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  63. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  64. package/framework/standards/ai-agents/guardrails.md +1 -1
  65. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  66. package/framework/standards/ai-agents/mcp-server.md +1 -1
  67. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  68. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  69. package/framework/standards/ai-agents/media-video.md +1 -1
  70. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  71. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  72. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  73. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  74. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  75. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  76. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  77. package/framework/standards/ai-agents/production.md +2 -2
  78. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  79. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  80. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  81. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  82. package/framework/standards/ai-agents/setup.md +1 -1
  83. package/framework/standards/ai-agents/structured-output.md +1 -1
  84. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  85. package/framework/standards/ai-agents/testing-ai.md +1 -1
  86. package/framework/standards/ai-agents/tool-adapters.md +1 -1
  87. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  88. package/framework/standards/ai-agents/workflows.md +1 -1
  89. package/framework/templates/CLAUDE.md.core.template +1 -1
  90. package/framework/templates/IDE-SNIPPETS.md +262 -262
  91. package/framework/templates/README.md +1 -1
  92. package/framework/templates/REGISTRY.json +0 -81
  93. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  94. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  95. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  96. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  97. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  98. package/framework/templates/docs/spec.md +19 -205
  99. package/framework/templates/docs/ui-components.md +52 -52
  100. package/framework/templates/docs/ui-design-system.md +76 -76
  101. package/framework/templates/docs/ui-flows.md +167 -167
  102. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  103. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  104. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  105. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  106. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  107. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  108. package/framework/templates/infrastructure/github/README.md +56 -56
  109. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  110. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  111. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  112. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  113. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  114. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  115. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  116. package/framework/templates/state.template.json +17 -17
  117. package/framework/templates/ui/design-system.css +226 -226
  118. package/package.json +2 -2
  119. package/src/commands/e2e/e2e.js +1 -1
  120. package/src/commands/project/heavy.js +1 -1
  121. package/src/commands/project/status.js +3 -3
  122. package/src/commands/state/approve.js +7 -49
  123. package/src/commands/state/gate-check.js +16 -106
  124. package/src/commands/state/gate-decision.js +1 -1
  125. package/src/commands/state/report-check.js +42 -17
  126. package/src/commands/validation/mutate.js +1 -1
  127. package/src/commands/validation/scout-check.js +28 -0
  128. package/src/commands/validation/validate-feature.js +5 -32
  129. package/src/commands/validation/verify.js +3 -4
  130. package/src/core/paths/output-schema.js +0 -2
  131. package/src/core/state/state-manager.js +1 -2
  132. package/src/core/templates/template-renderer.js +477 -477
  133. package/src/dashboard/app/lib/format.js +5 -0
  134. package/src/dashboard/app/main.jsx +13 -13
  135. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  136. package/src/dashboard/app/pages/Features.jsx +7 -7
  137. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  138. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  139. package/src/dashboard/scanner/docs-scanner.js +1 -2
  140. package/src/dashboard/scanner/features-scanner.js +3 -4
  141. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  142. package/src/dashboard/vite.config.js +24 -24
  143. package/src/lib/agents/output-collector.js +0 -1
  144. package/src/lib/detectors/design-system-detector.js +188 -188
  145. package/src/lib/evaluator-report.js +52 -334
  146. package/src/lib/generators/design-system-generator.js +508 -508
  147. package/src/lib/generators/handoff-generator.js +4 -5
  148. package/src/lib/installers/memory-installer.js +2 -2
  149. package/src/lib/mutation/manifest.js +8 -2
  150. package/src/lib/mutation/report.js +5 -3
  151. package/src/lib/mutation/runner.js +9 -7
  152. package/src/lib/risk-detector.js +60 -122
  153. package/src/lib/scout/scout-check.js +293 -0
  154. package/src/lib/tasks/task-classifier.js +30 -30
  155. package/src/lib/tasks/task-parser.js +209 -209
  156. package/src/lib/tasks/tasks-json-parser.js +7 -5
  157. package/src/lib/tasks/test-nodes.js +1 -1
  158. package/src/lib/tasks/test-runner.js +1 -1
  159. package/src/lib/validators/css/css-validator.js +340 -340
  160. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  161. package/src/lib/validators/verify-runner.js +1 -1
  162. package/src/scripts/setup-infra.js +1 -1
  163. package/src/utils/agent-id-mapper.js +11 -11
  164. package/src/utils/agents-installer.js +5 -9
  165. package/src/utils/claude-settings-manager.js +300 -300
  166. package/src/utils/hooks-installer.js +3 -10
  167. package/src/utils/skills-installer.js +1 -1
  168. package/framework/evals/proof-rubrics/README.md +0 -76
  169. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  170. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  171. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  172. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  173. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  174. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  175. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  176. package/framework/evals/rubrics/README.md +0 -45
  177. package/framework/evals/rubrics/architecture.md +0 -103
  178. package/framework/evals/rubrics/code-quality.md +0 -98
  179. package/framework/evals/rubrics/condensed.md +0 -57
  180. package/framework/evals/rubrics/contracts.md +0 -67
  181. package/framework/evals/rubrics/test-coverage.md +0 -99
  182. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  183. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  184. package/framework/evals/suites/standard.yaml +0 -5
  185. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  186. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  187. package/framework/templates/.idea/morph-templates.xml +0 -92
  188. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  189. package/framework/templates/docs/clarifications.md +0 -253
  190. package/framework/templates/docs/onboarding.md +0 -122
  191. package/framework/templates/docs/schema-analysis.md +0 -119
  192. package/framework/templates/docs/user-stories.md +0 -34
  193. package/src/commands/state/score.js +0 -147
@@ -1,33 +1,33 @@
1
- #!/usr/bin/env bash
2
- # Scope: universal | Validates commit message format (Conventional Commits)
3
- # MORPH-SPEC Commit Message Hook
4
- # Enforces Conventional Commits specification
5
-
6
- COMMIT_MSG_FILE="$1"
7
- COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
8
-
9
- # Conventional Commits pattern: type(scope): description
10
- # Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert
11
- PATTERN="^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\(.+\))?: .{1,100}"
12
-
13
- if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
14
- echo "❌ Invalid commit message format!"
15
- echo ""
16
- echo "Required format: <type>(<scope>): <description>"
17
- echo ""
18
- echo "Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert"
19
- echo ""
20
- echo "Examples:"
21
- echo " feat(auth): add JWT refresh token rotation"
22
- echo " fix(api): resolve null reference in UserService"
23
- echo " docs(readme): update installation instructions"
24
- echo ""
25
- echo "Your message:"
26
- echo " $COMMIT_MSG"
27
- echo ""
28
- echo "Override with: git commit --no-verify"
29
- exit 1
30
- fi
31
-
32
- echo "✅ Commit message format valid"
33
- exit 0
1
+ #!/usr/bin/env bash
2
+ # Scope: universal | Validates commit message format (Conventional Commits)
3
+ # MORPH-SPEC Commit Message Hook
4
+ # Enforces Conventional Commits specification
5
+
6
+ COMMIT_MSG_FILE="$1"
7
+ COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
8
+
9
+ # Conventional Commits pattern: type(scope): description
10
+ # Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert
11
+ PATTERN="^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\(.+\))?: .{1,100}"
12
+
13
+ if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
14
+ echo "❌ Invalid commit message format!"
15
+ echo ""
16
+ echo "Required format: <type>(<scope>): <description>"
17
+ echo ""
18
+ echo "Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert"
19
+ echo ""
20
+ echo "Examples:"
21
+ echo " feat(auth): add JWT refresh token rotation"
22
+ echo " fix(api): resolve null reference in UserService"
23
+ echo " docs(readme): update installation instructions"
24
+ echo ""
25
+ echo "Your message:"
26
+ echo " $COMMIT_MSG"
27
+ echo ""
28
+ echo "Override with: git commit --no-verify"
29
+ exit 1
30
+ fi
31
+
32
+ echo "✅ Commit message format valid"
33
+ exit 0
@@ -1,25 +1,25 @@
1
- #!/bin/bash
2
- # Scope: universal | Validates agents.json Schema
3
- # MORPH-SPEC Pre-Commit Hook: Agent Configuration Validation
4
- # Uses validate-agents.js to check agents.json
5
-
6
- echo "🤖 Validating agent configuration..."
7
-
8
- # Check if agents.json is being modified
9
- if git diff --cached --name-only | grep -q 'agents\.json$'; then
10
- echo "Detected changes to agents.json"
11
-
12
- # Run validator
13
- if ! morph-spec validate-agents-skills; then
14
- echo ""
15
- echo "❌ COMMIT BLOCKED: agents.json validation failed"
16
- echo " Fix errors above before committing"
17
- exit 1
18
- fi
19
-
20
- echo "✓ agents.json is valid"
21
- else
22
- echo "✓ No changes to agents.json"
23
- fi
24
-
25
- exit 0
1
+ #!/bin/bash
2
+ # Scope: universal | Validates agents.json Schema
3
+ # MORPH-SPEC Pre-Commit Hook: Agent Configuration Validation
4
+ # Uses validate-agents.js to check agents.json
5
+
6
+ echo "🤖 Validating agent configuration..."
7
+
8
+ # Check if agents.json is being modified
9
+ if git diff --cached --name-only | grep -q 'agents\.json$'; then
10
+ echo "Detected changes to agents.json"
11
+
12
+ # Run validator
13
+ if ! morph-spec validate-agents-skills; then
14
+ echo ""
15
+ echo "❌ COMMIT BLOCKED: agents.json validation failed"
16
+ echo " Fix errors above before committing"
17
+ exit 1
18
+ fi
19
+
20
+ echo "✓ agents.json is valid"
21
+ else
22
+ echo "✓ No changes to agents.json"
23
+ fi
24
+
25
+ exit 0
@@ -1,64 +1,64 @@
1
- #!/usr/bin/env bash
2
- # Scope: universal | Orchestrates framework + stack-specific pre-commit hooks
3
- # MORPH-SPEC Master Pre-Commit Hook
4
- # Runs universal framework hooks + stack-specific hooks in sequence
5
-
6
- echo "╔════════════════════════════════════════════════╗"
7
- echo "║ MORPH-SPEC PRE-COMMIT VALIDATION ║"
8
- echo "╚════════════════════════════════════════════════╝"
9
- echo ""
10
-
11
- FRAMEWORK_HOOKS_DIR="$(dirname "$0")"
12
- STACK_HOOKS_DIR=".morph/hooks/pre-commit"
13
-
14
- HAS_FAILURES=false
15
-
16
- # Run framework hooks (universal - all stacks)
17
- echo "📦 Running framework hooks (universal)..."
18
- for hook in "$FRAMEWORK_HOOKS_DIR"/*.sh; do
19
- # Skip orchestrator itself
20
- if [[ "$hook" == */orchestrator.sh ]]; then
21
- continue
22
- fi
23
-
24
- if [[ -f "$hook" ]]; then
25
- hook_name=$(basename "$hook")
26
- echo "─────────────────────────────────────────────────"
27
- if ! bash "$hook"; then
28
- HAS_FAILURES=true
29
- echo "❌ Framework hook failed: $hook_name"
30
- fi
31
- echo ""
32
- fi
33
- done
34
-
35
- # Run stack-specific hooks (if exist)
36
- if [[ -d "$STACK_HOOKS_DIR" ]]; then
37
- echo "🎯 Running stack-specific hooks..."
38
- for hook in "$STACK_HOOKS_DIR"/*.sh; do
39
- if [[ -f "$hook" ]]; then
40
- hook_name=$(basename "$hook")
41
- echo "─────────────────────────────────────────────────"
42
- if ! bash "$hook"; then
43
- HAS_FAILURES=true
44
- echo "❌ Stack hook failed: $hook_name"
45
- fi
46
- echo ""
47
- fi
48
- done
49
- else
50
- echo "ℹ️ No stack-specific hooks found (optional)"
51
- echo ""
52
- fi
53
-
54
- echo "═════════════════════════════════════════════════"
55
-
56
- if [[ "$HAS_FAILURES" == "true" ]]; then
57
- echo "❌ PRE-COMMIT VALIDATION FAILED"
58
- echo " Fix errors above before committing"
59
- echo " Or use: git commit --no-verify to skip"
60
- exit 1
61
- fi
62
-
63
- echo "✅ ALL PRE-COMMIT VALIDATIONS PASSED"
64
- exit 0
1
+ #!/usr/bin/env bash
2
+ # Scope: universal | Orchestrates framework + stack-specific pre-commit hooks
3
+ # MORPH-SPEC Master Pre-Commit Hook
4
+ # Runs universal framework hooks + stack-specific hooks in sequence
5
+
6
+ echo "╔════════════════════════════════════════════════╗"
7
+ echo "║ MORPH-SPEC PRE-COMMIT VALIDATION ║"
8
+ echo "╚════════════════════════════════════════════════╝"
9
+ echo ""
10
+
11
+ FRAMEWORK_HOOKS_DIR="$(dirname "$0")"
12
+ STACK_HOOKS_DIR=".morph/hooks/pre-commit"
13
+
14
+ HAS_FAILURES=false
15
+
16
+ # Run framework hooks (universal - all stacks)
17
+ echo "📦 Running framework hooks (universal)..."
18
+ for hook in "$FRAMEWORK_HOOKS_DIR"/*.sh; do
19
+ # Skip orchestrator itself
20
+ if [[ "$hook" == */orchestrator.sh ]]; then
21
+ continue
22
+ fi
23
+
24
+ if [[ -f "$hook" ]]; then
25
+ hook_name=$(basename "$hook")
26
+ echo "─────────────────────────────────────────────────"
27
+ if ! bash "$hook"; then
28
+ HAS_FAILURES=true
29
+ echo "❌ Framework hook failed: $hook_name"
30
+ fi
31
+ echo ""
32
+ fi
33
+ done
34
+
35
+ # Run stack-specific hooks (if exist)
36
+ if [[ -d "$STACK_HOOKS_DIR" ]]; then
37
+ echo "🎯 Running stack-specific hooks..."
38
+ for hook in "$STACK_HOOKS_DIR"/*.sh; do
39
+ if [[ -f "$hook" ]]; then
40
+ hook_name=$(basename "$hook")
41
+ echo "─────────────────────────────────────────────────"
42
+ if ! bash "$hook"; then
43
+ HAS_FAILURES=true
44
+ echo "❌ Stack hook failed: $hook_name"
45
+ fi
46
+ echo ""
47
+ fi
48
+ done
49
+ else
50
+ echo "ℹ️ No stack-specific hooks found (optional)"
51
+ echo ""
52
+ fi
53
+
54
+ echo "═════════════════════════════════════════════════"
55
+
56
+ if [[ "$HAS_FAILURES" == "true" ]]; then
57
+ echo "❌ PRE-COMMIT VALIDATION FAILED"
58
+ echo " Fix errors above before committing"
59
+ echo " Or use: git commit --no-verify to skip"
60
+ exit 1
61
+ fi
62
+
63
+ echo "✅ ALL PRE-COMMIT VALIDATIONS PASSED"
64
+ exit 0
@@ -1,50 +1,50 @@
1
- #!/bin/bash
2
- # Scope: universal | Validates spec.md required sections
3
- # MORPH-SPEC Pre-Commit Hook: Spec Validation
4
- # Validates that spec.md files have required sections
5
-
6
- echo "🔍 Validating spec files..."
7
-
8
- # Find modified spec.md files
9
- SPEC_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep 'spec\.md$')
10
-
11
- if [ -z "$SPEC_FILES" ]; then
12
- echo "✓ No spec files modified"
13
- exit 0
14
- fi
15
-
16
- HAS_ERRORS=false
17
-
18
- for spec_file in $SPEC_FILES; do
19
- echo "Checking: $spec_file"
20
-
21
- # Required sections
22
- REQUIRED_SECTIONS=(
23
- "## 📋 Metadata"
24
- "## 🎯 Overview"
25
- "## 🏗️ Technical Design"
26
- "## ✅ Acceptance Criteria"
27
- )
28
-
29
- for section in "${REQUIRED_SECTIONS[@]}"; do
30
- if ! grep -q "$section" "$spec_file"; then
31
- echo " ❌ Missing section: $section"
32
- HAS_ERRORS=true
33
- fi
34
- done
35
-
36
- # Check if has at least one user story or requirement
37
- if ! grep -qi "user story\|requirement\|acceptance criteria" "$spec_file"; then
38
- echo " ⚠️ Warning: No user stories or requirements found"
39
- fi
40
- done
41
-
42
- if [ "$HAS_ERRORS" = true ]; then
43
- echo ""
44
- echo "❌ COMMIT BLOCKED: spec.md files are incomplete"
45
- echo " Add missing sections before committing"
46
- exit 1
47
- fi
48
-
49
- echo "✓ All spec files are valid"
50
- exit 0
1
+ #!/bin/bash
2
+ # Scope: universal | Validates spec.md required sections
3
+ # MORPH-SPEC Pre-Commit Hook: Spec Validation
4
+ # Validates that spec.md files have required sections
5
+
6
+ echo "🔍 Validating spec files..."
7
+
8
+ # Find modified spec.md files
9
+ SPEC_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep 'spec\.md$')
10
+
11
+ if [ -z "$SPEC_FILES" ]; then
12
+ echo "✓ No spec files modified"
13
+ exit 0
14
+ fi
15
+
16
+ HAS_ERRORS=false
17
+
18
+ for spec_file in $SPEC_FILES; do
19
+ echo "Checking: $spec_file"
20
+
21
+ # Required sections
22
+ REQUIRED_SECTIONS=(
23
+ "## 📋 Metadata"
24
+ "## 🎯 Overview"
25
+ "## 🏗️ Technical Design"
26
+ "## ✅ Acceptance Criteria"
27
+ )
28
+
29
+ for section in "${REQUIRED_SECTIONS[@]}"; do
30
+ if ! grep -q "$section" "$spec_file"; then
31
+ echo " ❌ Missing section: $section"
32
+ HAS_ERRORS=true
33
+ fi
34
+ done
35
+
36
+ # Check if has at least one user story or requirement
37
+ if ! grep -qi "user story\|requirement\|acceptance criteria" "$spec_file"; then
38
+ echo " ⚠️ Warning: No user stories or requirements found"
39
+ fi
40
+ done
41
+
42
+ if [ "$HAS_ERRORS" = true ]; then
43
+ echo ""
44
+ echo "❌ COMMIT BLOCKED: spec.md files are incomplete"
45
+ echo " Add missing sections before committing"
46
+ exit 1
47
+ fi
48
+
49
+ echo "✓ All spec files are valid"
50
+ exit 0
@@ -1,44 +1,44 @@
1
- #!/usr/bin/env bash
2
- # Scope: universal | Runs test suite before push
3
- # MORPH-SPEC Pre-Push Hook
4
- # Ensures all tests pass before pushing to remote
5
-
6
- echo "🧪 Running test suite before push..."
7
- echo ""
8
-
9
- # Detect project type and run appropriate tests
10
- if [[ -f *.csproj ]] || find . -maxdepth 2 -name "*.csproj" 2>/dev/null | grep -q .; then
11
- # .NET project detected
12
- echo "📦 Detected .NET project"
13
-
14
- if ! dotnet test --verbosity minimal --no-build --no-restore 2>/dev/null; then
15
- echo ""
16
- echo "❌ .NET tests failed!"
17
- echo ""
18
- echo "Fix failing tests before pushing."
19
- echo "Override with: git push --no-verify"
20
- exit 1
21
- fi
22
-
23
- elif [[ -f package.json ]]; then
24
- # Node.js project detected
25
- echo "📦 Detected Node.js project"
26
-
27
- if ! npm test 2>/dev/null; then
28
- echo ""
29
- echo "❌ Node.js tests failed!"
30
- echo ""
31
- echo "Fix failing tests before pushing."
32
- echo "Override with: git push --no-verify"
33
- exit 1
34
- fi
35
-
36
- else
37
- echo "⚠️ No recognized test framework found"
38
- echo " Skipping test execution"
39
- exit 0
40
- fi
41
-
42
- echo ""
43
- echo "✅ All tests passed - safe to push"
44
- exit 0
1
+ #!/usr/bin/env bash
2
+ # Scope: universal | Runs test suite before push
3
+ # MORPH-SPEC Pre-Push Hook
4
+ # Ensures all tests pass before pushing to remote
5
+
6
+ echo "🧪 Running test suite before push..."
7
+ echo ""
8
+
9
+ # Detect project type and run appropriate tests
10
+ if [[ -f *.csproj ]] || find . -maxdepth 2 -name "*.csproj" 2>/dev/null | grep -q .; then
11
+ # .NET project detected
12
+ echo "📦 Detected .NET project"
13
+
14
+ if ! dotnet test --verbosity minimal --no-build --no-restore 2>/dev/null; then
15
+ echo ""
16
+ echo "❌ .NET tests failed!"
17
+ echo ""
18
+ echo "Fix failing tests before pushing."
19
+ echo "Override with: git push --no-verify"
20
+ exit 1
21
+ fi
22
+
23
+ elif [[ -f package.json ]]; then
24
+ # Node.js project detected
25
+ echo "📦 Detected Node.js project"
26
+
27
+ if ! npm test 2>/dev/null; then
28
+ echo ""
29
+ echo "❌ Node.js tests failed!"
30
+ echo ""
31
+ echo "Fix failing tests before pushing."
32
+ echo "Override with: git push --no-verify"
33
+ exit 1
34
+ fi
35
+
36
+ else
37
+ echo "⚠️ No recognized test framework found"
38
+ echo " Skipping test execution"
39
+ exit 0
40
+ fi
41
+
42
+ echo ""
43
+ echo "✅ All tests passed - safe to push"
44
+ exit 0
@@ -84,7 +84,7 @@ export function getBuildSteps(stack, { cwd, frontendPath, backendPath } = {}) {
84
84
 
85
85
  if (isFrontendStack(s)) {
86
86
  const frontendDir = frontendPath ? join(cwd, frontendPath) : cwd;
87
- // node_modules guard (same fail-open as post-edit-typecheck.js): a fresh worktree before
87
+ // node_modules guard : a fresh worktree before
88
88
  // `morph-spec worktree link` has tsconfig.json (versioned) but no toolchain — running
89
89
  // `npx tsc` there fetches an unrelated "tsc" package and fails noisily. No toolchain →
90
90
  // no tsc step; the real typecheck runs wherever node_modules exists (root/CI).
@@ -16,7 +16,7 @@ const PROCESS_CITATION = [
16
16
  /\bADR[-\s]?\d+/,
17
17
  /\bFR[-\s]?\d+/,
18
18
  /\bgate\s?[1-3]\b/i,
19
- /\b(?:spec|mandate)\.md\b/i,
19
+ /\bspec\.md\b/i,
20
20
  /\bmockups?\b/i,
21
21
  ];
22
22
 
@@ -29,10 +29,8 @@ export const OUTPUT_PHASE_MAP = {
29
29
  uiComponents: 'uiux',
30
30
  uiFlows: 'uiux',
31
31
  spec: 'plan',
32
- mandate: 'plan',
33
32
  tasks: 'plan',
34
33
  decisions: 'plan',
35
- reuseMap: 'plan',
36
34
  usecases: 'plan',
37
35
  recap: 'implement',
38
36
  evidencias: 'implement',
@@ -49,10 +47,8 @@ export const FILENAME_TO_OUTPUT = {
49
47
  'components.md': 'uiComponents',
50
48
  'flows.md': 'uiFlows',
51
49
  'spec.md': 'spec',
52
- 'mandate.md': 'mandate',
53
50
  'tasks.json': 'tasks',
54
51
  'decisions.md': 'decisions',
55
- 'reuse-map.md': 'reuseMap',
56
52
  'recap.md': 'recap',
57
53
  'review-report.md': 'reviewReport',
58
54
  'evaluator-report.md': 'evaluatorReport',
@@ -65,7 +61,6 @@ export const PROTECTED_SPEC_FILES = {
65
61
  'components.md': 'uiux',
66
62
  'flows.md': 'uiux',
67
63
  'spec.md': 'plan',
68
- 'mandate.md': 'plan',
69
64
  'tasks.json': 'plan',
70
65
  };
71
66
 
@@ -1,26 +1,26 @@
1
- /**
2
- * Shared stdin reader for Claude Code hooks.
3
- *
4
- * Reads JSON payload from stdin (provided by Claude Code to hooks).
5
- * Returns parsed object or null on failure.
6
- */
7
-
8
- /**
9
- * Read and parse JSON from stdin
10
- * @returns {Promise<Object|null>} Parsed JSON or null
11
- */
12
- export function readStdin() {
13
- return new Promise((resolve) => {
14
- let input = '';
15
- process.stdin.setEncoding('utf-8');
16
- process.stdin.on('data', (chunk) => { input += chunk; });
17
- process.stdin.on('end', () => {
18
- try {
19
- resolve(JSON.parse(input || '{}'));
20
- } catch {
21
- resolve(null);
22
- }
23
- });
24
- process.stdin.on('error', () => resolve(null));
25
- });
26
- }
1
+ /**
2
+ * Shared stdin reader for Claude Code hooks.
3
+ *
4
+ * Reads JSON payload from stdin (provided by Claude Code to hooks).
5
+ * Returns parsed object or null on failure.
6
+ */
7
+
8
+ /**
9
+ * Read and parse JSON from stdin
10
+ * @returns {Promise<Object|null>} Parsed JSON or null
11
+ */
12
+ export function readStdin() {
13
+ return new Promise((resolve) => {
14
+ let input = '';
15
+ process.stdin.setEncoding('utf-8');
16
+ process.stdin.on('data', (chunk) => { input += chunk; });
17
+ process.stdin.on('end', () => {
18
+ try {
19
+ resolve(JSON.parse(input || '{}'));
20
+ } catch {
21
+ resolve(null);
22
+ }
23
+ });
24
+ process.stdin.on('error', () => resolve(null));
25
+ });
26
+ }
@@ -42,13 +42,12 @@
42
42
  "displayName": "Plan",
43
43
  "goals": [
44
44
  "Write spec.md (technical spec)",
45
- "Write mandate.md (implementation contract with stack defaults + forbidden patterns)",
46
45
  "Write tasks.json (ordered task breakdown)"
47
46
  ],
48
- "requiredOutputs": ["spec", "mandate", "tasks"],
47
+ "requiredOutputs": ["spec", "tasks"],
49
48
  "optionalOutputs": ["decisions"],
50
49
  "pausePoints": [
51
- { "id": "plan", "label": "Gate 2 — Approve spec + mandate + tasks" }
50
+ { "id": "plan", "label": "Gate 2 — Approve spec + tasks" }
52
51
  ],
53
52
  "skill": "morph-plan"
54
53
  },
@@ -59,7 +58,7 @@
59
58
  "displayName": "Implementation",
60
59
  "goals": [
61
60
  "Execute tasks in order with auto-advance between tasks",
62
- "Apply morph-eval after each task",
61
+ "Advance a task only on verify green and its doneCriteria met",
63
62
  "Maintain recap.md and execution trace"
64
63
  ],
65
64
  "requiredOutputs": ["recap"],
@@ -73,8 +72,7 @@
73
72
  "folder": "4-review",
74
73
  "displayName": "Review",
75
74
  "goals": [
76
- "Verify implementation against mandate",
77
- "Apply morph-eval at phase scope to produce dimension scores",
75
+ "Independent evaluator verdict (SHIP/FIX) with evidence-typed blockers",
78
76
  "Produce review-report.md and present Gate 3"
79
77
  ],
80
78
  "requiredOutputs": ["reviewReport"],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "backend",
3
3
  "version": "1.1.0",
4
- "description": "Backend-focused rubric. Higher weight on architecture, security, and package health. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0.",
4
+ "description": "Backend-focused rubric. Higher weight on architecture, security, and package health. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.25,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "default",
3
3
  "version": "1.1.0",
4
- "description": "Default rubric for general-purpose projects. Balanced weights across all categories. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0 (the LLM eval rubrics live in framework/evals/rubrics/*.md).",
4
+ "description": "Default rubric for general-purpose projects. Balanced weights across all categories. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.30,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "frontend",
3
3
  "version": "1.1.0",
4
- "description": "Frontend-focused rubric. Higher weight on design system compliance and UI quality. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0.",
4
+ "description": "Frontend-focused rubric. Higher weight on design system compliance and UI quality. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.25,
@@ -15,7 +15,7 @@ stacks:
15
15
 
16
16
  1. **Proposal** — Problem statement + scope + risks (`0-proposal/proposal.md`). No acceptance criteria: verifiable behaviour lives in the use cases.
17
17
  2. **UI/UX Design** (optional, UI-heavy) — Design system + mockups + flows. The phase id is `uiux` (that is the gate name); the folder is `1-design/`
18
- 3. **Plan** — Use cases first, then technical spec + mandate + tasks (`2-plan/usecases/UC-{nn}-{slug}.md`, `spec.md`, `mandate.md`, `tasks.json`). Each use case post-condition must be observable in a test and reaches the task's `doneCriteria` verbatim.
18
+ 3. **Plan** — Use cases first, then technical spec + tasks (`2-plan/usecases/UC-{nn}-{slug}.md`, `spec.md`, `tasks.json`). Each use case post-condition must be observable in a test and reaches the task's `doneCriteria` verbatim.
19
19
  4. **Implement** — Code + recap (`3-implement/recap.md`)
20
20
  5. **Review** — Review report + Gate 3 (`4-review/review-report.md`)
21
21
 
@@ -72,7 +72,7 @@ All outputs go in `.morph/features/{feature}/`:
72
72
  |-------|------|
73
73
  | Proposal | `0-proposal/proposal.md`, `stack-scan.md` |
74
74
  | Design (optional) | `1-design/design-system.md`, `mockups.md`, `components.md`, `flows.md` |
75
- | Plan | `2-plan/spec.md`, `mandate.md`, `tasks.json`, `decisions.md` |
75
+ | Plan | `2-plan/usecases/`, `spec.md`, `tasks.json`, `decisions.md` |
76
76
  | Implement | `3-implement/recap.md` + source code; `3-implement/evidencias/{taskId}.md` (condicional — task cujo `doneCriteria` julga saída de LLM) |
77
77
  | Review | `4-review/review-report.md` |
78
78
 
@@ -206,8 +206,8 @@ here would put a second, staler copy in permanent context:
206
206
 
207
207
  | Concern | Where it actually lives |
208
208
  |---------|-------------------------|
209
- | How many tests to write | The test budget copied into the feature's `mandate.md`: one test per postcondition, same-behavior cases in one table, no test that only pins text |
210
- | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e), then the `morph-eval` skill for the 0-10 score |
209
+ | How many tests to write | The test budget in `morph-plan` §5: one test per postcondition, same-behavior cases in one table, no test that only pins text |
210
+ | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e) green, and each `doneCriteria` with the test or `file:line` that proves it |
211
211
  | Parallel dispatch | `morph-spec dag {feature}` decides sequential vs parallel; execution and isolation rules are in `morph-apply` §2/§3b |
212
212
  | Closing the phase / opening the PR | `morph-review` for Gate 3, then `morph-spec finish {feature} --pr\|--merge` |
213
213
 
@@ -215,7 +215,7 @@ here would put a second, staler copy in permanent context:
215
215
 
216
216
  ## Scope Escalation
217
217
 
218
- The plan contract frozen at Gate 2 — `spec.md`, `mandate.md`, and the immutable `tasks.json`
218
+ The plan contract frozen at Gate 2 — `spec.md` and the immutable `tasks.json`
219
219
  fields listed in `morph-task-tracking.md` — is enforced by the `protect-spec-files` hook. When a
220
220
  task turns out to be bigger than estimated, three different situations resolve three different ways:
221
221
 
@@ -225,7 +225,7 @@ task turns out to be bigger than estimated, three different situations resolve t
225
225
  | **Error of fact**: the spec asserts something about the code that the code contradicts, with no scope change | Append an `## Errata` block at the END of the file. Body untouched, append-only, accepted by `protect-spec-files` **without revoking the gate** — freezing the CONTRACT is not freezing an ERROR OF FACT (MORPH.md §3) |
226
226
  | **The scope itself changed**: the contract no longer describes the work | `morph-spec unapprove {feature} plan --reason "..."`, amend the plan, then re-approve. There is no shortcut around the gate for this one |
227
227
 
228
- Scope ambiguity the `mandate.md` does not cover is **not** an escalation: record it in
228
+ Scope ambiguity the plan does not cover is **not** an escalation: record it in
229
229
  `decisions.md`, resolve it the conservative way, and keep going — only pause if it is genuinely
230
230
  blocking (`morph-implement` §5).
231
231