@codeyam/codeyam-cli 0.1.10 → 0.1.12
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/package.json +1 -1
- 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/kysely/tables/editorScenariosTable.ts +42 -16
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +44 -16
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +11 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +1214 -217
- 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 +893 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
- package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +6 -3
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +261 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +75 -1
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +441 -17
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +67 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +125 -10
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +40 -1
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +3 -1
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +145 -0
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
- package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
- package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
- package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js +1 -1
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/editorEntityHelpers.js +129 -0
- package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +40 -1
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -1
- package/codeyam-cli/src/utils/editorMigration.js +224 -0
- package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarios.js +163 -2
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +253 -4
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -1
- package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
- package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +19 -2
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +41 -3
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -1
- package/codeyam-cli/src/utils/fileWatcher.js +38 -0
- package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +9 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
- package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +8 -9
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -1
- package/codeyam-cli/src/utils/scenariosManifest.js +18 -10
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +35 -0
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +33 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
- package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
- package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
- package/codeyam-cli/src/webserver/backgroundServer.js +18 -4
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CzTDWkF2.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-BcgbViKV.js → EntityItem-BFbq6iFk.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CQIG2qda.js → EntityTypeIcon-B6OMi58N.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-DuYodzo1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CXo9EeCl.js +25 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DYCNb2It.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BU_OAEMP.js → LoadingDots-By5zI316.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-ceAyBX-H.js → LogViewer-CZgY3sxX.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-BzHcG7SE.js → ReportIssueModal-CnYYwRDw.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CDoF7ZpU.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-TSD3C211.js → ScenarioViewer-DrnfvaLL.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Df3UCi8k.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-DRKR9T0U.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-DLxKhri3.js → _index-ClR-g3tY.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BcY3q6nt.js → activity.(_tab)-DTH6ydEA.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-Duc5hnl7.js → addon-web-links-74hnHF59.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-Bni3iiUj.js → agent-transcripts-B8CYhCO9.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-BYOypzCa.js → book-open-CLaoh4ac.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-C_Pmso5S.js → chevron-down-BZ2DZxbW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-C4pqxYJB.js → chunk-JZWAC4HX-BBXArFPl.js} +13 -21
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BVMi9VA5.js → circle-check-CT4unAk-.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{copy-n2FB0_Sw.js → copy-zK0B6Nu-.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-CC6AbExI.js → createLucideIcon-DJB0YQJL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-CkXFP_i-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor._tab-DPw7NZHc.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DmBK1JBK.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-DBa7T2FK.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-DwCV5__E.js → entity._sha._-BqAN7hyG.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BOi8kpwd.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Dg1NhIms.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CJX6kkkV.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMvVHNXU.js → entity._sha_.edit._scenarioId-BhVjZhKg.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DTvKq3TY.js → entry.client-_gzKltPN.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-CV_17tZS.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-D-YXmMbR.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-CGrDAxj0.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-yHOVb4rc.js → index-Blo6EK8G.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-10oVnAAH.js → index-BsX0F-9C.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-BcvgDzbZ.js → index-CCrgCshv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/labs-Byazq8Pv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-DaAZ_H2w.js → loader-circle-DVQ0oHR7.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-b3f77062.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{memory-9gnxSZlb.js → memory-b-VmA2Vj.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{pause-f5-1lKBt.js → pause-DGcndCAa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{root-BWAyuj0r.js → root-D5Zi3U2Z.js} +4 -4
- package/codeyam-cli/src/webserver/build/client/assets/{search-Di64LWVb.js → search-C0Uw0bcK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-OoNgHIfW.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-Bcemfu8a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-Br7MOqts.js → terminal-BgMmG7R9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BLdiCuG-.js → triangle-alert-Cs87hJYK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BR3Rs7JY.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-C14nCb1q.js → useLastLogLine-BxxP_XF9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-BermyNU5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useToast-a_QN_W9_.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-yTyb36j3.js +13 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-ChX0hPcu.js → index-Cr7d_IsG.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-M_wqNAfu.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-_ybRgrlc.js +551 -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/editorProxy.js +93 -11
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
- package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
- package/codeyam-cli/src/webserver/server.js +9 -0
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +105 -9
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/editor-step-hook.py +104 -20
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +42 -7
- package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +62 -0
- package/package.json +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +44 -16
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-BPXZwM4t.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-g3saevPb.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-DYFW3lDD.js +0 -25
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DLeucoVX.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BED4B6sP.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-C8OKAR5x.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Ii3inc0_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor-COWCNVyV.js +0 -10
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CNB06EIa.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-CXSi2aeZ.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CHMiAog3.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-cPo8LiG3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-BZrlFE1F.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-phvmGvat.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-6134dc40.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-0OrEMU6J.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-DWT-CvLy.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C-_hOl_g.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-O-jkvSPx.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-9FIWuYfK.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-kSNsMjj8.js +0 -10
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Bm2xIhmh.js +0 -439
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { broadcastSetViewport, broadcastPreviewRefresh, } from "../webserver/terminalServer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Broadcast viewport change THEN preview refresh.
|
|
4
|
+
*
|
|
5
|
+
* Order matters: the browser must resize the iframe before it starts
|
|
6
|
+
* reloading, otherwise the content renders at the wrong viewport size.
|
|
7
|
+
* Both the preview endpoint and register endpoint need this sequence.
|
|
8
|
+
*/
|
|
9
|
+
export function broadcastViewportThenRefresh(opts) {
|
|
10
|
+
// 1. Set viewport (only when a named dimension is present)
|
|
11
|
+
if (opts.dimension) {
|
|
12
|
+
try {
|
|
13
|
+
broadcastSetViewport({
|
|
14
|
+
name: opts.dimension,
|
|
15
|
+
width: opts.viewport.width,
|
|
16
|
+
height: opts.viewport.height,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Non-critical — viewport broadcast failure shouldn't block refresh
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// 2. Refresh preview iframe
|
|
24
|
+
broadcastPreviewRefresh(opts.refreshPath, opts.scenarioId);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=editorBroadcastViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorBroadcastViewport.js","sourceRoot":"","sources":["../../../../src/utils/editorBroadcastViewport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAK5C;IACC,2DAA2D;IAC3D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,oBAAoB,CAAC;gBACnB,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAC1B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;aAC7B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI wrapper for deleting a scenario via the editor API.
|
|
3
|
+
*
|
|
4
|
+
* Looks up the scenario name from the editor-scenarios endpoint,
|
|
5
|
+
* then calls the delete-scenario endpoint to remove it.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Delete a scenario by ID via the running editor server.
|
|
9
|
+
*
|
|
10
|
+
* 1. Fetches scenario list to resolve the scenario name (for user feedback)
|
|
11
|
+
* 2. Calls the delete-scenario API
|
|
12
|
+
*/
|
|
13
|
+
export async function deleteScenarioViaCli(scenarioId, port) {
|
|
14
|
+
const baseUrl = `http://localhost:${port}`;
|
|
15
|
+
// Step 1: Look up the scenario to confirm it exists and get its name
|
|
16
|
+
let scenarios;
|
|
17
|
+
try {
|
|
18
|
+
const listRes = await fetch(`${baseUrl}/api/editor-scenarios`);
|
|
19
|
+
if (!listRes.ok) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
message: `Failed to fetch scenarios (HTTP ${listRes.status})`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const data = await listRes.json();
|
|
26
|
+
scenarios = data.scenarios;
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
message: `Could not reach the CodeYam server. Is it running? (${err instanceof Error ? err.message : String(err)})`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const scenario = scenarios.find((s) => s.id === scenarioId);
|
|
35
|
+
if (!scenario) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
message: `Scenario "${scenarioId}" not found. Use \`codeyam editor scenarios\` to list available scenarios.`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Step 2: Delete the scenario
|
|
42
|
+
try {
|
|
43
|
+
const deleteRes = await fetch(`${baseUrl}/api/delete-scenario`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/json' },
|
|
46
|
+
body: JSON.stringify({ scenarioId }),
|
|
47
|
+
});
|
|
48
|
+
if (!deleteRes.ok) {
|
|
49
|
+
return {
|
|
50
|
+
success: false,
|
|
51
|
+
message: `Failed to delete scenario (HTTP ${deleteRes.status})`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
scenarioName: scenario.name,
|
|
57
|
+
message: `Deleted scenario "${scenario.name}" (${scenarioId})`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
message: `Failed to delete scenario: ${err instanceof Error ? err.message : String(err)}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=editorDeleteScenario.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorDeleteScenario.js","sourceRoot":"","sources":["../../../../src/utils/editorDeleteScenario.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,IAAY;IAEZ,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAE3C,qEAAqE;IACrE,IAAI,SAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,uBAAuB,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,mCAAmC,OAAO,CAAC,MAAM,GAAG;aAC9D,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,SAAS,GAAI,IAAwC,CAAC,SAAS,CAAC;IAClE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG;SACpH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,aAAa,UAAU,4EAA4E;SAC7G,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,mCAAmC,SAAS,CAAC,MAAM,GAAG;aAChE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,OAAO,EAAE,qBAAqB,QAAQ,CAAC,IAAI,MAAM,UAAU,GAAG;SAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -15,7 +15,7 @@ import { detectFirstFeature, scanPageFilePaths, } from "./entityChangeStatus.ser
|
|
|
15
15
|
import { buildChangedFilesMap, buildEntityInfosFromScenarios, buildEntityInfosFromGlossary, computeEntityChangeStatus, } from "./entityChangeStatus.js";
|
|
16
16
|
export async function computeEntityChangeStatusForEditor(params) {
|
|
17
17
|
const { projectRoot, scenarioInputs, glossaryInputs } = params;
|
|
18
|
-
const pageFilePaths = scanPageFilePaths(projectRoot);
|
|
18
|
+
const { map: pageFilePaths } = scanPageFilePaths(projectRoot);
|
|
19
19
|
const pageEntityNames = new Set(Object.keys(pageFilePaths));
|
|
20
20
|
const gitFiles = getGitStatusForProject();
|
|
21
21
|
if (gitFiles.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorEntityChangeStatus.js","sourceRoot":"","sources":["../../../../src/utils/editorEntityChangeStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,GAI1B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,MAIxD;IAIC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAC/D,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"editorEntityChangeStatus.js","sourceRoot":"","sources":["../../../../src/utils/editorEntityChangeStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,GAI1B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,MAIxD;IAIC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAC/D,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAEpE,IAAI,oBAAoB,GAAU,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,qBAAqB,EAAE,CAAC;QAC9B,oBAAoB,GAAG,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,MAAM,mBAAmB,GAAG,6BAA6B,CACvD,cAAc,EACd,aAAa,EACb,oBAAoB,CACrB,CAAC;IAEF,IAAI,WAAW,GAAG,mBAAmB,CAAC;IAEtC,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,mBAAmB,GAAG,4BAA4B,CACtD,cAAc,EACd,aAAa,CACd,CAAC;QACF,WAAW,GAAG,CAAC,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,kBAAkB,GAAG,yBAAyB,CAClD,YAAY,EACZ,WAAW,CACZ,CAAC;IACF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helper functions for editor entity operations.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from EditorAppTab and editor.entity.($sha).tsx for testability.
|
|
5
|
+
* No React dependencies — these are plain data transformations.
|
|
6
|
+
*/
|
|
7
|
+
import { pageNameFromUrl, isIsolationUrl } from "./entityChangeStatus.js";
|
|
8
|
+
import { buildRoutePattern, routeDisplayName } from "./routePatternMatching.js";
|
|
9
|
+
/**
|
|
10
|
+
* Group scenarios into page groups and component groups.
|
|
11
|
+
* Page group names come from scenario.displayName (DB) with fallbacks.
|
|
12
|
+
*/
|
|
13
|
+
export function groupScenarios(scenarios) {
|
|
14
|
+
const pages = new Map();
|
|
15
|
+
const components = new Map();
|
|
16
|
+
for (const scenario of scenarios) {
|
|
17
|
+
if (scenario.componentName) {
|
|
18
|
+
const existing = components.get(scenario.componentName) || [];
|
|
19
|
+
existing.push(scenario);
|
|
20
|
+
components.set(scenario.componentName, existing);
|
|
21
|
+
}
|
|
22
|
+
else if (isIsolationUrl(scenario.url)) {
|
|
23
|
+
const match = scenario.url?.match(/[?&]c=([^&]+)/);
|
|
24
|
+
const compName = match ? decodeURIComponent(match[1]) : 'Isolated';
|
|
25
|
+
const existing = components.get(compName) || [];
|
|
26
|
+
existing.push(scenario);
|
|
27
|
+
components.set(compName, existing);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const pageName = scenario.displayName ||
|
|
31
|
+
(scenario.pageFilePath?.startsWith('app/')
|
|
32
|
+
? routeDisplayName(buildRoutePattern(scenario.pageFilePath))
|
|
33
|
+
: pageNameFromUrl(scenario.url));
|
|
34
|
+
const existing = pages.get(pageName) || [];
|
|
35
|
+
existing.push(scenario);
|
|
36
|
+
pages.set(pageName, existing);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const sorted = new Map([...components.entries()].sort(([a], [b]) => a.localeCompare(b)));
|
|
40
|
+
return { pageGroups: pages, componentGroups: sorted };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a map from group display name → entity SHA.
|
|
44
|
+
* Reads entitySha directly from scenarios — no entity table joins.
|
|
45
|
+
*/
|
|
46
|
+
export function buildEntityShaMap(pageGroups, componentGroups) {
|
|
47
|
+
const map = new Map();
|
|
48
|
+
for (const [groupName, groupScenarios] of pageGroups) {
|
|
49
|
+
const sha = groupScenarios.find((s) => s.entitySha)?.entitySha;
|
|
50
|
+
if (sha)
|
|
51
|
+
map.set(groupName, sha);
|
|
52
|
+
}
|
|
53
|
+
for (const [groupName, groupScenarios] of componentGroups) {
|
|
54
|
+
const sha = groupScenarios.find((s) => s.entitySha)?.entitySha;
|
|
55
|
+
if (sha)
|
|
56
|
+
map.set(groupName, sha);
|
|
57
|
+
}
|
|
58
|
+
return map;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if an entity SHA represents a fully analyzed entity.
|
|
62
|
+
*/
|
|
63
|
+
export function isEntityComplete(sha, analyzedShas, allEntities, entityNamesWithImports) {
|
|
64
|
+
if (analyzedShas.has(sha))
|
|
65
|
+
return true;
|
|
66
|
+
const entity = allEntities.find((e) => e.sha === sha);
|
|
67
|
+
return entity ? entityNamesWithImports.has(entity.name) : false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Find entities that are missing or incomplete across all groups.
|
|
71
|
+
*/
|
|
72
|
+
export function findBrokenEntities(pageGroups, componentGroups, entityShaMap, isComplete) {
|
|
73
|
+
const broken = [];
|
|
74
|
+
for (const [groupName, groupScenarios] of pageGroups) {
|
|
75
|
+
const sha = entityShaMap.get(groupName);
|
|
76
|
+
if (!sha) {
|
|
77
|
+
broken.push({
|
|
78
|
+
name: groupName,
|
|
79
|
+
scenarios: groupScenarios,
|
|
80
|
+
reason: 'missing',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else if (!isComplete(sha)) {
|
|
84
|
+
broken.push({
|
|
85
|
+
name: groupName,
|
|
86
|
+
scenarios: groupScenarios,
|
|
87
|
+
reason: 'incomplete',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const [groupName, groupScenarios] of componentGroups) {
|
|
92
|
+
const sha = entityShaMap.get(groupName);
|
|
93
|
+
if (!sha) {
|
|
94
|
+
broken.push({
|
|
95
|
+
name: groupName,
|
|
96
|
+
scenarios: groupScenarios,
|
|
97
|
+
reason: 'missing',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else if (!isComplete(sha)) {
|
|
101
|
+
broken.push({
|
|
102
|
+
name: groupName,
|
|
103
|
+
scenarios: groupScenarios,
|
|
104
|
+
reason: 'incomplete',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return broken;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve a focused entity from a SHA using client-side data.
|
|
112
|
+
* No server round-trip — uses already-loaded entities and scenarios.
|
|
113
|
+
*/
|
|
114
|
+
export function resolveClientFocusedEntity(sha, allEntities, allScenarios) {
|
|
115
|
+
if (!sha)
|
|
116
|
+
return null;
|
|
117
|
+
const entity = allEntities.find((e) => e.sha === sha);
|
|
118
|
+
if (!entity)
|
|
119
|
+
return null;
|
|
120
|
+
const scenario = allScenarios.find((s) => s.entitySha === sha);
|
|
121
|
+
return {
|
|
122
|
+
sha,
|
|
123
|
+
name: entity.name,
|
|
124
|
+
filePath: entity.filePath,
|
|
125
|
+
entityType: entity.entityType,
|
|
126
|
+
displayName: scenario?.displayName || entity.name,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=editorEntityHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorEntityHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorEntityHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitize glossary entries that may have been written by an LLM.
|
|
3
|
+
* Handles object wrappers like {"components": [...]} or {"entries": [...]},
|
|
4
|
+
* keyed-by-filepath objects like {"src/Foo.tsx": {name: "Foo", ...}},
|
|
5
|
+
* as well as completely invalid shapes.
|
|
6
|
+
*/
|
|
7
|
+
export function sanitizeGlossaryEntries(raw) {
|
|
8
|
+
if (Array.isArray(raw))
|
|
9
|
+
return raw;
|
|
10
|
+
if (raw && typeof raw === 'object') {
|
|
11
|
+
const obj = raw;
|
|
12
|
+
// Try known wrapper keys that LLMs commonly use
|
|
13
|
+
for (const key of ['components', 'entries', 'functions', 'glossary']) {
|
|
14
|
+
const val = obj[key];
|
|
15
|
+
if (Array.isArray(val))
|
|
16
|
+
return val;
|
|
17
|
+
}
|
|
18
|
+
// Try the first key that has an array value
|
|
19
|
+
for (const val of Object.values(obj)) {
|
|
20
|
+
if (Array.isArray(val))
|
|
21
|
+
return val;
|
|
22
|
+
}
|
|
23
|
+
// Keyed-by-filepath: {"src/Foo.tsx": {name: "Foo", ...}, ...}
|
|
24
|
+
// Detect by checking all values are plain objects (not arrays)
|
|
25
|
+
const entries = Object.entries(obj);
|
|
26
|
+
if (entries.length > 0 &&
|
|
27
|
+
entries.every(([, v]) => v && typeof v === 'object' && !Array.isArray(v))) {
|
|
28
|
+
return entries.map(([filePath, v]) => ({
|
|
29
|
+
...v,
|
|
30
|
+
filePath,
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
1
36
|
/**
|
|
2
37
|
* Filter glossary entries to extract library functions (non-visual entries with test files).
|
|
38
|
+
*
|
|
39
|
+
* Handles LLM-written glossary files that may be objects (e.g. {"components": [...]})
|
|
40
|
+
* instead of plain arrays. Extracts the array from known wrapper keys.
|
|
3
41
|
*/
|
|
4
42
|
export function filterGlossaryFunctions(entries) {
|
|
5
|
-
|
|
43
|
+
const arr = sanitizeGlossaryEntries(entries);
|
|
44
|
+
return arr
|
|
6
45
|
.filter((g) => g.testFile &&
|
|
7
46
|
g.returnType !== 'JSX.Element' &&
|
|
8
47
|
g.returnType !== 'React.ReactNode')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorLoaderHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorLoaderHelpers.ts"],"names":[],"mappings":"AA4DA
|
|
1
|
+
{"version":3,"file":"editorLoaderHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorLoaderHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/** Extract an array from an object with a known wrapper key (e.g. {"components": [...]}). */
|
|
4
|
+
function extractArrayFromObject(obj) {
|
|
5
|
+
if (!obj || typeof obj !== 'object')
|
|
6
|
+
return [];
|
|
7
|
+
for (const val of Object.values(obj)) {
|
|
8
|
+
if (Array.isArray(val))
|
|
9
|
+
return val;
|
|
10
|
+
}
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
function getMigrationStatePath(root) {
|
|
14
|
+
return path.join(root, '.codeyam', 'migration-state.json');
|
|
15
|
+
}
|
|
16
|
+
export function readMigrationState(root) {
|
|
17
|
+
const statePath = getMigrationStatePath(root);
|
|
18
|
+
try {
|
|
19
|
+
const content = fs.readFileSync(statePath, 'utf8');
|
|
20
|
+
const raw = JSON.parse(content);
|
|
21
|
+
return sanitizeMigrationState(raw);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* migration-state.json is written by the LLM — fields may be missing
|
|
29
|
+
* despite what the TypeScript types say. Fill in safe defaults.
|
|
30
|
+
*/
|
|
31
|
+
function sanitizeMigrationState(raw) {
|
|
32
|
+
const pages = Array.isArray(raw.pages) ? raw.pages : [];
|
|
33
|
+
const sharedComponents = Array.isArray(raw.sharedComponents)
|
|
34
|
+
? raw.sharedComponents
|
|
35
|
+
: [];
|
|
36
|
+
return {
|
|
37
|
+
status: raw.status || 'surveyed',
|
|
38
|
+
startedAt: raw.startedAt || new Date().toISOString(),
|
|
39
|
+
completedAt: raw.completedAt ?? null,
|
|
40
|
+
currentPageIndex: typeof raw.currentPageIndex === 'number' ? raw.currentPageIndex : 0,
|
|
41
|
+
pages: pages.map((p) => ({
|
|
42
|
+
name: p.name || 'Unknown',
|
|
43
|
+
route: p.route || '/',
|
|
44
|
+
filePath: p.filePath || '',
|
|
45
|
+
status: p.status || 'pending',
|
|
46
|
+
startedAt: p.startedAt ?? null,
|
|
47
|
+
completedAt: p.completedAt ?? null,
|
|
48
|
+
extractedComponents: Array.isArray(p.extractedComponents)
|
|
49
|
+
? p.extractedComponents
|
|
50
|
+
: [],
|
|
51
|
+
extractedFunctions: Array.isArray(p.extractedFunctions)
|
|
52
|
+
? p.extractedFunctions
|
|
53
|
+
: [],
|
|
54
|
+
scenarioCount: typeof p.scenarioCount === 'number' ? p.scenarioCount : 0,
|
|
55
|
+
})),
|
|
56
|
+
sharedComponents: sharedComponents.map((sc) => ({
|
|
57
|
+
name: sc.name || '',
|
|
58
|
+
filePath: sc.filePath || '',
|
|
59
|
+
extractedFromPage: sc.extractedFromPage || '',
|
|
60
|
+
usedInPages: Array.isArray(sc.usedInPages) ? sc.usedInPages : [],
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function writeMigrationState(root, state) {
|
|
65
|
+
const statePath = getMigrationStatePath(root);
|
|
66
|
+
const dir = path.dirname(statePath);
|
|
67
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
68
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect whether the project is a migration candidate.
|
|
72
|
+
*
|
|
73
|
+
* A project is a candidate when ALL of these are true:
|
|
74
|
+
* - package.json exists (has a project)
|
|
75
|
+
* - No editor scenarios exist
|
|
76
|
+
* - No glossary entries (glossary.json missing or empty array)
|
|
77
|
+
* - No active feature in progress (editor-step.json missing or no feature field)
|
|
78
|
+
* - No completed migration (migration-state.json missing or status !== 'complete')
|
|
79
|
+
*
|
|
80
|
+
* We intentionally do NOT check for page files here — the project structure
|
|
81
|
+
* is unknown until Claude surveys it. The UI shows a generic migration prompt
|
|
82
|
+
* and Claude handles discovery.
|
|
83
|
+
*
|
|
84
|
+
* The hasEditorScenarios option allows callers to pass the DB check result
|
|
85
|
+
* (since this module doesn't do database queries).
|
|
86
|
+
*/
|
|
87
|
+
export function detectMigrationCandidate(root, opts) {
|
|
88
|
+
// 1. Must have package.json
|
|
89
|
+
if (!fs.existsSync(path.join(root, 'package.json'))) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// 2. No editor scenarios
|
|
93
|
+
if (opts?.hasEditorScenarios) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// 3. No glossary entries (handles LLM-written object wrappers like {"components": [...]})
|
|
97
|
+
const glossaryPath = path.join(root, '.codeyam', 'glossary.json');
|
|
98
|
+
if (fs.existsSync(glossaryPath)) {
|
|
99
|
+
try {
|
|
100
|
+
const raw = JSON.parse(fs.readFileSync(glossaryPath, 'utf8'));
|
|
101
|
+
const entries = Array.isArray(raw) ? raw : extractArrayFromObject(raw);
|
|
102
|
+
if (entries.length > 0) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Parse failure → treat as no glossary
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 4. No active feature in progress
|
|
111
|
+
const stepPath = path.join(root, '.codeyam', 'editor-step.json');
|
|
112
|
+
if (fs.existsSync(stepPath)) {
|
|
113
|
+
try {
|
|
114
|
+
const state = JSON.parse(fs.readFileSync(stepPath, 'utf8'));
|
|
115
|
+
if (state.feature || state.scaffolded) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Parse failure → treat as no state
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 5. No completed migration
|
|
124
|
+
const migrationState = readMigrationState(root);
|
|
125
|
+
if (migrationState?.status === 'complete') {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if editor-step.json indicates an active migration.
|
|
132
|
+
* Used by the loader to detect migration even before migration-state.json exists
|
|
133
|
+
* (e.g. during the survey phase).
|
|
134
|
+
*/
|
|
135
|
+
export function isMigrationActiveInEditorState(root) {
|
|
136
|
+
const stepPath = path.join(root, '.codeyam', 'editor-step.json');
|
|
137
|
+
try {
|
|
138
|
+
const content = fs.readFileSync(stepPath, 'utf8');
|
|
139
|
+
const state = JSON.parse(content);
|
|
140
|
+
return !!state.migration;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Pure function that determines what CLI command to resume migration with.
|
|
148
|
+
* Used by printCycleOverview to give Claude the right next command.
|
|
149
|
+
*/
|
|
150
|
+
export function getMigrationResumeInfo(editorState, migrationState) {
|
|
151
|
+
// Complete
|
|
152
|
+
if (migrationState?.status === 'complete') {
|
|
153
|
+
return { mode: 'complete', resumeCommand: null };
|
|
154
|
+
}
|
|
155
|
+
// Survey phase: editor state at step 0 with migration field, or migration-state surveyed
|
|
156
|
+
if ((editorState?.migration && editorState.step === 0) ||
|
|
157
|
+
migrationState?.status === 'surveyed') {
|
|
158
|
+
return { mode: 'survey', resumeCommand: 'codeyam editor migrate' };
|
|
159
|
+
}
|
|
160
|
+
// In progress with editor state migration field (knows current step)
|
|
161
|
+
if (editorState?.migration) {
|
|
162
|
+
return {
|
|
163
|
+
mode: 'page-in-progress',
|
|
164
|
+
resumeCommand: `codeyam editor migrate ${editorState.step}`,
|
|
165
|
+
pageName: editorState.migration.pageName,
|
|
166
|
+
pageIndex: editorState.migration.pageIndex,
|
|
167
|
+
totalPages: editorState.migration.totalPages,
|
|
168
|
+
step: editorState.step,
|
|
169
|
+
stepLabel: editorState.label,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// migration-state.json in-progress but no editor state (fresh session)
|
|
173
|
+
if (migrationState?.status === 'in-progress') {
|
|
174
|
+
const currentPage = migrationState.pages[migrationState.currentPageIndex];
|
|
175
|
+
return {
|
|
176
|
+
mode: 'page-in-progress',
|
|
177
|
+
resumeCommand: 'codeyam editor migrate 1',
|
|
178
|
+
pageName: currentPage?.name ?? 'Unknown',
|
|
179
|
+
pageIndex: migrationState.currentPageIndex,
|
|
180
|
+
totalPages: migrationState.pages.length,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return { mode: 'none', resumeCommand: null };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Advance to the next pending page in the migration.
|
|
187
|
+
* Returns the page info or null if all pages are complete.
|
|
188
|
+
*/
|
|
189
|
+
export function advanceToNextPage(root) {
|
|
190
|
+
const state = readMigrationState(root);
|
|
191
|
+
if (!state)
|
|
192
|
+
return null;
|
|
193
|
+
const nextIndex = state.pages.findIndex((p) => p.status === 'pending');
|
|
194
|
+
if (nextIndex === -1) {
|
|
195
|
+
// All pages done — mark migration complete
|
|
196
|
+
state.status = 'complete';
|
|
197
|
+
state.completedAt = new Date().toISOString();
|
|
198
|
+
writeMigrationState(root, state);
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
state.currentPageIndex = nextIndex;
|
|
202
|
+
state.pages[nextIndex].status = 'in-progress';
|
|
203
|
+
state.pages[nextIndex].startedAt = new Date().toISOString();
|
|
204
|
+
writeMigrationState(root, state);
|
|
205
|
+
return { name: state.pages[nextIndex].name, index: nextIndex };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Mark the current page as complete with extraction stats.
|
|
209
|
+
*/
|
|
210
|
+
export function completePage(root, stats) {
|
|
211
|
+
const state = readMigrationState(root);
|
|
212
|
+
if (!state)
|
|
213
|
+
return;
|
|
214
|
+
const page = state.pages[state.currentPageIndex];
|
|
215
|
+
if (!page)
|
|
216
|
+
return;
|
|
217
|
+
page.status = 'complete';
|
|
218
|
+
page.completedAt = new Date().toISOString();
|
|
219
|
+
page.extractedComponents = stats.extractedComponents;
|
|
220
|
+
page.extractedFunctions = stats.extractedFunctions;
|
|
221
|
+
page.scenarioCount = stats.scenarioCount;
|
|
222
|
+
writeMigrationState(root, state);
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=editorMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorMigration.js","sourceRoot":"","sources":["../../../../src/utils/editorMigration.ts"],"names":[],"mappings":"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"}
|