@codeyam/codeyam-cli 0.1.0-staging.9574237 → 0.1.0-staging.a2f381a
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 +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +4 -4
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +135 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +36 -9
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.ts +10 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +16 -6
- package/analyzer-template/packages/analyze/index.ts +4 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +28 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +5 -36
- 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/analyze/trackEntityCircularDependencies.ts +21 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +82 -10
- 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/analyze/src/lib/files/analyzeNextRoute.ts +8 -3
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +239 -58
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1684 -1462
- package/analyzer-template/packages/aws/package.json +6 -6
- package/analyzer-template/packages/database/package.json +2 -2
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +25 -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 +7 -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/analyzer-template/project/runMultiScenarioServer.ts +26 -3
- package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
- package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
- package/codeyam-cli/src/cli.js +24 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
- package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +71 -0
- package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
- package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
- package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js +55 -0
- package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +9 -9
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +39 -3
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +2497 -467
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
- package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
- package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
- package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +21 -0
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/telemetry.js +37 -0
- package/codeyam-cli/src/commands/telemetry.js.map +1 -0
- package/codeyam-cli/src/data/designSystems.js +27 -0
- package/codeyam-cli/src/data/designSystems.js.map +1 -0
- package/codeyam-cli/src/data/techStacks.js +1 -1
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js +93 -1
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js +44 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +3174 -1
- 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__/editorEntityChangeStatus.test.js +70 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +163 -4
- 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__/editorPreview.test.js +11 -3
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +98 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +1108 -0
- package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +190 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +344 -7
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +134 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +294 -2
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/envFile.test.js +125 -0
- package/codeyam-cli/src/utils/__tests__/envFile.test.js.map +1 -0
- 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__/handoffContext.test.js +500 -0
- package/codeyam-cli/src/utils/__tests__/handoffContext.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__/manualEntityAnalysis.test.js +302 -0
- package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js.map +1 -0
- 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 +180 -1
- 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/__tests__/telemetry.test.js +159 -0
- package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/testRunner.test.js +216 -0
- package/codeyam-cli/src/utils/__tests__/testRunner.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +6 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +36 -7
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +11 -1
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
- package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
- package/codeyam-cli/src/utils/devServerState.js +32 -0
- package/codeyam-cli/src/utils/devServerState.js.map +1 -1
- package/codeyam-cli/src/utils/editorApi.js +16 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +649 -10
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js +13 -7
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/editorEntityHelpers.js +18 -3
- package/codeyam-cli/src/utils/editorEntityHelpers.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/editorPreview.js +5 -3
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
- package/codeyam-cli/src/utils/editorRecapture.js +109 -0
- package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorRoadmap.js +574 -0
- package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +39 -2
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarios.js +181 -17
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +69 -16
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.js +39 -5
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +31 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -1
- package/codeyam-cli/src/utils/envFile.js +90 -0
- package/codeyam-cli/src/utils/envFile.js.map +1 -0
- package/codeyam-cli/src/utils/fileWatcher.js +38 -0
- package/codeyam-cli/src/utils/fileWatcher.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/handoffContext.js +257 -0
- package/codeyam-cli/src/utils/handoffContext.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +41 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/manualEntityAnalysis.js +196 -0
- package/codeyam-cli/src/utils/manualEntityAnalysis.js.map +1 -0
- package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
- package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
- package/codeyam-cli/src/utils/queue/job.js +35 -6
- 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 +66 -2
- 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/utils/techStackConfig.js +38 -0
- package/codeyam-cli/src/utils/techStackConfig.js.map +1 -0
- package/codeyam-cli/src/utils/techStackConfig.test.js +85 -0
- package/codeyam-cli/src/utils/techStackConfig.test.js.map +1 -0
- package/codeyam-cli/src/utils/telemetry.js +106 -0
- package/codeyam-cli/src/utils/telemetry.js.map +1 -0
- package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
- package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
- package/codeyam-cli/src/utils/testResultCache.js +53 -0
- package/codeyam-cli/src/utils/testResultCache.js.map +1 -0
- package/codeyam-cli/src/utils/testResultCache.server.js +81 -0
- package/codeyam-cli/src/utils/testResultCache.server.js.map +1 -0
- package/codeyam-cli/src/utils/testResultCache.server.test.js +187 -0
- package/codeyam-cli/src/utils/testResultCache.server.test.js.map +1 -0
- package/codeyam-cli/src/utils/testResultCache.test.js +230 -0
- package/codeyam-cli/src/utils/testResultCache.test.js.map +1 -0
- package/codeyam-cli/src/utils/testRunner.js +193 -1
- package/codeyam-cli/src/utils/testRunner.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +4 -2
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +99 -0
- package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +119 -1
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.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__/editorProxy.test.js +442 -9
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +190 -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/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
- package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
- package/codeyam-cli/src/webserver/backgroundServer.js +42 -57
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CzTDWkF2.js → CopyButton-DTBZZfSk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-BFbq6iFk.js → EntityItem-BxclONWq.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-B6OMi58N.js → EntityTypeIcon-BsnEOJZ_.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-DuYodzo1.js → InlineSpinner-ByaELMbv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CXo9EeCl.js → InteractivePreview-6WjVfhxX.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-DYCNb2It.js → LibraryFunctionPreview-ChX-Hp7W.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CZgY3sxX.js → LogViewer-C-9zQdXg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/MiniClaudeChat-Bs2_Oua4.js +36 -0
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-CnYYwRDw.js → ReportIssueModal-DQsceHVv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CDoF7ZpU.js → SafeScreenshot-DThcm_9M.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DrnfvaLL.js → ScenarioViewer-Cl4oOA3A.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-CIil5-gb.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/{ViewportInspectBar-DRKR9T0U.js → ViewportInspectBar-BqkA9zyZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-ClR-g3tY.js → _index-DnOgyseQ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DTH6ydEA.js → activity.(_tab)-DqM9hbNE.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-74hnHF59.js → addon-web-links-C58dYPwR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-B8CYhCO9.js → agent-transcripts-B8NCeOrm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-database-verify-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-github-verify-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-handoff-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-hosting-verify-l0sNRNKZ.js +1 -0
- 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-roadmap-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/api.editor-verify-routes-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-CLaoh4ac.js → book-open-BFSIqZgO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BZ2DZxbW.js → chevron-down-B9fDzFVh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CT4unAk-.js → circle-check-DLPObLUx.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{copy-zK0B6Nu-.js → copy-DXEmO0TD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-DJB0YQJL.js → createLucideIcon-BwyFiRot.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-Coe5NhbS.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-DoA97ML3.svg} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-CkXFP_i-.js → dev.empty-iRhRIFlp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DhtVC4aI.js +161 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-C6fEYHrh.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BqAN7hyG.js → entity._sha._-pc-vc6wO.js} +13 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-BOi8kpwd.js → entity._sha.scenarios._scenarioId.dev-C8AyYgYT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-Dg1NhIms.js → entity._sha.scenarios._scenarioId.fullscreen-DziaVQX1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-CJX6kkkV.js → entity._sha_.create-scenario-BTcpgIpC.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BhVjZhKg.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-_gzKltPN.js → entry.client-j1Vi0bco.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/{files-CV_17tZS.js → files-kuny2Q_s.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-D-YXmMbR.js → git-DgCZPMie.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-L-aUIeux.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-CCrgCshv.js → index-BliGSSpl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-Blo6EK8G.js → index-SqjQKTdH.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-BsX0F-9C.js → index-vyrZD2g4.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{labs-Byazq8Pv.js → labs-c3yLxSEp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-DVQ0oHR7.js → loader-circle-D-q28GLF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-79d0d81a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{memory-b-VmA2Vj.js → memory-CEWIUC4t.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DGcndCAa.js → pause-BP6fitdh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-L2V0jea7.js +80 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-C0Uw0bcK.js → search-BooqacKS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-OoNgHIfW.js → settings-BM0nbryO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-Bcemfu8a.js → simulations-ovy6FjRY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BgMmG7R9.js → terminal-DHemCJIs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-Cs87hJYK.js → triangle-alert-D87ekDl8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-BR3Rs7JY.js → useCustomSizes-Dk0Tciqg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C8QvIe05.js +2 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-BermyNU5.js → useReportContext-jkCytuYz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-a_QN_W9_.js → useToast-BgqkixU9.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-QgInFGdU.js +16 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-CHSrVJtC.js → index-zblh9auj.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-DaE0CBjk.js +14 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CNvgz1cC.js +853 -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 +388 -26
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/idleDetector.js +65 -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 +151 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +253 -41
- 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-codex.md +61 -0
- package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
- package/codeyam-cli/templates/codeyam-editor-reference.md +216 -0
- package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
- package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
- package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
- package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
- package/codeyam-cli/templates/editor-step-hook.py +93 -46
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +204 -5
- package/codeyam-cli/templates/expo-react-native/__tests__/.gitkeep +0 -0
- package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +6 -3
- package/codeyam-cli/templates/expo-react-native/app/index.tsx +36 -0
- package/codeyam-cli/templates/expo-react-native/app.json +11 -0
- package/codeyam-cli/templates/expo-react-native/babel.config.js +1 -0
- package/codeyam-cli/templates/expo-react-native/gitignore +2 -0
- package/codeyam-cli/templates/expo-react-native/global.css +7 -0
- package/codeyam-cli/templates/expo-react-native/lib/theme.ts +73 -0
- package/codeyam-cli/templates/expo-react-native/package.json +32 -16
- package/codeyam-cli/templates/expo-react-native/patches/expo-modules-autolinking+3.0.24.patch +29 -0
- package/codeyam-cli/templates/isolation-route/expo-router.tsx.template +54 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +1 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +1 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +47 -34
- package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +1 -1
- package/codeyam-cli/templates/seed-adapters/supabase.ts +271 -78
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +34 -1
- package/package.json +2 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
- package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
- package/packages/ai/src/lib/astScopes/paths.js +12 -3
- package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +27 -10
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js +9 -2
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +14 -4
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/analyze/index.js +1 -1
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +16 -2
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +6 -26
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.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/analyze/trackEntityCircularDependencies.js +14 -0
- package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +44 -11
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.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/analyze/src/lib/files/analyzeNextRoute.js +5 -1
- package/packages/analyze/src/lib/files/analyzeNextRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +120 -28
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1368 -1193
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +7 -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/Spinner-Df3UCi8k.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BBXArFPl.js +0 -43
- 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._tab-DPw7NZHc.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dmg9cGK3.js +0 -58
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-DBa7T2FK.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/globals-Bqg9V6XV.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-422a3551.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-ue8uWVRS.js +0 -67
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BxxP_XF9.js +0 -2
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-DXQyOV0G.js +0 -13
- package/codeyam-cli/src/webserver/build/server/assets/init-DL8vWZ6m.js +0 -10
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BUKVjBSZ.js +0 -501
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +0 -33
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +0 -12
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +0 -12
|
@@ -10,27 +10,39 @@
|
|
|
10
10
|
* "tableName": [{ "column": "value", ... }, ...],
|
|
11
11
|
* "_auth": { // optional
|
|
12
12
|
* "email": "alice@example.com",
|
|
13
|
-
* "password": "test123"
|
|
13
|
+
* "password": "test123" // optional — default used if omitted
|
|
14
14
|
* }
|
|
15
15
|
* }
|
|
16
16
|
*
|
|
17
17
|
* When _auth is present, the adapter:
|
|
18
18
|
* 1. Creates the user if they don't exist (auto-confirms email)
|
|
19
|
-
* 2.
|
|
20
|
-
* 3. Writes session cookies to .codeyam/tmp/seed-session.json
|
|
19
|
+
* 2. Builds a synthetic JWT with far-future expiry (no real sign-in needed)
|
|
20
|
+
* 3. Writes session cookies + auth mocks to .codeyam/tmp/seed-session.json
|
|
21
21
|
* so the CodeYam proxy can inject them into the browser
|
|
22
22
|
*
|
|
23
|
+
* The password field is optional — if omitted, a default dev password is used.
|
|
24
|
+
* No real JWTs are stored; the preload module intercepts all auth API calls.
|
|
25
|
+
*
|
|
26
|
+
* Data operations use direct PostgreSQL (pg) for speed — TRUNCATE CASCADE
|
|
27
|
+
* and batched INSERT are ~2x faster than individual PostgREST HTTP calls.
|
|
28
|
+
*
|
|
23
29
|
* Requirements:
|
|
30
|
+
* - DATABASE_URL env var with a PostgreSQL connection string (session pooler recommended)
|
|
24
31
|
* - A Supabase project URL (https://<ref>.supabase.co) in any env var
|
|
25
32
|
* - A secret key (sb_secret_... or legacy eyJ... service_role JWT) in any env var
|
|
26
33
|
*
|
|
27
|
-
* The adapter scans ALL env vars by value pattern
|
|
34
|
+
* The adapter scans ALL env vars by value pattern for Supabase URL and secret key —
|
|
35
|
+
* no specific naming required. DATABASE_URL must be set explicitly.
|
|
28
36
|
*/
|
|
29
37
|
|
|
30
38
|
import { createClient } from '@supabase/supabase-js';
|
|
39
|
+
import { Prisma } from '@prisma/client';
|
|
40
|
+
import pg from 'pg';
|
|
31
41
|
import * as fs from 'fs';
|
|
32
42
|
import * as path from 'path';
|
|
33
43
|
|
|
44
|
+
const { Client } = pg;
|
|
45
|
+
|
|
34
46
|
/**
|
|
35
47
|
* Scan all env vars for values matching a pattern.
|
|
36
48
|
* Returns ALL unique matches (not just the first) so callers can disambiguate.
|
|
@@ -65,7 +77,6 @@ const supabaseUrl = findAllEnvByPattern(
|
|
|
65
77
|
|
|
66
78
|
// New-format keys are unambiguous by prefix
|
|
67
79
|
const newSecretKey = findAllEnvByPattern(/^sb_secret_/)[0];
|
|
68
|
-
const newAnonKey = findAllEnvByPattern(/^sb_publishable_/)[0];
|
|
69
80
|
|
|
70
81
|
// Legacy JWT keys — disambiguate by decoding the role claim
|
|
71
82
|
const legacyJwts = findAllEnvByPattern(
|
|
@@ -74,10 +85,8 @@ const legacyJwts = findAllEnvByPattern(
|
|
|
74
85
|
const legacyServiceRole = legacyJwts.find(
|
|
75
86
|
(jwt) => getJwtRole(jwt) === 'service_role',
|
|
76
87
|
);
|
|
77
|
-
const legacyAnon = legacyJwts.find((jwt) => getJwtRole(jwt) === 'anon');
|
|
78
88
|
|
|
79
89
|
const secretKey = newSecretKey || legacyServiceRole;
|
|
80
|
-
const anonKey = newAnonKey || legacyAnon;
|
|
81
90
|
|
|
82
91
|
if (!supabaseUrl || !secretKey) {
|
|
83
92
|
console.error(
|
|
@@ -92,7 +101,17 @@ if (!supabaseUrl || !secretKey) {
|
|
|
92
101
|
process.exit(1);
|
|
93
102
|
}
|
|
94
103
|
|
|
95
|
-
//
|
|
104
|
+
// DATABASE_URL for direct PostgreSQL access (session pooler recommended for speed)
|
|
105
|
+
const databaseUrl = process.env.DATABASE_URL;
|
|
106
|
+
if (!databaseUrl || !databaseUrl.startsWith('postgresql://')) {
|
|
107
|
+
console.error('DATABASE_URL must be set to a PostgreSQL connection string.');
|
|
108
|
+
console.error(
|
|
109
|
+
'Use the session pooler connection string (port 5432) from your Supabase dashboard.',
|
|
110
|
+
);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Admin client for user management only (uses secret key to bypass RLS)
|
|
96
115
|
const supabase = createClient(supabaseUrl, secretKey, {
|
|
97
116
|
auth: { autoRefreshToken: false, persistSession: false },
|
|
98
117
|
});
|
|
@@ -108,53 +127,213 @@ function getProjectRef(): string {
|
|
|
108
127
|
}
|
|
109
128
|
}
|
|
110
129
|
|
|
130
|
+
/**
|
|
131
|
+
* Build a mapping from lowercased seed-data keys to actual PostgreSQL table names.
|
|
132
|
+
* Prisma creates tables with the model name (PascalCase) unless @@map is used.
|
|
133
|
+
* PostgreSQL requires the exact table name, so we need this translation.
|
|
134
|
+
*/
|
|
135
|
+
function buildTableNameMap(): Record<string, string> {
|
|
136
|
+
const map: Record<string, string> = {};
|
|
137
|
+
for (const model of Prisma.dmmf.datamodel.models) {
|
|
138
|
+
// dbName is set when @@map is used, otherwise null → use model name
|
|
139
|
+
const dbName = (model as any).dbName || model.name;
|
|
140
|
+
// Map lowercased model name → actual table name
|
|
141
|
+
const lowered = model.name.charAt(0).toLowerCase() + model.name.slice(1);
|
|
142
|
+
map[lowered] = dbName;
|
|
143
|
+
map[model.name] = dbName; // Also map PascalCase for safety
|
|
144
|
+
}
|
|
145
|
+
return map;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Build column name mapping from Prisma field names to database column names.
|
|
150
|
+
* Prisma uses camelCase field names but generates snake_case columns unless @map is used.
|
|
151
|
+
*/
|
|
152
|
+
function buildColumnMap(tableName: string): Record<string, string> {
|
|
153
|
+
const map: Record<string, string> = {};
|
|
154
|
+
for (const model of Prisma.dmmf.datamodel.models) {
|
|
155
|
+
const dbName = (model as any).dbName || model.name;
|
|
156
|
+
if (dbName !== tableName) continue;
|
|
157
|
+
for (const field of model.fields) {
|
|
158
|
+
if (field.kind === 'object') continue; // Skip relation fields
|
|
159
|
+
const colName = (field as any).dbName || field.name;
|
|
160
|
+
map[field.name] = colName;
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
return map;
|
|
165
|
+
}
|
|
166
|
+
|
|
111
167
|
async function seedTables(seed: Record<string, unknown[]>) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
168
|
+
if (Object.keys(seed).length === 0) return;
|
|
169
|
+
|
|
170
|
+
const tableMap = buildTableNameMap();
|
|
171
|
+
|
|
172
|
+
// Discover ALL models from the Prisma schema — not just the tables in the seed data.
|
|
173
|
+
// This ensures FK-dependent tables are cleared even when the seed only contains
|
|
174
|
+
// the parent table's data.
|
|
175
|
+
const allTables = Prisma.dmmf.datamodel.models.map(
|
|
176
|
+
(m) => (m as any).dbName || m.name,
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
console.log(
|
|
180
|
+
`Clearing ${allTables.length} tables, seeding: ${Object.keys(seed).join(', ')}`,
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const client = new Client({
|
|
184
|
+
connectionString: databaseUrl,
|
|
185
|
+
ssl: { rejectUnauthorized: false },
|
|
186
|
+
});
|
|
187
|
+
await client.connect();
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
// TRUNCATE all tables in one statement — CASCADE handles FK dependencies
|
|
191
|
+
// automatically, so table order doesn't matter. Much faster than
|
|
192
|
+
// individual DELETE FROM queries via PostgREST.
|
|
193
|
+
const quoted = allTables.map((t) => `"${t}"`).join(', ');
|
|
194
|
+
await client.query(`TRUNCATE ${quoted} CASCADE`);
|
|
195
|
+
console.log(` Cleared ${allTables.length} tables`);
|
|
196
|
+
|
|
197
|
+
// Reset auto-increment sequences so IDs start from 1 on each scenario switch.
|
|
198
|
+
// Without this, IDs keep climbing and hardcoded URLs like /drinks/1 break.
|
|
199
|
+
for (const table of allTables) {
|
|
200
|
+
try {
|
|
201
|
+
await client.query(
|
|
202
|
+
`SELECT setval(pg_get_serial_sequence('"${table}"', 'id'), 1, false)`,
|
|
203
|
+
);
|
|
204
|
+
} catch {
|
|
205
|
+
// Table may not have an 'id' serial column — skip
|
|
129
206
|
}
|
|
130
|
-
} else {
|
|
131
|
-
console.log(` Cleared ${table}`);
|
|
132
207
|
}
|
|
208
|
+
|
|
209
|
+
// Insert seed data using batched INSERT for speed
|
|
210
|
+
for (const [seedKey, rows] of Object.entries(seed)) {
|
|
211
|
+
if (!Array.isArray(rows) || rows.length === 0) continue;
|
|
212
|
+
const table = tableMap[seedKey] || seedKey;
|
|
213
|
+
const columnMap = buildColumnMap(table);
|
|
214
|
+
|
|
215
|
+
// Get column names from the first row's keys, mapped to DB column names
|
|
216
|
+
const fieldNames = Object.keys(rows[0] as Record<string, unknown>);
|
|
217
|
+
const dbColumns = fieldNames.map((f) => columnMap[f] || f);
|
|
218
|
+
const quotedCols = dbColumns.map((c) => `"${c}"`).join(', ');
|
|
219
|
+
|
|
220
|
+
// Build parameterized VALUES clause for all rows at once
|
|
221
|
+
const params: unknown[] = [];
|
|
222
|
+
const valueClauses: string[] = [];
|
|
223
|
+
for (let i = 0; i < rows.length; i++) {
|
|
224
|
+
const row = rows[i] as Record<string, unknown>;
|
|
225
|
+
const placeholders: string[] = [];
|
|
226
|
+
for (const field of fieldNames) {
|
|
227
|
+
params.push(row[field]);
|
|
228
|
+
placeholders.push(`$${params.length}`);
|
|
229
|
+
}
|
|
230
|
+
valueClauses.push(`(${placeholders.join(', ')})`);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
await client.query(
|
|
234
|
+
`INSERT INTO "${table}" (${quotedCols}) VALUES ${valueClauses.join(', ')}`,
|
|
235
|
+
params,
|
|
236
|
+
);
|
|
237
|
+
console.log(` Seeded ${rows.length} rows into ${table}`);
|
|
238
|
+
}
|
|
239
|
+
} finally {
|
|
240
|
+
await client.end();
|
|
133
241
|
}
|
|
242
|
+
}
|
|
134
243
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
244
|
+
/**
|
|
245
|
+
* Export mode: dump current database state to a JSON file.
|
|
246
|
+
* Used by CodeYam to save interactive changes back to scenario seed data.
|
|
247
|
+
*
|
|
248
|
+
* Usage: npx tsx .codeyam/seed-adapter.ts --export <output-path.json>
|
|
249
|
+
*/
|
|
250
|
+
async function exportData(outputPath: string) {
|
|
251
|
+
const tableMap = buildTableNameMap();
|
|
252
|
+
const modelNames = Prisma.dmmf.datamodel.models.map((m) => m.name);
|
|
253
|
+
|
|
254
|
+
const client = new Client({
|
|
255
|
+
connectionString: databaseUrl,
|
|
256
|
+
ssl: { rejectUnauthorized: false },
|
|
257
|
+
});
|
|
258
|
+
await client.connect();
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
const seed: Record<string, unknown[]> = {};
|
|
262
|
+
for (const model of modelNames) {
|
|
263
|
+
const camelCase = model.charAt(0).toLowerCase() + model.slice(1);
|
|
264
|
+
const table = tableMap[camelCase] || model;
|
|
265
|
+
try {
|
|
266
|
+
const result = await client.query(`SELECT * FROM "${table}"`);
|
|
267
|
+
if (result.rows.length > 0) {
|
|
268
|
+
seed[camelCase] = result.rows;
|
|
269
|
+
}
|
|
270
|
+
} catch {
|
|
271
|
+
// Skip tables that can't be queried
|
|
272
|
+
}
|
|
142
273
|
}
|
|
143
|
-
|
|
274
|
+
|
|
275
|
+
fs.writeFileSync(outputPath, JSON.stringify(seed, null, 2));
|
|
276
|
+
console.log(`Exported ${Object.keys(seed).length} tables`);
|
|
277
|
+
} finally {
|
|
278
|
+
await client.end();
|
|
144
279
|
}
|
|
145
280
|
}
|
|
146
281
|
|
|
147
282
|
/**
|
|
148
|
-
*
|
|
283
|
+
* Build a minimal JWT with a far-future expiry.
|
|
284
|
+
* The signature is fake — it doesn't matter because the CodeYam preload module
|
|
285
|
+
* intercepts the Supabase auth validation endpoint and returns mock data.
|
|
286
|
+
*/
|
|
287
|
+
function buildFakeJwt(userId: string, email: string): string {
|
|
288
|
+
const header = { alg: 'HS256', typ: 'JWT' };
|
|
289
|
+
const payload = {
|
|
290
|
+
sub: userId,
|
|
291
|
+
email,
|
|
292
|
+
role: 'authenticated',
|
|
293
|
+
aud: 'authenticated',
|
|
294
|
+
exp: 9999999999,
|
|
295
|
+
iat: Math.floor(Date.now() / 1000),
|
|
296
|
+
};
|
|
297
|
+
const encode = (obj: object) =>
|
|
298
|
+
Buffer.from(JSON.stringify(obj)).toString('base64url');
|
|
299
|
+
return `${encode(header)}.${encode(payload)}.codeyam-mock-signature`;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Build a Supabase user response object matching the /auth/v1/user endpoint format.
|
|
304
|
+
*/
|
|
305
|
+
function buildUserResponse(user: { id: string; email?: string }) {
|
|
306
|
+
return {
|
|
307
|
+
id: user.id,
|
|
308
|
+
aud: 'authenticated',
|
|
309
|
+
role: 'authenticated',
|
|
310
|
+
email: user.email || '',
|
|
311
|
+
email_confirmed_at: new Date().toISOString(),
|
|
312
|
+
app_metadata: { provider: 'email', providers: ['email'] },
|
|
313
|
+
user_metadata: {},
|
|
314
|
+
created_at: new Date().toISOString(),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const DEFAULT_AUTH_PASSWORD = 'codeyam-dev-password-123!';
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Handle auth: create user, build synthetic session, write session cookies.
|
|
149
322
|
* Returns the user ID so callers can replace __AUTH_USER_ID__ placeholders in seed data.
|
|
323
|
+
*
|
|
324
|
+
* No real sign-in is performed — the session cookie uses a synthetic JWT with
|
|
325
|
+
* far-future expiry, and externalApis mocks intercept all Supabase auth API calls.
|
|
326
|
+
* This avoids storing real tokens (security risk + expiration) in scenario files.
|
|
150
327
|
*/
|
|
151
328
|
async function handleAuth(auth: {
|
|
152
329
|
email: string;
|
|
153
|
-
password
|
|
330
|
+
password?: string;
|
|
154
331
|
}): Promise<string> {
|
|
155
|
-
const
|
|
332
|
+
const email = auth.email;
|
|
333
|
+
const password = auth.password || DEFAULT_AUTH_PASSWORD;
|
|
156
334
|
|
|
157
|
-
// Create user if they don't exist (auto-confirm email
|
|
335
|
+
// Create user if they don't exist (auto-confirm email)
|
|
336
|
+
// We still need the auth.users row for PostgREST FK relationships.
|
|
158
337
|
const { data: createData, error: createError } =
|
|
159
338
|
await supabase.auth.admin.createUser({
|
|
160
339
|
email,
|
|
@@ -162,72 +341,79 @@ async function handleAuth(auth: {
|
|
|
162
341
|
email_confirm: true,
|
|
163
342
|
});
|
|
164
343
|
|
|
344
|
+
let userId: string;
|
|
345
|
+
|
|
165
346
|
if (createError) {
|
|
166
347
|
if (createError.message.includes('already been registered')) {
|
|
167
|
-
// User exists —
|
|
168
|
-
// scenario specifies a different password than a previous run.
|
|
348
|
+
// User exists — look up their ID
|
|
169
349
|
const { data: listData } = await supabase.auth.admin.listUsers();
|
|
170
350
|
const existingUser = listData?.users?.find((u) => u.email === email);
|
|
171
351
|
if (existingUser) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
console.
|
|
352
|
+
userId = existingUser.id;
|
|
353
|
+
console.log(` Found existing user ${email} (user: ${userId})`);
|
|
354
|
+
} else {
|
|
355
|
+
console.error(
|
|
356
|
+
` User ${email} reported as registered but not found in listUsers`,
|
|
357
|
+
);
|
|
358
|
+
process.exit(1);
|
|
176
359
|
}
|
|
177
360
|
} else {
|
|
178
361
|
console.error(` Failed to create auth user: ${createError.message}`);
|
|
179
362
|
process.exit(1);
|
|
180
363
|
}
|
|
364
|
+
} else {
|
|
365
|
+
userId = createData!.user.id;
|
|
366
|
+
console.log(` Created user ${email} (user: ${userId})`);
|
|
181
367
|
}
|
|
182
368
|
|
|
183
|
-
//
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
auth: { autoRefreshToken: false, persistSession: false },
|
|
189
|
-
})
|
|
190
|
-
: supabase;
|
|
191
|
-
|
|
192
|
-
const { data: signInData, error: signInError } =
|
|
193
|
-
await signInClient.auth.signInWithPassword({ email, password });
|
|
194
|
-
|
|
195
|
-
if (signInError || !signInData.session) {
|
|
196
|
-
console.error(
|
|
197
|
-
` Failed to sign in as ${email}: ${signInError?.message || 'no session returned'}`,
|
|
198
|
-
);
|
|
199
|
-
process.exit(1);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const userId = signInData.user.id;
|
|
203
|
-
console.log(` Signed in as ${email} (user: ${userId})`);
|
|
369
|
+
// Build synthetic JWT and mock responses — no real sign-in needed.
|
|
370
|
+
// The preload module intercepts server-side getUser() calls so Next.js
|
|
371
|
+
// middleware returns the mock user without hitting real Supabase.
|
|
372
|
+
const fakeJwt = buildFakeJwt(userId!, email);
|
|
373
|
+
const userResponse = buildUserResponse({ id: userId!, email });
|
|
204
374
|
|
|
205
|
-
// Write session cookies for the proxy to inject
|
|
206
375
|
const projectRef = getProjectRef();
|
|
207
376
|
const sessionOutput = {
|
|
208
377
|
cookies: [
|
|
209
378
|
{
|
|
210
379
|
name: `sb-${projectRef}-auth-token`,
|
|
211
380
|
value: JSON.stringify({
|
|
212
|
-
access_token:
|
|
213
|
-
refresh_token:
|
|
381
|
+
access_token: fakeJwt,
|
|
382
|
+
refresh_token: 'codeyam-mock-refresh-token',
|
|
214
383
|
token_type: 'bearer',
|
|
215
|
-
expires_in:
|
|
216
|
-
expires_at:
|
|
384
|
+
expires_in: 315360000,
|
|
385
|
+
expires_at: 9999999999,
|
|
217
386
|
}),
|
|
218
387
|
path: '/',
|
|
219
388
|
sameSite: 'Lax' as const,
|
|
220
389
|
},
|
|
221
390
|
],
|
|
391
|
+
externalApis: {
|
|
392
|
+
[`${supabaseUrl}/auth/v1/user`]: {
|
|
393
|
+
body: userResponse,
|
|
394
|
+
status: 200,
|
|
395
|
+
},
|
|
396
|
+
[`${supabaseUrl}/auth/v1/token`]: {
|
|
397
|
+
body: {
|
|
398
|
+
access_token: fakeJwt,
|
|
399
|
+
token_type: 'bearer',
|
|
400
|
+
expires_in: 315360000,
|
|
401
|
+
expires_at: 9999999999,
|
|
402
|
+
refresh_token: 'codeyam-mock-refresh-token',
|
|
403
|
+
user: userResponse,
|
|
404
|
+
},
|
|
405
|
+
status: 200,
|
|
406
|
+
},
|
|
407
|
+
},
|
|
222
408
|
};
|
|
223
409
|
|
|
224
410
|
const outputDir = path.join(process.cwd(), '.codeyam', 'tmp');
|
|
225
411
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
226
412
|
const outputPath = path.join(outputDir, 'seed-session.json');
|
|
227
413
|
fs.writeFileSync(outputPath, JSON.stringify(sessionOutput, null, 2));
|
|
228
|
-
console.log(` Session cookies written to ${outputPath}`);
|
|
414
|
+
console.log(` Session cookies + auth mocks written to ${outputPath}`);
|
|
229
415
|
|
|
230
|
-
return userId
|
|
416
|
+
return userId!;
|
|
231
417
|
}
|
|
232
418
|
|
|
233
419
|
/**
|
|
@@ -266,7 +452,7 @@ async function main() {
|
|
|
266
452
|
// in seed data (e.g. for user_id foreign key columns with Supabase RLS)
|
|
267
453
|
if (auth) {
|
|
268
454
|
const userId = await handleAuth(
|
|
269
|
-
auth as { email: string; password
|
|
455
|
+
auth as { email: string; password?: string },
|
|
270
456
|
);
|
|
271
457
|
seed = replaceAuthPlaceholders(seed, userId);
|
|
272
458
|
}
|
|
@@ -276,7 +462,14 @@ async function main() {
|
|
|
276
462
|
console.log('Seed complete');
|
|
277
463
|
}
|
|
278
464
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
465
|
+
if (process.argv[2] === '--export') {
|
|
466
|
+
exportData(process.argv[3]).catch((e) => {
|
|
467
|
+
console.error('Seed adapter export error:', e);
|
|
468
|
+
process.exit(1);
|
|
469
|
+
});
|
|
470
|
+
} else {
|
|
471
|
+
main().catch((e) => {
|
|
472
|
+
console.error('Seed adapter error:', e);
|
|
473
|
+
process.exit(1);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
@@ -16,6 +16,15 @@ You MUST follow a step-by-step workflow driven by `codeyam editor` commands. Eac
|
|
|
16
16
|
|
|
17
17
|
**The rule:** After completing what a command tells you to do, run the NEXT command it specifies. The commands are your instructions — follow them one at a time.
|
|
18
18
|
|
|
19
|
+
## TASK Directive
|
|
20
|
+
|
|
21
|
+
Some `codeyam editor N` commands output a `━━━ TASK ━━━` section with an `EXACT_TASK_TITLE:` line. When you see one:
|
|
22
|
+
|
|
23
|
+
1. Delete ALL existing tasks: run TaskList, then run TaskUpdate with status "deleted" for every task returned
|
|
24
|
+
2. Run TaskCreate with the EXACT title from the `EXACT_TASK_TITLE:` line — copy it character-for-character, do NOT paraphrase
|
|
25
|
+
|
|
26
|
+
This ensures only one task is ever visible. Do NOT create tasks on your own. Only create them when a `━━━ TASK ━━━` directive tells you to.
|
|
27
|
+
|
|
19
28
|
## Migration Mode
|
|
20
29
|
|
|
21
30
|
When `codeyam editor steps` shows **"Project Migration"** instead of "Feature Cycle", the project is being migrated from an existing codebase. Follow the `codeyam editor migrate` commands instead of the normal 13-step cycle.
|
|
@@ -117,6 +126,9 @@ This command gives you the post-change checklist (re-register scenarios, re-run
|
|
|
117
126
|
## Key Rules
|
|
118
127
|
|
|
119
128
|
- **Run the commands** — they ARE your instructions, not suggestions
|
|
129
|
+
- **One step at a time** — run each `codeyam editor N` command, read its FULL output, complete every checklist item, then advance. The CLI enforces a minimum time per step.
|
|
130
|
+
- **NEVER batch-run steps** — `for step in 5 6 7 8; do codeyam editor $step; done` or piping to `head` defeats the entire workflow. Each step has unique instructions you must read and follow.
|
|
131
|
+
- **NEVER delegate multiple steps to a subagent** — each step must be run, read, and completed in the main conversation. You MAY use subagents for parallelizable work _within_ a single step (e.g. extracting components + writing tests in step 5).
|
|
120
132
|
- **Every feature gets scenarios** — this is the core value of CodeYam
|
|
121
133
|
- **Always scaffold with a database** (Prisma + SQLite)
|
|
122
134
|
- **Build real API routes** — the proxy handles scenario data transparently
|
|
@@ -163,6 +175,21 @@ Isolation routes are committed to git (not gitignored). They are protected by a
|
|
|
163
175
|
|
|
164
176
|
When a collaborator clones the repo and runs `codeyam editor`, scenarios are auto-imported from `scenarios-manifest.json`. Run `codeyam editor sync` to manually re-sync after pulling new changes.
|
|
165
177
|
|
|
178
|
+
## Expo / React Native Projects
|
|
179
|
+
|
|
180
|
+
When working with an Expo project (tech stack `expo-react-native`):
|
|
181
|
+
|
|
182
|
+
- Use `<View>`, `<Text>`, `<ScrollView>`, `<Pressable>` from `react-native` — **never use HTML elements** (`<div>`, `<span>`, `<h1>`, etc.)
|
|
183
|
+
- Do NOT use `'use client'` — this is a Next.js directive that has no meaning in Expo
|
|
184
|
+
- Do NOT import from `next/navigation`, `next/router`, or any `next/*` package
|
|
185
|
+
- Use `expo-router` for navigation: `useRouter()`, `useLocalSearchParams()`, `<Link>`
|
|
186
|
+
- Use `@/lib/theme` for all design tokens — not CSS custom properties (`var(--token)` does not work in React Native)
|
|
187
|
+
- AsyncStorage maps to localStorage on web — CodeYam's `localStorage` injection in scenarios works automatically
|
|
188
|
+
- Test with `npx jest`, not `npx vitest`
|
|
189
|
+
- Isolation routes use Expo Router: `app/isolated-components/ComponentName.tsx` (not a `/page.tsx` subdirectory)
|
|
190
|
+
- Capture wrappers use `nativeID="codeyam-capture"` (not `id="codeyam-capture"`) — `nativeID` maps to `id` on web
|
|
191
|
+
- The preview renders via react-native-web in a browser — some visual differences from native devices are expected (fonts, SafeAreaView, shadows). See `MOBILE_SETUP.md` for details.
|
|
192
|
+
|
|
166
193
|
## Quick Reference
|
|
167
194
|
|
|
168
195
|
```bash
|
|
@@ -176,7 +203,13 @@ codeyam editor register '{"name":"Full Catalog","type":"application","url":"/","
|
|
|
176
203
|
# Register app scenario with localStorage (for apps using client-side storage instead of a database)
|
|
177
204
|
codeyam editor register '{"name":"Full Library","type":"application","url":"/","dimensions":["<name from screenSizes>"],"localStorage":{"articles":[...],"collections":[...]}}'
|
|
178
205
|
|
|
179
|
-
#
|
|
206
|
+
# BULK REGISTRATION (preferred — register all scenarios at once):
|
|
207
|
+
# Write an array of scenarios to a temp file, then register with @ prefix.
|
|
208
|
+
# This is faster and avoids repeated screenshot capture overhead.
|
|
209
|
+
# File format: [{"name":"...","type":"...","url":"...","seed":{...}}, ...]
|
|
210
|
+
codeyam editor register @.codeyam/tmp/scenarios.json
|
|
211
|
+
|
|
212
|
+
# Single scenario from file (for large seed/localStorage data):
|
|
180
213
|
codeyam editor register @/tmp/scenario-data.json
|
|
181
214
|
|
|
182
215
|
# Journal entry (one per feature, references scenario names)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeyam/codeyam-cli",
|
|
3
|
-
"version": "0.1.0-staging.
|
|
3
|
+
"version": "0.1.0-staging.a2f381a",
|
|
4
4
|
"description": "Local development CLI for CodeYam analysis",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"p-queue": "^9.1.0",
|
|
47
47
|
"p-retry": "^7.1.1",
|
|
48
48
|
"pg": "^8.19.0",
|
|
49
|
+
"posthog-node": "^4.0.0",
|
|
49
50
|
"piscina": "^5.1.4",
|
|
50
51
|
"pixelmatch": "^5.3.0",
|
|
51
52
|
"playwright": "1.58.0",
|
|
@@ -616,6 +616,97 @@ export class UseStateSemantics {
|
|
|
616
616
|
return true;
|
|
617
617
|
}
|
|
618
618
|
}
|
|
619
|
+
// ─── Set/Map method semantics ──────────────────────────────────────────
|
|
620
|
+
//
|
|
621
|
+
// Set/Map membership operations (.has, .delete, .add, .get, .set, .clear)
|
|
622
|
+
// don't create data flow equivalencies — they're membership checks or
|
|
623
|
+
// mutations, not transformations that propagate schema structure.
|
|
624
|
+
// Without these semantics, code like `filterRatings.has(articleId)` creates
|
|
625
|
+
// spurious equivalencies (332 entries in the Margo LibraryPage case).
|
|
626
|
+
/**
|
|
627
|
+
* Set.has() / Map.has() — membership check, returns boolean
|
|
628
|
+
*/
|
|
629
|
+
export class CollectionHasSemantics {
|
|
630
|
+
getReturnType() {
|
|
631
|
+
return 'boolean';
|
|
632
|
+
}
|
|
633
|
+
addEquivalences(methodCallPath, _sourcePath, context) {
|
|
634
|
+
context.addType(methodCallPath, 'boolean');
|
|
635
|
+
}
|
|
636
|
+
isComplete() {
|
|
637
|
+
return true;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Set.delete() / Map.delete() — removal, returns boolean
|
|
642
|
+
*/
|
|
643
|
+
export class CollectionDeleteSemantics {
|
|
644
|
+
getReturnType() {
|
|
645
|
+
return 'boolean';
|
|
646
|
+
}
|
|
647
|
+
addEquivalences(methodCallPath, _sourcePath, context) {
|
|
648
|
+
context.addType(methodCallPath, 'boolean');
|
|
649
|
+
}
|
|
650
|
+
isComplete() {
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* Set.add() — adds an element, returns the Set (for chaining)
|
|
656
|
+
*/
|
|
657
|
+
export class SetAddSemantics {
|
|
658
|
+
getReturnType() {
|
|
659
|
+
return 'object'; // Returns the Set itself
|
|
660
|
+
}
|
|
661
|
+
addEquivalences(_methodCallPath, _sourcePath, _context) {
|
|
662
|
+
// No equivalencies — add() doesn't create data flow
|
|
663
|
+
}
|
|
664
|
+
isComplete() {
|
|
665
|
+
return true;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Set.clear() / Map.clear() — removes all elements, returns void
|
|
670
|
+
*/
|
|
671
|
+
export class CollectionClearSemantics {
|
|
672
|
+
getReturnType() {
|
|
673
|
+
return 'void';
|
|
674
|
+
}
|
|
675
|
+
addEquivalences() {
|
|
676
|
+
// No equivalencies
|
|
677
|
+
}
|
|
678
|
+
isComplete() {
|
|
679
|
+
return true;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Map.get() — retrieves a value by key, returns unknown (value type)
|
|
684
|
+
*/
|
|
685
|
+
export class MapGetSemantics {
|
|
686
|
+
getReturnType() {
|
|
687
|
+
return 'unknown';
|
|
688
|
+
}
|
|
689
|
+
addEquivalences(_methodCallPath, _sourcePath, _context) {
|
|
690
|
+
// No equivalencies — the return value type depends on the map contents
|
|
691
|
+
}
|
|
692
|
+
isComplete() {
|
|
693
|
+
return true;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* Map.set() — sets a key-value pair, returns the Map (for chaining)
|
|
698
|
+
*/
|
|
699
|
+
export class MapSetSemantics {
|
|
700
|
+
getReturnType() {
|
|
701
|
+
return 'object'; // Returns the Map itself
|
|
702
|
+
}
|
|
703
|
+
addEquivalences() {
|
|
704
|
+
// No equivalencies
|
|
705
|
+
}
|
|
706
|
+
isComplete() {
|
|
707
|
+
return true;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
619
710
|
/**
|
|
620
711
|
* Create and populate the registry with method semantics
|
|
621
712
|
*/
|
|
@@ -645,6 +736,14 @@ export function createMethodRegistry() {
|
|
|
645
736
|
// Register React hooks
|
|
646
737
|
registry.register('useState', new UseStateSemantics(), 'React');
|
|
647
738
|
registry.register('useMemo', new UseMemoSemantics(), 'React');
|
|
739
|
+
// Register Set/Map collection methods.
|
|
740
|
+
// Only .has() and .delete() are safe to register by method name — they always
|
|
741
|
+
// return boolean regardless of the collection type (Set, Map, WeakSet, WeakMap,
|
|
742
|
+
// FormData, URLSearchParams, etc.).
|
|
743
|
+
// .add(), .clear(), .get(), .set() are too ambiguous across different types
|
|
744
|
+
// and can't be registered until the lookup code supports class-aware resolution.
|
|
745
|
+
registry.register('has', new CollectionHasSemantics());
|
|
746
|
+
registry.register('delete', new CollectionDeleteSemantics());
|
|
648
747
|
return registry;
|
|
649
748
|
}
|
|
650
749
|
// Create a singleton instance of the registry for use throughout the codebase
|