@polymorphism-tech/morph-spec 2.4.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +158 -26
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +8 -0
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/{checklists → level-0-meta}/morph-checklist.md +117 -117
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
- package/content/.claude/skills/level-3-technologies/README.md +7 -0
- package/content/.claude/skills/level-4-patterns/README.md +7 -0
- package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
- package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +742 -358
- package/content/.morph/config/config.template.json +33 -0
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -158
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
- package/content/.morph/examples/scheduled-reports/spec.md +267 -267
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +158 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -220
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/clarify-questions.md +159 -159
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -74
- package/content/.morph/templates/contracts/Entities.cs +25 -25
- package/content/.morph/templates/contracts/Queries.cs +74 -74
- package/content/.morph/templates/contracts/README.md +74 -74
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -426
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/templates.md +418 -418
- package/package.json +1 -1
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +83 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +34 -6
- package/src/commands/detect.js +104 -104
- package/src/commands/generate-context.js +40 -0
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/context-generator.js +513 -0
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +65 -13
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +9 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
- /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
- /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
- /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# MORPH-SPEC Master Pre-Commit Hook
|
|
3
|
-
# Runs all validation hooks in sequence
|
|
4
|
-
|
|
5
|
-
echo "╔════════════════════════════════════════════════╗"
|
|
6
|
-
echo "║ MORPH-SPEC PRE-COMMIT VALIDATION ║"
|
|
7
|
-
echo "╚════════════════════════════════════════════════╝"
|
|
8
|
-
echo ""
|
|
9
|
-
|
|
10
|
-
HOOKS_DIR="$(dirname "$0")"
|
|
11
|
-
|
|
12
|
-
# Run all hooks in order
|
|
13
|
-
HOOKS=(
|
|
14
|
-
"pre-commit-agents.sh"
|
|
15
|
-
"pre-commit-costs.sh"
|
|
16
|
-
"pre-commit-specs.sh"
|
|
17
|
-
"pre-commit-tests.sh"
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
HAS_FAILURES=false
|
|
21
|
-
|
|
22
|
-
for hook in "${HOOKS[@]}"; do
|
|
23
|
-
HOOK_PATH="$HOOKS_DIR/$hook"
|
|
24
|
-
|
|
25
|
-
if [ ! -f "$HOOK_PATH" ]; then
|
|
26
|
-
echo "⚠️ Hook not found: $hook (skipping)"
|
|
27
|
-
continue
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
|
-
echo "─────────────────────────────────────────────────"
|
|
31
|
-
if ! bash "$HOOK_PATH"; then
|
|
32
|
-
HAS_FAILURES=true
|
|
33
|
-
echo "❌ Hook failed: $hook"
|
|
34
|
-
fi
|
|
35
|
-
echo ""
|
|
36
|
-
done
|
|
37
|
-
|
|
38
|
-
echo "═════════════════════════════════════════════════"
|
|
39
|
-
|
|
40
|
-
if [ "$HAS_FAILURES" = true ]; then
|
|
41
|
-
echo "❌ PRE-COMMIT VALIDATION FAILED"
|
|
42
|
-
echo " Fix errors above before committing"
|
|
43
|
-
echo " Or use: git commit --no-verify to skip"
|
|
44
|
-
exit 1
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
echo "✅ ALL PRE-COMMIT VALIDATIONS PASSED"
|
|
48
|
-
exit 0
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MORPH-SPEC Master Pre-Commit Hook
|
|
3
|
+
# Runs all validation hooks in sequence
|
|
4
|
+
|
|
5
|
+
echo "╔════════════════════════════════════════════════╗"
|
|
6
|
+
echo "║ MORPH-SPEC PRE-COMMIT VALIDATION ║"
|
|
7
|
+
echo "╚════════════════════════════════════════════════╝"
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
HOOKS_DIR="$(dirname "$0")"
|
|
11
|
+
|
|
12
|
+
# Run all hooks in order
|
|
13
|
+
HOOKS=(
|
|
14
|
+
"pre-commit-agents.sh"
|
|
15
|
+
"pre-commit-costs.sh"
|
|
16
|
+
"pre-commit-specs.sh"
|
|
17
|
+
"pre-commit-tests.sh"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
HAS_FAILURES=false
|
|
21
|
+
|
|
22
|
+
for hook in "${HOOKS[@]}"; do
|
|
23
|
+
HOOK_PATH="$HOOKS_DIR/$hook"
|
|
24
|
+
|
|
25
|
+
if [ ! -f "$HOOK_PATH" ]; then
|
|
26
|
+
echo "⚠️ Hook not found: $hook (skipping)"
|
|
27
|
+
continue
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "─────────────────────────────────────────────────"
|
|
31
|
+
if ! bash "$HOOK_PATH"; then
|
|
32
|
+
HAS_FAILURES=true
|
|
33
|
+
echo "❌ Hook failed: $hook"
|
|
34
|
+
fi
|
|
35
|
+
echo ""
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
echo "═════════════════════════════════════════════════"
|
|
39
|
+
|
|
40
|
+
if [ "$HAS_FAILURES" = true ]; then
|
|
41
|
+
echo "❌ PRE-COMMIT VALIDATION FAILED"
|
|
42
|
+
echo " Fix errors above before committing"
|
|
43
|
+
echo " Or use: git commit --no-verify to skip"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo "✅ ALL PRE-COMMIT VALIDATIONS PASSED"
|
|
48
|
+
exit 0
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# MORPH-SPEC Pre-Commit Hook: Spec Validation
|
|
3
|
-
# Validates that spec.md files have required sections
|
|
4
|
-
|
|
5
|
-
echo "🔍 Validating spec files..."
|
|
6
|
-
|
|
7
|
-
# Find modified spec.md files
|
|
8
|
-
SPEC_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep 'spec\.md$')
|
|
9
|
-
|
|
10
|
-
if [ -z "$SPEC_FILES" ]; then
|
|
11
|
-
echo "✓ No spec files modified"
|
|
12
|
-
exit 0
|
|
13
|
-
fi
|
|
14
|
-
|
|
15
|
-
HAS_ERRORS=false
|
|
16
|
-
|
|
17
|
-
for spec_file in $SPEC_FILES; do
|
|
18
|
-
echo "Checking: $spec_file"
|
|
19
|
-
|
|
20
|
-
# Required sections
|
|
21
|
-
REQUIRED_SECTIONS=(
|
|
22
|
-
"## 📋 Metadata"
|
|
23
|
-
"## 🎯 Overview"
|
|
24
|
-
"## 🏗️ Technical Design"
|
|
25
|
-
"## ✅ Acceptance Criteria"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
for section in "${REQUIRED_SECTIONS[@]}"; do
|
|
29
|
-
if ! grep -q "$section" "$spec_file"; then
|
|
30
|
-
echo " ❌ Missing section: $section"
|
|
31
|
-
HAS_ERRORS=true
|
|
32
|
-
fi
|
|
33
|
-
done
|
|
34
|
-
|
|
35
|
-
# Check if has at least one user story or requirement
|
|
36
|
-
if ! grep -qi "user story\|requirement\|acceptance criteria" "$spec_file"; then
|
|
37
|
-
echo " ⚠️ Warning: No user stories or requirements found"
|
|
38
|
-
fi
|
|
39
|
-
done
|
|
40
|
-
|
|
41
|
-
if [ "$HAS_ERRORS" = true ]; then
|
|
42
|
-
echo ""
|
|
43
|
-
echo "❌ COMMIT BLOCKED: spec.md files are incomplete"
|
|
44
|
-
echo " Add missing sections before committing"
|
|
45
|
-
exit 1
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
echo "✓ All spec files are valid"
|
|
49
|
-
exit 0
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MORPH-SPEC Pre-Commit Hook: Spec Validation
|
|
3
|
+
# Validates that spec.md files have required sections
|
|
4
|
+
|
|
5
|
+
echo "🔍 Validating spec files..."
|
|
6
|
+
|
|
7
|
+
# Find modified spec.md files
|
|
8
|
+
SPEC_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep 'spec\.md$')
|
|
9
|
+
|
|
10
|
+
if [ -z "$SPEC_FILES" ]; then
|
|
11
|
+
echo "✓ No spec files modified"
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
HAS_ERRORS=false
|
|
16
|
+
|
|
17
|
+
for spec_file in $SPEC_FILES; do
|
|
18
|
+
echo "Checking: $spec_file"
|
|
19
|
+
|
|
20
|
+
# Required sections
|
|
21
|
+
REQUIRED_SECTIONS=(
|
|
22
|
+
"## 📋 Metadata"
|
|
23
|
+
"## 🎯 Overview"
|
|
24
|
+
"## 🏗️ Technical Design"
|
|
25
|
+
"## ✅ Acceptance Criteria"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
for section in "${REQUIRED_SECTIONS[@]}"; do
|
|
29
|
+
if ! grep -q "$section" "$spec_file"; then
|
|
30
|
+
echo " ❌ Missing section: $section"
|
|
31
|
+
HAS_ERRORS=true
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
# Check if has at least one user story or requirement
|
|
36
|
+
if ! grep -qi "user story\|requirement\|acceptance criteria" "$spec_file"; then
|
|
37
|
+
echo " ⚠️ Warning: No user stories or requirements found"
|
|
38
|
+
fi
|
|
39
|
+
done
|
|
40
|
+
|
|
41
|
+
if [ "$HAS_ERRORS" = true ]; then
|
|
42
|
+
echo ""
|
|
43
|
+
echo "❌ COMMIT BLOCKED: spec.md files are incomplete"
|
|
44
|
+
echo " Add missing sections before committing"
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
echo "✓ All spec files are valid"
|
|
49
|
+
exit 0
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# MORPH-SPEC Pre-Commit Hook: Test Coverage
|
|
3
|
-
# Ensures new code has corresponding tests
|
|
4
|
-
|
|
5
|
-
echo "🧪 Checking test coverage..."
|
|
6
|
-
|
|
7
|
-
# Find modified C# files (excluding tests)
|
|
8
|
-
CS_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.cs$' | grep -v 'Tests\|Test\.cs$')
|
|
9
|
-
|
|
10
|
-
if [ -z "$CS_FILES" ]; then
|
|
11
|
-
echo "✓ No production code modified"
|
|
12
|
-
exit 0
|
|
13
|
-
fi
|
|
14
|
-
|
|
15
|
-
MISSING_TESTS=false
|
|
16
|
-
|
|
17
|
-
for cs_file in $CS_FILES; do
|
|
18
|
-
# Extract class name
|
|
19
|
-
class_name=$(basename "$cs_file" .cs)
|
|
20
|
-
|
|
21
|
-
# Look for corresponding test file
|
|
22
|
-
test_patterns=(
|
|
23
|
-
"*/${class_name}Tests.cs"
|
|
24
|
-
"*/${class_name}Test.cs"
|
|
25
|
-
"*/Test${class_name}.cs"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
FOUND_TEST=false
|
|
29
|
-
for pattern in "${test_patterns[@]}"; do
|
|
30
|
-
if find . -path "$pattern" 2>/dev/null | grep -q .; then
|
|
31
|
-
FOUND_TEST=true
|
|
32
|
-
break
|
|
33
|
-
fi
|
|
34
|
-
done
|
|
35
|
-
|
|
36
|
-
if [ "$FOUND_TEST" = false ]; then
|
|
37
|
-
# Check if it's a trivial file (DTO, model, etc.)
|
|
38
|
-
if grep -qi 'record\|DTO\|Model\|Entity' "$cs_file" && ! grep -qi 'class.*{.*public.*{' "$cs_file"; then
|
|
39
|
-
echo " ℹ️ Skipping trivial file: $cs_file"
|
|
40
|
-
continue
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
echo " ⚠️ No test found for: $cs_file"
|
|
44
|
-
MISSING_TESTS=true
|
|
45
|
-
else
|
|
46
|
-
echo " ✓ Test found for: $cs_file"
|
|
47
|
-
fi
|
|
48
|
-
done
|
|
49
|
-
|
|
50
|
-
if [ "$MISSING_TESTS" = true ]; then
|
|
51
|
-
echo ""
|
|
52
|
-
echo "⚠️ WARNING: Some files don't have tests"
|
|
53
|
-
echo " Consider adding tests before committing"
|
|
54
|
-
echo " Override with: git commit --no-verify"
|
|
55
|
-
# Don't block, just warn
|
|
56
|
-
exit 0
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
echo "✓ Test coverage looks good"
|
|
60
|
-
exit 0
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MORPH-SPEC Pre-Commit Hook: Test Coverage
|
|
3
|
+
# Ensures new code has corresponding tests
|
|
4
|
+
|
|
5
|
+
echo "🧪 Checking test coverage..."
|
|
6
|
+
|
|
7
|
+
# Find modified C# files (excluding tests)
|
|
8
|
+
CS_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.cs$' | grep -v 'Tests\|Test\.cs$')
|
|
9
|
+
|
|
10
|
+
if [ -z "$CS_FILES" ]; then
|
|
11
|
+
echo "✓ No production code modified"
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
MISSING_TESTS=false
|
|
16
|
+
|
|
17
|
+
for cs_file in $CS_FILES; do
|
|
18
|
+
# Extract class name
|
|
19
|
+
class_name=$(basename "$cs_file" .cs)
|
|
20
|
+
|
|
21
|
+
# Look for corresponding test file
|
|
22
|
+
test_patterns=(
|
|
23
|
+
"*/${class_name}Tests.cs"
|
|
24
|
+
"*/${class_name}Test.cs"
|
|
25
|
+
"*/Test${class_name}.cs"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
FOUND_TEST=false
|
|
29
|
+
for pattern in "${test_patterns[@]}"; do
|
|
30
|
+
if find . -path "$pattern" 2>/dev/null | grep -q .; then
|
|
31
|
+
FOUND_TEST=true
|
|
32
|
+
break
|
|
33
|
+
fi
|
|
34
|
+
done
|
|
35
|
+
|
|
36
|
+
if [ "$FOUND_TEST" = false ]; then
|
|
37
|
+
# Check if it's a trivial file (DTO, model, etc.)
|
|
38
|
+
if grep -qi 'record\|DTO\|Model\|Entity' "$cs_file" && ! grep -qi 'class.*{.*public.*{' "$cs_file"; then
|
|
39
|
+
echo " ℹ️ Skipping trivial file: $cs_file"
|
|
40
|
+
continue
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
echo " ⚠️ No test found for: $cs_file"
|
|
44
|
+
MISSING_TESTS=true
|
|
45
|
+
else
|
|
46
|
+
echo " ✓ Test found for: $cs_file"
|
|
47
|
+
fi
|
|
48
|
+
done
|
|
49
|
+
|
|
50
|
+
if [ "$MISSING_TESTS" = true ]; then
|
|
51
|
+
echo ""
|
|
52
|
+
echo "⚠️ WARNING: Some files don't have tests"
|
|
53
|
+
echo " Consider adding tests before committing"
|
|
54
|
+
echo " Override with: git commit --no-verify"
|
|
55
|
+
# Don't block, just warn
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
echo "✓ Test coverage looks good"
|
|
60
|
+
exit 0
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TaskCompleted Hook - Claude Code Agent Teams
|
|
5
|
+
*
|
|
6
|
+
* Triggered when a task is marked as completed.
|
|
7
|
+
* Validates the task deliverables before allowing the task to be marked done.
|
|
8
|
+
*
|
|
9
|
+
* Usage (from Claude Code hooks):
|
|
10
|
+
* task-completed.js <feature-name> <task-id> [--dry-run] [--verbose]
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 - All validators passed
|
|
14
|
+
* 1 - Validation failed and blocked
|
|
15
|
+
* 2 - Configuration error
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { executeHook, formatHookResults } from '../../../src/lib/hook-executor.js';
|
|
19
|
+
import { fileURLToPath } from 'url';
|
|
20
|
+
import { dirname, join } from 'path';
|
|
21
|
+
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = dirname(__filename);
|
|
24
|
+
|
|
25
|
+
// Get project root (3 levels up from hooks dir)
|
|
26
|
+
const projectPath = join(__dirname, '../../..');
|
|
27
|
+
|
|
28
|
+
async function main() {
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
|
|
31
|
+
if (args.length < 2) {
|
|
32
|
+
console.error('Usage: task-completed.js <feature-name> <task-id> [--dry-run] [--verbose]');
|
|
33
|
+
process.exit(2);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const featureName = args[0];
|
|
37
|
+
const taskId = args[1];
|
|
38
|
+
const dryRun = args.includes('--dry-run');
|
|
39
|
+
const verbose = args.includes('--verbose');
|
|
40
|
+
|
|
41
|
+
console.log('🔔 TaskCompleted Hook Triggered');
|
|
42
|
+
console.log(` Feature: ${featureName}`);
|
|
43
|
+
console.log(` Task: ${taskId}`);
|
|
44
|
+
console.log(` Event: Task marked complete, validating deliverables...\n`);
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const results = await executeHook(projectPath, featureName, 'TaskCompleted', {
|
|
48
|
+
dryRun,
|
|
49
|
+
verbose
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const output = formatHookResults(results, 'TaskCompleted');
|
|
53
|
+
console.log(output);
|
|
54
|
+
|
|
55
|
+
if (results.blocked) {
|
|
56
|
+
console.log('\n💡 TIP: Fix the errors above before the task can be marked complete.');
|
|
57
|
+
console.log(` Run: morph-spec task done ${featureName} ${taskId} --skip-validation`);
|
|
58
|
+
console.log(' (Not recommended - only use if you know what you\'re doing)');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log('\n✅ Task deliverables validated successfully.');
|
|
63
|
+
process.exit(0);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
console.error(`\n❌ Hook execution error: ${err.message}`);
|
|
66
|
+
if (verbose) {
|
|
67
|
+
console.error(err.stack);
|
|
68
|
+
}
|
|
69
|
+
process.exit(2);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
main();
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TeammateIdle Hook - Claude Code Agent Teams
|
|
5
|
+
*
|
|
6
|
+
* Triggered when a teammate is idle and waiting for next instructions.
|
|
7
|
+
* Validates the teammate's recent work before allowing them to proceed.
|
|
8
|
+
*
|
|
9
|
+
* Usage (from Claude Code hooks):
|
|
10
|
+
* teammate-idle.js <feature-name> [--dry-run] [--verbose]
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 - All validators passed
|
|
14
|
+
* 1 - Validation failed and blocked
|
|
15
|
+
* 2 - Configuration error
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { executeHook, formatHookResults } from '../../../src/lib/hook-executor.js';
|
|
19
|
+
import { fileURLToPath } from 'url';
|
|
20
|
+
import { dirname, join } from 'path';
|
|
21
|
+
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = dirname(__filename);
|
|
24
|
+
|
|
25
|
+
// Get project root (3 levels up from hooks dir)
|
|
26
|
+
const projectPath = join(__dirname, '../../..');
|
|
27
|
+
|
|
28
|
+
async function main() {
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
|
|
31
|
+
if (args.length === 0) {
|
|
32
|
+
console.error('Usage: teammate-idle.js <feature-name> [--dry-run] [--verbose]');
|
|
33
|
+
process.exit(2);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const featureName = args[0];
|
|
37
|
+
const dryRun = args.includes('--dry-run');
|
|
38
|
+
const verbose = args.includes('--verbose');
|
|
39
|
+
|
|
40
|
+
console.log('🔔 TeammateIdle Hook Triggered');
|
|
41
|
+
console.log(` Feature: ${featureName}`);
|
|
42
|
+
console.log(` Event: Teammate is idle, validating recent work...\n`);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const results = await executeHook(projectPath, featureName, 'TeammateIdle', {
|
|
46
|
+
dryRun,
|
|
47
|
+
verbose
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const output = formatHookResults(results, 'TeammateIdle');
|
|
51
|
+
console.log(output);
|
|
52
|
+
|
|
53
|
+
if (results.blocked) {
|
|
54
|
+
console.log('\n💡 TIP: Fix the errors above before the teammate can proceed.');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
process.exit(0);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error(`\n❌ Hook execution error: ${err.message}`);
|
|
61
|
+
if (verbose) {
|
|
62
|
+
console.error(err.stack);
|
|
63
|
+
}
|
|
64
|
+
process.exit(2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
main();
|