@polymorphism-tech/morph-spec 4.10.9 → 4.11.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 +3 -3
- package/LICENSE +71 -71
- package/README.md +5 -11
- package/bin/morph-spec.js +23 -1
- package/bin/task-manager.js +5 -5
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +2 -8
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/css-specialist.md +1 -1
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/azure-deploy-specialist.md +4 -4
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/commands/morph-apply.md +18 -18
- package/framework/commands/morph-preflight.md +3 -3
- package/framework/commands/morph-proposal.md +15 -15
- package/framework/commands/morph-status.md +3 -3
- package/framework/commands/morph-troubleshoot.md +1 -1
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +2 -2
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +1 -1
- package/framework/hooks/claude-code/teammate-idle/teammate-idle.js +3 -3
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +2 -2
- package/framework/hooks/git/pre-commit/agents.sh +1 -1
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/rules/csharp-standards.md +13 -13
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +16 -16
- package/framework/rules/testing-standards.md +14 -14
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +8 -8
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +3 -3
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +1 -1
- package/framework/skills/level-0-meta/morph-init/SKILL.md +11 -11
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +3 -3
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +1 -1
- package/framework/skills/level-0-meta/morph-simulation-checklist/SKILL.md +4 -4
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +25 -25
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +8 -8
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +7 -7
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +4 -4
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +23 -23
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +29 -29
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -4
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +9 -9
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +17 -17
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +12 -12
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +16 -16
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +5 -5
- package/framework/standards/STANDARDS.json +2338 -2041
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/README.md +814 -814
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
- package/framework/templates/code/dotnet/contracts/README.md +74 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
- package/framework/templates/code/dotnet/frontend/component.razor +239 -239
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
- package/framework/templates/code/dotnet/jobs/job.cs +171 -171
- package/framework/templates/code/dotnet/test.cs +239 -239
- package/framework/templates/code/sql/rls-policy.sql +57 -57
- package/framework/templates/code/sql/supabase-migration.sql +100 -100
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
- package/framework/templates/code/typescript/contracts.ts +168 -168
- package/framework/templates/context/CONTEXT.md +181 -181
- package/framework/templates/docs/proposal.md +182 -182
- package/framework/templates/docs/user-stories.md +34 -34
- package/framework/templates/examples/design-system-examples.md +357 -357
- package/framework/templates/examples/spec-examples.md +90 -90
- package/framework/templates/feature/decisions.md +187 -187
- package/framework/templates/feature/recap.md +146 -146
- package/framework/templates/feature/tasks.md +199 -199
- package/framework/templates/infrastructure/azure/README.md +286 -286
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
- package/framework/workflows/README.md +18 -18
- package/framework/workflows/docs/enforcement-pipeline.md +1 -1
- package/framework/workflows/docs/full-morph.md +2 -2
- package/package.json +1 -1
- package/src/commands/agents/dispatch-agents.js +17 -0
- package/src/commands/agents/index.js +13 -13
- package/src/commands/agents/project-metrics.js +74 -0
- package/src/commands/project/doctor.js +3 -4
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/project/status.js +8 -1
- package/src/commands/scope/escalate.js +5 -3
- package/src/commands/standards/context-budget.js +89 -0
- package/src/commands/tasks/index.js +4 -4
- package/src/commands/templates/index.js +5 -5
- package/src/commands/utils/index.js +3 -3
- package/src/commands/validation/index.js +4 -4
- package/src/commands/validation/validate-feature.js +32 -3
- package/src/core/state/phase-state-machine.js +217 -217
- package/src/lib/agents/metrics-aggregator.js +56 -0
- package/src/lib/generators/design-system-generator.js +298 -298
- package/src/lib/generators/index.js +10 -10
- package/src/lib/generators/metadata-extractor.js +387 -387
- package/src/lib/stack-filter.js +65 -65
- package/src/lib/standards/digest-builder.js +57 -3
- package/src/lib/standards/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/validators/architecture/architecture-validator.js +387 -387
- package/src/lib/validators/architecture/index.js +7 -7
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
- package/src/lib/validators/blazor/blazor-validator.js +369 -369
- package/src/lib/validators/blazor/index.js +9 -9
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/content/index.js +7 -7
- package/src/lib/validators/contracts/index.js +7 -7
- package/src/lib/validators/css/css-validator.js +352 -352
- package/src/lib/validators/css/index.js +7 -7
- package/src/lib/validators/design-system/design-system-validator.js +231 -231
- package/src/lib/validators/design-system/index.js +7 -7
- package/src/lib/validators/nextjs/index.js +6 -6
- package/src/lib/validators/nextjs/next-component-validator.js +183 -183
- package/src/lib/validators/packages/index.js +7 -7
- package/src/lib/validators/packages/package-validator.js +360 -360
- package/src/lib/validators/shared/index.js +12 -12
- package/src/lib/validators/shared/issue-counter.js +18 -18
- package/src/lib/validators/shared/result-formatter.js +124 -124
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/scripts/global-install.js +112 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/file-copier.js +200 -200
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +169 -175
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
// GENERATED by scripts/generate-refs.js — DO NOT EDIT manually
|
|
2
|
-
// Source of truth: src/core/paths/output-schema.js
|
|
3
|
-
// Regenerate with: node scripts/generate-refs.js
|
|
4
|
-
/**
|
|
5
|
-
* Shared phase utilities for Claude Code hooks.
|
|
6
|
-
*
|
|
7
|
-
* Maps phases to directories and output types.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/** Phase order */
|
|
11
|
-
export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","plan","tasks","implement","sync"];
|
|
12
|
-
|
|
13
|
-
/** Map phase → allowed output subdirectory */
|
|
14
|
-
export const PHASE_DIRS = {
|
|
15
|
-
proposal: '0-proposal',
|
|
16
|
-
setup: '0-proposal',
|
|
17
|
-
uiux: '2-ui',
|
|
18
|
-
design: '1-design',
|
|
19
|
-
clarify: '1-design',
|
|
20
|
-
plan: '3-plan',
|
|
21
|
-
tasks: '4-tasks',
|
|
22
|
-
implement: '5-implement',
|
|
23
|
-
sync: '5-implement',
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/** Map output type (camelCase) → phase that produces it */
|
|
27
|
-
export const OUTPUT_PHASE_MAP = {
|
|
28
|
-
proposal: 'proposal',
|
|
29
|
-
schemaAnalysis: 'design',
|
|
30
|
-
spec: 'design',
|
|
31
|
-
clarifications: 'clarify',
|
|
32
|
-
contracts: 'design',
|
|
33
|
-
contractsTs: 'design',
|
|
34
|
-
contractsVsa: 'design',
|
|
35
|
-
plan: 'plan',
|
|
36
|
-
tasks: 'tasks',
|
|
37
|
-
uiDesignSystem: 'uiux',
|
|
38
|
-
uiMockups: 'uiux',
|
|
39
|
-
uiComponents: 'uiux',
|
|
40
|
-
uiFlows: 'uiux',
|
|
41
|
-
decisions: 'design',
|
|
42
|
-
recap: 'implement',
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/** Map filename → output type (camelCase) */
|
|
46
|
-
export const FILENAME_TO_OUTPUT = {
|
|
47
|
-
'proposal.md': 'proposal',
|
|
48
|
-
'schema-analysis.md': 'schemaAnalysis',
|
|
49
|
-
'spec.md': 'spec',
|
|
50
|
-
'clarifications.md': 'clarifications',
|
|
51
|
-
'contracts.cs': 'contracts',
|
|
52
|
-
'contracts.ts': 'contractsTs',
|
|
53
|
-
'contracts-vsa.cs': 'contractsVsa',
|
|
54
|
-
'plan.md': 'plan',
|
|
55
|
-
'tasks.md': 'tasks',
|
|
56
|
-
'design-system.md': 'uiDesignSystem',
|
|
57
|
-
'mockups.md': 'uiMockups',
|
|
58
|
-
'components.md': 'uiComponents',
|
|
59
|
-
'flows.md': 'uiFlows',
|
|
60
|
-
'decisions.md': 'decisions',
|
|
61
|
-
'recap.md': 'recap',
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/** Protected spec files and the approval gate that locks them */
|
|
65
|
-
export const PROTECTED_SPEC_FILES = {
|
|
66
|
-
'schema-analysis.md': 'design',
|
|
67
|
-
'spec.md': 'design',
|
|
68
|
-
'contracts.cs': 'design',
|
|
69
|
-
'contracts.ts': 'design',
|
|
70
|
-
'contracts-vsa.cs': 'design',
|
|
71
|
-
'plan.md': 'plan',
|
|
72
|
-
'tasks.md': 'tasks',
|
|
73
|
-
'design-system.md': 'uiux',
|
|
74
|
-
'mockups.md': 'uiux',
|
|
75
|
-
'components.md': 'uiux',
|
|
76
|
-
'flows.md': 'uiux',
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Extract feature name from a .morph/features/{feature}/... path
|
|
81
|
-
* @param {string} filePath - File path to analyze
|
|
82
|
-
* @returns {string|null} Feature name or null
|
|
83
|
-
*/
|
|
84
|
-
export function extractFeatureName(filePath) {
|
|
85
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
86
|
-
const match = normalized.match(/\.morph\/features\/([^/]+)\//);
|
|
87
|
-
return match ? match[1] : null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
|
|
92
|
-
* @param {string} filePath - File path to analyze
|
|
93
|
-
* @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
|
|
94
|
-
*/
|
|
95
|
-
export function extractPhaseDir(filePath) {
|
|
96
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
97
|
-
const match = normalized.match(/\.morph\/features\/[^/]+\/(\d+-[^/]+)\//);
|
|
98
|
-
return match ? match[1] : null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Check if a file path is inside .morph/features/
|
|
103
|
-
* @param {string} filePath
|
|
104
|
-
* @returns {boolean}
|
|
105
|
-
*/
|
|
106
|
-
export function isFeaturePath(filePath) {
|
|
107
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
108
|
-
return normalized.includes('.morph/features/');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Check if a file path is inside .morph/framework/ (readonly)
|
|
113
|
-
* @param {string} filePath
|
|
114
|
-
* @returns {boolean}
|
|
115
|
-
*/
|
|
116
|
-
export function isFrameworkPath(filePath) {
|
|
117
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
118
|
-
return normalized.includes('.morph/framework/');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Check if a file path is state.json
|
|
123
|
-
* @param {string} filePath
|
|
124
|
-
* @returns {boolean}
|
|
125
|
-
*/
|
|
126
|
-
export function isStatePath(filePath) {
|
|
127
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
128
|
-
return normalized.endsWith('.morph/state.json');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Get the basename of a file path
|
|
133
|
-
* @param {string} filePath
|
|
134
|
-
* @returns {string}
|
|
135
|
-
*/
|
|
136
|
-
export function getBasename(filePath) {
|
|
137
|
-
const normalized = filePath.replace(/\\/g, '/');
|
|
138
|
-
return normalized.split('/').pop();
|
|
139
|
-
}
|
|
1
|
+
// GENERATED by scripts/generate-refs.js — DO NOT EDIT manually
|
|
2
|
+
// Source of truth: src/core/paths/output-schema.js
|
|
3
|
+
// Regenerate with: node scripts/generate-refs.js
|
|
4
|
+
/**
|
|
5
|
+
* Shared phase utilities for Claude Code hooks.
|
|
6
|
+
*
|
|
7
|
+
* Maps phases to directories and output types.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Phase order */
|
|
11
|
+
export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","plan","tasks","implement","sync"];
|
|
12
|
+
|
|
13
|
+
/** Map phase → allowed output subdirectory */
|
|
14
|
+
export const PHASE_DIRS = {
|
|
15
|
+
proposal: '0-proposal',
|
|
16
|
+
setup: '0-proposal',
|
|
17
|
+
uiux: '2-ui',
|
|
18
|
+
design: '1-design',
|
|
19
|
+
clarify: '1-design',
|
|
20
|
+
plan: '3-plan',
|
|
21
|
+
tasks: '4-tasks',
|
|
22
|
+
implement: '5-implement',
|
|
23
|
+
sync: '5-implement',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** Map output type (camelCase) → phase that produces it */
|
|
27
|
+
export const OUTPUT_PHASE_MAP = {
|
|
28
|
+
proposal: 'proposal',
|
|
29
|
+
schemaAnalysis: 'design',
|
|
30
|
+
spec: 'design',
|
|
31
|
+
clarifications: 'clarify',
|
|
32
|
+
contracts: 'design',
|
|
33
|
+
contractsTs: 'design',
|
|
34
|
+
contractsVsa: 'design',
|
|
35
|
+
plan: 'plan',
|
|
36
|
+
tasks: 'tasks',
|
|
37
|
+
uiDesignSystem: 'uiux',
|
|
38
|
+
uiMockups: 'uiux',
|
|
39
|
+
uiComponents: 'uiux',
|
|
40
|
+
uiFlows: 'uiux',
|
|
41
|
+
decisions: 'design',
|
|
42
|
+
recap: 'implement',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Map filename → output type (camelCase) */
|
|
46
|
+
export const FILENAME_TO_OUTPUT = {
|
|
47
|
+
'proposal.md': 'proposal',
|
|
48
|
+
'schema-analysis.md': 'schemaAnalysis',
|
|
49
|
+
'spec.md': 'spec',
|
|
50
|
+
'clarifications.md': 'clarifications',
|
|
51
|
+
'contracts.cs': 'contracts',
|
|
52
|
+
'contracts.ts': 'contractsTs',
|
|
53
|
+
'contracts-vsa.cs': 'contractsVsa',
|
|
54
|
+
'plan.md': 'plan',
|
|
55
|
+
'tasks.md': 'tasks',
|
|
56
|
+
'design-system.md': 'uiDesignSystem',
|
|
57
|
+
'mockups.md': 'uiMockups',
|
|
58
|
+
'components.md': 'uiComponents',
|
|
59
|
+
'flows.md': 'uiFlows',
|
|
60
|
+
'decisions.md': 'decisions',
|
|
61
|
+
'recap.md': 'recap',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** Protected spec files and the approval gate that locks them */
|
|
65
|
+
export const PROTECTED_SPEC_FILES = {
|
|
66
|
+
'schema-analysis.md': 'design',
|
|
67
|
+
'spec.md': 'design',
|
|
68
|
+
'contracts.cs': 'design',
|
|
69
|
+
'contracts.ts': 'design',
|
|
70
|
+
'contracts-vsa.cs': 'design',
|
|
71
|
+
'plan.md': 'plan',
|
|
72
|
+
'tasks.md': 'tasks',
|
|
73
|
+
'design-system.md': 'uiux',
|
|
74
|
+
'mockups.md': 'uiux',
|
|
75
|
+
'components.md': 'uiux',
|
|
76
|
+
'flows.md': 'uiux',
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Extract feature name from a .morph/features/{feature}/... path
|
|
81
|
+
* @param {string} filePath - File path to analyze
|
|
82
|
+
* @returns {string|null} Feature name or null
|
|
83
|
+
*/
|
|
84
|
+
export function extractFeatureName(filePath) {
|
|
85
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
86
|
+
const match = normalized.match(/\.morph\/features\/([^/]+)\//);
|
|
87
|
+
return match ? match[1] : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
|
|
92
|
+
* @param {string} filePath - File path to analyze
|
|
93
|
+
* @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
|
|
94
|
+
*/
|
|
95
|
+
export function extractPhaseDir(filePath) {
|
|
96
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
97
|
+
const match = normalized.match(/\.morph\/features\/[^/]+\/(\d+-[^/]+)\//);
|
|
98
|
+
return match ? match[1] : null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if a file path is inside .morph/features/
|
|
103
|
+
* @param {string} filePath
|
|
104
|
+
* @returns {boolean}
|
|
105
|
+
*/
|
|
106
|
+
export function isFeaturePath(filePath) {
|
|
107
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
108
|
+
return normalized.includes('.morph/features/');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Check if a file path is inside .morph/framework/ (readonly)
|
|
113
|
+
* @param {string} filePath
|
|
114
|
+
* @returns {boolean}
|
|
115
|
+
*/
|
|
116
|
+
export function isFrameworkPath(filePath) {
|
|
117
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
118
|
+
return normalized.includes('.morph/framework/');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Check if a file path is state.json
|
|
123
|
+
* @param {string} filePath
|
|
124
|
+
* @returns {boolean}
|
|
125
|
+
*/
|
|
126
|
+
export function isStatePath(filePath) {
|
|
127
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
128
|
+
return normalized.endsWith('.morph/state.json');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get the basename of a file path
|
|
133
|
+
* @param {string} filePath
|
|
134
|
+
* @returns {string}
|
|
135
|
+
*/
|
|
136
|
+
export function getBasename(filePath) {
|
|
137
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
138
|
+
return normalized.split('/').pop();
|
|
139
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.cs"
|
|
4
|
-
- "**/*.csproj"
|
|
5
|
-
stacks:
|
|
6
|
-
- dotnet
|
|
7
|
-
- blazor
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# C# and .NET Standards
|
|
11
|
-
|
|
12
|
-
@.morph/framework/standards/core/coding.md
|
|
13
|
-
@.morph/framework/standards/backend/dotnet/core.md
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cs"
|
|
4
|
+
- "**/*.csproj"
|
|
5
|
+
stacks:
|
|
6
|
+
- dotnet
|
|
7
|
+
- blazor
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# C# and .NET Standards
|
|
11
|
+
|
|
12
|
+
@.morph/framework/standards/core/coding.md
|
|
13
|
+
@.morph/framework/standards/backend/dotnet/core.md
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.razor"
|
|
4
|
-
- "**/*.css"
|
|
5
|
-
- "**/*.scss"
|
|
6
|
-
stacks:
|
|
7
|
-
- blazor
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Frontend Standards
|
|
11
|
-
|
|
12
|
-
@.morph/framework/standards/frontend/blazor/design-checklist.md
|
|
13
|
-
@.morph/framework/standards/frontend/design-system/naming.md
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.razor"
|
|
4
|
+
- "**/*.css"
|
|
5
|
+
- "**/*.scss"
|
|
6
|
+
stacks:
|
|
7
|
+
- blazor
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Frontend Standards
|
|
11
|
+
|
|
12
|
+
@.morph/framework/standards/frontend/blazor/design-checklist.md
|
|
13
|
+
@.morph/framework/standards/frontend/design-system/naming.md
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.bicep"
|
|
4
|
-
- "**/Dockerfile"
|
|
5
|
-
- "**/docker-compose*.yml"
|
|
6
|
-
- "**/pipelines/**"
|
|
7
|
-
- "**/.github/workflows/**"
|
|
8
|
-
stacks:
|
|
9
|
-
- azure
|
|
10
|
-
- docker
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Infrastructure Standards
|
|
14
|
-
|
|
15
|
-
@.morph/framework/standards/infrastructure/azure/azure.md
|
|
16
|
-
@.morph/framework/standards/infrastructure/docker/easypanel-deploy.md
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.bicep"
|
|
4
|
+
- "**/Dockerfile"
|
|
5
|
+
- "**/docker-compose*.yml"
|
|
6
|
+
- "**/pipelines/**"
|
|
7
|
+
- "**/.github/workflows/**"
|
|
8
|
+
stacks:
|
|
9
|
+
- azure
|
|
10
|
+
- docker
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Infrastructure Standards
|
|
14
|
+
|
|
15
|
+
@.morph/framework/standards/infrastructure/azure/azure.md
|
|
16
|
+
@.morph/framework/standards/infrastructure/docker/easypanel-deploy.md
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "tests/**"
|
|
4
|
-
- "**/*.test.*"
|
|
5
|
-
- "**/*.spec.*"
|
|
6
|
-
- "**/*Tests.cs"
|
|
7
|
-
stacks:
|
|
8
|
-
- dotnet
|
|
9
|
-
- blazor
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Testing Standards
|
|
13
|
-
|
|
14
|
-
@.morph/framework/standards/core/testing.md
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "tests/**"
|
|
4
|
+
- "**/*.test.*"
|
|
5
|
+
- "**/*.spec.*"
|
|
6
|
+
- "**/*Tests.cs"
|
|
7
|
+
stacks:
|
|
8
|
+
- dotnet
|
|
9
|
+
- blazor
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Testing Standards
|
|
13
|
+
|
|
14
|
+
@.morph/framework/standards/core/testing.md
|
|
@@ -22,12 +22,12 @@ allowed-tools: Read, Bash, Glob, Grep, AskUserQuestion
|
|
|
22
22
|
|
|
23
23
|
| Action | Tool | Alternative |
|
|
24
24
|
|--------|------|-------------|
|
|
25
|
-
| Load feature state | **Bash** `
|
|
25
|
+
| Load feature state | **Bash** `morph-spec state get $ARGUMENTS` | — |
|
|
26
26
|
| Read project config | **Read** `.morph/config/config.json` | — |
|
|
27
27
|
| Scan existing code | **Glob** / **Grep** | — |
|
|
28
28
|
| Research libraries | **Context7 MCP** `query_docs()` | **WebSearch** |
|
|
29
29
|
| Ask clarifying questions | **AskUserQuestion** (never plain text) | — |
|
|
30
|
-
| Render proposal template | **Bash** `
|
|
30
|
+
| Render proposal template | **Bash** `morph-spec template render docs/proposal ...` | — |
|
|
31
31
|
|
|
32
32
|
---
|
|
33
33
|
|
|
@@ -49,11 +49,11 @@ Update each to `in_progress` before its step and `completed` after.
|
|
|
49
49
|
|
|
50
50
|
Gather information before generating ideas. This step is what makes morph-aware brainstorming different from generic brainstorming — it grounds your thinking in the actual project state and constraints.
|
|
51
51
|
|
|
52
|
-
1. **Read state** — `
|
|
52
|
+
1. **Read state** — `morph-spec state get $ARGUMENTS` → current phase, active agents, existing outputs, task history
|
|
53
53
|
2. **Read config** — `.morph/config/config.json` → stack, architecture style (VSA vs standard), project name, integrations
|
|
54
54
|
3. **Check architecture** — `cat .morph/config/config.json | grep -A3 architecture` → determines which agents and patterns apply
|
|
55
55
|
4. **Read existing outputs** — proposal.md, spec.md, decisions.md (if they exist from prior work)
|
|
56
|
-
5. **Check active agents** — `
|
|
56
|
+
5. **Check active agents** — `morph-spec dispatch-agents $ARGUMENTS design --table` → which specialists are available
|
|
57
57
|
6. **Scan codebase** — use Glob/Grep to understand existing patterns, domain models, and service boundaries relevant to the feature
|
|
58
58
|
7. **Check MCP tools** — if Context7, GitHub, or other MCPs are available, use them for research
|
|
59
59
|
|
|
@@ -106,7 +106,7 @@ For each approach, document:
|
|
|
106
106
|
|
|
107
107
|
**Phase 0 (Proposal):**
|
|
108
108
|
```bash
|
|
109
|
-
|
|
109
|
+
morph-spec template render docs/proposal ".morph/features/$ARGUMENTS/0-proposal/proposal.md" '{"FEATURE_NAME":"...", "DATE":"..."}'
|
|
110
110
|
```
|
|
111
111
|
Then edit the rendered file to add the brainstorming results.
|
|
112
112
|
|
|
@@ -115,12 +115,12 @@ For each approach, document:
|
|
|
115
115
|
|
|
116
116
|
3. **Update state** (mandatory — do not skip):
|
|
117
117
|
```bash
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
morph-spec state mark-output $ARGUMENTS proposal # Phase 0
|
|
119
|
+
morph-spec state mark-output $ARGUMENTS decisions # Phase 2
|
|
120
120
|
```
|
|
121
121
|
Then verify the output was recorded:
|
|
122
122
|
```bash
|
|
123
|
-
|
|
123
|
+
morph-spec state get $ARGUMENTS
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
---
|
|
@@ -14,9 +14,9 @@ Types: `deploy`, `security`, `seo`, `performance`, `accessibility`, `legal-brazi
|
|
|
14
14
|
## Deploy
|
|
15
15
|
|
|
16
16
|
### MORPH-SPEC Validation (run first)
|
|
17
|
-
- [ ] `
|
|
18
|
-
- [ ] `
|
|
19
|
-
- [ ] `
|
|
17
|
+
- [ ] `morph-spec validate-feature {feature}` — passes with 100% pass rate
|
|
18
|
+
- [ ] `morph-spec approval-status {feature}` — all gates approved (design, plan, tasks)
|
|
19
|
+
- [ ] `morph-spec state get {feature}` — phase is `implement`, all tasks `done`
|
|
20
20
|
- [ ] Recap generated: `.morph/features/{feature}/5-implement/recap.md` exists
|
|
21
21
|
|
|
22
22
|
### Pre-Deploy
|