@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
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Postinstall script for @polymorphism-tech/morph-spec
|
|
5
|
-
*
|
|
6
|
-
* Checks if morph-spec is accessible in PATH and warns users
|
|
7
|
-
* if it's not (common issue with nvm-windows).
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { execSync } from 'child_process';
|
|
11
|
-
import { platform } from 'os';
|
|
12
|
-
import chalk from 'chalk';
|
|
13
|
-
|
|
14
|
-
const isWindows = platform() === 'win32';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Check if morph-spec command is in PATH
|
|
18
|
-
*/
|
|
19
|
-
function isMorphSpecInPath() {
|
|
20
|
-
try {
|
|
21
|
-
const command = isWindows ? 'where morph-spec' : 'which morph-spec';
|
|
22
|
-
execSync(command, { stdio: 'ignore' });
|
|
23
|
-
return true;
|
|
24
|
-
} catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Detect if nvm-windows is installed
|
|
31
|
-
*/
|
|
32
|
-
function isUsingNvmWindows() {
|
|
33
|
-
if (!isWindows) return false;
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const path = process.env.PATH || '';
|
|
37
|
-
return path.includes('nvm4w') || path.includes('\\nvm\\');
|
|
38
|
-
} catch {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Get npm global prefix
|
|
45
|
-
*/
|
|
46
|
-
function getNpmGlobalPrefix() {
|
|
47
|
-
try {
|
|
48
|
-
const prefix = execSync('npm config get prefix', { encoding: 'utf8' }).trim();
|
|
49
|
-
return prefix;
|
|
50
|
-
} catch {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Show installation success message
|
|
57
|
-
*/
|
|
58
|
-
function showSuccessMessage() {
|
|
59
|
-
console.log('');
|
|
60
|
-
console.log(chalk.green('✓ @polymorphism-tech/morph-spec installed successfully!'));
|
|
61
|
-
console.log('');
|
|
62
|
-
console.log(chalk.cyan('Quick start:'));
|
|
63
|
-
console.log(chalk.white(' morph-spec init'));
|
|
64
|
-
console.log(chalk.white(' morph-spec --help'));
|
|
65
|
-
console.log('');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Show PATH warning for nvm-windows users
|
|
70
|
-
*/
|
|
71
|
-
function showPathWarning() {
|
|
72
|
-
console.log('');
|
|
73
|
-
console.log(chalk.yellow('⚠ Warning: morph-spec command not found in PATH'));
|
|
74
|
-
console.log('');
|
|
75
|
-
|
|
76
|
-
if (isUsingNvmWindows()) {
|
|
77
|
-
console.log(chalk.white('You are using nvm-windows, which does not automatically add'));
|
|
78
|
-
console.log(chalk.white('npm global packages to your PATH.'));
|
|
79
|
-
console.log('');
|
|
80
|
-
console.log(chalk.cyan('Solution 1: Add npm global directory to PATH'));
|
|
81
|
-
|
|
82
|
-
const prefix = getNpmGlobalPrefix();
|
|
83
|
-
if (prefix) {
|
|
84
|
-
console.log(chalk.white(` Add this to your PATH: ${chalk.yellow(prefix)}`));
|
|
85
|
-
console.log('');
|
|
86
|
-
console.log(chalk.gray(' PowerShell (as Administrator):'));
|
|
87
|
-
console.log(chalk.white(` [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";${prefix}", "User")`));
|
|
88
|
-
console.log('');
|
|
89
|
-
console.log(chalk.gray(' Or manually via System Properties > Environment Variables'));
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
console.log('');
|
|
93
|
-
console.log(chalk.cyan('Solution 2: Use npx (recommended)'));
|
|
94
|
-
console.log(chalk.white(' npx @polymorphism-tech/morph-spec init'));
|
|
95
|
-
console.log(chalk.white(' npx @polymorphism-tech/morph-spec --help'));
|
|
96
|
-
} else {
|
|
97
|
-
console.log(chalk.white('The morph-spec command was not found in your PATH.'));
|
|
98
|
-
console.log('');
|
|
99
|
-
console.log(chalk.cyan('Solution: Use npx instead'));
|
|
100
|
-
console.log(chalk.white(' npx @polymorphism-tech/morph-spec init'));
|
|
101
|
-
console.log(chalk.white(' npx @polymorphism-tech/morph-spec --help'));
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
console.log('');
|
|
105
|
-
console.log(chalk.gray('For more help, see: https://github.com/lucasPolymorphism/morph-spec-framework#troubleshooting'));
|
|
106
|
-
console.log('');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Main postinstall check
|
|
111
|
-
*/
|
|
112
|
-
function main() {
|
|
113
|
-
// Only show messages for global installs
|
|
114
|
-
// Skip for local installs (when used as dependency)
|
|
115
|
-
const isGlobalInstall = process.env.npm_config_global === 'true';
|
|
116
|
-
|
|
117
|
-
if (!isGlobalInstall) {
|
|
118
|
-
// Silent exit for local installs
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Give npm a moment to set up the symlinks
|
|
123
|
-
setTimeout(() => {
|
|
124
|
-
if (isMorphSpecInPath()) {
|
|
125
|
-
showSuccessMessage();
|
|
126
|
-
} else {
|
|
127
|
-
showPathWarning();
|
|
128
|
-
}
|
|
129
|
-
}, 100);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Postinstall script for @polymorphism-tech/morph-spec
|
|
5
|
+
*
|
|
6
|
+
* Checks if morph-spec is accessible in PATH and warns users
|
|
7
|
+
* if it's not (common issue with nvm-windows).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import { platform } from 'os';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
|
|
14
|
+
const isWindows = platform() === 'win32';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Check if morph-spec command is in PATH
|
|
18
|
+
*/
|
|
19
|
+
function isMorphSpecInPath() {
|
|
20
|
+
try {
|
|
21
|
+
const command = isWindows ? 'where morph-spec' : 'which morph-spec';
|
|
22
|
+
execSync(command, { stdio: 'ignore' });
|
|
23
|
+
return true;
|
|
24
|
+
} catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Detect if nvm-windows is installed
|
|
31
|
+
*/
|
|
32
|
+
function isUsingNvmWindows() {
|
|
33
|
+
if (!isWindows) return false;
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const path = process.env.PATH || '';
|
|
37
|
+
return path.includes('nvm4w') || path.includes('\\nvm\\');
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get npm global prefix
|
|
45
|
+
*/
|
|
46
|
+
function getNpmGlobalPrefix() {
|
|
47
|
+
try {
|
|
48
|
+
const prefix = execSync('npm config get prefix', { encoding: 'utf8' }).trim();
|
|
49
|
+
return prefix;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Show installation success message
|
|
57
|
+
*/
|
|
58
|
+
function showSuccessMessage() {
|
|
59
|
+
console.log('');
|
|
60
|
+
console.log(chalk.green('✓ @polymorphism-tech/morph-spec installed successfully!'));
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(chalk.cyan('Quick start:'));
|
|
63
|
+
console.log(chalk.white(' morph-spec init'));
|
|
64
|
+
console.log(chalk.white(' morph-spec --help'));
|
|
65
|
+
console.log('');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Show PATH warning for nvm-windows users
|
|
70
|
+
*/
|
|
71
|
+
function showPathWarning() {
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(chalk.yellow('⚠ Warning: morph-spec command not found in PATH'));
|
|
74
|
+
console.log('');
|
|
75
|
+
|
|
76
|
+
if (isUsingNvmWindows()) {
|
|
77
|
+
console.log(chalk.white('You are using nvm-windows, which does not automatically add'));
|
|
78
|
+
console.log(chalk.white('npm global packages to your PATH.'));
|
|
79
|
+
console.log('');
|
|
80
|
+
console.log(chalk.cyan('Solution 1: Add npm global directory to PATH'));
|
|
81
|
+
|
|
82
|
+
const prefix = getNpmGlobalPrefix();
|
|
83
|
+
if (prefix) {
|
|
84
|
+
console.log(chalk.white(` Add this to your PATH: ${chalk.yellow(prefix)}`));
|
|
85
|
+
console.log('');
|
|
86
|
+
console.log(chalk.gray(' PowerShell (as Administrator):'));
|
|
87
|
+
console.log(chalk.white(` [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";${prefix}", "User")`));
|
|
88
|
+
console.log('');
|
|
89
|
+
console.log(chalk.gray(' Or manually via System Properties > Environment Variables'));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
console.log('');
|
|
93
|
+
console.log(chalk.cyan('Solution 2: Use npx (recommended)'));
|
|
94
|
+
console.log(chalk.white(' npx @polymorphism-tech/morph-spec init'));
|
|
95
|
+
console.log(chalk.white(' npx @polymorphism-tech/morph-spec --help'));
|
|
96
|
+
} else {
|
|
97
|
+
console.log(chalk.white('The morph-spec command was not found in your PATH.'));
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log(chalk.cyan('Solution: Use npx instead'));
|
|
100
|
+
console.log(chalk.white(' npx @polymorphism-tech/morph-spec init'));
|
|
101
|
+
console.log(chalk.white(' npx @polymorphism-tech/morph-spec --help'));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
console.log('');
|
|
105
|
+
console.log(chalk.gray('For more help, see: https://github.com/lucasPolymorphism/morph-spec-framework#troubleshooting'));
|
|
106
|
+
console.log('');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Main postinstall check
|
|
111
|
+
*/
|
|
112
|
+
function main() {
|
|
113
|
+
// Only show messages for global installs
|
|
114
|
+
// Skip for local installs (when used as dependency)
|
|
115
|
+
const isGlobalInstall = process.env.npm_config_global === 'true';
|
|
116
|
+
|
|
117
|
+
if (!isGlobalInstall) {
|
|
118
|
+
// Silent exit for local installs
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Give npm a moment to set up the symlinks
|
|
123
|
+
setTimeout(() => {
|
|
124
|
+
if (isMorphSpecInPath()) {
|
|
125
|
+
showSuccessMessage();
|
|
126
|
+
} else {
|
|
127
|
+
showPathWarning();
|
|
128
|
+
}
|
|
129
|
+
}, 100);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
main();
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
import chalk from 'chalk';
|
|
13
13
|
import { loadState, saveState, getFeature } from '../lib/state-manager.js';
|
|
14
14
|
import { PHASES, validatePhase } from './validate-phase.js';
|
|
15
|
+
import { detectDesignSystem, hasUIAgentsActive } from '../lib/design-system-detector.js';
|
|
16
|
+
import { validateSpec } from '../lib/spec-validator.js';
|
|
15
17
|
|
|
16
18
|
// Phase order for advancing (skips optional phases unless active)
|
|
17
19
|
const PHASE_ORDER = ['proposal', 'setup', 'uiux', 'design', 'clarify', 'tasks', 'implement', 'sync'];
|
|
@@ -110,6 +112,48 @@ export async function advancePhaseCommand(feature, options = {}) {
|
|
|
110
112
|
console.log(chalk.yellow(`\n⚠️ ${validation.stateWarning}`));
|
|
111
113
|
}
|
|
112
114
|
|
|
115
|
+
// Gate: Validate spec.md and contracts.cs when advancing from design phase
|
|
116
|
+
if (currentPhase === 'design' && (nextPhase === 'clarify' || nextPhase === 'tasks')) {
|
|
117
|
+
const specValidation = await validateSpec('.', feature);
|
|
118
|
+
|
|
119
|
+
if (specValidation.errors > 0) {
|
|
120
|
+
console.log(chalk.red('\n✗ Spec validation failed — fix errors before advancing:'));
|
|
121
|
+
specValidation.issues.filter(i => i.level === 'error').forEach(issue => {
|
|
122
|
+
console.log(chalk.red(` - ${issue.message}`));
|
|
123
|
+
console.log(chalk.yellow(` → ${issue.solution}`));
|
|
124
|
+
});
|
|
125
|
+
console.log('');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (specValidation.warnings > 0 && !options.skipWarnings) {
|
|
130
|
+
console.log(chalk.yellow('\n⚠️ Spec validation warnings:'));
|
|
131
|
+
specValidation.issues.filter(i => i.level === 'warning').forEach(issue => {
|
|
132
|
+
console.log(chalk.yellow(` - ${issue.message}`));
|
|
133
|
+
});
|
|
134
|
+
console.log(chalk.gray('\n (Use --skip-warnings to ignore warnings)\n'));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Gate: Check design system when advancing to implement with UI agents
|
|
139
|
+
if (nextPhase === 'implement') {
|
|
140
|
+
const gateResult = designSystemGate(feature);
|
|
141
|
+
|
|
142
|
+
if (gateResult.blocked) {
|
|
143
|
+
console.log(chalk.red(`\n✗ ${gateResult.message}`));
|
|
144
|
+
console.log('');
|
|
145
|
+
gateResult.solution.forEach(line => {
|
|
146
|
+
if (line === '') {
|
|
147
|
+
console.log('');
|
|
148
|
+
} else {
|
|
149
|
+
console.log(chalk.yellow(` ${line}`));
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
console.log('');
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
113
157
|
// Advance the phase
|
|
114
158
|
const state = loadState();
|
|
115
159
|
state.features[feature].phase = nextPhase;
|
|
@@ -181,3 +225,42 @@ function getPhaseGuidance(phase, feature) {
|
|
|
181
225
|
|
|
182
226
|
return guides[phase] || null;
|
|
183
227
|
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Gate: Check design system exists when advancing to implement with UI agents
|
|
231
|
+
* @param {string} feature - Feature name
|
|
232
|
+
* @param {string} projectPath - Project root path
|
|
233
|
+
* @returns {Object} { blocked: boolean, message?: string, solution?: string[] }
|
|
234
|
+
*/
|
|
235
|
+
function designSystemGate(feature, projectPath = '.') {
|
|
236
|
+
// Check if UI agents are active
|
|
237
|
+
const hasUIAgents = hasUIAgentsActive(projectPath, feature);
|
|
238
|
+
|
|
239
|
+
if (!hasUIAgents) {
|
|
240
|
+
return { blocked: false }; // No UI agents, gate doesn't apply
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Check if design system exists
|
|
244
|
+
const dsDetection = detectDesignSystem(projectPath, feature);
|
|
245
|
+
|
|
246
|
+
if (dsDetection.hasDesignSystem) {
|
|
247
|
+
return { blocked: false }; // Design system exists, gate passed
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Block advancement - no design system found with UI agents active
|
|
251
|
+
return {
|
|
252
|
+
blocked: true,
|
|
253
|
+
message: 'Cannot advance to implementation — UI agents are active but no design system found',
|
|
254
|
+
solution: [
|
|
255
|
+
'Design system is required when UI agents (blazor-builder, ui-designer, css-specialist) are active',
|
|
256
|
+
'',
|
|
257
|
+
'Create a design system with one of these options:',
|
|
258
|
+
' 1. Project-level: .morph/project/design-system.md (shared across features)',
|
|
259
|
+
` 2. Feature-level: .morph/project/outputs/${feature}/ui-design-system.md (feature-specific)`,
|
|
260
|
+
' 3. Auto-generate: morph-spec generate design-system (scans existing CSS)',
|
|
261
|
+
'',
|
|
262
|
+
'Or remove UI agents if they are not needed:',
|
|
263
|
+
` morph-spec state remove-agent ${feature} blazor-builder`
|
|
264
|
+
]
|
|
265
|
+
};
|
|
266
|
+
}
|