@polymorphism-tech/morph-spec 4.7.0 → 4.7.2

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 (232) hide show
  1. package/.morph/.morphversion +5 -0
  2. package/.morph/analytics/threads-log.jsonl +5 -0
  3. package/.morph/config/config.json +8 -0
  4. package/.morph/framework/agents.json +1815 -0
  5. package/.morph/framework/hooks/README.md +205 -0
  6. package/.morph/framework/hooks/claude-code/notification/approval-reminder.js +54 -0
  7. package/.morph/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  8. package/.morph/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  9. package/.morph/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  10. package/.morph/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  11. package/.morph/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  12. package/.morph/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  13. package/.morph/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  14. package/.morph/framework/hooks/claude-code/statusline.py +538 -0
  15. package/.morph/framework/hooks/claude-code/statusline.sh +7 -0
  16. package/.morph/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  17. package/.morph/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  18. package/.morph/framework/hooks/git/commit-msg/conventional-commits.sh +33 -0
  19. package/.morph/framework/hooks/git/pre-commit/agents.sh +25 -0
  20. package/.morph/framework/hooks/git/pre-commit/orchestrator.sh +64 -0
  21. package/.morph/framework/hooks/git/pre-commit/specs.sh +50 -0
  22. package/.morph/framework/hooks/git/pre-push/run-tests.sh +44 -0
  23. package/.morph/framework/hooks/shared/hook-response.js +45 -0
  24. package/.morph/framework/hooks/shared/phase-utils.js +129 -0
  25. package/.morph/framework/hooks/shared/state-reader.js +138 -0
  26. package/.morph/framework/hooks/shared/stdin-reader.js +26 -0
  27. package/.morph/framework/standards/STANDARDS.json +933 -0
  28. package/.morph/framework/standards/ai-agents/blazor-ui.md +364 -0
  29. package/.morph/framework/standards/ai-agents/production.md +415 -0
  30. package/.morph/framework/standards/ai-agents/setup.md +418 -0
  31. package/.morph/framework/standards/ai-agents/team-orchestration.md +479 -0
  32. package/.morph/framework/standards/ai-agents/workflows.md +354 -0
  33. package/.morph/framework/standards/architecture/ddd/aggregates.md +120 -0
  34. package/.morph/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  35. package/.morph/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  36. package/.morph/framework/standards/architecture/ddd/entities.md +99 -0
  37. package/.morph/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  38. package/.morph/framework/standards/architecture/ddd/value-objects.md +124 -0
  39. package/.morph/framework/standards/backend/api/minimal-api.md +494 -0
  40. package/.morph/framework/standards/backend/api/rest.md +492 -0
  41. package/.morph/framework/standards/backend/api/validation.md +88 -0
  42. package/.morph/framework/standards/backend/authentication/passkeys.md +428 -0
  43. package/.morph/framework/standards/backend/database/ef-core.md +199 -0
  44. package/.morph/framework/standards/backend/database/migrations.md +393 -0
  45. package/.morph/framework/standards/backend/database/postgresql/database.md +352 -0
  46. package/.morph/framework/standards/backend/database/repository-patterns.md +528 -0
  47. package/.morph/framework/standards/backend/database/vector-search-rag.md +541 -0
  48. package/.morph/framework/standards/backend/dotnet/async.md +366 -0
  49. package/.morph/framework/standards/backend/dotnet/core.md +117 -0
  50. package/.morph/framework/standards/backend/dotnet/di.md +439 -0
  51. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +92 -0
  52. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +216 -0
  53. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +290 -0
  54. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +350 -0
  55. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +385 -0
  56. package/.morph/framework/standards/context/analytics.md +96 -0
  57. package/.morph/framework/standards/context/bundles.md +110 -0
  58. package/.morph/framework/standards/context/priming.md +78 -0
  59. package/.morph/framework/standards/core/architecture.md +185 -0
  60. package/.morph/framework/standards/core/coding.md +214 -0
  61. package/.morph/framework/standards/core/git-branching-strategy.md +403 -0
  62. package/.morph/framework/standards/core/git.md +185 -0
  63. package/.morph/framework/standards/core/testing.md +295 -0
  64. package/.morph/framework/standards/data/nosql/blob-storage.md +102 -0
  65. package/.morph/framework/standards/data/nosql/cache/redis.md +97 -0
  66. package/.morph/framework/standards/data/nosql/cosmos-db.md +118 -0
  67. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +121 -0
  68. package/.morph/framework/standards/data/vector-search/rag-chunking.md +104 -0
  69. package/.morph/framework/standards/frontend/blazor/design-checklist.md +222 -0
  70. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +595 -0
  71. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +137 -0
  72. package/.morph/framework/standards/frontend/blazor/html-conversion.md +184 -0
  73. package/.morph/framework/standards/frontend/blazor/lifecycle.md +195 -0
  74. package/.morph/framework/standards/frontend/blazor/pitfalls.md +198 -0
  75. package/.morph/framework/standards/frontend/blazor/state.md +191 -0
  76. package/.morph/framework/standards/frontend/design-system/animations.md +151 -0
  77. package/.morph/framework/standards/frontend/design-system/naming.md +64 -0
  78. package/.morph/framework/standards/frontend/nextjs/app-router.md +123 -0
  79. package/.morph/framework/standards/frontend/nextjs/components.md +132 -0
  80. package/.morph/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  81. package/.morph/framework/standards/frontend/nextjs/forms.md +128 -0
  82. package/.morph/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  83. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +215 -0
  84. package/.morph/framework/standards/frontend/nextjs/project-structure.md +102 -0
  85. package/.morph/framework/standards/frontend/nextjs/state-management.md +72 -0
  86. package/.morph/framework/standards/frontend/nextjs/testing.md +111 -0
  87. package/.morph/framework/standards/infrastructure/azure/azure.md +624 -0
  88. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +422 -0
  89. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +516 -0
  90. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +520 -0
  91. package/.morph/framework/standards/infrastructure/azure/services/functions.md +486 -0
  92. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +459 -0
  93. package/.morph/framework/standards/infrastructure/azure/services/storage.md +407 -0
  94. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +196 -0
  95. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +252 -0
  96. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +176 -0
  97. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +169 -0
  98. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +184 -0
  99. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +153 -0
  100. package/.morph/framework/standards/integration/api/graphql.md +91 -0
  101. package/.morph/framework/standards/integration/api/grpc.md +114 -0
  102. package/.morph/framework/standards/integration/api/rest-design.md +95 -0
  103. package/.morph/framework/standards/integration/event-driven/cqrs.md +101 -0
  104. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +124 -0
  105. package/.morph/framework/standards/integration/event-driven/service-bus.md +95 -0
  106. package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
  107. package/.morph/framework/standards/observability/logging.md +131 -0
  108. package/.morph/framework/standards/observability/metrics.md +121 -0
  109. package/.morph/framework/standards/observability/monitoring.md +114 -0
  110. package/.morph/framework/standards/observability/tracing.md +132 -0
  111. package/.morph/framework/standards/workflows/parallel-execution.md +112 -0
  112. package/.morph/framework/standards/workflows/thread-management.md +113 -0
  113. package/.morph/framework/templates/.idea/morph-templates.xml +92 -0
  114. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  115. package/.morph/framework/templates/IDE-SNIPPETS.md +266 -0
  116. package/.morph/framework/templates/README.md +814 -0
  117. package/.morph/framework/templates/REGISTRY.json +1888 -0
  118. package/.morph/framework/templates/code/dotnet/backend/repository.cs +141 -0
  119. package/.morph/framework/templates/code/dotnet/backend/service.cs +139 -0
  120. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +74 -0
  121. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +25 -0
  122. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +74 -0
  123. package/.morph/framework/templates/code/dotnet/contracts/README.md +74 -0
  124. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -0
  125. package/.morph/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  126. package/.morph/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  127. package/.morph/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  128. package/.morph/framework/templates/code/dotnet/database/migration.cs +83 -0
  129. package/.morph/framework/templates/code/dotnet/frontend/component.razor +239 -0
  130. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +163 -0
  131. package/.morph/framework/templates/code/dotnet/jobs/job.cs +171 -0
  132. package/.morph/framework/templates/code/dotnet/test.cs +239 -0
  133. package/.morph/framework/templates/code/sql/rls-policy.sql +57 -0
  134. package/.morph/framework/templates/code/sql/supabase-migration.sql +100 -0
  135. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +113 -0
  136. package/.morph/framework/templates/code/typescript/contracts.ts +168 -0
  137. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +276 -0
  138. package/.morph/framework/templates/context/CONTEXT.md +181 -0
  139. package/.morph/framework/templates/docs/clarifications.md +253 -0
  140. package/.morph/framework/templates/docs/onboarding.md +123 -0
  141. package/.morph/framework/templates/docs/proposal.md +182 -0
  142. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  143. package/.morph/framework/templates/docs/spec.md +198 -0
  144. package/.morph/framework/templates/docs/ui-components.md +124 -0
  145. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  146. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  147. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  148. package/.morph/framework/templates/docs/user-stories.md +34 -0
  149. package/.morph/framework/templates/examples/design-system-examples.md +357 -0
  150. package/.morph/framework/templates/examples/spec-examples.md +90 -0
  151. package/.morph/framework/templates/feature/decisions.md +187 -0
  152. package/.morph/framework/templates/feature/recap.md +146 -0
  153. package/.morph/framework/templates/feature/tasks.md +199 -0
  154. package/.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  155. package/.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  156. package/.morph/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  157. package/.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  158. package/.morph/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  159. package/.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  160. package/.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  161. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +82 -0
  162. package/.morph/framework/templates/infrastructure/azure/README.md +286 -0
  163. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +63 -0
  164. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +164 -0
  165. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +49 -0
  166. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +156 -0
  167. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +426 -0
  168. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +229 -0
  169. package/.morph/framework/templates/infrastructure/azure/deploy.sh +208 -0
  170. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +91 -0
  171. package/.morph/framework/templates/infrastructure/azure/main.bicep +189 -0
  172. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +29 -0
  173. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +29 -0
  174. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +29 -0
  175. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +103 -0
  176. package/.morph/framework/templates/infrastructure/azure/storage.bicep +106 -0
  177. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +58 -0
  178. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -0
  179. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -0
  180. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -0
  181. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +54 -0
  182. package/.morph/framework/templates/infrastructure/github/README.md +593 -0
  183. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +22 -0
  184. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -0
  185. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -0
  186. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +61 -0
  187. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +31 -0
  188. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -0
  189. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -0
  190. package/.morph/framework/templates/integrations/asaas-client.cs +387 -0
  191. package/.morph/framework/templates/integrations/asaas-webhook.cs +351 -0
  192. package/.morph/framework/templates/integrations/azure-identity-config.cs +288 -0
  193. package/.morph/framework/templates/integrations/clerk-config.cs +258 -0
  194. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -0
  195. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -0
  196. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +78 -0
  197. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +97 -0
  198. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +36 -0
  199. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -0
  200. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -0
  201. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -0
  202. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +126 -0
  203. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +43 -0
  204. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -0
  205. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -0
  206. package/.morph/framework/templates/project-structure/dotnet-ddd.md +70 -0
  207. package/.morph/framework/templates/saas/subscription.cs +347 -0
  208. package/.morph/framework/templates/saas/tenant.cs +338 -0
  209. package/.morph/framework/templates/state.template.json +17 -0
  210. package/.morph/framework/templates/ui/FluentDesignTheme.cs +149 -0
  211. package/.morph/framework/templates/ui/MudTheme.cs +281 -0
  212. package/.morph/framework/templates/ui/design-system.css +226 -0
  213. package/.morph/logs/tool-failures.log +17 -0
  214. package/.morph/memory/pre-compact-2026-02-24T17-43-30-049Z.json +16 -0
  215. package/.morph/plans/eager-watching-bunny.md +105 -0
  216. package/.morph/plans/temporal-seeking-nebula.md +45 -0
  217. package/.morph/state.json +48 -0
  218. package/CLAUDE.md +1 -1
  219. package/README.md +119 -99
  220. package/bin/morph-spec.js +0 -9
  221. package/framework/CLAUDE.md +1 -1
  222. package/framework/hooks/README.md +10 -6
  223. package/framework/hooks/claude-code/notification/approval-reminder.js +2 -0
  224. package/framework/hooks/claude-code/post-tool-use/dispatch.js +1 -1
  225. package/framework/hooks/claude-code/stop/validate-completion.js +1 -1
  226. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +1 -1
  227. package/package.json +1 -1
  228. package/src/commands/project/init.js +15 -42
  229. package/src/commands/project/update.js +22 -37
  230. package/src/lib/installers/mcp-installer.js +18 -3
  231. package/src/utils/hooks-installer.js +5 -15
  232. package/src/commands/project/detect.js +0 -114
