@codeyam/codeyam-cli 0.1.0-staging.b8b17a5 → 0.1.0-staging.b8ee127
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 +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 +15 -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.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 +38 -3
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +2207 -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/init.js +20 -0
- package/codeyam-cli/src/commands/init.js.map +1 -1
- 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__/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 +2232 -52
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/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 +398 -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 +249 -1
- 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 +266 -2
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +16 -1
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/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__/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/editorApi.js +16 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +504 -43
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorGuard.js +36 -0
- package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
- package/codeyam-cli/src/utils/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 +301 -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 +141 -7
- 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 +31 -3
- 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/glossaryAdd.js +74 -0
- package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +32 -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/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__/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 +145 -11
- 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-BusrvT2F.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-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)-CsYVRiNH.js +147 -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._-Ce1s4OQ1.js} +13 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-D1eikpe1.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-Gp2o-NMc.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-ef0f624d.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-Didv9PLi.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-BKMsxwqe.js +16 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-CHymws6l.js → index-CvuvIPEn.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-B3gVLAAJ.js +14 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-B4LxStYP.js +741 -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 +132 -7
- 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 +119 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +174 -32
- 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-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/seed-adapter.ts +47 -34
- package/codeyam-cli/templates/seed-adapters/supabase.ts +133 -52
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +34 -1
- package/package.json +1 -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)-DYqG1D_d.js +0 -58
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-DggyRwOr.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/globals-DRvOjyO3.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-f4212c17.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-F-k2uYj5.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-if8kM_1Q.js +0 -13
- package/codeyam-cli/src/webserver/build/server/assets/init-D3HkMDbI.js +0 -10
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DTCzJQiH.js +0 -551
- 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
|
@@ -15,40 +15,44 @@ from datetime import datetime, timezone
|
|
|
15
15
|
|
|
16
16
|
STEP_LABELS = {
|
|
17
17
|
1: "Plan",
|
|
18
|
-
2: "
|
|
19
|
-
3: "
|
|
20
|
-
4: "
|
|
21
|
-
5: "
|
|
22
|
-
6: "
|
|
23
|
-
7: "
|
|
24
|
-
8: "
|
|
25
|
-
9: "
|
|
26
|
-
10: "
|
|
27
|
-
11: "
|
|
28
|
-
12: "
|
|
29
|
-
13: "
|
|
30
|
-
14: "
|
|
31
|
-
15: "
|
|
32
|
-
16: "
|
|
18
|
+
2: "Prepare",
|
|
19
|
+
3: "Prototype",
|
|
20
|
+
4: "Verify Prototype",
|
|
21
|
+
5: "Confirm",
|
|
22
|
+
6: "Deconstruct",
|
|
23
|
+
7: "Extract",
|
|
24
|
+
8: "Glossary",
|
|
25
|
+
9: "Analyze",
|
|
26
|
+
10: "App Scenarios",
|
|
27
|
+
11: "User Scenarios",
|
|
28
|
+
12: "Verify",
|
|
29
|
+
13: "Journal",
|
|
30
|
+
14: "Review",
|
|
31
|
+
15: "Present",
|
|
32
|
+
16: "Commit",
|
|
33
|
+
17: "Finalize",
|
|
34
|
+
18: "Push",
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
STEP_RESTRICTIONS = {
|
|
36
38
|
1: "Do NOT write any code. Plan and describe only. Wait for user confirmation.",
|
|
37
|
-
2: "Do NOT
|
|
38
|
-
3: "
|
|
39
|
-
4: "
|
|
40
|
-
5: "
|
|
41
|
-
6: "Do NOT write
|
|
42
|
-
7: "
|
|
43
|
-
8: "Do NOT
|
|
44
|
-
9: "
|
|
45
|
-
10: "
|
|
46
|
-
11: "
|
|
47
|
-
12: "Verify
|
|
48
|
-
13: "
|
|
49
|
-
14: "
|
|
50
|
-
15: "
|
|
51
|
-
16: "
|
|
39
|
+
2: "Do NOT write any code or build features. Set up the project and prepare the database only.",
|
|
40
|
+
3: "Do NOT create scenarios or run codeyam analyze. Build fast — working prototype with real data.",
|
|
41
|
+
4: "Verify the prototype works. Do NOT add features — only fix broken functionality.",
|
|
42
|
+
5: "Present a selection menu (AskUserQuestion) for confirmation. Do NOT refactor or create scenarios until approved.",
|
|
43
|
+
6: "Do NOT write any code. Read every file, identify all extractable pieces, write a numbered plan. Planning only. Every opportunity to extract code into a function, helper, or sub-component MUST be taken. Then plan to extract from the extracted code until each piece does one clearly defined thing.",
|
|
44
|
+
7: "Execute the extraction plan from step 6. Components first (no tests), then library functions via TDD. Page files must contain ZERO direct JSX. After extraction: re-read every file — extract further until each piece does one thing. Verify every test file covers all conditional branches.",
|
|
45
|
+
8: "Do NOT write application code or scenarios. Update the glossary only.",
|
|
46
|
+
9: "Create isolation routes for visual components, run tests for library functions. Register component scenarios via codeyam editor register.",
|
|
47
|
+
10: "Do NOT modify application code. Create and register app-level scenarios only.",
|
|
48
|
+
11: "Do NOT modify application code. Create user-persona scenarios only (or skip if no users).",
|
|
49
|
+
12: "Verify component isolation screenshots AND editor scenarios. After ANY code fix, re-register affected components. Fix only — do NOT add features.",
|
|
50
|
+
13: "Create or update the journal entry for this feature. Do NOT create a duplicate — check if one exists first.",
|
|
51
|
+
14: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors). Run codeyam editor audit. Do not proceed until all checks pass.",
|
|
52
|
+
15: "Show the results panel, present summary, then selection menu (AskUserQuestion): Save or make changes.",
|
|
53
|
+
16: "Hide the results panel and commit all changes. Do NOT push — that happens in step 18.",
|
|
54
|
+
17: "Update the journal entry with the commit SHA and amend the commit to include the journal update.",
|
|
55
|
+
18: "Check for a git remote and offer to push. After push (or skip), call the feature-complete API and STOP.",
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
MIGRATION_STEP_LABELS = {
|
|
@@ -127,18 +131,34 @@ def main():
|
|
|
127
131
|
# Detect event early so we can capture the user prompt even before state exists
|
|
128
132
|
event_type, event_data = detect_event()
|
|
129
133
|
|
|
130
|
-
# Capture the
|
|
131
|
-
#
|
|
134
|
+
# Capture the user's feature request prompt.
|
|
135
|
+
# Write when: (a) no prompt file yet, (b) no state file (between features),
|
|
136
|
+
# or (c) previous feature is done (step >= 18). This ensures the prompt
|
|
137
|
+
# is refreshed for each new feature instead of persisting stale text.
|
|
132
138
|
# Skip slash commands (e.g. /codeyam-editor) — they aren't user prompts.
|
|
133
|
-
if event_type == "user_prompt"
|
|
139
|
+
if event_type == "user_prompt":
|
|
134
140
|
prompt_text = event_data.get("prompt", "").strip()
|
|
135
141
|
if prompt_text and not prompt_text.startswith("/"):
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
+
should_capture = not os.path.exists(prompt_path)
|
|
143
|
+
if not should_capture:
|
|
144
|
+
# Overwrite stale prompt when between features
|
|
145
|
+
if not os.path.exists(state_path):
|
|
146
|
+
should_capture = True
|
|
147
|
+
else:
|
|
148
|
+
try:
|
|
149
|
+
with open(state_path, "r") as f:
|
|
150
|
+
prev = json.load(f)
|
|
151
|
+
if prev.get("step", 0) >= 18:
|
|
152
|
+
should_capture = True
|
|
153
|
+
except Exception:
|
|
154
|
+
pass
|
|
155
|
+
if should_capture:
|
|
156
|
+
try:
|
|
157
|
+
os.makedirs(os.path.dirname(prompt_path), exist_ok=True)
|
|
158
|
+
with open(prompt_path, "w") as f:
|
|
159
|
+
f.write(prompt_text)
|
|
160
|
+
except Exception:
|
|
161
|
+
pass # Best-effort
|
|
142
162
|
|
|
143
163
|
if not os.path.exists(state_path):
|
|
144
164
|
return
|
|
@@ -157,6 +177,27 @@ def main():
|
|
|
157
177
|
if not step:
|
|
158
178
|
return
|
|
159
179
|
|
|
180
|
+
# ── Task tracking ──────────────────────────────────────────────────
|
|
181
|
+
# Track whether TaskCreate was called between step transitions.
|
|
182
|
+
# If Claude advances to the next step without creating a task, block it.
|
|
183
|
+
task_tracking_path = os.path.join(project_dir, ".codeyam", "editor-task-tracking.json")
|
|
184
|
+
|
|
185
|
+
if event_type == "post_tool_use":
|
|
186
|
+
tool_name = event_data.get("tool_name", "")
|
|
187
|
+
|
|
188
|
+
# Record when TaskCreate is called
|
|
189
|
+
if tool_name == "TaskCreate":
|
|
190
|
+
try:
|
|
191
|
+
tracking = {}
|
|
192
|
+
if os.path.exists(task_tracking_path):
|
|
193
|
+
with open(task_tracking_path, "r") as f:
|
|
194
|
+
tracking = json.load(f)
|
|
195
|
+
tracking["taskCreated"] = True
|
|
196
|
+
with open(task_tracking_path, "w") as f:
|
|
197
|
+
json.dump(tracking, f)
|
|
198
|
+
except Exception:
|
|
199
|
+
pass
|
|
200
|
+
|
|
160
201
|
# Log the hook firing
|
|
161
202
|
log_data = {"step": step, "label": label, "feature": feature, "hook": event_type}
|
|
162
203
|
if migration:
|
|
@@ -171,7 +212,7 @@ def main():
|
|
|
171
212
|
next_cmd = f"codeyam editor migrate {step + 1}" if step < 10 else "codeyam editor migrate next"
|
|
172
213
|
else:
|
|
173
214
|
restriction = STEP_RESTRICTIONS.get(step, "")
|
|
174
|
-
next_cmd = f"codeyam editor {step + 1}" if step <
|
|
215
|
+
next_cmd = f"codeyam editor {step + 1}" if step < 18 else "(feature complete — UI handles transition)"
|
|
175
216
|
|
|
176
217
|
# UserPromptSubmit: concise workflow reminder injected before Claude processes the user's message
|
|
177
218
|
if event_type == "user_prompt":
|
|
@@ -212,14 +253,14 @@ def main():
|
|
|
212
253
|
"The change workflow ensures Working Session Results are shown to the user. "
|
|
213
254
|
"If the user chose to commit, run `codeyam editor migrate next` to advance to the next page."
|
|
214
255
|
)
|
|
215
|
-
elif step in (
|
|
256
|
+
elif step in (15, 16, 17, 18) and not migration:
|
|
216
257
|
lines.append(
|
|
217
258
|
"If the user is requesting changes (even indirectly), "
|
|
218
259
|
"run `codeyam editor change` BEFORE making any modifications "
|
|
219
260
|
"(code, scenarios, data, styles — everything). "
|
|
220
261
|
"The change command gives you the post-change checklist. "
|
|
221
262
|
"The change workflow ensures Working Session Results are shown to the user. "
|
|
222
|
-
"If the user chose to commit, run `codeyam editor
|
|
263
|
+
"If the user chose to commit, run `codeyam editor 16` to advance to the commit step."
|
|
223
264
|
)
|
|
224
265
|
elif migration:
|
|
225
266
|
lines.append(
|
|
@@ -270,9 +311,9 @@ def main():
|
|
|
270
311
|
tracker.append(f"{DIM} \u2502 \u25cb {cntnt}\u2502{RESET}")
|
|
271
312
|
tracker.append(f"{DIM} \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518{RESET}")
|
|
272
313
|
else:
|
|
273
|
-
# Standard progress tracker (
|
|
314
|
+
# Standard progress tracker (18 steps)
|
|
274
315
|
tracker = [f"{DIM} \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510{RESET}"]
|
|
275
|
-
for i in range(1,
|
|
316
|
+
for i in range(1, 19):
|
|
276
317
|
lbl = STEP_LABELS[i].ljust(28)
|
|
277
318
|
num = f" {i}" if i < 10 else f"{i}"
|
|
278
319
|
content = f"{num}. {lbl}"
|
|
@@ -291,7 +332,7 @@ def main():
|
|
|
291
332
|
"\u2713 (done) or \u2717 (skipped + reason)."
|
|
292
333
|
)
|
|
293
334
|
|
|
294
|
-
if event_type == "stop" and ((step in (
|
|
335
|
+
if event_type == "stop" and ((step in (15, 16) and not migration) or (step == 8 and migration)):
|
|
295
336
|
import subprocess as _sp
|
|
296
337
|
try:
|
|
297
338
|
_result = _sp.run(
|
|
@@ -309,9 +350,15 @@ def main():
|
|
|
309
350
|
)
|
|
310
351
|
lines.append(
|
|
311
352
|
f"\033[31mRun `codeyam editor change` if you haven't already, then complete the "
|
|
312
|
-
f"checklist and run `{'codeyam editor migrate 8' if migration else 'codeyam editor
|
|
353
|
+
f"checklist and run `{'codeyam editor migrate 8' if migration else 'codeyam editor 15'}` to show results to the user.\033[0m"
|
|
313
354
|
)
|
|
314
355
|
|
|
356
|
+
if event_type == "stop":
|
|
357
|
+
lines.append(
|
|
358
|
+
f"\n\033[2mReminder: Only use `codeyam editor` subcommands in the Build terminal. "
|
|
359
|
+
f"Follow `codeyam editor steps` when changing code.\033[0m"
|
|
360
|
+
)
|
|
361
|
+
|
|
315
362
|
lines.append(f"When this step is complete, run: {next_cmd}")
|
|
316
363
|
|
|
317
364
|
print("\n".join(lines))
|
|
@@ -29,14 +29,13 @@ npm start
|
|
|
29
29
|
|
|
30
30
|
```
|
|
31
31
|
app/ # Expo Router file-based routes
|
|
32
|
-
_layout.tsx # Root layout (
|
|
33
|
-
|
|
34
|
-
_layout.tsx # Tab bar configuration
|
|
35
|
-
index.tsx # Home tab
|
|
36
|
-
settings.tsx # Settings tab
|
|
32
|
+
_layout.tsx # Root layout (SafeAreaProvider, StatusBar)
|
|
33
|
+
index.tsx # Home screen (single entry point)
|
|
37
34
|
components/ # Reusable components
|
|
38
35
|
lib/
|
|
36
|
+
theme.ts # Design tokens (colors, spacing, typography)
|
|
39
37
|
storage.ts # AsyncStorage wrapper for persistent data
|
|
38
|
+
__tests__/ # Test files (keep outside app/ — Expo Router treats all app/ files as routes)
|
|
40
39
|
```
|
|
41
40
|
|
|
42
41
|
## Key Patterns
|
|
@@ -78,6 +77,206 @@ Use Tailwind classes on React Native components:
|
|
|
78
77
|
</View>
|
|
79
78
|
```
|
|
80
79
|
|
|
80
|
+
## CodeYam Scenario Data
|
|
81
|
+
|
|
82
|
+
### AsyncStorage Seeding
|
|
83
|
+
|
|
84
|
+
AsyncStorage uses `localStorage` on web, so CodeYam's existing localStorage injection works automatically. Use the `localStorage` field in scenario JSON to pre-populate storage:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"name": "With Saved Items",
|
|
89
|
+
"url": "/",
|
|
90
|
+
"dimensions": ["iPhone 16"],
|
|
91
|
+
"localStorage": {
|
|
92
|
+
"items": "[{\"id\":\"1\",\"title\":\"Buy groceries\",\"done\":false},{\"id\":\"2\",\"title\":\"Walk the dog\",\"done\":true}]"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Values must be JSON strings (matching how AsyncStorage stores them). Your `storage.get()` calls will read this data normally.
|
|
98
|
+
|
|
99
|
+
### API Mocking
|
|
100
|
+
|
|
101
|
+
For apps that fetch from APIs, use relative URLs so CodeYam's proxy can intercept and mock them:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
// Use relative URLs — these go through the CodeYam proxy
|
|
105
|
+
const response = await fetch('/api/items');
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Then provide mock routes in your scenario data:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"name": "With API Data",
|
|
113
|
+
"url": "/",
|
|
114
|
+
"dimensions": ["iPhone 16"],
|
|
115
|
+
"routes": {
|
|
116
|
+
"/api/items": {
|
|
117
|
+
"body": [{ "id": 1, "title": "First item" }],
|
|
118
|
+
"status": 200
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Device Presets
|
|
125
|
+
|
|
126
|
+
Mobile projects default to these screen sizes:
|
|
127
|
+
|
|
128
|
+
| Preset | Width | Height |
|
|
129
|
+
| ----------------- | ----- | ------ |
|
|
130
|
+
| iPhone 16 | 393 | 852 |
|
|
131
|
+
| iPhone 16 Pro Max | 430 | 932 |
|
|
132
|
+
| iPhone SE | 375 | 667 |
|
|
133
|
+
| Pixel 8 | 412 | 915 |
|
|
134
|
+
| iPad mini | 744 | 1133 |
|
|
135
|
+
|
|
136
|
+
## Design Tokens (lib/theme.ts)
|
|
137
|
+
|
|
138
|
+
All design tokens live in `lib/theme.ts` — this is the **single source of truth** for colors, spacing, typography, and border radius. Import and use in every component:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import { theme } from '@/lib/theme';
|
|
142
|
+
|
|
143
|
+
<View
|
|
144
|
+
style={{ backgroundColor: theme.colors.bgBase, padding: theme.spacing.lg }}
|
|
145
|
+
>
|
|
146
|
+
<Text
|
|
147
|
+
style={{ fontSize: theme.fontSize.lg, color: theme.colors.textPrimary }}
|
|
148
|
+
>
|
|
149
|
+
Hello
|
|
150
|
+
</Text>
|
|
151
|
+
</View>;
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Do NOT:**
|
|
155
|
+
|
|
156
|
+
- Use CSS custom properties (`var(--token)`) — they don't work in React Native
|
|
157
|
+
- Hardcode color strings or pixel values in components
|
|
158
|
+
- Create a separate `globals.css` token system — `lib/theme.ts` is the only source
|
|
159
|
+
|
|
160
|
+
When a design system is selected, populate `lib/theme.ts` with its tokens.
|
|
161
|
+
|
|
162
|
+
## Testing
|
|
163
|
+
|
|
164
|
+
Tests use Jest with the `jest-expo` preset. Run with:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npx jest # Run all tests
|
|
168
|
+
npx jest app/hooks/useCounter.ts # Run specific test file
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The Jest config is in `package.json`. The `transformIgnorePatterns` is pre-configured to handle Expo and React Native module transforms — you should not need to modify it.
|
|
172
|
+
|
|
173
|
+
## Building for a Real iOS Device
|
|
174
|
+
|
|
175
|
+
### Prerequisites
|
|
176
|
+
|
|
177
|
+
- **Xcode 16.x** (Xcode 16.4 or later recommended)
|
|
178
|
+
- **Apple Developer account** (free is fine for personal devices)
|
|
179
|
+
- Device connected via USB or on the same Wi-Fi network
|
|
180
|
+
|
|
181
|
+
### Steps
|
|
182
|
+
|
|
183
|
+
1. Generate the native iOS project:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npx expo prebuild --clean
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
2. Add Swift 5 enforcement to the generated Podfile. Open `ios/Podfile` and add this inside the `post_install` block, after `react_native_post_install(...)`:
|
|
190
|
+
|
|
191
|
+
```ruby
|
|
192
|
+
# Fix Swift 6.1 (Xcode 16.4) strict concurrency errors
|
|
193
|
+
installer.pods_project.targets.each do |target|
|
|
194
|
+
target.build_configurations.each do |config|
|
|
195
|
+
config.build_settings['SWIFT_VERSION'] = '5.0'
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
3. Reinstall pods with the fix:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
cd ios && pod install && cd ..
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
4. Build and run on your device:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
npx expo run:ios --device
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Troubleshooting
|
|
213
|
+
|
|
214
|
+
- **"invalid code signature" / "profile has not been explicitly trusted"**: Your iPhone doesn't trust the developer profile yet. On your iPhone: **Settings → General → VPN & Device Management** → tap your Apple ID → **Trust**. Then relaunch the app.
|
|
215
|
+
- **"No script URL provided"**: Metro bundler isn't running or the device can't reach it. Start Metro with `npx expo start` in a separate terminal, then relaunch the app. Your phone and Mac must be on the same Wi-Fi network.
|
|
216
|
+
- **"Missing factory in ExpoAppDelegate"** crash: The native project is stale. Run `npx expo prebuild --clean` to regenerate it.
|
|
217
|
+
- **"ambiguous implicit access level for import"** error: The `patch-package` fix wasn't applied. Run `npm install` to reapply, then `cd ios && pod install`.
|
|
218
|
+
|
|
219
|
+
### Notes
|
|
220
|
+
|
|
221
|
+
- The `ios/` and `android/` directories are gitignored — they're generated by `expo prebuild` and shouldn't be committed.
|
|
222
|
+
- The `patches/` directory IS committed — it contains a fix for Xcode 16.4 Swift compatibility that auto-applies on `npm install`.
|
|
223
|
+
|
|
224
|
+
## Web vs Native Differences
|
|
225
|
+
|
|
226
|
+
The CodeYam editor previews your app via **Expo Web** (react-native-web in a browser). Some differences from native iOS/Android devices are expected:
|
|
227
|
+
|
|
228
|
+
| Aspect | Web Preview | Native Device |
|
|
229
|
+
| ---------------- | ------------------------------------------------------ | ------------------------------------------------------- |
|
|
230
|
+
| **Fonts** | System fonts, may differ in weight/metrics/line-height | Loaded custom fonts (if added via expo-font) |
|
|
231
|
+
| **SafeAreaView** | No effect (no notch in browser) | Applies real safe area insets for notch, home indicator |
|
|
232
|
+
| **Platform.OS** | Returns `'web'` | Returns `'ios'` or `'android'` |
|
|
233
|
+
| **Shadows** | Uses CSS `box-shadow` (works well) | Uses RN shadow props (iOS) or `elevation` (Android) |
|
|
234
|
+
| **Gestures** | Mouse drag events | Touch/swipe with inertia |
|
|
235
|
+
| **StatusBar** | No visible effect | Controls device status bar appearance |
|
|
236
|
+
| **Haptics** | No-op | Real haptic feedback via `expo-haptics` |
|
|
237
|
+
| **Pressable** | `backgroundColor`/`borderStyle` work on Pressable | Must use View wrapper (see below) |
|
|
238
|
+
|
|
239
|
+
### Pressable Styling on Native
|
|
240
|
+
|
|
241
|
+
`<Pressable>` with `backgroundColor`, `borderRadius`, or `borderStyle: 'dashed'` renders correctly in the web preview but **fails silently on native devices** — the background/border simply won't appear.
|
|
242
|
+
|
|
243
|
+
**Fix:** Put visual styles on a wrapping `<View>` and use `onPressIn`/`onPressOut` for press feedback:
|
|
244
|
+
|
|
245
|
+
```tsx
|
|
246
|
+
const [pressed, setPressed] = useState(false);
|
|
247
|
+
|
|
248
|
+
<View
|
|
249
|
+
style={{
|
|
250
|
+
backgroundColor: theme.colors.bgInverse,
|
|
251
|
+
borderRadius: 60,
|
|
252
|
+
overflow: 'hidden',
|
|
253
|
+
}}
|
|
254
|
+
>
|
|
255
|
+
<Pressable
|
|
256
|
+
onPress={onPress}
|
|
257
|
+
onPressIn={() => setPressed(true)}
|
|
258
|
+
onPressOut={() => setPressed(false)}
|
|
259
|
+
style={{
|
|
260
|
+
opacity: pressed ? 0.8 : 1,
|
|
261
|
+
alignItems: 'center',
|
|
262
|
+
padding: theme.spacing.lg,
|
|
263
|
+
}}
|
|
264
|
+
>
|
|
265
|
+
<Text style={{ color: theme.colors.accent }}>+</Text>
|
|
266
|
+
</Pressable>
|
|
267
|
+
</View>;
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
For dashed borders, put `borderStyle`, `borderWidth`, and `borderColor` on the outer `<View>`, not on `<Pressable>`.
|
|
271
|
+
|
|
272
|
+
**The web preview is for layout and data verification.** Test final visual polish on a real device or simulator:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
npm run ios # iOS Simulator
|
|
276
|
+
npm run android # Android Emulator
|
|
277
|
+
npm start # Pick platform from Expo menu
|
|
278
|
+
```
|
|
279
|
+
|
|
81
280
|
## Building for Production
|
|
82
281
|
|
|
83
282
|
```bash
|
|
File without changes
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import '../global.css';
|
|
2
2
|
import { Stack } from 'expo-router';
|
|
3
3
|
import { StatusBar } from 'expo-status-bar';
|
|
4
|
+
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
|
|
4
5
|
|
|
5
6
|
export default function RootLayout() {
|
|
6
7
|
return (
|
|
7
|
-
|
|
8
|
-
<
|
|
8
|
+
<SafeAreaProvider>
|
|
9
|
+
<SafeAreaView style={{ flex: 1 }}>
|
|
10
|
+
<Stack screenOptions={{ headerShown: false }} />
|
|
11
|
+
</SafeAreaView>
|
|
9
12
|
<StatusBar style="auto" />
|
|
10
|
-
|
|
13
|
+
</SafeAreaProvider>
|
|
11
14
|
);
|
|
12
15
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { View, Text } from 'react-native';
|
|
2
|
+
import { theme } from '@/lib/theme';
|
|
3
|
+
|
|
4
|
+
export default function HomeScreen() {
|
|
5
|
+
return (
|
|
6
|
+
<View
|
|
7
|
+
style={{
|
|
8
|
+
flex: 1,
|
|
9
|
+
alignItems: 'center',
|
|
10
|
+
justifyContent: 'center',
|
|
11
|
+
backgroundColor: theme.colors.bgBase,
|
|
12
|
+
padding: theme.spacing.lg,
|
|
13
|
+
}}
|
|
14
|
+
>
|
|
15
|
+
<Text
|
|
16
|
+
style={{
|
|
17
|
+
fontSize: theme.fontSize['2xl'],
|
|
18
|
+
fontWeight: theme.fontWeight.bold,
|
|
19
|
+
color: theme.colors.textPrimary,
|
|
20
|
+
marginBottom: theme.spacing.sm,
|
|
21
|
+
}}
|
|
22
|
+
>
|
|
23
|
+
Welcome
|
|
24
|
+
</Text>
|
|
25
|
+
<Text
|
|
26
|
+
style={{
|
|
27
|
+
fontSize: theme.fontSize.base,
|
|
28
|
+
color: theme.colors.textSecondary,
|
|
29
|
+
textAlign: 'center',
|
|
30
|
+
}}
|
|
31
|
+
>
|
|
32
|
+
Your Expo app is ready. Start building!
|
|
33
|
+
</Text>
|
|
34
|
+
</View>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"slug": "codeyam-expo-app",
|
|
5
5
|
"version": "1.0.0",
|
|
6
6
|
"scheme": "codeyam-expo-app",
|
|
7
|
+
"icon": "./assets/icon.png",
|
|
7
8
|
"platforms": ["ios", "android", "web"],
|
|
8
9
|
"web": {
|
|
9
10
|
"bundler": "metro",
|
|
@@ -13,6 +14,16 @@
|
|
|
13
14
|
"plugins": ["expo-router"],
|
|
14
15
|
"experiments": {
|
|
15
16
|
"typedRoutes": true
|
|
17
|
+
},
|
|
18
|
+
"ios": {
|
|
19
|
+
"bundleIdentifier": "com.codeyam.expo-app"
|
|
20
|
+
},
|
|
21
|
+
"android": {
|
|
22
|
+
"adaptiveIcon": {
|
|
23
|
+
"foregroundImage": "./assets/adaptive-icon.png",
|
|
24
|
+
"backgroundColor": "#f8fafc"
|
|
25
|
+
},
|
|
26
|
+
"package": "com.codeyam.expoapp"
|
|
16
27
|
}
|
|
17
28
|
}
|
|
18
29
|
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/* NativeWind / Tailwind utility layer.
|
|
2
|
+
*
|
|
3
|
+
* Design tokens are defined in lib/theme.ts — that is the single source
|
|
4
|
+
* of truth for colors, spacing, typography, and border radius.
|
|
5
|
+
* Do NOT define CSS custom properties here for design tokens.
|
|
6
|
+
* React Native components cannot read CSS variables.
|
|
7
|
+
*/
|
|
1
8
|
@tailwind base;
|
|
2
9
|
@tailwind components;
|
|
3
10
|
@tailwind utilities;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design tokens — single source of truth for all styling.
|
|
3
|
+
*
|
|
4
|
+
* When a design system is selected (via .codeyam/design-system.md),
|
|
5
|
+
* populate these values from the design system's color palette,
|
|
6
|
+
* typography scale, and spacing rhythm.
|
|
7
|
+
*
|
|
8
|
+
* Import in every component:
|
|
9
|
+
* import { theme } from '@/lib/theme';
|
|
10
|
+
* <View style={{ backgroundColor: theme.colors.bgBase }}>
|
|
11
|
+
*
|
|
12
|
+
* Do NOT use CSS custom properties (var(--token)) in React Native.
|
|
13
|
+
* Do NOT hardcode color strings or pixel values in components.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export const theme = {
|
|
17
|
+
colors: {
|
|
18
|
+
bgBase: '#f8fafc',
|
|
19
|
+
bgSurface: '#ffffff',
|
|
20
|
+
bgSurfaceRaised: '#ffffff',
|
|
21
|
+
bgInverse: '#1e293b',
|
|
22
|
+
|
|
23
|
+
textPrimary: '#0f172a',
|
|
24
|
+
textSecondary: '#475569',
|
|
25
|
+
textMuted: '#94a3b8',
|
|
26
|
+
|
|
27
|
+
border: '#e2e8f0',
|
|
28
|
+
|
|
29
|
+
accent: '#005C75',
|
|
30
|
+
accentLight: '#e0f2fe',
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
spacing: {
|
|
34
|
+
xs: 4,
|
|
35
|
+
sm: 8,
|
|
36
|
+
md: 12,
|
|
37
|
+
lg: 16,
|
|
38
|
+
xl: 24,
|
|
39
|
+
'2xl': 32,
|
|
40
|
+
'3xl': 48,
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
fontSize: {
|
|
44
|
+
xs: 12,
|
|
45
|
+
sm: 14,
|
|
46
|
+
base: 16,
|
|
47
|
+
lg: 18,
|
|
48
|
+
xl: 20,
|
|
49
|
+
'2xl': 24,
|
|
50
|
+
'3xl': 30,
|
|
51
|
+
'4xl': 36,
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
fontWeight: {
|
|
55
|
+
normal: '400' as const,
|
|
56
|
+
medium: '500' as const,
|
|
57
|
+
semibold: '600' as const,
|
|
58
|
+
bold: '700' as const,
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
fontFamily: {
|
|
62
|
+
sans: 'System',
|
|
63
|
+
mono: 'monospace',
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
borderRadius: {
|
|
67
|
+
sm: 4,
|
|
68
|
+
md: 8,
|
|
69
|
+
lg: 12,
|
|
70
|
+
xl: 16,
|
|
71
|
+
full: 9999,
|
|
72
|
+
},
|
|
73
|
+
};
|