@polymorphism-tech/morph-spec 4.10.7 → 4.10.9

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.
Files changed (123) hide show
  1. package/CLAUDE.md +3 -3
  2. package/LICENSE +71 -71
  3. package/README.md +379 -379
  4. package/bin/morph-spec.js +1 -1
  5. package/claude-plugin.json +14 -14
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +206 -206
  8. package/framework/agents/README.md +14 -14
  9. package/framework/agents/architecture/standards-architect.md +159 -159
  10. package/framework/agents/frontend/blazor-builder.md +13 -0
  11. package/framework/agents/frontend/css-specialist.md +87 -0
  12. package/framework/agents/frontend/nextjs-expert.md +13 -0
  13. package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
  14. package/framework/agents/frontend/ui-ux-designer.md +80 -10
  15. package/framework/agents/infrastructure/azure-architect.md +149 -149
  16. package/framework/agents/infrastructure/infra-architect.md +48 -48
  17. package/framework/agents.json +2268 -2204
  18. package/framework/hooks/README.md +204 -204
  19. package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
  20. package/framework/hooks/shared/phase-utils.js +139 -139
  21. package/framework/hooks/shared/worktree-helpers.js +30 -8
  22. package/framework/rules/csharp-standards.md +13 -13
  23. package/framework/rules/frontend-standards.md +13 -13
  24. package/framework/rules/infrastructure-standards.md +16 -16
  25. package/framework/rules/testing-standards.md +14 -14
  26. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
  27. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
  28. package/framework/skills/level-0-meta/morph-init/SKILL.md +136 -3
  29. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
  30. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
  31. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
  32. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -500
  33. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
  34. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -262
  35. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
  36. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +457 -323
  37. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  38. package/framework/standards/STANDARDS.json +2040 -2040
  39. package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
  40. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
  41. package/framework/templates/README.md +814 -814
  42. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
  43. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
  44. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
  45. package/framework/templates/code/dotnet/contracts/README.md +74 -74
  46. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
  47. package/framework/templates/code/dotnet/frontend/component.razor +239 -239
  48. package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
  49. package/framework/templates/code/dotnet/jobs/job.cs +171 -171
  50. package/framework/templates/code/dotnet/test.cs +239 -239
  51. package/framework/templates/code/sql/rls-policy.sql +57 -57
  52. package/framework/templates/code/sql/supabase-migration.sql +100 -100
  53. package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
  54. package/framework/templates/code/typescript/contracts.ts +168 -168
  55. package/framework/templates/context/CONTEXT.md +181 -181
  56. package/framework/templates/context/design-system.md +211 -0
  57. package/framework/templates/docs/proposal.md +182 -182
  58. package/framework/templates/docs/user-stories.md +34 -34
  59. package/framework/templates/examples/design-system-examples.md +357 -357
  60. package/framework/templates/examples/spec-examples.md +90 -90
  61. package/framework/templates/feature/decisions.md +187 -187
  62. package/framework/templates/feature/recap.md +146 -146
  63. package/framework/templates/feature/tasks.md +199 -199
  64. package/framework/templates/infrastructure/azure/README.md +286 -286
  65. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
  66. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
  67. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
  68. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
  69. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
  70. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  71. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  72. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
  73. package/package.json +82 -82
  74. package/src/commands/agents/index.js +13 -13
  75. package/src/commands/project/install-plugin-cmd.js +28 -28
  76. package/src/commands/project/setup-infra-cmd.js +12 -12
  77. package/src/commands/project/worktree.js +58 -2
  78. package/src/commands/tasks/index.js +4 -4
  79. package/src/commands/templates/index.js +5 -5
  80. package/src/commands/utils/index.js +3 -3
  81. package/src/commands/validation/index.js +4 -4
  82. package/src/core/state/phase-state-machine.js +217 -217
  83. package/src/lib/detectors/design-system-detector.js +73 -31
  84. package/src/lib/generators/design-system-generator.js +298 -298
  85. package/src/lib/generators/index.js +10 -10
  86. package/src/lib/generators/metadata-extractor.js +387 -387
  87. package/src/lib/stack-filter.js +65 -65
  88. package/src/lib/standards/index.js +7 -7
  89. package/src/lib/standards/standards-context-injector.js +302 -302
  90. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  91. package/src/lib/validators/architecture/index.js +7 -7
  92. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  93. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  94. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  95. package/src/lib/validators/blazor/index.js +9 -9
  96. package/src/lib/validators/content/content-validator.js +287 -287
  97. package/src/lib/validators/content/index.js +7 -7
  98. package/src/lib/validators/contracts/index.js +7 -7
  99. package/src/lib/validators/css/css-validator.js +352 -352
  100. package/src/lib/validators/css/index.js +7 -7
  101. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  102. package/src/lib/validators/design-system/index.js +7 -7
  103. package/src/lib/validators/nextjs/index.js +6 -6
  104. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  105. package/src/lib/validators/packages/index.js +7 -7
  106. package/src/lib/validators/packages/package-validator.js +360 -360
  107. package/src/lib/validators/shared/index.js +12 -12
  108. package/src/lib/validators/shared/issue-counter.js +18 -18
  109. package/src/lib/validators/shared/result-formatter.js +124 -124
  110. package/src/lib/validators/ui/index.js +7 -7
  111. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  112. package/src/scripts/global-install.js +58 -58
  113. package/src/scripts/install-plugin.js +126 -126
  114. package/src/utils/claude-md-injector.js +90 -90
  115. package/src/utils/file-copier.js +200 -196
  116. package/src/utils/hooks-installer.js +556 -494
  117. package/src/utils/logger.js +32 -32
  118. package/src/utils/skills-installer.js +178 -178
  119. package/src/utils/version-checker.js +175 -175
  120. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  121. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  122. package/framework/templates/.idea/morph-templates.xml +0 -92
  123. 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
- if (result.created) {
40
- return `ðŸŠī Worktree created: Working in .worktrees/${result.feature || ''} on branch ${result.branch}`;
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
- `⚠ïļ Existing worktree found for feature '${result.feature}': ${result.path} (branch: ${result.branch})`,
46
- ` Use AskUserQuestion to ask: "resume existing worktree or start fresh (--fresh)?"`,
47
- ` â€Ē Resume: continue in existing worktree (no change)`,
48
- ` â€Ē Fresh: run \`morph-spec worktree setup ${result.feature} --fresh\``
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
@@ -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.