@polymorphism-tech/morph-spec 3.0.0 → 3.0.1
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 +75 -371
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -529
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/prompt-engineer.md +189 -189
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/seo-growth-hacker.md +320 -320
- package/content/.claude/skills/{infra → level-2-domains/infrastructure}/azure-deploy-specialist.md +699 -699
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +7 -5
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -480
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -426
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/README.md +79 -79
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/templates.md +418 -418
- package/package.json +1 -2
- package/scripts/postinstall.js +132 -132
- package/scripts/reorganize-skills.cjs +175 -0
- package/scripts/validate-agents-structure.cjs +52 -0
- package/scripts/validate-skills.cjs +180 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -780
- package/src/commands/detect-agents.js +9 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +334 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/update.js +13 -1
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-generator.js +298 -298
- package/{detectors → src/lib/detectors}/config-detector.js +223 -223
- package/{detectors → src/lib/detectors}/conversation-analyzer.js +163 -163
- package/{detectors → src/lib/detectors}/index.js +84 -84
- package/{detectors → src/lib/detectors}/standards-generator.js +275 -275
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/state-manager.js +21 -4
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/{detectors → src/lib/detectors}/structure-detector.js +0 -0
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Troubleshoot Index Search
|
|
3
|
-
* Searches the troubleshooting-index.json for matching problems
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { readFileSync, existsSync } from 'fs';
|
|
7
|
-
import { join, dirname } from 'path';
|
|
8
|
-
import { fileURLToPath } from 'url';
|
|
9
|
-
|
|
10
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
-
const __dirname = dirname(__filename);
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Load the troubleshooting index
|
|
15
|
-
* @returns {Object} The index object or null if not found
|
|
16
|
-
*/
|
|
17
|
-
export function loadIndex() {
|
|
18
|
-
const indexPath = join(__dirname, '../../framework/index/troubleshooting-index.json');
|
|
19
|
-
|
|
20
|
-
if (!existsSync(indexPath)) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const content = readFileSync(indexPath, 'utf-8');
|
|
26
|
-
return JSON.parse(content);
|
|
27
|
-
} catch (error) {
|
|
28
|
-
console.error('Error loading troubleshooting index:', error.message);
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Calculate relevance score for a problem based on keywords
|
|
35
|
-
* @param {Object} problem - The problem object from index
|
|
36
|
-
* @param {string[]} searchTerms - Search terms from user
|
|
37
|
-
* @returns {number} Relevance score (higher is better)
|
|
38
|
-
*/
|
|
39
|
-
function calculateScore(problem, searchTerms) {
|
|
40
|
-
let score = 0;
|
|
41
|
-
const searchLower = searchTerms.map(t => t.toLowerCase());
|
|
42
|
-
|
|
43
|
-
// Check keywords
|
|
44
|
-
for (const keyword of problem.keywords) {
|
|
45
|
-
const keywordLower = keyword.toLowerCase();
|
|
46
|
-
for (const term of searchLower) {
|
|
47
|
-
if (keywordLower.includes(term) || term.includes(keywordLower)) {
|
|
48
|
-
score += 10;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Check title
|
|
54
|
-
const titleLower = problem.title.toLowerCase();
|
|
55
|
-
for (const term of searchLower) {
|
|
56
|
-
if (titleLower.includes(term)) {
|
|
57
|
-
score += 5;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Check error pattern (regex match on search string)
|
|
62
|
-
if (problem.errorPattern) {
|
|
63
|
-
try {
|
|
64
|
-
const regex = new RegExp(problem.errorPattern, 'i');
|
|
65
|
-
const searchString = searchTerms.join(' ');
|
|
66
|
-
if (regex.test(searchString)) {
|
|
67
|
-
score += 20; // High score for error pattern match
|
|
68
|
-
}
|
|
69
|
-
} catch (e) {
|
|
70
|
-
// Invalid regex, skip
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Boost critical severity
|
|
75
|
-
if (problem.severity === 'critical') {
|
|
76
|
-
score *= 1.2;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return score;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Search the index for problems matching the keywords
|
|
84
|
-
* @param {string[]} keywords - Search keywords
|
|
85
|
-
* @param {Object} options - Search options
|
|
86
|
-
* @param {string} options.category - Filter by category
|
|
87
|
-
* @returns {Object[]} Array of matching problems with scores
|
|
88
|
-
*/
|
|
89
|
-
export function searchIndex(keywords, options = {}) {
|
|
90
|
-
const index = loadIndex();
|
|
91
|
-
|
|
92
|
-
if (!index || !index.problems) {
|
|
93
|
-
return [];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
let problems = index.problems;
|
|
97
|
-
|
|
98
|
-
// Filter by category if specified
|
|
99
|
-
if (options.category) {
|
|
100
|
-
problems = problems.filter(p => p.category === options.category);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Score and filter problems
|
|
104
|
-
const results = problems
|
|
105
|
-
.map(problem => ({
|
|
106
|
-
...problem,
|
|
107
|
-
score: calculateScore(problem, keywords)
|
|
108
|
-
}))
|
|
109
|
-
.filter(p => p.score > 0)
|
|
110
|
-
.sort((a, b) => b.score - a.score);
|
|
111
|
-
|
|
112
|
-
return results;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Get all categories from the index
|
|
117
|
-
* @returns {Object} Categories object
|
|
118
|
-
*/
|
|
119
|
-
export function getCategories() {
|
|
120
|
-
const index = loadIndex();
|
|
121
|
-
return index?.categories || {};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Get a specific problem by ID
|
|
126
|
-
* @param {string} id - Problem ID
|
|
127
|
-
* @returns {Object|null} Problem object or null
|
|
128
|
-
*/
|
|
129
|
-
export function getProblemById(id) {
|
|
130
|
-
const index = loadIndex();
|
|
131
|
-
|
|
132
|
-
if (!index || !index.problems) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return index.problems.find(p => p.id === id) || null;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export default {
|
|
140
|
-
loadIndex,
|
|
141
|
-
searchIndex,
|
|
142
|
-
getCategories,
|
|
143
|
-
getProblemById
|
|
144
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Troubleshoot Index Search
|
|
3
|
+
* Searches the troubleshooting-index.json for matching problems
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Load the troubleshooting index
|
|
15
|
+
* @returns {Object} The index object or null if not found
|
|
16
|
+
*/
|
|
17
|
+
export function loadIndex() {
|
|
18
|
+
const indexPath = join(__dirname, '../../framework/index/troubleshooting-index.json');
|
|
19
|
+
|
|
20
|
+
if (!existsSync(indexPath)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const content = readFileSync(indexPath, 'utf-8');
|
|
26
|
+
return JSON.parse(content);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error('Error loading troubleshooting index:', error.message);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Calculate relevance score for a problem based on keywords
|
|
35
|
+
* @param {Object} problem - The problem object from index
|
|
36
|
+
* @param {string[]} searchTerms - Search terms from user
|
|
37
|
+
* @returns {number} Relevance score (higher is better)
|
|
38
|
+
*/
|
|
39
|
+
function calculateScore(problem, searchTerms) {
|
|
40
|
+
let score = 0;
|
|
41
|
+
const searchLower = searchTerms.map(t => t.toLowerCase());
|
|
42
|
+
|
|
43
|
+
// Check keywords
|
|
44
|
+
for (const keyword of problem.keywords) {
|
|
45
|
+
const keywordLower = keyword.toLowerCase();
|
|
46
|
+
for (const term of searchLower) {
|
|
47
|
+
if (keywordLower.includes(term) || term.includes(keywordLower)) {
|
|
48
|
+
score += 10;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Check title
|
|
54
|
+
const titleLower = problem.title.toLowerCase();
|
|
55
|
+
for (const term of searchLower) {
|
|
56
|
+
if (titleLower.includes(term)) {
|
|
57
|
+
score += 5;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Check error pattern (regex match on search string)
|
|
62
|
+
if (problem.errorPattern) {
|
|
63
|
+
try {
|
|
64
|
+
const regex = new RegExp(problem.errorPattern, 'i');
|
|
65
|
+
const searchString = searchTerms.join(' ');
|
|
66
|
+
if (regex.test(searchString)) {
|
|
67
|
+
score += 20; // High score for error pattern match
|
|
68
|
+
}
|
|
69
|
+
} catch (e) {
|
|
70
|
+
// Invalid regex, skip
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Boost critical severity
|
|
75
|
+
if (problem.severity === 'critical') {
|
|
76
|
+
score *= 1.2;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return score;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Search the index for problems matching the keywords
|
|
84
|
+
* @param {string[]} keywords - Search keywords
|
|
85
|
+
* @param {Object} options - Search options
|
|
86
|
+
* @param {string} options.category - Filter by category
|
|
87
|
+
* @returns {Object[]} Array of matching problems with scores
|
|
88
|
+
*/
|
|
89
|
+
export function searchIndex(keywords, options = {}) {
|
|
90
|
+
const index = loadIndex();
|
|
91
|
+
|
|
92
|
+
if (!index || !index.problems) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let problems = index.problems;
|
|
97
|
+
|
|
98
|
+
// Filter by category if specified
|
|
99
|
+
if (options.category) {
|
|
100
|
+
problems = problems.filter(p => p.category === options.category);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Score and filter problems
|
|
104
|
+
const results = problems
|
|
105
|
+
.map(problem => ({
|
|
106
|
+
...problem,
|
|
107
|
+
score: calculateScore(problem, keywords)
|
|
108
|
+
}))
|
|
109
|
+
.filter(p => p.score > 0)
|
|
110
|
+
.sort((a, b) => b.score - a.score);
|
|
111
|
+
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get all categories from the index
|
|
117
|
+
* @returns {Object} Categories object
|
|
118
|
+
*/
|
|
119
|
+
export function getCategories() {
|
|
120
|
+
const index = loadIndex();
|
|
121
|
+
return index?.categories || {};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get a specific problem by ID
|
|
126
|
+
* @param {string} id - Problem ID
|
|
127
|
+
* @returns {Object|null} Problem object or null
|
|
128
|
+
*/
|
|
129
|
+
export function getProblemById(id) {
|
|
130
|
+
const index = loadIndex();
|
|
131
|
+
|
|
132
|
+
if (!index || !index.problems) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return index.problems.find(p => p.id === id) || null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export default {
|
|
140
|
+
loadIndex,
|
|
141
|
+
searchIndex,
|
|
142
|
+
getCategories,
|
|
143
|
+
getProblemById
|
|
144
|
+
};
|