@polymorphism-tech/morph-spec 4.10.6 → 4.10.8
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 -0
- package/LICENSE +71 -71
- package/README.md +379 -379
- package/bin/morph-spec.js +89 -0
- package/bin/task-manager.js +59 -6
- package/claude-plugin.json +14 -14
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +206 -206
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/blazor-builder.md +13 -0
- package/framework/agents/frontend/css-specialist.md +87 -0
- package/framework/agents/frontend/nextjs-expert.md +13 -0
- package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
- package/framework/agents/frontend/ui-ux-designer.md +80 -10
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/agents.json +2268 -2567
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +10 -5
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/hooks/shared/worktree-helpers.js +30 -8
- 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/README.md +0 -1
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-init/SKILL.md +88 -3
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -471
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -258
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +424 -323
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +2040 -2040
- package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- 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/context/design-system.md +211 -0
- 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/package.json +82 -82
- package/src/commands/agents/agent-metrics.js +174 -0
- package/src/commands/agents/audit-dispatch.js +82 -0
- package/src/commands/agents/detect-agents.js +275 -0
- package/src/commands/agents/dispatch-agents.js +41 -135
- package/src/commands/agents/index.js +13 -4
- package/src/commands/agents/manage-agents.js +352 -0
- package/src/commands/project/doctor.js +59 -0
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/project/update.js +1 -17
- package/src/commands/project/worktree.js +58 -2
- package/src/commands/state/advance-phase.js +11 -3
- 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/core/state/phase-state-machine.js +217 -217
- package/src/core/state/state-manager.js +81 -0
- package/src/lib/agents/agents-manager.js +349 -0
- package/src/lib/agents/metrics-calculator.js +125 -0
- package/src/lib/agents/output-collector.js +75 -0
- package/src/lib/generators/context-generator.js +8 -7
- 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/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/tasks/task-parser.js +94 -3
- 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/checkpoint-persistence.js +39 -0
- package/src/lib/validators/content/content-validator.js +287 -279
- 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/spec-validator.js +2 -2
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/lib/validators/validation-runner.js +20 -0
- package/src/scripts/global-install.js +58 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/scripts/setup-infra.js +1 -17
- package/src/utils/agent-id-mapper.js +11 -0
- package/src/utils/agents-installer.js +40 -8
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/claude-settings-manager.js +1 -1
- package/src/utils/file-copier.js +200 -196
- package/src/utils/hooks-installer.js +556 -739
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/tier-helpers.js +24 -0
- package/src/utils/version-checker.js +175 -175
- package/framework/agents/architecture/po-pm-advisor.md +0 -203
- package/framework/hooks/claude-code/user-prompt/set-terminal-title.js +0 -68
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
|
@@ -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
|
+
}
|
|
@@ -29,6 +29,7 @@ export function parseWorktreeResult(stdout) {
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Build context line(s) to inject based on worktree setup result.
|
|
32
|
+
* Outputs MANDATORY instructions for Claude to work inside the worktree.
|
|
32
33
|
* @param {Object|null} result - Parsed result from parseWorktreeResult
|
|
33
34
|
* @returns {string} Context lines to inject, or '' to skip injection
|
|
34
35
|
*/
|
|
@@ -36,18 +37,39 @@ export function buildWorktreeContextLine(result) {
|
|
|
36
37
|
if (!result) return '';
|
|
37
38
|
if (result.error) return '';
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
40
|
+
const path = result.path;
|
|
41
|
+
const feature = result.feature || '';
|
|
42
42
|
|
|
43
|
-
if (result.alreadyExists) {
|
|
43
|
+
if (result.created || result.alreadyExists) {
|
|
44
44
|
return [
|
|
45
|
-
|
|
46
|
-
`
|
|
47
|
-
`
|
|
48
|
-
` •
|
|
45
|
+
`🪴 WORKTREE ACTIVE — branch: ${result.branch}`,
|
|
46
|
+
` WORKTREE_PATH: ${path}`,
|
|
47
|
+
` MANDATORY: ALL work for feature '${feature}' MUST happen inside the worktree:`,
|
|
48
|
+
` • Bash: run \`cd ${path}\` first (CWD persists for subsequent commands)`,
|
|
49
|
+
` • Read/Write/Edit: use ${path} as base for ALL file paths`,
|
|
50
|
+
` • Glob/Grep: set path parameter to ${path}`,
|
|
51
|
+
` DO NOT write files to the main project directory.`,
|
|
49
52
|
].join('\n');
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
return '';
|
|
53
56
|
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Build worktree context from state metadata (for resume sessions).
|
|
60
|
+
* @param {Object} worktreeMeta - { path, branch } from state.features[name].worktree
|
|
61
|
+
* @param {string} featureName - Feature name
|
|
62
|
+
* @returns {string} Context lines or ''
|
|
63
|
+
*/
|
|
64
|
+
export function buildWorktreeResumeContext(worktreeMeta, featureName) {
|
|
65
|
+
if (!worktreeMeta?.path) return '';
|
|
66
|
+
return [
|
|
67
|
+
`🪴 WORKTREE ACTIVE — branch: ${worktreeMeta.branch}`,
|
|
68
|
+
` WORKTREE_PATH: ${worktreeMeta.path}`,
|
|
69
|
+
` MANDATORY: ALL work for feature '${featureName}' MUST happen inside the worktree:`,
|
|
70
|
+
` • Bash: run \`cd ${worktreeMeta.path}\` first (CWD persists for subsequent commands)`,
|
|
71
|
+
` • Read/Write/Edit: use ${worktreeMeta.path} as base for ALL file paths`,
|
|
72
|
+
` • Glob/Grep: set path parameter to ${worktreeMeta.path}`,
|
|
73
|
+
` DO NOT write files to the main project directory.`,
|
|
74
|
+
].join('\n');
|
|
75
|
+
}
|
|
@@ -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
|
|
@@ -17,7 +17,6 @@ Each skill is a directory: `{name}/SKILL.md` + optional `scripts/`, `references/
|
|
|
17
17
|
| `verification-before-completion` | Gate check before marking any work done |
|
|
18
18
|
| `code-review` | .NET/C# review checklist (naming, arch, async, DI, DTOs) |
|
|
19
19
|
| `morph-replicate` | Convert HTML prototypes to Blazor components |
|
|
20
|
-
| `terminal-title` | Manually override the terminal window title for the current task |
|
|
21
20
|
|
|
22
21
|
### level-0-meta extras
|
|
23
22
|
|
|
@@ -33,6 +33,18 @@ allowed-tools: Read, Bash, Glob, Grep, AskUserQuestion
|
|
|
33
33
|
|
|
34
34
|
## Workflow
|
|
35
35
|
|
|
36
|
+
### Step 0: Create session tasks
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
TaskCreate: "Explore project context" → activeForm: "Exploring context"
|
|
40
|
+
TaskCreate: "Ask clarifying questions" → activeForm: "Asking questions"
|
|
41
|
+
TaskCreate: "Propose 2-3 approaches" → activeForm: "Analyzing approaches"
|
|
42
|
+
TaskCreate: "Present design" → activeForm: "Presenting design"
|
|
43
|
+
TaskCreate: "Document recommendation" → activeForm: "Documenting"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Update each to `in_progress` before its step and `completed` after.
|
|
47
|
+
|
|
36
48
|
### Step 1: Explore Context
|
|
37
49
|
|
|
38
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.
|