@polymorphism-tech/morph-spec 8.28.0 → 8.31.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 +6 -1
- package/README.md +13 -2
- package/bin/morph-spec.js +48 -0
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +2 -0
- package/framework/MORPH.md +2 -1
- package/framework/agents.json +20 -9
- package/framework/commands/create-umbraco-lp.md +1 -1
- package/framework/commands/morph-status.md +1 -1
- package/framework/docs/CLI.md +18 -0
- package/framework/evals/rubrics/code-quality.md +17 -0
- package/framework/evals/rubrics/condensed.md +3 -1
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/phase-utils.js +2 -0
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/mcp/registry.json +97 -11
- package/framework/rubrics/backend.json +2 -2
- package/framework/rubrics/default.json +2 -2
- package/framework/rubrics/frontend.json +2 -2
- package/framework/schemas/tasks.schema.json +25 -0
- package/framework/skills/core/create-umbraco-lp/SKILL.md +13 -2
- package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +598 -0
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +92 -7
- package/framework/skills/core/morph-apply/SKILL.md +12 -3
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
- package/framework/skills/core/morph-implement/SKILL.md +12 -2
- package/framework/skills/core/morph-plan/SKILL.md +45 -3
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +11 -3
- package/framework/skills/core/morph-stack-scan/SKILL.md +13 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +1 -1
- package/framework/standards/PROVENANCE.json +41 -0
- package/framework/standards/STANDARDS.json +218 -7
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +231 -231
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/standards/frontend/design-system/ai-image-generation.md +43 -0
- package/framework/standards/frontend/design-system/ai-video-generation.md +113 -0
- package/framework/standards/frontend/design-system/premium-finish.md +160 -0
- package/framework/standards/frontend/gsap/gsap-core.md +1 -1
- package/framework/standards/frontend/gsap/gsap-plugins.md +1 -1
- package/framework/standards/frontend/gsap/gsap-scrolltrigger.md +3 -1
- package/framework/standards/frontend/nextjs/motion-patterns.md +3 -1
- package/framework/standards/frontend/scroll-driven/frame-scrub.md +287 -0
- package/framework/standards/frontend/scroll-driven/scroll-components.md +256 -0
- package/framework/standards/frontend/scroll-driven/smooth-scroll.md +148 -0
- package/framework/standards/frontend/seo/meta-schema-audit.md +134 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/context/ARCHITECTURE.md +20 -0
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/graph/affected.js +89 -0
- package/src/commands/graph/build.js +94 -0
- package/src/commands/graph/explain.js +96 -0
- package/src/commands/graph/status.js +93 -0
- package/src/commands/index.js +13 -13
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +11 -0
- package/src/core/paths/output-schema.js +7 -0
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +45 -4
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/graph/god-nodes.js +75 -0
- package/src/lib/graph/graph-health.js +61 -0
- package/src/lib/graph/graph-loader.js +86 -0
- package/src/lib/graph/graphify-runtime.js +100 -0
- package/src/lib/graph/graphifyignore.js +86 -0
- package/src/lib/graph/sanitize.js +280 -0
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/tasks-json-parser.js +26 -0
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/reuse/index.js +10 -0
- package/src/lib/validators/reuse/reuse-validator.js +324 -0
- package/src/lib/validators/reuse/symbol-scanner.js +144 -0
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +40 -1
- package/src/scripts/setup-infra.js +60 -1
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +40 -0
- package/src/utils/skills-installer.js +187 -187
|
@@ -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
|
|
@@ -32,6 +32,7 @@ export const OUTPUT_PHASE_MAP = {
|
|
|
32
32
|
mandate: 'plan',
|
|
33
33
|
tasks: 'plan',
|
|
34
34
|
decisions: 'plan',
|
|
35
|
+
reuseMap: 'plan',
|
|
35
36
|
usecases: 'plan',
|
|
36
37
|
recap: 'implement',
|
|
37
38
|
reviewReport: 'review',
|
|
@@ -50,6 +51,7 @@ export const FILENAME_TO_OUTPUT = {
|
|
|
50
51
|
'mandate.md': 'mandate',
|
|
51
52
|
'tasks.json': 'tasks',
|
|
52
53
|
'decisions.md': 'decisions',
|
|
54
|
+
'reuse-map.md': 'reuseMap',
|
|
53
55
|
'recap.md': 'recap',
|
|
54
56
|
'review-report.md': 'reviewReport',
|
|
55
57
|
'evaluator-report.md': 'evaluatorReport',
|
|
@@ -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
|
+
}
|
|
@@ -176,15 +176,15 @@
|
|
|
176
176
|
"testCall": "Call get_configuration_status to verify API key and server health",
|
|
177
177
|
"testParams": {},
|
|
178
178
|
"successIndicator": "Returns status with valid API key configured",
|
|
179
|
-
"failureHint": "Gemini Image MCP not responding.
|
|
179
|
+
"failureHint": "Gemini Image MCP not responding. Check that GEMINI_API_KEY is set in the MCP env config and that MORPH_HUB points at a built morph-HUB checkout."
|
|
180
180
|
},
|
|
181
181
|
"install": {
|
|
182
182
|
"autoInstall": false,
|
|
183
183
|
"transport": "stdio",
|
|
184
184
|
"config": {
|
|
185
185
|
"type": "stdio",
|
|
186
|
-
"command": "
|
|
187
|
-
"args": ["/
|
|
186
|
+
"command": "node",
|
|
187
|
+
"args": ["${MORPH_HUB}/mcps/gemini-image/dist/index.js"]
|
|
188
188
|
},
|
|
189
189
|
"credentials": [
|
|
190
190
|
{
|
|
@@ -194,19 +194,105 @@
|
|
|
194
194
|
"helpUrl": "https://aistudio.google.com/apikey"
|
|
195
195
|
}
|
|
196
196
|
],
|
|
197
|
-
"prerequisites": [
|
|
197
|
+
"prerequisites": [
|
|
198
|
+
"Google AI Studio API key",
|
|
199
|
+
"Local morph-HUB checkout with mcps/gemini-image built, exposed via the MORPH_HUB env var"
|
|
200
|
+
],
|
|
198
201
|
"stackRelevance": ["nextjs", "next"],
|
|
199
|
-
"warnings": [
|
|
200
|
-
|
|
202
|
+
"warnings": [
|
|
203
|
+
"Internal Polymorphism MCP, not published to npm. The public gemini-image-mcp package was unpublished in 2025-04, so npx installs no longer work.",
|
|
204
|
+
"Requires GEMINI_API_KEY environment variable. Image generation costs apply per Google AI pricing."
|
|
205
|
+
],
|
|
206
|
+
"setupGuide": "1. Get an API key at https://aistudio.google.com/apikey\n2. Build the MCP: cd $MORPH_HUB/mcps/gemini-image && npm install && npm run build\n3. Run: claude mcp add gemini-image-mcp -e GEMINI_API_KEY=<key> -- node $MORPH_HUB/mcps/gemini-image/dist/index.js\n4. Verify with get_configuration_status"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"seedance": {
|
|
210
|
+
"phases": ["uiux", "implement"],
|
|
211
|
+
"tools": ["generate_video", "generate_loop_video", "get_video", "list_videos"],
|
|
212
|
+
"detection": "mcpServers includes seedance",
|
|
213
|
+
"fallback": "Use client-provided footage or a static poster image; canvas frame-scrub works from any frame sequence, AI-generated or not",
|
|
214
|
+
"usage": "AI video generation for scroll-driven heroes and ambient backgrounds. generate_video with endImage produces the directional footage that frame-scrub needs (start frame differs from end frame); generate_loop_video is only for seamless ambient loops",
|
|
215
|
+
"healthCheck": {
|
|
216
|
+
"toolPattern": "seedance",
|
|
217
|
+
"testCall": "Call list_videos with limit 1 to verify the server responds (reads local history, spends no credits)",
|
|
218
|
+
"testParams": {
|
|
219
|
+
"limit": 1
|
|
220
|
+
},
|
|
221
|
+
"successIndicator": "Returns the local job history, or 'No videos in history yet'",
|
|
222
|
+
"failureHint": "Seedance MCP not responding. Check that REPLICATE_API_TOKEN is set in the MCP env config and that MORPH_HUB points at a built morph-HUB checkout."
|
|
223
|
+
},
|
|
224
|
+
"install": {
|
|
225
|
+
"autoInstall": false,
|
|
226
|
+
"transport": "stdio",
|
|
227
|
+
"config": {
|
|
228
|
+
"type": "stdio",
|
|
229
|
+
"command": "node",
|
|
230
|
+
"args": ["${MORPH_HUB}/mcps/seedance/dist/index.js"]
|
|
231
|
+
},
|
|
232
|
+
"credentials": [
|
|
233
|
+
{
|
|
234
|
+
"name": "Replicate API Token",
|
|
235
|
+
"envVar": "REPLICATE_API_TOKEN",
|
|
236
|
+
"secret": true,
|
|
237
|
+
"helpUrl": "https://replicate.com/account/api-tokens"
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
"prerequisites": [
|
|
241
|
+
"Replicate account with billing enabled",
|
|
242
|
+
"Local morph-HUB checkout with mcps/seedance built, exposed via the MORPH_HUB env var",
|
|
243
|
+
"ffmpeg on PATH to extract frames for scroll-scrubbing"
|
|
244
|
+
],
|
|
245
|
+
"stackRelevance": ["next", "react", "vite", "astro"],
|
|
246
|
+
"warnings": [
|
|
247
|
+
"Internal Polymorphism MCP, not published to npm. Requires a local morph-HUB checkout.",
|
|
248
|
+
"Paid per generation. Draft at fast/480p/4s first, render 1080p only after the take is approved.",
|
|
249
|
+
"Generation is stochastic and needs a human approval gate. Do not wire it into an unattended phase."
|
|
250
|
+
],
|
|
251
|
+
"setupGuide": "1. Get a token at https://replicate.com/account/api-tokens\n2. Build the MCP: cd $MORPH_HUB/mcps/seedance && npm install && npm run build\n3. Run: claude mcp add seedance -e REPLICATE_API_TOKEN=<token> -- node $MORPH_HUB/mcps/seedance/dist/index.js\n4. Verify with list_videos (reads local history, spends no credits)"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"graphify": {
|
|
255
|
+
"phases": ["proposal", "plan", "implement", "review"],
|
|
256
|
+
"tools": ["query_graph", "get_node", "get_neighbors", "get_community", "god_nodes", "graph_stats", "shortest_path", "list_prs", "get_pr_impact", "triage_prs"],
|
|
257
|
+
"detection": "graphify-out/graph.json exists in the project root (written by morph-spec graph build, or by the graphify post-commit hook)",
|
|
258
|
+
"fallback": "Comportamento atual: Grep/Glob/Read. O grafo é um subconjunto estrito do grep — no eval não encontrou um único arquivo que o grep perderia — então cair para grep não perde recall, só devolve mais ruído",
|
|
259
|
+
"usage": "Blast radius, vizinhança de símbolo e god nodes sem gastar token de leitura. PREFIRA `morph-spec graph explain|affected`, que aplica o saneamento da ADR-003 (coalesce de stub, classificação de órfão) que este servidor NÃO aplica — em C# o grafo cru produz falso negativo silencioso. O MCP serve para exploração interativa e para consulta cross-repo: as 10 tools aceitam project_path, então uma instância serve vários repositórios",
|
|
260
|
+
"healthCheck": {
|
|
261
|
+
"toolPattern": "graphify",
|
|
262
|
+
"testCall": "Call graph_stats with no arguments (uses the current project)",
|
|
263
|
+
"testParams": {},
|
|
264
|
+
"successIndicator": "Returns node and edge counts for the project graph",
|
|
265
|
+
"failureHint": "graphify-mcp não respondeu. Confirme com `graphify --version` (pinado: 0.9.50) e com `morph-spec graph status`. Se o graph.json não existir, rode `morph-spec graph build` — sem grafo o servidor não tem o que servir."
|
|
266
|
+
},
|
|
267
|
+
"install": {
|
|
268
|
+
"autoInstall": false,
|
|
269
|
+
"transport": "stdio",
|
|
270
|
+
"config": {
|
|
271
|
+
"type": "stdio",
|
|
272
|
+
"command": "graphify-mcp",
|
|
273
|
+
"args": []
|
|
274
|
+
},
|
|
275
|
+
"credentials": [],
|
|
276
|
+
"prerequisites": [
|
|
277
|
+
"graphify 0.9.50 instalado (o step 18b do setup-infra faz isso via uv/pipx/pip)",
|
|
278
|
+
"graphify-out/graph.json gerado — morph-spec graph build"
|
|
279
|
+
],
|
|
280
|
+
"stackRelevance": ["*"],
|
|
281
|
+
"warnings": [
|
|
282
|
+
"O binário é `graphify-mcp`. `python -m graphify.serve`, que é o comando do README oficial, FALHA com `uv tool install`: o pacote vive num venv isolado e o Python do sistema não o enxerga.",
|
|
283
|
+
"Quem instala e pina o graphify é o step 18b do setup-infra, não este registro — por isso autoInstall é false.",
|
|
284
|
+
"As respostas deste servidor são o grafo CRU, sem o saneamento do `morph-spec graph`. Em C#, blast radius cru pode devolver zero consumidores onde existem dois."
|
|
285
|
+
],
|
|
286
|
+
"setupGuide": null
|
|
201
287
|
}
|
|
202
288
|
}
|
|
203
289
|
},
|
|
204
290
|
"_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas) stay out of this matrix on purpose — only universal ones are listed.",
|
|
205
291
|
"phaseMatrix": {
|
|
206
|
-
"proposal": ["context7"],
|
|
207
|
-
"uiux": ["playwright", "context7", "stitch", "gemini-image"],
|
|
208
|
-
"plan": ["context7"],
|
|
209
|
-
"implement": ["context7", "playwright", "vercel", "gemini-image"],
|
|
210
|
-
"review": ["playwright", "context7"]
|
|
292
|
+
"proposal": ["context7", "graphify"],
|
|
293
|
+
"uiux": ["playwright", "context7", "stitch", "gemini-image", "seedance"],
|
|
294
|
+
"plan": ["context7", "graphify"],
|
|
295
|
+
"implement": ["context7", "playwright", "vercel", "gemini-image", "seedance", "graphify"],
|
|
296
|
+
"review": ["playwright", "context7", "graphify"]
|
|
211
297
|
}
|
|
212
298
|
}
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
},
|
|
11
11
|
"code_quality": {
|
|
12
12
|
"weight": 0.25,
|
|
13
|
-
"validators": ["architecture"],
|
|
14
|
-
"description": "Architecture patterns, dependency direction, and
|
|
13
|
+
"validators": ["architecture", "reuse"],
|
|
14
|
+
"description": "Architecture patterns, dependency direction, code structure, and reuse of what the codebase already has"
|
|
15
15
|
},
|
|
16
16
|
"design_ui": {
|
|
17
17
|
"weight": 0.05,
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
},
|
|
11
11
|
"code_quality": {
|
|
12
12
|
"weight": 0.25,
|
|
13
|
-
"validators": ["architecture"],
|
|
14
|
-
"description": "Architecture patterns and
|
|
13
|
+
"validators": ["architecture", "reuse"],
|
|
14
|
+
"description": "Architecture patterns, code structure, and reuse of what the codebase already has"
|
|
15
15
|
},
|
|
16
16
|
"design_ui": {
|
|
17
17
|
"weight": 0.15,
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
},
|
|
11
11
|
"code_quality": {
|
|
12
12
|
"weight": 0.15,
|
|
13
|
-
"validators": ["architecture"],
|
|
14
|
-
"description": "Architecture patterns and
|
|
13
|
+
"validators": ["architecture", "reuse"],
|
|
14
|
+
"description": "Architecture patterns, code structure, and reuse of what the codebase already has"
|
|
15
15
|
},
|
|
16
16
|
"design_ui": {
|
|
17
17
|
"weight": 0.35,
|
|
@@ -36,6 +36,31 @@
|
|
|
36
36
|
"minLength": 1,
|
|
37
37
|
"description": "Persona id assigned by morph-plan for this task — the bare framework/agents.json id, no 'morph-' prefix (e.g. \"dotnet-senior\"). Optional. Part of the plan contract: frozen after Gate 2."
|
|
38
38
|
},
|
|
39
|
+
"reuse": {
|
|
40
|
+
"type": "array",
|
|
41
|
+
"description": "Veredito de reuso por conceito que ESTA task introduz, carimbado por morph-plan a partir do 2-plan/reuse-map.md. Optional. Part of the plan contract: frozen after Gate 2. A justificativa de um CRIAR mora no reuse-map.md, nunca aqui — duas verdades do mesmo fato divergem.",
|
|
42
|
+
"items": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["concept", "verdict"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"concept": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1,
|
|
49
|
+
"description": "Nome do conceito/símbolo, como ele aparecerá no código (ex.: \"SimpleBuilding\")."
|
|
50
|
+
},
|
|
51
|
+
"verdict": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"enum": ["REUSAR", "ESTENDER", "CRIAR"],
|
|
54
|
+
"description": "REUSAR: usar o que existe. ESTENDER: partir do que existe. CRIAR: nada cobre o caso — exige justificativa de uma linha no reuse-map.md."
|
|
55
|
+
},
|
|
56
|
+
"target": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Path (ou path:símbolo) do que será reusado/estendido. Vazio ou ausente em CRIAR."
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"additionalProperties": false
|
|
62
|
+
}
|
|
63
|
+
},
|
|
39
64
|
"standards": {
|
|
40
65
|
"type": "array",
|
|
41
66
|
"items": { "type": "string", "minLength": 1 },
|
|
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.31.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- umbraco
|
|
10
10
|
---
|
|
@@ -199,6 +199,17 @@ Edite `frontend/src/app/globals.css`. As variáveis CSS de base do tema são def
|
|
|
199
199
|
|
|
200
200
|
Para tipografias customizadas, importe via `next/font` em `frontend/src/app/layout.tsx` e exponha como variável CSS.
|
|
201
201
|
|
|
202
|
+
> **Se a LP nasce cinematográfica (scroll-driven):** o template não traz `gsap` nem `lenis`; adicione ao
|
|
203
|
+
> `frontend/package.json` e monte o runtime de motion como componente `'use client'` montado uma vez na
|
|
204
|
+
> page, com guard de SSR no registro do ScrollTrigger. O conhecimento está nos standards
|
|
205
|
+
> `frontend/scroll-driven/smooth-scroll.md` (wiring Lenis com o ticker do GSAP, `window.__lenis`,
|
|
206
|
+
> armadilha de HMR), `frame-scrub.md` (canvas quadro a quadro, extração ffmpeg, poster no mobile) e
|
|
207
|
+
> `scroll-components.md` (pin, modal, parallax, reveal). Regra de assets que vale desde o primeiro dia:
|
|
208
|
+
> **sequência de frames é asset estrutural em `frontend/public/` com cache-bust `?v=N` manual, e só o
|
|
209
|
+
> poster vira mídia editável no backoffice.** Frames na Media Library perdem o webp (o ImageSharp do
|
|
210
|
+
> Umbraco 17 exige URL assinada por HMAC, não relaxável por config) e viram 145 requests assinadas
|
|
211
|
+
> por visitante.
|
|
212
|
+
|
|
202
213
|
**4.2 — Módulos disponíveis (Content Types *Section):**
|
|
203
214
|
|
|
204
215
|
O template já inclui os seguintes módulos versionados em `backend/uSync/v17/ContentTypes/`:
|
|
@@ -268,7 +279,7 @@ Antes de fazer deploy ou entregar o projeto ao cliente:
|
|
|
268
279
|
## Referências
|
|
269
280
|
|
|
270
281
|
- `polymorphism-tech/MORPH_Umbraco_LP_Template` (privado, branch `master`) — template canônico: `scripts/new-lp.ps1`, `scripts/new-lp.sh`, `backend/Infrastructure/SeedContentHandler.cs`, `backend/Controllers/LeadController.cs`, `backend/uSync/v17/`.
|
|
271
|
-
- `
|
|
282
|
+
- `references/umbraco-lp-patterns.md` (carregue sob demanda) — padrões e gotchas detalhados: controller público (seção 1), DI multi-sink (seção 2), leitura server-side de config oculta (seção 3), segurança Delivery API (seção 4), uSync config-as-code (seção 5), dropdown gotcha (seção 6), seed idempotente (seção 7), endpoint Ping (seção 10), skip silencioso em dev (seção 11), build Next.js exige backend (seção 12).
|
|
272
283
|
- `backend/appsettings.json` — `Umbraco:CMS:DeliveryApi:DisallowedContentTypeAliases` e `uSync:Settings:ImportAtStartup`.
|
|
273
284
|
- `backend/Properties/launchSettings.json` — portas de dev: HTTP `:19223`, HTTPS `:44324`.
|
|
274
285
|
- `docker-compose.yml` — orquestração de produção (backend porta `5001`, frontend `3000`).
|