@codeyam/codeyam-cli 0.1.0-staging.25a2014 → 0.1.0-staging.26dc674
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/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +5 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +10 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +19 -15
- package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
- package/analyzer-template/project/analyzeFileEntities.ts +26 -0
- package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
- package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
- package/codeyam-cli/src/cli.js +15 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +9 -9
- package/codeyam-cli/src/commands/editor.js +981 -344
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +1 -0
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +1274 -33
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +70 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +71 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +233 -1
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +16 -1
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
- package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +57 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +41 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
- package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
- package/codeyam-cli/src/utils/analysisRunner.js +8 -6
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +8 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +277 -37
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorGuard.js +36 -0
- package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
- package/codeyam-cli/src/utils/editorRecapture.js +109 -0
- package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +24 -2
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarios.js +65 -6
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.js +31 -3
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
- package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +5 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +6 -3
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
- package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +4 -1
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -1
- package/codeyam-cli/src/utils/scenariosManifest.js +28 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -1
- package/codeyam-cli/src/utils/screenshotHash.js +26 -0
- package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +9 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +68 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +123 -21
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
- package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +22 -1
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-CJzc4vOH.svg} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DODLxLcw.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dx-h1rJK.js +130 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-NTuLi4Xg.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-CUobbQdQ.js → entity._sha.scenarios._scenarioId.dev-BA5L8bU-.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-C6eeL24i.js → entity._sha.scenarios._scenarioId.fullscreen-D4dmRgvO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-BrPXT1iR.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-5025e428.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{root-DB3O9_9j.js → root-BCx1S8Z3.js} +26 -13
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-C1kjC9UJ.js +13 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-CEaDhUiv.js → index-C91yWWCI.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{init-DA7guOrE.js → init-Dkas-RUS.js} +2 -2
- package/codeyam-cli/src/webserver/build/server/assets/server-build-pulXLTrG.js +640 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/idleDetector.js +41 -8
- package/codeyam-cli/src/webserver/idleDetector.js.map +1 -1
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +53 -0
- package/codeyam-cli/src/webserver/server.js +52 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +141 -27
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +2 -0
- package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
- package/codeyam-cli/templates/editor-step-hook.py +93 -46
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +19 -1
- package/package.json +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +4 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +3 -2
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +1 -1
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadEntity.js +5 -5
- package/packages/database/src/lib/loadEntity.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-B7xQ9Sjy.js +0 -58
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CxmrE6AF.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/globals-fAqOD9ex.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-5d53342d.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-DcJSnBCE.js +0 -13
- package/codeyam-cli/src/webserver/build/server/assets/server-build-juyiY2m6.js +0 -551
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysisRunner.js","sourceRoot":"","sources":["../../../../src/utils/analysisRunner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"analysisRunner.js","sourceRoot":"","sources":["../../../../src/utils/analysisRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,8 @@ export function analyzerExists(projectSlug) {
|
|
|
76
76
|
export async function createAnalyzer(projectSlug) {
|
|
77
77
|
const templatePath = getAnalyzerTemplatePath();
|
|
78
78
|
const analyzerPath = getAnalyzerPath(projectSlug);
|
|
79
|
+
const startTime = Date.now();
|
|
80
|
+
const elapsed = () => `${((Date.now() - startTime) / 1000).toFixed(1)}s`;
|
|
79
81
|
// Verify template exists
|
|
80
82
|
if (!fsSync.existsSync(templatePath)) {
|
|
81
83
|
throw new Error(`Analyzer template not found at ${templatePath}. Did the build process complete successfully?`);
|
|
@@ -83,19 +85,24 @@ export async function createAnalyzer(projectSlug) {
|
|
|
83
85
|
// Create parent directory
|
|
84
86
|
await fs.mkdir(path.dirname(analyzerPath), { recursive: true });
|
|
85
87
|
// Copy template to analyzer location using rsync (handles symlinks properly)
|
|
88
|
+
console.log(`[createAnalyzer] Starting rsync: ${templatePath} → ${analyzerPath}`);
|
|
86
89
|
await rsyncCopy({
|
|
87
90
|
sourcePath: templatePath,
|
|
88
91
|
destinationPath: analyzerPath,
|
|
89
92
|
silent: true,
|
|
90
93
|
});
|
|
94
|
+
console.log(`[createAnalyzer] rsync completed (${elapsed()})`);
|
|
91
95
|
// Build the analyzer if dist/ doesn't exist (rsync from template won't include it)
|
|
92
96
|
if (!fsSync.existsSync(path.join(analyzerPath, 'dist'))) {
|
|
97
|
+
console.log(`[createAnalyzer] dist/ not found, running npm install + build`);
|
|
93
98
|
execSync('npm install --include=dev && npm run build', {
|
|
94
99
|
cwd: analyzerPath,
|
|
95
100
|
stdio: 'pipe',
|
|
96
101
|
timeout: 300000,
|
|
97
102
|
});
|
|
103
|
+
console.log(`[createAnalyzer] npm install + build completed (${elapsed()})`);
|
|
98
104
|
}
|
|
105
|
+
console.log(`[createAnalyzer] Done (${elapsed()})`);
|
|
99
106
|
}
|
|
100
107
|
/**
|
|
101
108
|
* Run the analyzer start process
|
|
@@ -235,6 +242,7 @@ export async function ensureFreshAnalyzer(projectSlug, progress) {
|
|
|
235
242
|
if (!freshnessCheck.isFresh) {
|
|
236
243
|
progress.update(`Updating analyzer (${freshnessCheck.reason})...`);
|
|
237
244
|
await createAnalyzer(projectSlug);
|
|
245
|
+
progress.update('Analyzer updated');
|
|
238
246
|
}
|
|
239
247
|
}
|
|
240
248
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../../src/utils/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,kCAAkC,EAClC,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,uDAAuD,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAgB,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,eAAe,IAAI,sBAAsB,EACzC,cAAc,IAAI,qBAAqB,EACvC,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D;;GAEG;AAEH;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAC7C,CAAC;gBACF,IAAI,WAAW,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;oBAChD,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;QACH,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,kEAAkE;IAClE,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,kDAAkD;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,sBAAsB,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../../src/utils/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Cross-references glossary entries against registered scenarios (components)
|
|
5
5
|
* and test files (functions) to detect gaps Claude may have missed.
|
|
6
6
|
*/
|
|
7
|
+
import { isIsolationUrl, } from "./entityChangeStatus.js";
|
|
7
8
|
// ─── Logic ───────────────────────────────────────────────────────────
|
|
8
9
|
const COMPONENT_RETURN_PATTERNS = ['JSX', 'React', 'Element', 'ReactNode'];
|
|
9
10
|
/**
|
|
@@ -39,14 +40,25 @@ export function classifyGlossaryEntries(entries) {
|
|
|
39
40
|
* @param scenarioCounts - Map of component_name → number of registered scenarios
|
|
40
41
|
* @param testFileExistence - Map of testFile path → whether the file exists on disk
|
|
41
42
|
*/
|
|
42
|
-
export function computeAudit({ components, functions, scenarioCounts, testFileExistence, testResults, clientErrors, }) {
|
|
43
|
+
export function computeAudit({ components, functions, scenarioCounts, testFileExistence, testResults, clientErrors, totalScenarioCounts, entityChangeStatus, }) {
|
|
43
44
|
const componentResults = components.map((c) => {
|
|
44
45
|
const count = scenarioCounts[c.name] || 0;
|
|
46
|
+
const totalCount = totalScenarioCounts?.[c.name] || 0;
|
|
47
|
+
const changeStatus = entityChangeStatus?.[c.name];
|
|
45
48
|
const errors = clientErrors?.[c.name];
|
|
46
49
|
const hasErrors = count > 0 && errors && errors.length > 0;
|
|
47
50
|
let status;
|
|
48
51
|
if (count === 0) {
|
|
49
|
-
|
|
52
|
+
// Entities with existing scenarios from prior sessions don't need
|
|
53
|
+
// new scenarios — they need recapture. This applies to both "edited"
|
|
54
|
+
// and "impacted" entities: an edited page may not have been re-registered
|
|
55
|
+
// this session, and an impacted page's dependency changed.
|
|
56
|
+
if (changeStatus && totalCount > 0) {
|
|
57
|
+
status = 'needs_recapture';
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
status = 'missing';
|
|
61
|
+
}
|
|
50
62
|
}
|
|
51
63
|
else if (hasErrors) {
|
|
52
64
|
status = 'has_errors';
|
|
@@ -54,12 +66,27 @@ export function computeAudit({ components, functions, scenarioCounts, testFileEx
|
|
|
54
66
|
else {
|
|
55
67
|
status = 'ok';
|
|
56
68
|
}
|
|
69
|
+
// Generate actionable hint for missing components
|
|
70
|
+
let hint;
|
|
71
|
+
if (status === 'missing') {
|
|
72
|
+
const fileName = c.filePath.split('/').pop() || '';
|
|
73
|
+
if (fileName === 'layout.tsx' || fileName === 'layout.ts') {
|
|
74
|
+
hint = `This is a layout file — register an app-level scenario with pageFilePath instead of componentName: codeyam editor register '{"name":"${c.name} - Default","pageFilePath":"${c.filePath}","url":"/<route>","dimensions":["Desktop"]}'`;
|
|
75
|
+
}
|
|
76
|
+
else if (fileName === 'page.tsx' || fileName === 'page.ts') {
|
|
77
|
+
hint = `This is a page file — register an app-level scenario with pageFilePath: codeyam editor register '{"name":"${c.name} - Default","pageFilePath":"${c.filePath}","url":"/<route>","dimensions":["Desktop"]}'`;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
hint = `Register a component scenario via an isolation route: codeyam editor isolate ${c.name} then codeyam editor register '{"name":"${c.name} - Default","componentName":"${c.name}","url":"/isolated-components/${c.name}?s=Default","dimensions":["Desktop"]}'`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
57
83
|
return {
|
|
58
84
|
name: c.name,
|
|
59
85
|
filePath: c.filePath,
|
|
60
|
-
scenarioCount: count,
|
|
86
|
+
scenarioCount: status === 'needs_recapture' ? totalCount : count,
|
|
61
87
|
status,
|
|
62
88
|
...(hasErrors ? { clientErrors: errors } : {}),
|
|
89
|
+
...(hint ? { hint } : {}),
|
|
63
90
|
};
|
|
64
91
|
});
|
|
65
92
|
const functionResults = functions.map((f) => {
|
|
@@ -67,12 +94,17 @@ export function computeAudit({ components, functions, scenarioCounts, testFileEx
|
|
|
67
94
|
? (testFileExistence[f.testFile] ?? false)
|
|
68
95
|
: false;
|
|
69
96
|
if (!exists) {
|
|
97
|
+
// Suggest conventional test file path when testFile isn't in the glossary
|
|
98
|
+
const suggestedTestFile = !f.testFile
|
|
99
|
+
? f.filePath.replace(/\.tsx?$/, '.test.ts')
|
|
100
|
+
: undefined;
|
|
70
101
|
return {
|
|
71
102
|
name: f.name,
|
|
72
103
|
filePath: f.filePath,
|
|
73
104
|
testFile: f.testFile,
|
|
74
105
|
testFileExists: false,
|
|
75
106
|
status: 'missing',
|
|
107
|
+
...(suggestedTestFile ? { suggestedTestFile } : {}),
|
|
76
108
|
};
|
|
77
109
|
}
|
|
78
110
|
// If we have test results for this file, use them for deeper status
|
|
@@ -111,9 +143,10 @@ export function computeAudit({ components, functions, scenarioCounts, testFileEx
|
|
|
111
143
|
...(tr.errorMessage ? { errorMessage: tr.errorMessage } : {}),
|
|
112
144
|
};
|
|
113
145
|
});
|
|
114
|
-
const componentsOk = componentResults.filter((c) => c.status === 'ok').length;
|
|
146
|
+
const componentsOk = componentResults.filter((c) => c.status === 'ok' || c.status === 'needs_recapture').length;
|
|
115
147
|
const componentsWithErrors = componentResults.filter((c) => c.status === 'has_errors').length;
|
|
116
148
|
const componentsMissing = componentResults.filter((c) => c.status === 'missing').length;
|
|
149
|
+
const componentsNeedingRecapture = componentResults.filter((c) => c.status === 'needs_recapture').length;
|
|
117
150
|
const functionsOk = functionResults.filter((f) => f.status === 'ok').length;
|
|
118
151
|
const functionsFailing = functionResults.filter((f) => f.status === 'failing').length;
|
|
119
152
|
const functionsRunnerError = functionResults.filter((f) => f.status === 'runner_error').length;
|
|
@@ -127,6 +160,7 @@ export function computeAudit({ components, functions, scenarioCounts, testFileEx
|
|
|
127
160
|
componentsOk,
|
|
128
161
|
componentsMissing,
|
|
129
162
|
componentsWithErrors,
|
|
163
|
+
componentsNeedingRecapture,
|
|
130
164
|
totalFunctions: functionResults.length,
|
|
131
165
|
functionsOk,
|
|
132
166
|
functionsMissing,
|
|
@@ -143,21 +177,62 @@ export function computeAudit({ components, functions, scenarioCounts, testFileEx
|
|
|
143
177
|
};
|
|
144
178
|
}
|
|
145
179
|
/**
|
|
146
|
-
* Returns true when the audit failure can be auto-fixed
|
|
147
|
-
*
|
|
148
|
-
*
|
|
180
|
+
* Returns true when the audit failure can be auto-fixed inline.
|
|
181
|
+
*
|
|
182
|
+
* Always returns false — full analyze-imports takes minutes on large projects
|
|
183
|
+
* and must never run as part of the audit. The audit only does lightweight
|
|
184
|
+
* entity SHA backfill. Users should run `codeyam editor analyze-imports`
|
|
185
|
+
* separately if incomplete entities persist.
|
|
149
186
|
*/
|
|
150
|
-
export function isAutoRemediable(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
187
|
+
export function isAutoRemediable(_summary, _alreadyAttempted) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Generate clear, actionable guidance for an incomplete entity.
|
|
192
|
+
*
|
|
193
|
+
* Tells Claude exactly what's wrong, whether it's pre-existing, and
|
|
194
|
+
* the exact command to fix it — no guessing required.
|
|
195
|
+
*/
|
|
196
|
+
export function formatIncompleteEntityGuidance(entity) {
|
|
197
|
+
const parts = [];
|
|
198
|
+
if (entity.preExisting) {
|
|
199
|
+
parts.push(`${entity.name}: ${entity.scenarioCount} scenario(s) without import graph (pre-existing issue, not from this session).`);
|
|
200
|
+
parts.push(`This is non-blocking — the entity had scenarios before this session but analyze-imports was never run for it.`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
parts.push(`${entity.name}: ${entity.scenarioCount} scenario(s) without import graph — analyze-imports has not been run for this entity.`);
|
|
204
|
+
parts.push(`The entity has scenarios registered but its import graph is not built, so the editor cannot track its dependencies.`);
|
|
205
|
+
}
|
|
206
|
+
parts.push(`Fix: Run \`codeyam editor analyze-imports\` to build the import graph for all entities.`);
|
|
207
|
+
return parts.join(' ');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Resolve incomplete entity SHAs to their source file paths.
|
|
211
|
+
*
|
|
212
|
+
* Used by the audit to run targeted analysis on just the files that need it,
|
|
213
|
+
* instead of scanning all 117+ project files. Returns deduplicated file paths.
|
|
214
|
+
*/
|
|
215
|
+
export async function getIncompleteEntityFilePaths(db, incompleteEntities) {
|
|
216
|
+
if (incompleteEntities.length === 0)
|
|
217
|
+
return [];
|
|
218
|
+
const shas = incompleteEntities.map((e) => e.entitySha);
|
|
219
|
+
const rows = await db
|
|
220
|
+
.selectFrom('entities')
|
|
221
|
+
.select('file_path')
|
|
222
|
+
.where('sha', 'in', shas)
|
|
223
|
+
.execute();
|
|
224
|
+
const paths = new Set();
|
|
225
|
+
for (const row of rows) {
|
|
226
|
+
if (row.file_path)
|
|
227
|
+
paths.add(row.file_path);
|
|
228
|
+
}
|
|
229
|
+
return [...paths];
|
|
156
230
|
}
|
|
157
231
|
/**
|
|
158
|
-
* Returns true when
|
|
159
|
-
*
|
|
160
|
-
*
|
|
232
|
+
* Returns true when the only audit failures are auto-fixable entity issues
|
|
233
|
+
* (incompleteEntities and/or unassociatedScenarios) — all other failure
|
|
234
|
+
* counts are zero. Used to decide whether auto-running analyze-imports +
|
|
235
|
+
* entity SHA sync can fix the audit without manual intervention.
|
|
161
236
|
*/
|
|
162
237
|
export function isOnlyIncompleteEntities(summary) {
|
|
163
238
|
return ((summary.componentsMissing ?? 0) === 0 &&
|
|
@@ -169,6 +244,49 @@ export function isOnlyIncompleteEntities(summary) {
|
|
|
169
244
|
(summary.miscategorizedScenarios ?? 0) === 0 &&
|
|
170
245
|
(summary.scenariosNeedingRecapture ?? 0) === 0);
|
|
171
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Returns true when the only audit failures are incomplete entities that ALL
|
|
249
|
+
* existed before the current session. Used by the step gate to avoid blocking
|
|
250
|
+
* progress on pre-existing issues the user didn't cause.
|
|
251
|
+
*
|
|
252
|
+
* Requires both the summary (to confirm no other failure types) and the
|
|
253
|
+
* incompleteEntities array (to verify every entry is pre-existing).
|
|
254
|
+
*/
|
|
255
|
+
export function isOnlyPreExistingIncomplete(summary, incompleteEntities) {
|
|
256
|
+
// Must have at least one incomplete entity to be relevant
|
|
257
|
+
if (!incompleteEntities || incompleteEntities.length === 0)
|
|
258
|
+
return false;
|
|
259
|
+
// All other failure types must be zero
|
|
260
|
+
if (!isOnlyIncompleteEntities(summary))
|
|
261
|
+
return false;
|
|
262
|
+
// Every incomplete entity must be pre-existing
|
|
263
|
+
return incompleteEntities.every((e) => e.preExisting);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Filter a list of file paths to only those that need analysis.
|
|
267
|
+
*
|
|
268
|
+
* A file is excluded if ANY entity at that file path has an analysis
|
|
269
|
+
* record (direct or inherited from a sibling version with the same
|
|
270
|
+
* name+filePath). Everything else passes through.
|
|
271
|
+
*
|
|
272
|
+
* Used by handleAnalyzeImports to avoid re-analyzing ~120 files when
|
|
273
|
+
* only a few need it.
|
|
274
|
+
*/
|
|
275
|
+
export async function filterToIncompleteFilePaths(db, _projectId, allFilePaths) {
|
|
276
|
+
if (allFilePaths.length === 0)
|
|
277
|
+
return [];
|
|
278
|
+
// Single query: find all file paths that have at least one entity
|
|
279
|
+
// with an analysis record. These are already analyzed and can be skipped.
|
|
280
|
+
const analyzedRows = await db
|
|
281
|
+
.selectFrom('entities')
|
|
282
|
+
.innerJoin('analyses', 'analyses.entity_sha', 'entities.sha')
|
|
283
|
+
.select('entities.file_path')
|
|
284
|
+
.where('entities.file_path', 'in', allFilePaths)
|
|
285
|
+
.groupBy('entities.file_path')
|
|
286
|
+
.execute();
|
|
287
|
+
const analyzedFilePaths = new Set(analyzedRows.map((r) => r.file_path));
|
|
288
|
+
return allFilePaths.filter((fp) => !analyzedFilePaths.has(fp));
|
|
289
|
+
}
|
|
172
290
|
/**
|
|
173
291
|
* Ensures the two audit filters — glossary scoping and scenario-count scoping —
|
|
174
292
|
* are consistent. When entityChangeStatus is empty/undefined (meaning the glossary
|
|
@@ -215,22 +333,15 @@ export function filterGlossaryByChangeStatus(entries, entityChangeStatus) {
|
|
|
215
333
|
*/
|
|
216
334
|
export async function queryIncompleteEntities(db, projectId, featureStartedAt) {
|
|
217
335
|
// Step 1: Get distinct entity SHAs from scenarios (with counts)
|
|
218
|
-
|
|
336
|
+
// No time filter — we check ALL scenarios to catch entities whose
|
|
337
|
+
// scenario SHAs were updated mid-session without touching updated_at.
|
|
338
|
+
const scenarioQuery = db
|
|
219
339
|
.selectFrom('editor_scenarios')
|
|
220
340
|
.select(['entity_sha'])
|
|
221
341
|
.select(db.fn.count('id').as('count'))
|
|
222
342
|
.where('project_id', '=', projectId)
|
|
223
343
|
.where('entity_sha', 'is not', null)
|
|
224
344
|
.groupBy('entity_sha');
|
|
225
|
-
if (featureStartedAt) {
|
|
226
|
-
const sqliteTimestamp = featureStartedAt
|
|
227
|
-
.replace('T', ' ')
|
|
228
|
-
.replace(/\.\d{3}Z$/, '');
|
|
229
|
-
scenarioQuery = scenarioQuery.where((eb) => eb.or([
|
|
230
|
-
eb('created_at', '>=', sqliteTimestamp),
|
|
231
|
-
eb('updated_at', '>=', sqliteTimestamp),
|
|
232
|
-
]));
|
|
233
|
-
}
|
|
234
345
|
const scenarioRows = await scenarioQuery.execute();
|
|
235
346
|
if (scenarioRows.length === 0)
|
|
236
347
|
return [];
|
|
@@ -259,24 +370,41 @@ export async function queryIncompleteEntities(db, projectId, featureStartedAt) {
|
|
|
259
370
|
// A new entity version (created by the file watcher) may not have direct
|
|
260
371
|
// analyses, but an older version (same name+filePath) might. This matches
|
|
261
372
|
// getAllEntities() behavior which inherits analyses across versions.
|
|
262
|
-
|
|
263
|
-
|
|
373
|
+
// IMPORTANT: Must match by name+filePath, not name alone. When a component
|
|
374
|
+
// is extracted to a new file, the old version (different filePath) may have
|
|
375
|
+
// analyses but getAllEntities() won't inherit across different file paths.
|
|
376
|
+
const entityFilePathMap = new Map(entityRows.map((r) => [r.sha, r.file_path]));
|
|
377
|
+
const entityKeys = [
|
|
378
|
+
...new Set(entityRows
|
|
379
|
+
.map((r) => `${r.name}::${r.file_path}`)
|
|
380
|
+
.filter((k) => !k.startsWith('::') && !k.endsWith('::'))),
|
|
264
381
|
];
|
|
265
|
-
let
|
|
266
|
-
if (
|
|
382
|
+
let keysWithInheritedAnalyses = new Set();
|
|
383
|
+
if (entityKeys.length > 0) {
|
|
384
|
+
// We need to find entities that share name+filePath AND have analyses.
|
|
385
|
+
// Since Kysely doesn't support WHERE (name || '::' || file_path) IN (...),
|
|
386
|
+
// query by the entity names and filter by filePath in JS.
|
|
387
|
+
const entityNames = [
|
|
388
|
+
...new Set(entityRows.map((r) => r.name).filter(Boolean)),
|
|
389
|
+
];
|
|
267
390
|
const siblingRows = await db
|
|
268
391
|
.selectFrom('entities')
|
|
269
392
|
.innerJoin('analyses', 'analyses.entity_sha', 'entities.sha')
|
|
270
|
-
.select('entities.name')
|
|
393
|
+
.select(['entities.name', 'entities.file_path'])
|
|
271
394
|
.where('entities.name', 'in', entityNames)
|
|
272
|
-
.groupBy('entities.name')
|
|
395
|
+
.groupBy(['entities.name', 'entities.file_path'])
|
|
273
396
|
.execute();
|
|
274
|
-
|
|
397
|
+
keysWithInheritedAnalyses = new Set(siblingRows.map((r) => `${r.name}::${r.file_path}`));
|
|
275
398
|
}
|
|
276
|
-
// Filter out entities that have inherited analyses
|
|
399
|
+
// Filter out entities that have inherited analyses (same name+filePath)
|
|
277
400
|
const trulyIncompleteShas = incompleteShas.filter((r) => {
|
|
278
|
-
const
|
|
279
|
-
|
|
401
|
+
const sha = r.entity_sha;
|
|
402
|
+
const name = entityNameMap.get(sha);
|
|
403
|
+
const filePath = entityFilePathMap.get(sha);
|
|
404
|
+
if (!name)
|
|
405
|
+
return false; // No entity record (phantom SHA) — skip, not fixable by analysis
|
|
406
|
+
const key = `${name}::${filePath}`;
|
|
407
|
+
return !keysWithInheritedAnalyses.has(key);
|
|
280
408
|
});
|
|
281
409
|
if (trulyIncompleteShas.length === 0)
|
|
282
410
|
return [];
|
|
@@ -294,12 +422,34 @@ export async function queryIncompleteEntities(db, projectId, featureStartedAt) {
|
|
|
294
422
|
r.entity_sha,
|
|
295
423
|
r.component_name,
|
|
296
424
|
]));
|
|
425
|
+
// Step 6: Determine preExisting flag — if featureStartedAt is provided,
|
|
426
|
+
// check which entity SHAs have at least one scenario created/updated
|
|
427
|
+
// during the session. Those without any are pre-existing issues.
|
|
428
|
+
let sessionShas = new Set();
|
|
429
|
+
if (featureStartedAt) {
|
|
430
|
+
const sqliteTimestamp = featureStartedAt
|
|
431
|
+
.replace('T', ' ')
|
|
432
|
+
.replace(/\.\d{3}Z$/, '');
|
|
433
|
+
const sessionRows = await db
|
|
434
|
+
.selectFrom('editor_scenarios')
|
|
435
|
+
.select('entity_sha')
|
|
436
|
+
.where('project_id', '=', projectId)
|
|
437
|
+
.where('entity_sha', 'in', trulyIncompleteShalist)
|
|
438
|
+
.where((eb) => eb.or([
|
|
439
|
+
eb('created_at', '>=', sqliteTimestamp),
|
|
440
|
+
eb('updated_at', '>=', sqliteTimestamp),
|
|
441
|
+
]))
|
|
442
|
+
.groupBy('entity_sha')
|
|
443
|
+
.execute();
|
|
444
|
+
sessionShas = new Set(sessionRows.map((r) => r.entity_sha));
|
|
445
|
+
}
|
|
297
446
|
return trulyIncompleteShas.map((r) => {
|
|
298
447
|
const sha = r.entity_sha;
|
|
299
448
|
return {
|
|
300
449
|
entitySha: sha,
|
|
301
450
|
name: entityNameMap.get(sha) || scenarioNameMap.get(sha) || 'Unknown',
|
|
302
451
|
scenarioCount: Number(r.count),
|
|
452
|
+
preExisting: featureStartedAt ? !sessionShas.has(sha) : false,
|
|
303
453
|
};
|
|
304
454
|
});
|
|
305
455
|
}
|
|
@@ -331,7 +481,7 @@ export async function queryMiscategorizedScenarios(db, projectId, featureStarted
|
|
|
331
481
|
}
|
|
332
482
|
const rows = await query.execute();
|
|
333
483
|
// Filter to only rows where URL is NOT an isolation route
|
|
334
|
-
const miscategorized = rows.filter((r) => r.url && !r.url
|
|
484
|
+
const miscategorized = rows.filter((r) => r.url && !isIsolationUrl(r.url));
|
|
335
485
|
if (miscategorized.length === 0)
|
|
336
486
|
return [];
|
|
337
487
|
// Group by (component_name, url)
|
|
@@ -420,6 +570,96 @@ export async function queryPageScenarioCounts(db, projectId, featureStartedAt) {
|
|
|
420
570
|
}
|
|
421
571
|
return counts;
|
|
422
572
|
}
|
|
573
|
+
// ─── Unassociated Scenarios ───────────────────────────────────────────
|
|
574
|
+
/**
|
|
575
|
+
* Find scenarios with NULL entity_sha that have a file path
|
|
576
|
+
* (component_path or page_file_path). These scenarios were registered
|
|
577
|
+
* before entity records existed in the DB — typically because a subagent
|
|
578
|
+
* registered scenarios without running analyze-imports first.
|
|
579
|
+
*
|
|
580
|
+
* Fix: run `codeyam editor analyze-imports` to create entity records,
|
|
581
|
+
* then entity_sha backfill will associate them automatically.
|
|
582
|
+
*
|
|
583
|
+
* Optionally scoped to the current feature session via featureStartedAt.
|
|
584
|
+
*/
|
|
585
|
+
export async function queryUnassociatedScenarios(db, projectId, featureStartedAt) {
|
|
586
|
+
let query = db
|
|
587
|
+
.selectFrom('editor_scenarios')
|
|
588
|
+
.select(['component_name', 'component_path', 'page_file_path', 'name'])
|
|
589
|
+
.where('project_id', '=', projectId)
|
|
590
|
+
.where('entity_sha', 'is', null)
|
|
591
|
+
.where((eb) => eb.or([
|
|
592
|
+
eb('component_path', 'is not', null),
|
|
593
|
+
eb('page_file_path', 'is not', null),
|
|
594
|
+
]));
|
|
595
|
+
if (featureStartedAt) {
|
|
596
|
+
const sqliteTimestamp = featureStartedAt
|
|
597
|
+
.replace('T', ' ')
|
|
598
|
+
.replace(/\.\d{3}Z$/, '');
|
|
599
|
+
query = query.where((eb) => eb.or([
|
|
600
|
+
eb('created_at', '>=', sqliteTimestamp),
|
|
601
|
+
eb('updated_at', '>=', sqliteTimestamp),
|
|
602
|
+
]));
|
|
603
|
+
}
|
|
604
|
+
const rows = await query.execute();
|
|
605
|
+
if (rows.length === 0)
|
|
606
|
+
return [];
|
|
607
|
+
// Group by file path (component_path or page_file_path)
|
|
608
|
+
const groups = new Map();
|
|
609
|
+
for (const row of rows) {
|
|
610
|
+
const r = row;
|
|
611
|
+
const filePath = r.component_path || r.page_file_path;
|
|
612
|
+
const existing = groups.get(filePath);
|
|
613
|
+
if (existing) {
|
|
614
|
+
existing.scenarioNames.push(r.name);
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
// Derive a display name: use component_name if available,
|
|
618
|
+
// otherwise extract from file path (e.g., "src/lib/LibraryApp.tsx" → "LibraryApp")
|
|
619
|
+
const displayName = r.component_name ||
|
|
620
|
+
filePath
|
|
621
|
+
.split('/')
|
|
622
|
+
.pop()
|
|
623
|
+
?.replace(/\.\w+$/, '') ||
|
|
624
|
+
filePath;
|
|
625
|
+
groups.set(filePath, {
|
|
626
|
+
name: displayName,
|
|
627
|
+
filePath,
|
|
628
|
+
scenarioNames: [r.name],
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return [...groups.values()].map((g) => ({
|
|
633
|
+
name: g.name,
|
|
634
|
+
filePath: g.filePath,
|
|
635
|
+
scenarioCount: g.scenarioNames.length,
|
|
636
|
+
scenarioNames: g.scenarioNames,
|
|
637
|
+
}));
|
|
638
|
+
}
|
|
639
|
+
// ─── Duplicate Name Detection ─────────────────────────────────────────
|
|
640
|
+
/**
|
|
641
|
+
* Detect glossary entries that share the same `name`.
|
|
642
|
+
*
|
|
643
|
+
* Returns a Map of name → entries[] for names that appear more than once.
|
|
644
|
+
* Single-occurrence names are excluded. Used to warn Claude that ambiguous
|
|
645
|
+
* names will make audit output confusing (e.g., three entries all named "Page").
|
|
646
|
+
*/
|
|
647
|
+
export function detectDuplicateNames(entries) {
|
|
648
|
+
const groups = new Map();
|
|
649
|
+
for (const entry of entries) {
|
|
650
|
+
const existing = groups.get(entry.name);
|
|
651
|
+
if (existing)
|
|
652
|
+
existing.push(entry);
|
|
653
|
+
else
|
|
654
|
+
groups.set(entry.name, [entry]);
|
|
655
|
+
}
|
|
656
|
+
// Only return groups with duplicates
|
|
657
|
+
for (const [name, group] of groups) {
|
|
658
|
+
if (group.length <= 1)
|
|
659
|
+
groups.delete(name);
|
|
660
|
+
}
|
|
661
|
+
return groups;
|
|
662
|
+
}
|
|
423
663
|
/**
|
|
424
664
|
* Identify scenarios that need recapture because their entity (or an entity
|
|
425
665
|
* in their dependency tree) has changed.
|