@codeyam/codeyam-cli 0.1.0-staging.2ea44f6 → 0.1.0-staging.3ef993e
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 +1 -1
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +73 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +6 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +73 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
- package/analyzer-template/packages/ui-components/package.json +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +45 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +1265 -213
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +67 -34
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/data/techStacks.js +77 -0
- package/codeyam-cli/src/data/techStacks.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +508 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +152 -3
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +140 -12
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +238 -2
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +128 -1
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +191 -5
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +887 -2
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +213 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +289 -40
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +227 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +426 -218
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +13 -5
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
- package/codeyam-cli/src/utils/analyzer.js +9 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
- package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
- package/codeyam-cli/src/utils/backgroundServer.js +92 -16
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/database.js +37 -2
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +91 -3
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorDevServer.js +89 -1
- package/codeyam-cli/src/utils/editorDevServer.js.map +1 -1
- package/codeyam-cli/src/utils/editorImageVerifier.js +45 -10
- package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -1
- package/codeyam-cli/src/utils/editorJournal.js +78 -3
- package/codeyam-cli/src/utils/editorJournal.js.map +1 -1
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +32 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -1
- package/codeyam-cli/src/utils/editorPreview.js +43 -2
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarios.js +291 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +173 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +42 -19
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +56 -5
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -1
- package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +2 -2
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/scenarioCoverage.js +75 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +204 -75
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +30 -0
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +13 -5
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +8 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/slugUtils.js +25 -0
- package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +21 -0
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +567 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +146 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/git.js +3 -2
- package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-ZlRKbhrq.js → ScenarioViewer-TSD3C211.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-CltMNppm.js → dev.empty-Ii3inc0_.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor-COWCNVyV.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CNB06EIa.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-DItJnD8s.js → entity._sha._-DwCV5__E.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-CCa2trIL.js → entity._sha.scenarios._scenarioId.dev-CXSi2aeZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CHMiAog3.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-CdN8sCqs.js → git-DdZcvjGh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-phvmGvat.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/manifest-6134dc40.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-9gnxSZlb.js +101 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/root-BWAyuj0r.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C-_hOl_g.js +1 -0
- package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-ChX0hPcu.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-kSNsMjj8.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Bm2xIhmh.js +439 -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 +487 -17
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/idleDetector.js +73 -0
- package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
- package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +21 -3
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
- package/codeyam-cli/src/webserver/server.js +59 -34
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +64 -32
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
- package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
- package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
- package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
- package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
- package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
- package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
- package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
- package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
- package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +84 -5
- package/codeyam-cli/templates/editor-step-hook.py +37 -8
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
- package/codeyam-cli/templates/expo-react-native/README.md +41 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app.json +18 -0
- package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
- package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
- package/codeyam-cli/templates/expo-react-native/global.css +3 -0
- package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
- package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
- package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
- package/codeyam-cli/templates/expo-react-native/package.json +38 -0
- package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
- package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
- package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +1 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +1 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
- package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
- package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +1 -1
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +28 -9
- package/package.json +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +73 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +0 -6
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +0 -25
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/src/enums/ProjectFramework.js +2 -0
- package/packages/types/src/enums/ProjectFramework.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
- package/codeyam-cli/src/webserver/build/client/assets/editor-Rfq_y0VR.js +0 -10
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-GNwaLSmC.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CF164ouH.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-Bd0cs8vw.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-9ab0aba3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
- package/codeyam-cli/src/webserver/build/client/assets/root-3ciuWk-c.js +0 -67
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-CrAK28Bc.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DCxIbVvl.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-E-peu3XZ.js +0 -367
|
@@ -26,14 +26,20 @@ A **scenario** is a named set of data that drives how the app renders. Scenarios
|
|
|
26
26
|
- **App-level scenarios**: Full application state — what the database contains, what API responses return. Example: "Empty Dashboard", "Dashboard with 50 Tasks", "Dashboard with Overdue Tasks"
|
|
27
27
|
- **Component-level scenarios**: Props for a single component in isolation. Example: "TaskCard - Default", "TaskCard - Overdue", "TaskCard - Completed"
|
|
28
28
|
|
|
29
|
-
**
|
|
29
|
+
**Only create scenarios for states the current code can render.** If you seed 10 articles but the app doesn't have an article list component yet, the screenshot will show an empty page — that's a broken scenario. After registering, always view the captured screenshot to verify the data is actually visible.
|
|
30
|
+
|
|
31
|
+
**Always register scenarios with CodeYam** using the CLI:
|
|
30
32
|
|
|
31
33
|
```bash
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
# Small inline JSON:
|
|
35
|
+
codeyam editor register '{"name":"TaskCard - Default","componentName":"TaskCard","url":"/isolated-components/TaskCard?s=Default","dimensions":["<name from screenSizes>"]}'
|
|
36
|
+
|
|
37
|
+
# Large JSON — use the Write tool to write to .codeyam/tmp/scenario.json, then:
|
|
38
|
+
codeyam editor register @.codeyam/tmp/scenario.json
|
|
35
39
|
```
|
|
36
40
|
|
|
41
|
+
**To list existing scenarios:** `codeyam editor scenarios`
|
|
42
|
+
|
|
37
43
|
### Database First
|
|
38
44
|
|
|
39
45
|
Use a real database (SQLite + Prisma recommended) from the start. This lets scenarios represent different database states rather than just static prop variations:
|
|
@@ -54,7 +60,11 @@ Build components so they work at both zoom levels. A `TaskCard` should render co
|
|
|
54
60
|
## Workflow
|
|
55
61
|
|
|
56
62
|
1. Build a component
|
|
57
|
-
2. Create
|
|
63
|
+
2. Create scenarios with rich, realistic data that thoroughly exercises the component:
|
|
64
|
+
- Happy path with diverse, realistic content (not just "Test Item 1", "Test Item 2")
|
|
65
|
+
- Empty state (no data, first-time user)
|
|
66
|
+
- Rich data (many items, all optional fields populated, varied lengths and categories)
|
|
67
|
+
- Edge cases if they surface naturally from diverse data
|
|
58
68
|
3. Register the scenarios with CodeYam
|
|
59
69
|
4. Preview each scenario to verify the component handles all states
|
|
60
70
|
5. Repeat for the next component, building up scenario coverage
|
|
@@ -66,3 +76,72 @@ Build components so they work at both zoom levels. A `TaskCard` should render co
|
|
|
66
76
|
- Components accept props that can be provided by scenarios
|
|
67
77
|
- Database seed scripts go in `prisma/seeds/` (one per scenario when using DB-level scenarios)
|
|
68
78
|
- MSW handler files go in `.codeyam/msw-handlers/` (one per scenario for API mocking)
|
|
79
|
+
|
|
80
|
+
## Design System
|
|
81
|
+
|
|
82
|
+
If `.codeyam/design-system.md` exists, it contains the project's design tokens and brand guidelines. The editor step instructions will automatically show its contents inline — you don't need to read the file separately.
|
|
83
|
+
|
|
84
|
+
- Define **every** design token as a CSS custom property in `globals.css` — not just colors:
|
|
85
|
+
- Colors: `--bg-surface`, `--text-primary`, `--accent-green-a`, etc.
|
|
86
|
+
- Typography: `--text-xs: 12px`, `--text-sm: 14px`, `--text-lg: 18px`, etc.
|
|
87
|
+
- Font weights: `--font-weight-normal: 400`, `--font-weight-medium: 500`, `--font-weight-semibold: 600`
|
|
88
|
+
- Spacing: `--spacing-xs: 4px`, `--spacing-sm: 8px`, `--spacing-md: 12px`, `--spacing-lg: 16px`, etc.
|
|
89
|
+
- Border radius, shadows, and transitions
|
|
90
|
+
- Components must reference tokens — **zero hardcoded px values** for font-size, padding, margin, gap, or colors
|
|
91
|
+
- Bad: `fontSize: 14`, `padding: '12px 16px'`, `gap: 8`
|
|
92
|
+
- Good: `fontSize: 'var(--text-sm)'`, `padding: 'var(--spacing-md) var(--spacing-lg)'`, `gap: 'var(--spacing-sm)'`
|
|
93
|
+
- This ensures the entire app updates when the design system changes
|
|
94
|
+
|
|
95
|
+
## Avoiding Permission Prompts
|
|
96
|
+
|
|
97
|
+
These patterns cause unnecessary approval prompts in Claude Code. Follow these rules:
|
|
98
|
+
|
|
99
|
+
### Writing JSON files — use the Write tool, not bash
|
|
100
|
+
|
|
101
|
+
**BAD** (triggers "expansion obfuscation" security warning due to braces+quotes in heredoc):
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
cat > /tmp/scenario.json << 'EOF'
|
|
105
|
+
{"name":"My Scenario","localStorage":{"key":"[{\"id\":\"1\"}]"}}
|
|
106
|
+
EOF
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**GOOD** (Write tool is pre-approved, no bash prompt):
|
|
110
|
+
Use the **Write tool** to create `.codeyam/tmp/scenario.json`, then register:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
codeyam editor register @.codeyam/tmp/scenario.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Listing scenarios — use the CLI subcommand
|
|
117
|
+
|
|
118
|
+
**BAD** (triggers bash approval):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
cat .codeyam/editor-scenarios/*.json | grep -o '"name":"[^"]*"'
|
|
122
|
+
ls .codeyam/editor-scenarios/*.json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**GOOD** (pre-approved):
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
codeyam editor scenarios
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Database schema changes — never force-reset
|
|
132
|
+
|
|
133
|
+
**BAD** (destructive, triggers approval, drops all data):
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npx prisma db push --force-reset
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**GOOD** (preserves data by providing defaults for new required columns):
|
|
140
|
+
|
|
141
|
+
```prisma
|
|
142
|
+
userId Int @default(0) // existing rows get 0
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Then: `npm run db:push`
|
|
146
|
+
|
|
147
|
+
If you must add a required column without a default, make it optional (`Int?`) or provide a `@default()` value. Never destroy user data with `--force-reset`.
|
|
@@ -27,6 +27,9 @@ STEP_LABELS = {
|
|
|
27
27
|
11: "Journal",
|
|
28
28
|
12: "Review",
|
|
29
29
|
13: "Present",
|
|
30
|
+
14: "Commit",
|
|
31
|
+
15: "Finalize",
|
|
32
|
+
16: "Push",
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
STEP_RESTRICTIONS = {
|
|
@@ -43,6 +46,9 @@ STEP_RESTRICTIONS = {
|
|
|
43
46
|
11: "Create or update the journal entry for this feature. Do NOT create a duplicate — check if one exists first.",
|
|
44
47
|
12: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors). Run codeyam editor audit. Do not proceed until all checks pass.",
|
|
45
48
|
13: "Show the results panel, present summary, then selection menu (AskUserQuestion): Save or make changes.",
|
|
49
|
+
14: "Hide the results panel and commit all changes. Do NOT push — that happens in step 16.",
|
|
50
|
+
15: "Update the journal entry with the commit SHA and amend the commit to include the journal update.",
|
|
51
|
+
16: "Check for a git remote and offer to push. WAIT for the user's answer before starting the next feature.",
|
|
46
52
|
}
|
|
47
53
|
|
|
48
54
|
|
|
@@ -88,11 +94,12 @@ def main():
|
|
|
88
94
|
# Detect event early so we can capture the user prompt even before state exists
|
|
89
95
|
event_type, event_data = detect_event()
|
|
90
96
|
|
|
91
|
-
# Capture the very first user prompt (before state file may exist).
|
|
97
|
+
# Capture the very first real user prompt (before state file may exist).
|
|
92
98
|
# Save to a separate file so it persists across state transitions.
|
|
99
|
+
# Skip slash commands (e.g. /codeyam-editor) — they aren't user prompts.
|
|
93
100
|
if event_type == "user_prompt" and not os.path.exists(prompt_path):
|
|
94
101
|
prompt_text = event_data.get("prompt", "").strip()
|
|
95
|
-
if prompt_text:
|
|
102
|
+
if prompt_text and not prompt_text.startswith("/"):
|
|
96
103
|
try:
|
|
97
104
|
os.makedirs(os.path.dirname(prompt_path), exist_ok=True)
|
|
98
105
|
with open(prompt_path, "w") as f:
|
|
@@ -123,7 +130,7 @@ def main():
|
|
|
123
130
|
log_event(project_dir, "hook", log_data)
|
|
124
131
|
|
|
125
132
|
restriction = STEP_RESTRICTIONS.get(step, "")
|
|
126
|
-
next_cmd = f"codeyam editor {step + 1}" if step <
|
|
133
|
+
next_cmd = f"codeyam editor {step + 1}" if step < 16 else "codeyam editor 1"
|
|
127
134
|
|
|
128
135
|
# UserPromptSubmit: concise workflow reminder injected before Claude processes the user's message
|
|
129
136
|
if event_type == "user_prompt":
|
|
@@ -149,13 +156,14 @@ def main():
|
|
|
149
156
|
except (IOError, json.JSONDecodeError):
|
|
150
157
|
pass
|
|
151
158
|
|
|
152
|
-
if step
|
|
159
|
+
if step in (13, 14, 15, 16):
|
|
153
160
|
lines.append(
|
|
154
161
|
"If the user is requesting changes (even indirectly), "
|
|
155
|
-
"run `codeyam editor change` BEFORE
|
|
162
|
+
"run `codeyam editor change` BEFORE making any modifications "
|
|
163
|
+
"(code, scenarios, data, styles — everything). "
|
|
156
164
|
"The change command gives you the post-change checklist. "
|
|
157
|
-
"
|
|
158
|
-
"to
|
|
165
|
+
"The change workflow ensures Working Session Results are shown to the user. "
|
|
166
|
+
"If the user chose to commit, run `codeyam editor 14` to advance to the commit step."
|
|
159
167
|
)
|
|
160
168
|
else:
|
|
161
169
|
lines.append(
|
|
@@ -181,7 +189,7 @@ def main():
|
|
|
181
189
|
DIM = "\033[2m"
|
|
182
190
|
RESET = "\033[0m"
|
|
183
191
|
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}"]
|
|
184
|
-
for i in range(1,
|
|
192
|
+
for i in range(1, 17):
|
|
185
193
|
lbl = STEP_LABELS[i].ljust(28)
|
|
186
194
|
num = f" {i}" if i < 10 else f"{i}"
|
|
187
195
|
content = f"{num}. {lbl}"
|
|
@@ -199,6 +207,27 @@ def main():
|
|
|
199
207
|
"\u2713 (done) or \u2717 (skipped + reason)."
|
|
200
208
|
)
|
|
201
209
|
|
|
210
|
+
if event_type == "stop" and step in (13, 14):
|
|
211
|
+
import subprocess as _sp
|
|
212
|
+
try:
|
|
213
|
+
_result = _sp.run(
|
|
214
|
+
["git", "status", "--porcelain"],
|
|
215
|
+
cwd=project_dir,
|
|
216
|
+
capture_output=True, text=True, timeout=5
|
|
217
|
+
)
|
|
218
|
+
has_uncommitted = bool(_result.stdout.strip())
|
|
219
|
+
except Exception:
|
|
220
|
+
has_uncommitted = False
|
|
221
|
+
|
|
222
|
+
if has_uncommitted:
|
|
223
|
+
lines.append(
|
|
224
|
+
"\n\033[1;31m⚠️ You have uncommitted changes but haven't shown Working Session Results.\033[0m"
|
|
225
|
+
)
|
|
226
|
+
lines.append(
|
|
227
|
+
"\033[31mRun `codeyam editor change` if you haven't already, then complete the "
|
|
228
|
+
"checklist and run `codeyam editor 13` to show results to the user.\033[0m"
|
|
229
|
+
)
|
|
230
|
+
|
|
202
231
|
lines.append(f"When this step is complete, run: {next_cmd}")
|
|
203
232
|
|
|
204
233
|
print("\n".join(lines))
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Expo + React Native Setup
|
|
2
|
+
|
|
3
|
+
## Development
|
|
4
|
+
|
|
5
|
+
This project uses **Expo** with **Expo Router** for file-based navigation and **NativeWind** (Tailwind CSS) for styling.
|
|
6
|
+
|
|
7
|
+
### Web Development (used by CodeYam)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run dev
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This starts the Expo web dev server. CodeYam uses this to preview your app and take screenshots.
|
|
14
|
+
|
|
15
|
+
### Mobile Development
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# iOS Simulator
|
|
19
|
+
npm run ios
|
|
20
|
+
|
|
21
|
+
# Android Emulator
|
|
22
|
+
npm run android
|
|
23
|
+
|
|
24
|
+
# Start Expo dev server (pick platform from menu)
|
|
25
|
+
npm start
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Project Structure
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
app/ # Expo Router file-based routes
|
|
32
|
+
_layout.tsx # Root layout (status bar, navigation)
|
|
33
|
+
(tabs)/ # Tab-based navigation group
|
|
34
|
+
_layout.tsx # Tab bar configuration
|
|
35
|
+
index.tsx # Home tab
|
|
36
|
+
settings.tsx # Settings tab
|
|
37
|
+
components/ # Reusable components
|
|
38
|
+
lib/
|
|
39
|
+
storage.ts # AsyncStorage wrapper for persistent data
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Key Patterns
|
|
43
|
+
|
|
44
|
+
### Navigation (Expo Router)
|
|
45
|
+
|
|
46
|
+
Add new screens by creating files in `app/`:
|
|
47
|
+
|
|
48
|
+
- `app/profile.tsx` — accessible at `/profile`
|
|
49
|
+
- `app/items/[id].tsx` — dynamic route at `/items/123`
|
|
50
|
+
|
|
51
|
+
### Data Fetching
|
|
52
|
+
|
|
53
|
+
Use standard `fetch()` for API calls. CodeYam intercepts these to provide mock data during simulations:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
const response = await fetch('/api/items');
|
|
57
|
+
const data = await response.json();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Storage
|
|
61
|
+
|
|
62
|
+
Use the typed storage helper for persistent data:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { storage } from '@/lib/storage';
|
|
66
|
+
|
|
67
|
+
const items = await storage.get('items', []);
|
|
68
|
+
await storage.set('items', [...items, newItem]);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Styling (NativeWind)
|
|
72
|
+
|
|
73
|
+
Use Tailwind classes on React Native components:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<View className="flex-1 items-center justify-center bg-white p-4">
|
|
77
|
+
<Text className="text-lg font-bold text-gray-900">Hello</Text>
|
|
78
|
+
</View>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Building for Production
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Web
|
|
85
|
+
npm run build:web
|
|
86
|
+
|
|
87
|
+
# iOS/Android (requires EAS CLI)
|
|
88
|
+
npx eas build
|
|
89
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Project Name
|
|
2
|
+
|
|
3
|
+
Brief description of what this app does.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run setup
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Development
|
|
12
|
+
|
|
13
|
+
Start the Expo dev server (web):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run dev
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
For native platforms:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run ios # iOS simulator
|
|
23
|
+
npm run android # Android emulator
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Using CodeYam Editor
|
|
27
|
+
|
|
28
|
+
This project was built with [CodeYam](https://codeyam.com). To launch the editor:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
codeyam editor
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Scripts
|
|
35
|
+
|
|
36
|
+
| Script | Description |
|
|
37
|
+
| ----------------- | --------------------------- |
|
|
38
|
+
| `npm run setup` | Install dependencies |
|
|
39
|
+
| `npm run dev` | Start Expo dev server (web) |
|
|
40
|
+
| `npm run ios` | Run on iOS simulator |
|
|
41
|
+
| `npm run android` | Run on Android emulator |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Tabs } from 'expo-router';
|
|
2
|
+
import { Ionicons } from '@expo/vector-icons';
|
|
3
|
+
|
|
4
|
+
export default function TabLayout() {
|
|
5
|
+
return (
|
|
6
|
+
<Tabs
|
|
7
|
+
screenOptions={{
|
|
8
|
+
tabBarActiveTintColor: '#005C75',
|
|
9
|
+
headerStyle: { backgroundColor: '#f8fafc' },
|
|
10
|
+
headerTitleStyle: { fontWeight: '600' },
|
|
11
|
+
}}
|
|
12
|
+
>
|
|
13
|
+
<Tabs.Screen
|
|
14
|
+
name="index"
|
|
15
|
+
options={{
|
|
16
|
+
title: 'Home',
|
|
17
|
+
tabBarIcon: ({ color, size }) => (
|
|
18
|
+
<Ionicons name="home-outline" size={size} color={color} />
|
|
19
|
+
),
|
|
20
|
+
}}
|
|
21
|
+
/>
|
|
22
|
+
<Tabs.Screen
|
|
23
|
+
name="settings"
|
|
24
|
+
options={{
|
|
25
|
+
title: 'Settings',
|
|
26
|
+
tabBarIcon: ({ color, size }) => (
|
|
27
|
+
<Ionicons name="settings-outline" size={size} color={color} />
|
|
28
|
+
),
|
|
29
|
+
}}
|
|
30
|
+
/>
|
|
31
|
+
</Tabs>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { View, Text } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export default function HomeScreen() {
|
|
4
|
+
return (
|
|
5
|
+
<View className="flex-1 items-center justify-center bg-white p-6">
|
|
6
|
+
<Text className="text-2xl font-bold text-gray-900 mb-2">Welcome</Text>
|
|
7
|
+
<Text className="text-base text-gray-500 text-center">
|
|
8
|
+
Your Expo app is ready. Start building!
|
|
9
|
+
</Text>
|
|
10
|
+
</View>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { View, Text } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export default function SettingsScreen() {
|
|
4
|
+
return (
|
|
5
|
+
<View className="flex-1 items-center justify-center bg-white p-6">
|
|
6
|
+
<Text className="text-2xl font-bold text-gray-900 mb-2">Settings</Text>
|
|
7
|
+
<Text className="text-base text-gray-500 text-center">
|
|
8
|
+
Configure your app preferences here.
|
|
9
|
+
</Text>
|
|
10
|
+
</View>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import '../global.css';
|
|
2
|
+
import { Stack } from 'expo-router';
|
|
3
|
+
import { StatusBar } from 'expo-status-bar';
|
|
4
|
+
|
|
5
|
+
export default function RootLayout() {
|
|
6
|
+
return (
|
|
7
|
+
<>
|
|
8
|
+
<Stack screenOptions={{ headerShown: false }} />
|
|
9
|
+
<StatusBar style="auto" />
|
|
10
|
+
</>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"expo": {
|
|
3
|
+
"name": "CodeYam Expo App",
|
|
4
|
+
"slug": "codeyam-expo-app",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"scheme": "codeyam-expo-app",
|
|
7
|
+
"platforms": ["ios", "android", "web"],
|
|
8
|
+
"web": {
|
|
9
|
+
"bundler": "metro",
|
|
10
|
+
"output": "single",
|
|
11
|
+
"favicon": "./assets/favicon.png"
|
|
12
|
+
},
|
|
13
|
+
"plugins": ["expo-router"],
|
|
14
|
+
"experiments": {
|
|
15
|
+
"typedRoutes": true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type-safe storage abstraction over AsyncStorage.
|
|
5
|
+
* Works on iOS, Android, and Web.
|
|
6
|
+
*/
|
|
7
|
+
export const storage = {
|
|
8
|
+
async get<T>(key: string, defaultValue: T): Promise<T> {
|
|
9
|
+
try {
|
|
10
|
+
const raw = await AsyncStorage.getItem(key);
|
|
11
|
+
return raw !== null ? JSON.parse(raw) : defaultValue;
|
|
12
|
+
} catch {
|
|
13
|
+
return defaultValue;
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
18
|
+
try {
|
|
19
|
+
await AsyncStorage.setItem(key, JSON.stringify(value));
|
|
20
|
+
} catch {
|
|
21
|
+
// Storage write failed silently
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async remove(key: string): Promise<void> {
|
|
26
|
+
try {
|
|
27
|
+
await AsyncStorage.removeItem(key);
|
|
28
|
+
} catch {
|
|
29
|
+
// Storage remove failed silently
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="nativewind/types" />
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codeyam-expo-app",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"main": "expo-router/entry",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"setup": "npm install",
|
|
8
|
+
"dev": "expo start --web",
|
|
9
|
+
"start": "expo start",
|
|
10
|
+
"android": "expo start --android",
|
|
11
|
+
"ios": "expo start --ios",
|
|
12
|
+
"build:web": "expo export --platform web"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"expo": "~55.0.5",
|
|
16
|
+
"expo-router": "~55.0.4",
|
|
17
|
+
"expo-status-bar": "~55.0.4",
|
|
18
|
+
"expo-linking": "~55.0.7",
|
|
19
|
+
"expo-constants": "~55.0.7",
|
|
20
|
+
"react": "19.2.0",
|
|
21
|
+
"react-dom": "19.2.0",
|
|
22
|
+
"react-native": "0.83.2",
|
|
23
|
+
"react-native-web": "^0.21.0",
|
|
24
|
+
"react-native-safe-area-context": "~5.6.2",
|
|
25
|
+
"react-native-screens": "~4.23.0",
|
|
26
|
+
"@react-navigation/native": "^7.1.33",
|
|
27
|
+
"@expo/vector-icons": "^15.0.2",
|
|
28
|
+
"@react-native-async-storage/async-storage": "2.2.0",
|
|
29
|
+
"nativewind": "^4.2.2",
|
|
30
|
+
"tailwindcss": "^3.4.19",
|
|
31
|
+
"react-native-reanimated": "4.2.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/react": "~19.2.2",
|
|
35
|
+
"babel-preset-expo": "^55.0.10",
|
|
36
|
+
"typescript": "~5.9.2"
|
|
37
|
+
}
|
|
38
|
+
}
|