@@ -0,0 +1,113 @@
1
+ # Workflow Standard: Thread Management
2
+
3
+ ## Thread Types
4
+
5
+ | Type | Code | Purpose | Lifecycle |
6
+ |------|------|---------|-----------|
7
+ | Base | B-Thread | Default implementation thread | Bounded by feature phase |
8
+ | Parallel | P-Thread | Concurrent isolated execution | Short (1 task scope) |
9
+ | Fusion | F-Thread | Best-of-N competing implementations | Short (1 prompt scope) |
10
+ | Long-Running | L-Thread | Multi-session persistent work | Days/weeks |
11
+ | Zero-Touch | Z-Thread | Fully autonomous execution | Bounded by trust level |
12
+
13
+ ## Thread Lifecycle
14
+
15
+ ```
16
+ pending → running → completed
17
+ → failed → (retry) → running
18
+ → killed
19
+ ```
20
+
21
+ ## Creating Threads
22
+ ```bash
23
+ # Create a base thread (default)
24
+ morph-spec threads status morph-next-gen
25
+
26
+ # Create parallel threads for feature
27
+ morph-spec spawn-team morph-next-gen --parallel backend,frontend,infra
28
+
29
+ # Create fusion thread
30
+ morph-spec agents fuse \
31
+ --prompt "Implement caching strategy for UserService" \
32
+ --count=3 \
33
+ --strategy=best-of-n \
34
+ --feature=morph-next-gen
35
+ ```
36
+
37
+ ## Thread State in state.json
38
+ ```json
39
+ {
40
+ "threads": {
41
+ "thread-abc12345": {
42
+ "id": "thread-abc12345",
43
+ "type": "parallel",
44
+ "agent": "dotnet-senior",
45
+ "feature": "user-auth",
46
+ "status": "running",
47
+ "startedAt": "2026-02-19T00:00:00Z",
48
+ "events": [
49
+ { "type": "started", "timestamp": "..." },
50
+ { "type": "checkpoint_passed", "timestamp": "...", "checkpointNum": 1 }
51
+ ],
52
+ "metrics": {
53
+ "tasksCompleted": 3,
54
+ "checkpointsPassed": 1,
55
+ "errors": 0
56
+ }
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ ## Parallel Execution Rules (P-Threads)
63
+
64
+ 1. **File scope isolation**: Each P-Thread has exclusive write access to its files
65
+ 2. **No cross-thread dependencies**: P-Thread tasks are self-contained
66
+ 3. **Shared read access**: All P-Threads can read spec.md, standards, contracts
67
+ 4. **Merge on completion**: Coordinator merges results after all P-Threads complete
68
+ 5. **Max concurrent**: Default 3, max 5 (configurable in llm-interaction.json)
69
+
70
+ ## Dependency Analysis
71
+ ```bash
72
+ # Analyze task dependencies for parallel opportunities
73
+ morph-spec detect-workflow morph-next-gen
74
+
75
+ # Output:
76
+ # Parallelizable tasks: T001, T002, T003 (no dependencies)
77
+ # Sequential: T004 (depends on T001), T005 (depends on T002)
78
+ # Execution plan:
79
+ # Wave 1: [T001, T002, T003] (parallel)
80
+ # Wave 2: [T004, T005] (parallel, after wave 1)
81
+ # Wave 3: [T006] (sequential)
82
+ ```
83
+
84
+ ## Long-Running Threads (L-Threads)
85
+
86
+ ### Stop Hooks
87
+ L-Threads run periodic stop hooks every 30 minutes:
88
+ ```json
89
+ // llm-interaction.json
90
+ {
91
+ "stopHooks": {
92
+ "enabled": true,
93
+ "interval": 30,
94
+ "maxRetries": 5,
95
+ "hooks": ["validate-and-continue", "validate-checkpoints"]
96
+ }
97
+ }
98
+ ```
99
+
100
+ ### Resume Pattern
101
+ ```bash
102
+ # Resume L-Thread from bundle
103
+ morph-spec bundle load morph-next-gen
104
+ # Load resume context, continue from checkpoint
105
+ ```
106
+
107
+ ## Monitoring
108
+ ```bash
109
+ morph-spec threads list morph-next-gen
110
+ morph-spec threads analytics morph-next-gen
111
+ morph-spec threads wait-all morph-next-gen
112
+ morph-spec threads wait-any morph-next-gen
113
+ ```
@@ -0,0 +1,92 @@
1
+ <templateSet group="MORPH Templates">
2
+ <template name="morph-pascal" value="{{pascalCase $FEATURE_NAME$}}" description="Convert to PascalCase (UserAuth)" toReformat="false" toShortenFQNames="true">
3
+ <variable name="FEATURE_NAME" expression="" defaultValue="&quot;FEATURE_NAME&quot;" alwaysStopAt="true" />
4
+ <context>
5
+ <option name="OTHER" value="true" />
6
+ </context>
7
+ </template>
8
+
9
+ <template name="morph-camel" value="{{camelCase $FEATURE_NAME$}}" description="Convert to camelCase (userAuth)" toReformat="false" toShortenFQNames="true">
10
+ <variable name="FEATURE_NAME" expression="" defaultValue="&quot;FEATURE_NAME&quot;" alwaysStopAt="true" />
11
+ <context>
12
+ <option name="OTHER" value="true" />
13
+ </context>
14
+ </template>
15
+
16
+ <template name="morph-snake" value="{{snakeCase $FEATURE_NAME$}}" description="Convert to snake_case (user_auth)" toReformat="false" toShortenFQNames="true">
17
+ <variable name="FEATURE_NAME" expression="" defaultValue="&quot;FEATURE_NAME&quot;" alwaysStopAt="true" />
18
+ <context>
19
+ <option name="OTHER" value="true" />
20
+ </context>
21
+ </template>
22
+
23
+ <template name="morph-title" value="{{titleCase $FEATURE_NAME$}}" description="Convert to Title Case (User Auth)" toReformat="false" toShortenFQNames="true">
24
+ <variable name="FEATURE_NAME" expression="" defaultValue="&quot;FEATURE_NAME&quot;" alwaysStopAt="true" />
25
+ <context>
26
+ <option name="OTHER" value="true" />
27
+ </context>
28
+ </template>
29
+
30
+ <template name="morph-kebab" value="{{kebabCase $FEATURE_NAME$}}" description="Convert to kebab-case (user-auth)" toReformat="false" toShortenFQNames="true">
31
+ <variable name="FEATURE_NAME" expression="" defaultValue="&quot;FEATURE_NAME&quot;" alwaysStopAt="true" />
32
+ <context>
33
+ <option name="OTHER" value="true" />
34
+ </context>
35
+ </template>
36
+
37
+ <template name="morph-if" value="{{#if $CONDITION$}}&#10; $END$&#10;{{/if}}" description="Handlebars if block" toReformat="false" toShortenFQNames="true">
38
+ <variable name="CONDITION" expression="" defaultValue="&quot;condition&quot;" alwaysStopAt="true" />
39
+ <context>
40
+ <option name="OTHER" value="true" />
41
+ </context>
42
+ </template>
43
+
44
+ <template name="morph-if-else" value="{{#if $CONDITION$}}&#10; $TRUE_BRANCH$&#10;{{else}}&#10; $FALSE_BRANCH$&#10;{{/if}}" description="Handlebars if-else block" toReformat="false" toShortenFQNames="true">
45
+ <variable name="CONDITION" expression="" defaultValue="&quot;condition&quot;" alwaysStopAt="true" />
46
+ <variable name="TRUE_BRANCH" expression="" defaultValue="&quot;&quot;" alwaysStopAt="true" />
47
+ <variable name="FALSE_BRANCH" expression="" defaultValue="&quot;&quot;" alwaysStopAt="true" />
48
+ <context>
49
+ <option name="OTHER" value="true" />
50
+ </context>
51
+ </template>
52
+
53
+ <template name="morph-each" value="{{#each $ITEMS$}}&#10; {{this.$PROPERTY$}}&#10;{{/each}}" description="Handlebars each loop" toReformat="false" toShortenFQNames="true">
54
+ <variable name="ITEMS" expression="" defaultValue="&quot;items&quot;" alwaysStopAt="true" />
55
+ <variable name="PROPERTY" expression="" defaultValue="&quot;name&quot;" alwaysStopAt="true" />
56
+ <context>
57
+ <option name="OTHER" value="true" />
58
+ </context>
59
+ </template>
60
+
61
+ <template name="morph-service" value="namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services;&#10;&#10;public class {{pascalCase FEATURE_NAME}}Service(&#10; I{{pascalCase FEATURE_NAME}}Repository repository,&#10; ILogger&lt;{{pascalCase FEATURE_NAME}}Service&gt; logger) : I{{pascalCase FEATURE_NAME}}Service&#10;{&#10; public async Task&lt;{{pascalCase FEATURE_NAME}}Dto?&gt; GetByIdAsync(int id, CancellationToken cancellationToken = default)&#10; {&#10; $END$&#10; }&#10;}" description="MORPH .NET Service class template" toReformat="false" toShortenFQNames="true">
62
+ <context>
63
+ <option name="C_SHARP" value="true" />
64
+ </context>
65
+ </template>
66
+
67
+ <template name="morph-repository" value="public class {{pascalCase FEATURE_NAME}}Repository(AppDbContext context) : I{{pascalCase FEATURE_NAME}}Repository&#10;{&#10; private readonly DbSet&lt;{{pascalCase FEATURE_NAME}}&gt; _dbSet = context.Set&lt;{{pascalCase FEATURE_NAME}}&gt;();&#10;&#10; public async Task&lt;{{pascalCase FEATURE_NAME}}?&gt; GetByIdAsync(int id, CancellationToken cancellationToken = default)&#10; {&#10; $END$&#10; }&#10;}" description="MORPH .NET Repository class template" toReformat="false" toShortenFQNames="true">
68
+ <context>
69
+ <option name="C_SHARP" value="true" />
70
+ </context>
71
+ </template>
72
+
73
+ <template name="morph-component" value="@page &quot;/{{kebabCase FEATURE_NAME}}&quot;&#10;@inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service&#10;@inject ILogger&lt;{{pascalCase FEATURE_NAME}}Page&gt; Logger&#10;&#10;&lt;PageTitle&gt;{{pascalCase FEATURE_NAME}}&lt;/PageTitle&gt;&#10;&#10;&lt;div class=&quot;container-fluid&quot;&gt;&#10; $END$&#10;&lt;/div&gt;&#10;&#10;@code {&#10;&#10;}" description="MORPH Blazor component template" toReformat="false" toShortenFQNames="true">
74
+ <context>
75
+ <option name="HTML" value="true" />
76
+ </context>
77
+ </template>
78
+
79
+ <template name="morph-migration" value="public partial class Add{{pascalCase FEATURE_NAME}} : Migration&#10;{&#10; protected override void Up(MigrationBuilder migrationBuilder)&#10; {&#10; migrationBuilder.CreateTable(&#10; name: &quot;{{pascalCase FEATURE_NAME}}s&quot;,&#10; columns: table =&gt; new&#10; {&#10; Id = table.Column&lt;int&gt;(type: &quot;int&quot;, nullable: false)&#10; .Annotation(&quot;SqlServer:Identity&quot;, &quot;1, 1&quot;),&#10; $END$&#10; },&#10; constraints: table =&gt;&#10; {&#10; table.PrimaryKey(&quot;PK_{{pascalCase FEATURE_NAME}}s&quot;, x =&gt; x.Id);&#10; });&#10; }&#10;&#10; protected override void Down(MigrationBuilder migrationBuilder)&#10; {&#10; migrationBuilder.DropTable(name: &quot;{{pascalCase FEATURE_NAME}}s&quot;);&#10; }&#10;}" description="MORPH EF Core migration template" toReformat="false" toShortenFQNames="true">
80
+ <context>
81
+ <option name="C_SHARP" value="true" />
82
+ </context>
83
+ </template>
84
+
85
+ <template name="morph-ts-contract" value="export interface {{pascalCase FEATURE_NAME}} {&#10; id: number;&#10; $FIELD1$&#10;}&#10;&#10;export interface Create{{pascalCase FEATURE_NAME}}Request {&#10; $FIELD2$&#10;}&#10;&#10;export interface Update{{pascalCase FEATURE_NAME}}Request {&#10; $END$&#10;}" description="MORPH TypeScript contract template" toReformat="false" toShortenFQNames="true">
86
+ <variable name="FIELD1" expression="" defaultValue="&quot;&quot;" alwaysStopAt="true" />
87
+ <variable name="FIELD2" expression="" defaultValue="&quot;&quot;" alwaysStopAt="true" />
88
+ <context>
89
+ <option name="TypeScript" value="true" />
90
+ </context>
91
+ </template>
92
+ </templateSet>
@@ -0,0 +1,186 @@
1
+ {
2
+ "MORPH Template - PascalCase": {
3
+ "prefix": "morph-pascal",
4
+ "body": ["{{pascalCase ${1:FEATURE_NAME}}}"],
5
+ "description": "Convert to PascalCase (UserAuth)"
6
+ },
7
+ "MORPH Template - camelCase": {
8
+ "prefix": "morph-camel",
9
+ "body": ["{{camelCase ${1:FEATURE_NAME}}}"],
10
+ "description": "Convert to camelCase (userAuth)"
11
+ },
12
+ "MORPH Template - snake_case": {
13
+ "prefix": "morph-snake",
14
+ "body": ["{{snakeCase ${1:FEATURE_NAME}}}"],
15
+ "description": "Convert to snake_case (user_auth)"
16
+ },
17
+ "MORPH Template - Title Case": {
18
+ "prefix": "morph-title",
19
+ "body": ["{{titleCase ${1:FEATURE_NAME}}}"],
20
+ "description": "Convert to Title Case (User Auth)"
21
+ },
22
+ "MORPH Template - kebab-case": {
23
+ "prefix": "morph-kebab",
24
+ "body": ["{{kebabCase ${1:FEATURE_NAME}}}"],
25
+ "description": "Convert to kebab-case (user-auth)"
26
+ },
27
+ "MORPH Template - UPPER_SNAKE_CASE": {
28
+ "prefix": "morph-upper-snake",
29
+ "body": ["{{upperSnakeCase ${1:FEATURE_NAME}}}"],
30
+ "description": "Convert to UPPER_SNAKE_CASE (USER_AUTH)"
31
+ },
32
+ "MORPH Template - Conditional If": {
33
+ "prefix": "morph-if",
34
+ "body": [
35
+ "{{#if ${1:condition}}}",
36
+ " $2",
37
+ "{{/if}}"
38
+ ],
39
+ "description": "Handlebars if block"
40
+ },
41
+ "MORPH Template - Conditional If-Else": {
42
+ "prefix": "morph-if-else",
43
+ "body": [
44
+ "{{#if ${1:condition}}}",
45
+ " $2",
46
+ "{{else}}",
47
+ " $3",
48
+ "{{/if}}"
49
+ ],
50
+ "description": "Handlebars if-else block"
51
+ },
52
+ "MORPH Template - Each Loop": {
53
+ "prefix": "morph-each",
54
+ "body": [
55
+ "{{#each ${1:items}}}",
56
+ " {{this.$2}}",
57
+ "{{/each}}"
58
+ ],
59
+ "description": "Handlebars each loop"
60
+ },
61
+ "MORPH Template - Unless": {
62
+ "prefix": "morph-unless",
63
+ "body": [
64
+ "{{#unless ${1:condition}}}",
65
+ " $2",
66
+ "{{/unless}}"
67
+ ],
68
+ "description": "Handlebars unless block"
69
+ },
70
+ "MORPH Template - .NET Service Class": {
71
+ "prefix": "morph-service",
72
+ "body": [
73
+ "namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services;",
74
+ "",
75
+ "public class {{pascalCase FEATURE_NAME}}Service(",
76
+ " I{{pascalCase FEATURE_NAME}}Repository repository,",
77
+ " ILogger<{{pascalCase FEATURE_NAME}}Service> logger) : I{{pascalCase FEATURE_NAME}}Service",
78
+ "{",
79
+ " public async Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)",
80
+ " {",
81
+ " $1",
82
+ " }",
83
+ "}"
84
+ ],
85
+ "description": "MORPH .NET Service class template"
86
+ },
87
+ "MORPH Template - .NET Repository Class": {
88
+ "prefix": "morph-repository",
89
+ "body": [
90
+ "public class {{pascalCase FEATURE_NAME}}Repository(AppDbContext context) : I{{pascalCase FEATURE_NAME}}Repository",
91
+ "{",
92
+ " private readonly DbSet<{{pascalCase FEATURE_NAME}}> _dbSet = context.Set<{{pascalCase FEATURE_NAME}}>();",
93
+ "",
94
+ " public async Task<{{pascalCase FEATURE_NAME}}?> GetByIdAsync(int id, CancellationToken cancellationToken = default)",
95
+ " {",
96
+ " $1",
97
+ " }",
98
+ "}"
99
+ ],
100
+ "description": "MORPH .NET Repository class template"
101
+ },
102
+ "MORPH Template - Blazor Component": {
103
+ "prefix": "morph-component",
104
+ "body": [
105
+ "@page \"/{{kebabCase FEATURE_NAME}}\"",
106
+ "@inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service",
107
+ "@inject ILogger<{{pascalCase FEATURE_NAME}}Page> Logger",
108
+ "",
109
+ "<PageTitle>{{pascalCase FEATURE_NAME}}</PageTitle>",
110
+ "",
111
+ "<div class=\"container-fluid\">",
112
+ " $1",
113
+ "</div>",
114
+ "",
115
+ "@code {",
116
+ " $2",
117
+ "}"
118
+ ],
119
+ "description": "MORPH Blazor component template"
120
+ },
121
+ "MORPH Template - EF Core Migration": {
122
+ "prefix": "morph-migration",
123
+ "body": [
124
+ "public partial class Add{{pascalCase FEATURE_NAME}} : Migration",
125
+ "{",
126
+ " protected override void Up(MigrationBuilder migrationBuilder)",
127
+ " {",
128
+ " migrationBuilder.CreateTable(",
129
+ " name: \"{{pascalCase FEATURE_NAME}}s\",",
130
+ " columns: table => new",
131
+ " {",
132
+ " Id = table.Column<int>(type: \"int\", nullable: false)",
133
+ " .Annotation(\"SqlServer:Identity\", \"1, 1\"),",
134
+ " $1",
135
+ " },",
136
+ " constraints: table =>",
137
+ " {",
138
+ " table.PrimaryKey(\"PK_{{pascalCase FEATURE_NAME}}s\", x => x.Id);",
139
+ " });",
140
+ " }",
141
+ "",
142
+ " protected override void Down(MigrationBuilder migrationBuilder)",
143
+ " {",
144
+ " migrationBuilder.DropTable(name: \"{{pascalCase FEATURE_NAME}}s\");",
145
+ " }",
146
+ "}"
147
+ ],
148
+ "description": "MORPH EF Core migration template"
149
+ },
150
+ "MORPH Template - Hangfire Job": {
151
+ "prefix": "morph-job",
152
+ "body": [
153
+ "public class {{pascalCase FEATURE_NAME}}ProcessorJob(",
154
+ " I{{pascalCase FEATURE_NAME}}Service service,",
155
+ " ILogger<{{pascalCase FEATURE_NAME}}ProcessorJob> logger) : I{{pascalCase FEATURE_NAME}}ProcessorJob",
156
+ "{",
157
+ " [AutomaticRetry(Attempts = 3, DelaysInSeconds = new[] { 60, 300, 900 })]",
158
+ " [Queue(\"default\")]",
159
+ " [JobDisplayName(\"{{pascalCase FEATURE_NAME}} Processing - ID: {0}\")]",
160
+ " public async Task ExecuteAsync(int id, CancellationToken cancellationToken)",
161
+ " {",
162
+ " $1",
163
+ " }",
164
+ "}"
165
+ ],
166
+ "description": "MORPH Hangfire job template"
167
+ },
168
+ "MORPH Template - TypeScript Contract": {
169
+ "prefix": "morph-ts-contract",
170
+ "body": [
171
+ "export interface {{pascalCase FEATURE_NAME}} {",
172
+ " id: number;",
173
+ " $1",
174
+ "}",
175
+ "",
176
+ "export interface Create{{pascalCase FEATURE_NAME}}Request {",
177
+ " $2",
178
+ "}",
179
+ "",
180
+ "export interface Update{{pascalCase FEATURE_NAME}}Request {",
181
+ " $3",
182
+ "}"
183
+ ],
184
+ "description": "MORPH TypeScript contract template"
185
+ }
186
+ }
@@ -0,0 +1,266 @@
1
+ # IDE Snippets for MORPH Templates
2
+
3
+ > Boost your productivity with IDE snippets for Handlebars template syntax
4
+
5
+ ---
6
+
7
+ ## 📦 Installation
8
+
9
+ ### VS Code
10
+
11
+ **Option 1: Project Snippets (Recommended)**
12
+
13
+ Snippets are already configured in `framework/templates/.vscode/morph-templates.code-snippets`.
14
+
15
+ To use them:
16
+ 1. Open your project in VS Code
17
+ 2. Snippets auto-activate when editing template files
18
+ 3. Type a prefix (e.g., `morph-pascal`) and press `Tab`
19
+
20
+ **Option 2: Global Snippets**
21
+
22
+ To use snippets across all projects:
23
+ 1. Open VS Code
24
+ 2. Go to `File > Preferences > Configure User Snippets`
25
+ 3. Select `New Global Snippets file...`
26
+ 4. Name it `morph-templates.code-snippets`
27
+ 5. Copy content from `framework/templates/.vscode/morph-templates.code-snippets`
28
+
29
+ ---
30
+
31
+ ### JetBrains IDEs (Rider, WebStorm, IntelliJ IDEA)
32
+
33
+ **Installation:**
34
+
35
+ 1. Open your IDE
36
+ 2. Go to `File > Settings > Editor > Live Templates`
37
+ 3. Click the `⚙️` gear icon → `Import Settings...`
38
+ 4. Select `framework/templates/.idea/morph-templates.xml`
39
+ 5. Click `OK` to import
40
+
41
+ **Activation:**
42
+
43
+ Snippets will be available in the "MORPH Templates" group. Type the prefix and press `Tab`.
44
+
45
+ ---
46
+
47
+ ## 🎯 Available Snippets
48
+
49
+ ### Handlebars Helpers (Case Transformations)
50
+
51
+ | Prefix | Output | Example Result |
52
+ |--------|--------|----------------|
53
+ | `morph-pascal` | `{{pascalCase FEATURE_NAME}}` | `UserAuthentication` |
54
+ | `morph-camel` | `{{camelCase FEATURE_NAME}}` | `userAuthentication` |
55
+ | `morph-snake` | `{{snakeCase FEATURE_NAME}}` | `user_authentication` |
56
+ | `morph-title` | `{{titleCase FEATURE_NAME}}` | `User Authentication` |
57
+ | `morph-kebab` | `{{kebabCase FEATURE_NAME}}` | `user-authentication` |
58
+ | `morph-upper-snake` | `{{upperSnakeCase FEATURE_NAME}}` | `USER_AUTHENTICATION` |
59
+
60
+ ### Handlebars Control Flow
61
+
62
+ | Prefix | Description | Example |
63
+ |--------|-------------|---------|
64
+ | `morph-if` | If block | `{{#if condition}}...{{/if}}` |
65
+ | `morph-if-else` | If-else block | `{{#if condition}}...{{else}}...{{/if}}` |
66
+ | `morph-each` | Loop over array | `{{#each items}}{{this.name}}{{/each}}` |
67
+ | `morph-unless` | Unless block | `{{#unless condition}}...{{/unless}}` |
68
+
69
+ ### .NET Templates
70
+
71
+ | Prefix | Template | File Extension |
72
+ |--------|----------|----------------|
73
+ | `morph-service` | Service class (business logic) | `.cs` |
74
+ | `morph-repository` | Repository class (data access) | `.cs` |
75
+ | `morph-component` | Blazor component | `.razor` |
76
+ | `morph-migration` | EF Core migration | `.cs` |
77
+ | `morph-job` | Hangfire background job | `.cs` |
78
+
79
+ ### TypeScript Templates
80
+
81
+ | Prefix | Template | File Extension |
82
+ |--------|----------|----------------|
83
+ | `morph-ts-contract` | TypeScript interfaces (DTOs) | `.ts` |
84
+
85
+ ---
86
+
87
+ ## 🚀 Usage Examples
88
+
89
+ ### Example 1: Creating a Service Template
90
+
91
+ **Steps:**
92
+ 1. Create new file: `UserService.cs`
93
+ 2. Type `morph-service` → Press `Tab`
94
+ 3. Result:
95
+ ```csharp
96
+ namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services;
97
+
98
+ public class {{pascalCase FEATURE_NAME}}Service(
99
+ I{{pascalCase FEATURE_NAME}}Repository repository,
100
+ ILogger<{{pascalCase FEATURE_NAME}}Service> logger) : I{{pascalCase FEATURE_NAME}}Service
101
+ {
102
+ public async Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
103
+ {
104
+ // Cursor here
105
+ }
106
+ }
107
+ ```
108
+
109
+ ### Example 2: Using Case Helpers
110
+
111
+ **Scenario:** Convert `user-authentication` to different cases
112
+
113
+ ```handlebars
114
+ // Type: morph-pascal → Tab
115
+ {{pascalCase FEATURE_NAME}} // Output: UserAuthentication
116
+
117
+ // Type: morph-camel → Tab
118
+ {{camelCase FEATURE_NAME}} // Output: userAuthentication
119
+
120
+ // Type: morph-snake → Tab
121
+ {{snakeCase FEATURE_NAME}} // Output: user_authentication
122
+ ```
123
+
124
+ ### Example 3: Conditional Rendering
125
+
126
+ **Scenario:** Show different content based on stack
127
+
128
+ ```handlebars
129
+ // Type: morph-if-else → Tab
130
+ {{#if (eq STACK "Blazor")}}
131
+ // Blazor-specific code
132
+ {{else}}
133
+ // Generic code
134
+ {{/if}}
135
+ ```
136
+
137
+ ### Example 4: Looping Over Items
138
+
139
+ **Scenario:** Generate multiple DTOs
140
+
141
+ ```handlebars
142
+ // Type: morph-each → Tab
143
+ {{#each entities}}
144
+ public class {{pascalCase this.name}}Dto
145
+ {
146
+ // Properties
147
+ }
148
+ {{/each}}
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 📝 Customizing Snippets
154
+
155
+ ### VS Code
156
+
157
+ Edit `framework/templates/.vscode/morph-templates.code-snippets`:
158
+
159
+ ```json
160
+ {
161
+ "MORPH Template - Custom": {
162
+ "prefix": "morph-custom",
163
+ "body": [
164
+ "// Your custom template",
165
+ "$1"
166
+ ],
167
+ "description": "Your description"
168
+ }
169
+ }
170
+ ```
171
+
172
+ ### JetBrains IDEs
173
+
174
+ 1. Go to `File > Settings > Editor > Live Templates`
175
+ 2. Select "MORPH Templates" group
176
+ 3. Click `+` → `Live Template`
177
+ 4. Set abbreviation (prefix), description, and template text
178
+
179
+ ---
180
+
181
+ ## 🎨 Snippet Scopes
182
+
183
+ | Snippet | VS Code Scope | JetBrains Scope |
184
+ |---------|---------------|-----------------|
185
+ | Handlebars helpers | All files | All files |
186
+ | .NET templates | `.cs`, `.razor` | C#, HTML |
187
+ | TypeScript templates | `.ts`, `.tsx` | TypeScript |
188
+
189
+ ---
190
+
191
+ ## 💡 Best Practices
192
+
193
+ **1. Use Helpers Over Pre-computed Variables**
194
+
195
+ ```handlebars
196
+ ✅ GOOD: {{pascalCase FEATURE_NAME}}Service
197
+ ❌ BAD: {{FEATURE_NAME_PASCAL}}Service // Deprecated
198
+ ```
199
+
200
+ **2. Chain Helpers for Complex Transformations**
201
+
202
+ ```handlebars
203
+ // Pluralize a PascalCase name
204
+ {{pascalCase (pluralize FEATURE_NAME)}} // Users, Orders, etc.
205
+ ```
206
+
207
+ **3. Use Conditional Blocks for Stack-Specific Code**
208
+
209
+ ```handlebars
210
+ {{#if (eq STACK "Blazor")}}
211
+ @inject NavigationManager Navigation
212
+ {{/if}}
213
+ {{#if (eq STACK "Nextjs")}}
214
+ import { useRouter } from 'next/navigation';
215
+ {{/if}}
216
+ ```
217
+
218
+ **4. Extract Common Patterns to Snippets**
219
+
220
+ If you find yourself typing the same template code repeatedly, create a custom snippet!
221
+
222
+ ---
223
+
224
+ ## 🔧 Troubleshooting
225
+
226
+ ### Snippets Not Showing Up (VS Code)
227
+
228
+ **Solution:**
229
+ 1. Check file extension matches snippet scope (e.g., `.cs` for C# snippets)
230
+ 2. Reload VS Code: `Ctrl+Shift+P` → `Developer: Reload Window`
231
+ 3. Verify snippet file location: `framework/templates/.vscode/morph-templates.code-snippets`
232
+
233
+ ### Snippets Not Showing Up (JetBrains)
234
+
235
+ **Solution:**
236
+ 1. Verify import: `File > Settings > Editor > Live Templates` → Check "MORPH Templates" group exists
237
+ 2. Check snippet scope: Click snippet → Verify "Applicable in" contexts
238
+ 3. Restart IDE
239
+
240
+ ### Tab Not Expanding Snippet
241
+
242
+ **Solution:**
243
+ - **VS Code:** Ensure `editor.tabCompletion` is enabled in settings
244
+ - **JetBrains:** Ensure `Tab` is set as expansion key in `Settings > Editor > Live Templates`
245
+
246
+ ---
247
+
248
+ ## 📚 Related Documentation
249
+
250
+ - [Template System README](framework/templates/README.md) - Complete template system documentation
251
+ - [Handlebars Helpers](framework/templates/README.md#handlebars-helpers) - Full list of available helpers
252
+ - [CLI Template Commands](CLAUDE.md#templates) - Command-line template management
253
+
254
+ ---
255
+
256
+ ## 🎁 Contributing Custom Snippets
257
+
258
+ Have a useful snippet? Share it!
259
+
260
+ 1. Add snippet to appropriate file (`.vscode/` or `.idea/`)
261
+ 2. Document it in this README (add row to tables)
262
+ 3. Submit PR with description of use case
263
+
264
+ ---
265
+
266
+ *MORPH-SPEC Template Snippets by Polymorphism Tech*