@polymorphism-tech/morph-spec 7.8.1 → 7.9.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/README.md +2 -2
- package/bin/morph-spec.js +30 -1
- 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 +3 -1
- package/framework/MORPH.md +4 -3
- package/framework/commands/commit.md +166 -166
- package/framework/commands/morph-infra.md +215 -215
- package/framework/commands/morph-preflight.md +205 -205
- package/framework/commands/morph-troubleshoot.md +124 -124
- package/framework/evals/trace-schema.md +22 -12
- package/framework/hooks/README.md +2 -0
- package/framework/hooks/claude-code/core/subagent-report-guard.js +95 -0
- package/framework/hooks/claude-code/core/trace-autogen.js +183 -0
- package/framework/hooks/claude-code/statusline.py +679 -679
- 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/activity-logger.js +160 -160
- package/framework/hooks/shared/hook-response.js +45 -45
- package/framework/hooks/shared/payload-utils.js +78 -78
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/hooks/shared/tasks-validator.js +47 -4
- package/framework/rubrics/backend.json +41 -41
- package/framework/rules/ai-agents-standards.md +45 -45
- package/framework/rules/dotnet-templates.md +86 -86
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +27 -27
- package/framework/rules/neon-standards.md +25 -25
- package/framework/rules/nextjs-standards.md +20 -20
- package/framework/rules/nextjs-templates.md +40 -40
- package/framework/schemas/feature.schema.json +128 -0
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +23 -10
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +3 -6
- package/framework/skills/core/morph-implement/SKILL.md +28 -15
- package/framework/skills/core/morph-plan/SKILL.md +1 -1
- package/framework/skills/core/morph-proposal/SKILL.md +2 -2
- package/framework/skills/core/morph-review/SKILL.md +2 -6
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- 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 +275 -275
- 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/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/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/docker-compose.template.yml +50 -50
- 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/parallel-workers/parallel-coordinator.md +113 -113
- 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/index.js +13 -13
- package/src/commands/mcp/mcp-setup.js +519 -519
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +23 -18
- package/src/commands/project/update.js +16 -9
- package/src/commands/state/create.js +58 -0
- package/src/commands/state/gate-decision.js +99 -0
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +55 -0
- 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/LiveState.jsx +239 -239
- 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/hooks-scanner.js +41 -41
- 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/scanner/standards-scanner.js +26 -26
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/metrics-aggregator.js +56 -56
- package/src/lib/agents/metrics-calculator.js +125 -125
- package/src/lib/agents/output-collector.js +73 -73
- package/src/lib/detectors/claude-config-detector.js +152 -152
- package/src/lib/detectors/design-system-detector.js +231 -231
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +639 -639
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/index.js +13 -13
- package/src/lib/generators/settings-generator.js +209 -209
- 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/test-runner.js +81 -81
- package/src/lib/validators/architecture/architecture-validator.js +259 -259
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/packages/package-validator.js +347 -347
- 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 +349 -349
- package/src/scripts/setup-infra.js +385 -383
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +25 -10
- package/src/utils/banner.js +37 -4
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/hooks-installer.js +32 -4
- package/src/utils/skills-installer.js +174 -172
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Map an agents.json ID to the Claude Code subagent_type.
|
|
3
|
-
*
|
|
4
|
-
* @param {string} id - Agent ID from agents.json (e.g., "nextjs-expert")
|
|
5
|
-
* @param {number} [tier] - Agent tier (1-4). Defaults to non-validator.
|
|
6
|
-
* @returns {string} subagent_type matching .claude/agents/ filename stem
|
|
7
|
-
*/
|
|
8
|
-
export function agentIdToSubagentType(id, tier) {
|
|
9
|
-
const prefix = tier === 4 ? 'morph-validator-' : 'morph-';
|
|
10
|
-
return `${prefix}${id}`;
|
|
11
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Map an agents.json ID to the Claude Code subagent_type.
|
|
3
|
+
*
|
|
4
|
+
* @param {string} id - Agent ID from agents.json (e.g., "nextjs-expert")
|
|
5
|
+
* @param {number} [tier] - Agent tier (1-4). Defaults to non-validator.
|
|
6
|
+
* @returns {string} subagent_type matching .claude/agents/ filename stem
|
|
7
|
+
*/
|
|
8
|
+
export function agentIdToSubagentType(id, tier) {
|
|
9
|
+
const prefix = tier === 4 ? 'morph-validator-' : 'morph-';
|
|
10
|
+
return `${prefix}${id}`;
|
|
11
|
+
}
|
|
@@ -45,6 +45,26 @@ export function loadKnownMcpIds(frameworkDir) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Personas install-all default (friction fix, MORPH_GHLBrain 2026-07-11):
|
|
50
|
+
* with NO known stack tags (greenfield / install before config.json exists)
|
|
51
|
+
* EVERY persona is generated — a project that dispatches `morph-{id}` must
|
|
52
|
+
* find the subagent registered, and an install that only lands
|
|
53
|
+
* morph-evaluator forces every domain dispatch into the general-purpose
|
|
54
|
+
* fallback. Stack filtering only applies when the project's stack is KNOWN
|
|
55
|
+
* (tags non-empty): the fallback stays reserved for stacks the project
|
|
56
|
+
* genuinely does not have. Note this deliberately differs from rules/skills
|
|
57
|
+
* filtering (stack-filter.js), which stays minimal on greenfield.
|
|
58
|
+
*
|
|
59
|
+
* @param {object} agent - agents.json entry (with `stack`)
|
|
60
|
+
* @param {string[]} projectTags
|
|
61
|
+
* @returns {boolean}
|
|
62
|
+
*/
|
|
63
|
+
export function agentEligible(agent, projectTags = []) {
|
|
64
|
+
if (projectTags.length === 0) return true;
|
|
65
|
+
return shouldInstall(agent.stack ?? ['*'], projectTags);
|
|
66
|
+
}
|
|
67
|
+
|
|
48
68
|
const MANAGED_HEADER =
|
|
49
69
|
'<!-- MANAGED BY morph-spec — generated from .morph/framework/agents.json (single source of truth).\n' +
|
|
50
70
|
' Do NOT edit by hand: changes are overwritten on `morph-spec update` / `setup-infra --reinstall`.\n' +
|
|
@@ -75,11 +95,8 @@ export async function installAgents(projectDir, frameworkDir = 'framework', opti
|
|
|
75
95
|
|
|
76
96
|
const knownMcpIds = loadKnownMcpIds(frameworkDir);
|
|
77
97
|
|
|
78
|
-
// Filter by stack
|
|
79
|
-
const eligible = agents.filter(a =>
|
|
80
|
-
const stack = a.stack ?? ['*'];
|
|
81
|
-
return shouldInstall(stack, projectTags);
|
|
82
|
-
});
|
|
98
|
+
// Filter by stack — install-all when the stack is unknown (empty tags).
|
|
99
|
+
const eligible = agents.filter(a => agentEligible(a, projectTags));
|
|
83
100
|
|
|
84
101
|
// Build set of all possible filenames for orphan cleanup
|
|
85
102
|
const allPossible = new Set(agents.map(a => `morph-${a.id}.md`));
|
|
@@ -231,12 +248,11 @@ export function checkMissingAgents(projectDir, frameworkDir, projectTags = []) {
|
|
|
231
248
|
let expected = 0;
|
|
232
249
|
|
|
233
250
|
for (const a of agents) {
|
|
234
|
-
|
|
235
|
-
if (!shouldInstall(stack, projectTags)) continue;
|
|
251
|
+
if (!agentEligible(a, projectTags)) continue;
|
|
236
252
|
expected++;
|
|
237
253
|
const filename = `morph-${a.id}.md`;
|
|
238
254
|
if (!installedFiles.has(filename)) {
|
|
239
|
-
missing.push({ name: a.title ?? a.id, stacks: stack });
|
|
255
|
+
missing.push({ name: a.title ?? a.id, stacks: a.stack ?? ['*'] });
|
|
240
256
|
}
|
|
241
257
|
}
|
|
242
258
|
|
|
@@ -276,8 +292,7 @@ export function checkAgentsDrift(projectDir, frameworkDir, projectTags = []) {
|
|
|
276
292
|
let expected = 0;
|
|
277
293
|
|
|
278
294
|
for (const agent of agents) {
|
|
279
|
-
|
|
280
|
-
if (!shouldInstall(stack, projectTags)) continue;
|
|
295
|
+
if (!agentEligible(agent, projectTags)) continue;
|
|
281
296
|
expected++;
|
|
282
297
|
const filename = `morph-${agent.id}.md`;
|
|
283
298
|
const filePath = join(targetDir, filename);
|
package/src/utils/banner.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// src/utils/banner.js
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
-
import { type as osType, release as osRelease } from "os";
|
|
3
|
+
import { type as osType, release as osRelease, homedir } from "os";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
4
6
|
|
|
5
7
|
const BRAND = chalk.hex("#7C3AED");
|
|
6
8
|
const DIM = chalk.dim;
|
|
@@ -54,6 +56,39 @@ export function renderLogo(version) {
|
|
|
54
56
|
return `\n${art}\n${rule}\n`;
|
|
55
57
|
}
|
|
56
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Print the install banner once per version change, on the first CLI run
|
|
61
|
+
* after an install/upgrade. npm ≥7 swallows lifecycle-script output, so the
|
|
62
|
+
* postinstall banner is invisible on a normal `npm i -g` — this is the
|
|
63
|
+
* fallback that guarantees the next-steps guidance is actually seen.
|
|
64
|
+
*
|
|
65
|
+
* Marker: ~/.claude/morph-spec-banner-version (last version shown).
|
|
66
|
+
* Skips silently when stdout is not a TTY (piped/parsed output) or when
|
|
67
|
+
* MORPH_QUIET=1. Fail-open: any fs error just skips the banner.
|
|
68
|
+
*
|
|
69
|
+
* @param {{version: string, nodeVersion: string, markerDir?: string}} opts
|
|
70
|
+
* @returns {boolean} true if the banner was printed
|
|
71
|
+
*/
|
|
72
|
+
export function maybePrintFirstRunBanner({ version, nodeVersion, markerDir }) {
|
|
73
|
+
try {
|
|
74
|
+
if (!process.stdout.isTTY) return false;
|
|
75
|
+
if (process.env.MORPH_QUIET === "1") return false;
|
|
76
|
+
|
|
77
|
+
const dir = markerDir ?? join(homedir(), ".claude");
|
|
78
|
+
const marker = join(dir, "morph-spec-banner-version");
|
|
79
|
+
const last = existsSync(marker) ? readFileSync(marker, "utf8").trim() : null;
|
|
80
|
+
if (last === version) return false;
|
|
81
|
+
|
|
82
|
+
mkdirSync(dir, { recursive: true });
|
|
83
|
+
writeFileSync(marker, version, "utf8");
|
|
84
|
+
|
|
85
|
+
printInstallBanner({ version, nodeVersion, results: [] });
|
|
86
|
+
return true;
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
57
92
|
function platformLabel() {
|
|
58
93
|
const t = osType();
|
|
59
94
|
const r = osRelease().split(".").slice(0, 2).join(".");
|
|
@@ -78,9 +113,7 @@ export function printInstallBanner({ version, nodeVersion, results = [] }) {
|
|
|
78
113
|
` ${DIM("Spec-driven development harness for Claude Code")}`,
|
|
79
114
|
` ${DIM("by Polymorphism Tech")} ${DIM("·")} ${DIM("Node")} ${chalk.white(nodeVersion)} ${DIM("·")} ${chalk.white(platformLabel())}`,
|
|
80
115
|
"",
|
|
81
|
-
sep("Installed"),
|
|
82
|
-
...itemLines,
|
|
83
|
-
"",
|
|
116
|
+
...(itemLines.length > 0 ? [sep("Installed"), ...itemLines, ""] : []),
|
|
84
117
|
sep("Next · new project"),
|
|
85
118
|
` ${chalk.cyan("1.")} ${DIM("cd")} ${chalk.white("your-project")} ${DIM("(git repo)")}`,
|
|
86
119
|
` ${chalk.cyan("2.")} Run ${chalk.bold.white("morph-spec init")}`,
|