@codeyam/codeyam-cli 0.1.0-staging.036391e → 0.1.0-staging.03e0fb2
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 +14 -14
- package/analyzer-template/packages/ai/index.ts +1 -0
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +14 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +101 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +6 -0
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +102 -113
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +408 -13
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +70 -19
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +40 -13
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +32 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +134 -2
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +359 -142
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +18 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +50 -25
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +153 -76
- package/analyzer-template/packages/aws/package.json +10 -10
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -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 +98 -3
- 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 +121 -3
- package/analyzer-template/project/constructMockCode.ts +34 -7
- package/analyzer-template/project/orchestrateCapture.ts +4 -1
- package/analyzer-template/project/writeScenarioComponents.ts +76 -12
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +30 -7
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +56 -7
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +1 -1
- package/codeyam-cli/src/cli.js +31 -24
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +4 -2
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +2 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +2 -0
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +31 -20
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +49 -257
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +95 -81
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +2 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +7 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +90 -23
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +2 -2
- package/codeyam-cli/src/utils/install-skills.js +43 -63
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/labsAutoCheck.js +0 -29
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -1
- package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
- package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +7 -0
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +7 -8
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +0 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +97 -6
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +4 -6
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +3 -3
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -1
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +23 -23
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -1
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +1 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -1
- package/codeyam-cli/src/utils/rules/parser.js +19 -4
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
- package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
- package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
- package/codeyam-cli/src/utils/rules/ruleState.js +10 -10
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -1
- package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
- package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +6 -6
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +37 -10
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +159 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +5 -24
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
- package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
- package/codeyam-cli/src/utils/versionInfo.js +46 -0
- package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/database.js +14 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +36 -7
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +11 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CA3JxPb7.js → CopyButton-CtmbP4Gl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-B86KKU7e.js → EntityItem-DlMph_Hm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B5ctlSYt.js → EntityTypeBadge-B-0PjGOU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BqY8gDAW.js → EntityTypeIcon-DN9eiJAO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-ClaLpuOo.js → InlineSpinner-C1rIyZdV.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-BDhPilK7.js → InteractivePreview-rE_fI2h2.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-VeqEBv9v.js → LibraryFunctionPreview-CnatsCw2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-Bs7Nn1Jr.js → LoadingDots-CSP6DZrh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-Bm3PmcCz.js → LogViewer-CMK8Q7yk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-C6PKeMYR.js → ReportIssueModal-TCV_HBjy.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-Gq3Ocjo6.js → SafeScreenshot-CG2uh31y.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-BNLaXBHR.js → ScenarioViewer-CU_TDYd8.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-CiwXDxLh.js → TruncatedFilePath-D7IoaWUW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-B3TDXxnk.js → _index-B8z7mjR-.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BtBFH820.js → activity.(_tab)-DZu78RI1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-Dm5RS9il.js +22 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-PttOB2SF.js → book-open-Bp5FLkd4.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-TJp6ofnp.js → chevron-down-DQJA9f4o.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-JE9ZIoBl.js → chunk-JZWAC4HX-7VptmeIr.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CXhHQYrI.js → circle-check-B6C4LY9o.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{copy-6y9ALfGT.js → copy-6nzYCu0G.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Ca9fAY46.js → createLucideIcon-D-QUFOwe.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-C5lqplTC.js → dev.empty-DmzSmblj.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-n38keI1k.js → entity._sha._-C6PQhwY5.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js → entity._sha.scenarios._scenarioId.fullscreen-DVTcUnur.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DGgZjdFg.js → entity._sha_.create-scenario-BVgNO76F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-38yPijoD.js → entity._sha_.edit._scenarioId-C7ysA4Jq.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-BSHEfydn.js → entry.client-CU6EUArK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DCPhhSMo.js → fileTableUtils-EWpfFU4X.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-0N0YJQv7.js → files-CrxAoWIL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-DXnyr8uP.js → git-BldHtKeW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-CLmFdUae.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-ChN9-fAY.js → index-7-1FmlHo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-CcsFv748.js → index-DuYcwYp_.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-CPPVOSWB.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CTqLEAGU.js → loader-circle-BnDcD54R.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-717e346a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-0wMU4KXe.js +93 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-D6vreykR.js → pause-DhQX2g22.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-DqfSDjyQ.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-B8VUL8nl.js → search-DborVoKD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-BWunYSXt.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-CPoAg7Zo.js → simulations-BtrtCYJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BrCP7uQo.js → terminal-Bs4NC-VZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BZz2NjYa.js → triangle-alert-DTf3Jojp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-DNwUduNu.js → useCustomSizes-D_bDZyDU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-COky1GVF.js → useLastLogLine-DZp6rrQD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CpZgwliL.js → useReportContext-BsQb6rFd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-Bv9JFvUO.js → useToast-BOur3mUv.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-DV1ykEI6.js → index-B8jmgmn2.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-9OU4lmvL.js +285 -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/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
- package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +14 -14
- package/codeyam-cli/templates/{codeyam:memory.md → codeyam-memory.md} +16 -24
- package/codeyam-cli/templates/{codeyam:new-rule.md → codeyam-new-rule.md} +1 -3
- package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
- package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
- package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
- package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
- package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
- package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
- package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
- package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
- package/codeyam-cli/templates/rule-notification-hook.py +44 -17
- package/codeyam-cli/templates/rule-reflection-hook.py +88 -31
- package/codeyam-cli/templates/rules-instructions.md +45 -90
- package/package.json +12 -12
- package/packages/ai/index.js +1 -1
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +14 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +78 -1
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +0 -5
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +341 -10
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +59 -17
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructureChunking.js +30 -11
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +22 -3
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +97 -2
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +242 -81
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +11 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +42 -13
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +123 -67
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
- package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
- package/codeyam-cli/src/commands/list.js +0 -31
- package/codeyam-cli/src/commands/list.js.map +0 -1
- package/codeyam-cli/src/commands/webapp-info.js +0 -146
- package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
- package/codeyam-cli/src/utils/universal-mocks.js +0 -152
- package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DfKzxuoe.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/globals-DoeDFXZN.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-76786b8e.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-CrNQfdMO.js +0 -76
- package/codeyam-cli/src/webserver/build/client/assets/root-QAY34PIo.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-eBI36Yv5.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BrcVrUEv.js +0 -260
- package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
- package/codeyam-cli/templates/codeyam:diagnose.md +0 -805
- /package/codeyam-cli/src/webserver/build/client/assets/{api.labs-survey-l0sNRNKZ.js → api.rule-path-l0sNRNKZ.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: codeyam
|
|
2
|
+
name: codeyam-memory
|
|
3
3
|
autoApprove: true
|
|
4
4
|
description: |
|
|
5
5
|
Generate and maintain Claude Rules for your codebase based on thorough analysis.
|
|
@@ -13,19 +13,14 @@ This skill helps you generate and maintain Claude Rules (`.claude/rules/`) that
|
|
|
13
13
|
|
|
14
14
|
## Core Principle: Document Confusion, Not Information
|
|
15
15
|
|
|
16
|
-
**
|
|
16
|
+
**Valuable rules** capture knowledge that reading the code alone wouldn't reveal:
|
|
17
17
|
|
|
18
18
|
- Historical context (why code evolved this way)
|
|
19
19
|
- Hidden relationships (files that must change together)
|
|
20
20
|
- Gotchas that caused bugs
|
|
21
21
|
- Non-obvious conventions
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- What functions do (Claude can read the code)
|
|
26
|
-
- Type definitions (Claude can see them)
|
|
27
|
-
- Directory structure (Claude can explore it)
|
|
28
|
-
- Basic patterns (Claude knows common patterns)
|
|
23
|
+
Skip documenting things Claude can determine by reading code: function signatures, type definitions, directory structure, and common patterns.
|
|
29
24
|
|
|
30
25
|
## When to Use This Skill
|
|
31
26
|
|
|
@@ -41,7 +36,9 @@ Check if this is the first time running memory.
|
|
|
41
36
|
|
|
42
37
|
### 1A. Add Documentation Section to CLAUDE.md
|
|
43
38
|
|
|
44
|
-
If CLAUDE.md
|
|
39
|
+
If CLAUDE.md already contains a "Documenting Confusion / Mistakes" section, skip this step entirely.
|
|
40
|
+
|
|
41
|
+
Otherwise, add **only** the section below — do not modify or add any other content to CLAUDE.md. If CLAUDE.md doesn't exist, create it with just a `# Project` heading followed by this section:
|
|
45
42
|
|
|
46
43
|
```markdown
|
|
47
44
|
## Continuous Documentation
|
|
@@ -61,6 +58,8 @@ It is very important to document any tribal knowledge, complex architectural dec
|
|
|
61
58
|
Please see `.codeyam/rules/instructions.md` for guidance.
|
|
62
59
|
```
|
|
63
60
|
|
|
61
|
+
**Important:** Do not add project descriptions, architecture summaries, or any other content to CLAUDE.md. Only add the exact section above.
|
|
62
|
+
|
|
64
63
|
### 1B. Verify Instructions File
|
|
65
64
|
|
|
66
65
|
Check that `.codeyam/rules/instructions.md` exists (it should be created during `codeyam init`). If missing, copy it from `codeyam-cli/templates/rules-instructions.md`.
|
|
@@ -275,7 +274,7 @@ Before generating each rule, verify it passes these tests:
|
|
|
275
274
|
|
|
276
275
|
**2. Code-derivable check**: Read the files the rule will cover. Could the rule's content be determined by reading those files alone?
|
|
277
276
|
|
|
278
|
-
- If YES →
|
|
277
|
+
- If YES → the code is its own documentation — prefer keeping rules for non-derivable insights
|
|
279
278
|
- If NO (historical context, edge cases, non-obvious behavior) → rule is valuable
|
|
280
279
|
|
|
281
280
|
**3. Prevention check**: Would this rule have prevented one of the confusion commits you found?
|
|
@@ -301,7 +300,7 @@ This caused a bug where `entity` matched `entityCode` (siblings, not parent-chil
|
|
|
301
300
|
- Not code-derivable: Code doesn't explain why boundary checking matters
|
|
302
301
|
- Prevention: Would prevent future prefix-matching bugs
|
|
303
302
|
|
|
304
|
-
|
|
303
|
+
**Compare with a weaker alternative** (fails the checks):
|
|
305
304
|
|
|
306
305
|
```markdown
|
|
307
306
|
## Running Tests
|
|
@@ -309,9 +308,7 @@ This caused a bug where `entity` matched `entityCode` (siblings, not parent-chil
|
|
|
309
308
|
Use `pnpm jest` to run tests. Configuration is in `jest.config.ts`.
|
|
310
309
|
```
|
|
311
310
|
|
|
312
|
-
- No confusion evidence
|
|
313
|
-
- Code-derivable: Anyone can see `jest.config.ts` exists
|
|
314
|
-
- Doesn't prevent any confusion
|
|
311
|
+
- No confusion evidence, code-derivable, and wouldn't prevent future mistakes
|
|
315
312
|
|
|
316
313
|
### 5B. Rule File Guidelines
|
|
317
314
|
|
|
@@ -319,17 +316,13 @@ Use `pnpm jest` to run tests. Configuration is in `jest.config.ts`.
|
|
|
319
316
|
- Rule for `src/api/` → `.claude/rules/src/api/architecture.md`
|
|
320
317
|
- Rule for testing patterns → `.claude/rules/testing-patterns.md`
|
|
321
318
|
|
|
322
|
-
2. **Paths must be specific**
|
|
323
|
-
- Good: `paths: ['src/api/**/*.ts']`
|
|
324
|
-
- Bad: `paths: ['**/*.ts']` (too broad, wastes context)
|
|
319
|
+
2. **Paths must be specific** — use `paths: ['src/api/**/*.ts']` rather than `'**/*.ts'` (too broad wastes context)
|
|
325
320
|
|
|
326
321
|
3. **Content should explain "why" not just "what"**
|
|
327
322
|
- Focus on the reasoning, history, or gotcha
|
|
328
323
|
- Be concise - every word costs context
|
|
329
324
|
|
|
330
|
-
4. **
|
|
331
|
-
- Use ISO 8601 format: `2026-01-27T15:30:00Z`
|
|
332
|
-
- This enables the pre-commit hook enforcement
|
|
325
|
+
4. **Audit dates live in `.claude/codeyam-rule-state.json`** (managed by `codeyam memory touch`). Keep rule frontmatter limited to `paths`.
|
|
333
326
|
|
|
334
327
|
### Rule Template
|
|
335
328
|
|
|
@@ -337,7 +330,6 @@ Use `pnpm jest` to run tests. Configuration is in `jest.config.ts`.
|
|
|
337
330
|
---
|
|
338
331
|
paths:
|
|
339
332
|
- 'specific/path/**/*.ts'
|
|
340
|
-
timestamp: [CURRENT_ISO_TIMESTAMP]
|
|
341
333
|
---
|
|
342
334
|
|
|
343
335
|
## [Clear, Descriptive Title]
|
|
@@ -374,7 +366,7 @@ After generating rules based on your analysis and user answers:
|
|
|
374
366
|
5. **Remind the user** to commit the new rules:
|
|
375
367
|
```
|
|
376
368
|
git add .claude/rules/ .codeyam/rules/
|
|
377
|
-
git commit -m "Add rules for Claude Code (generated via /codeyam
|
|
369
|
+
git commit -m "Add rules for Claude Code (generated via /codeyam-memory)"
|
|
378
370
|
```
|
|
379
371
|
|
|
380
372
|
---
|
|
@@ -394,11 +386,11 @@ After generating rules based on your analysis and user answers:
|
|
|
394
386
|
The pre-commit hook **blocks commits** when:
|
|
395
387
|
|
|
396
388
|
- Code files matching a rule's `paths` are modified
|
|
397
|
-
- The rule's `
|
|
389
|
+
- The rule's `lastAuditedAt` in `.claude/codeyam-rule-state.json` is older than the code changes
|
|
398
390
|
|
|
399
391
|
To proceed:
|
|
400
392
|
|
|
401
393
|
1. Review the flagged rule(s)
|
|
402
394
|
2. Update content if needed
|
|
403
|
-
3.
|
|
395
|
+
3. Run `codeyam memory touch` to mark rules as audited in `.claude/codeyam-rule-state.json`
|
|
404
396
|
4. Stage and commit
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: codeyam
|
|
2
|
+
name: codeyam-new-rule
|
|
3
3
|
autoApprove: true
|
|
4
4
|
description: |
|
|
5
5
|
Create a new Claude Rule for documenting codebase patterns.
|
|
@@ -9,5 +9,3 @@ description: |
|
|
|
9
9
|
# Create New Claude Rule
|
|
10
10
|
|
|
11
11
|
Read `.codeyam/rules/instructions.md` for detailed guidance on structure and formatting.
|
|
12
|
-
|
|
13
|
-
If the instructions file doesn't exist, copy it from `codeyam-cli/templates/rules-instructions.md`.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: codeyam
|
|
2
|
+
name: codeyam-setup
|
|
3
3
|
autoApprove: true
|
|
4
4
|
description: |
|
|
5
5
|
Use this skill when the user asks to "setup CodeYam" or needs to configure CodeYam for their project.
|
|
@@ -52,6 +52,18 @@ codeyam validate-mock .codeyam/universal-mocks/{path-to-your-mock}
|
|
|
52
52
|
|
|
53
53
|
## Setup Workflow
|
|
54
54
|
|
|
55
|
+
### Step 0: Ensure Simulation Infrastructure
|
|
56
|
+
|
|
57
|
+
Before configuring the dev server or mocks, ensure the simulation infrastructure is installed.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
codeyam setup-simulations
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This is **idempotent** — if already set up, each step is detected and skipped. On first run it installs analyzer dependencies, Playwright chromium, and creates baseline entities (several minutes). Subsequent runs complete in seconds.
|
|
64
|
+
|
|
65
|
+
If it fails with "No web applications found", the project doesn't support simulations — inform the user and stop.
|
|
66
|
+
|
|
55
67
|
### Step 1: Configure Webapp Start Command
|
|
56
68
|
|
|
57
69
|
**ACTION 1:** Read configuration files:
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Staleness check hook - runs after file edits to check if related rules need review
|
|
3
|
+
# Receives JSON input via stdin with tool info
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
# Read the input JSON
|
|
8
|
+
INPUT=$(cat)
|
|
9
|
+
|
|
10
|
+
# Extract the file path that was edited
|
|
11
|
+
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // empty' 2>/dev/null)
|
|
12
|
+
|
|
13
|
+
if [ -z "$FILE_PATH" ]; then
|
|
14
|
+
exit 0 # No file path, nothing to check
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Find rules that match this file path
|
|
18
|
+
RULES_DIR="${CLAUDE_PROJECT_DIR}/.claude/rules"
|
|
19
|
+
|
|
20
|
+
if [ ! -d "$RULES_DIR" ]; then
|
|
21
|
+
exit 0 # No rules directory
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Search for rules whose paths might match the edited file
|
|
25
|
+
MATCHING_RULES=""
|
|
26
|
+
while IFS= read -r -d '' rule_file; do
|
|
27
|
+
# Extract paths from frontmatter
|
|
28
|
+
PATHS=$(sed -n '/^---$/,/^---$/p' "$rule_file" | grep -E "^\s*-\s*'" | sed "s/.*'\(.*\)'.*/\1/")
|
|
29
|
+
|
|
30
|
+
for pattern in $PATHS; do
|
|
31
|
+
# Simple check if the file might match the pattern
|
|
32
|
+
if [[ "$FILE_PATH" == *"${pattern%%\**}"* ]]; then
|
|
33
|
+
MATCHING_RULES="$MATCHING_RULES\n- $(basename "$rule_file")"
|
|
34
|
+
break
|
|
35
|
+
fi
|
|
36
|
+
done
|
|
37
|
+
done < <(find "$RULES_DIR" -name "*.md" -print0 2>/dev/null)
|
|
38
|
+
|
|
39
|
+
if [ -n "$MATCHING_RULES" ]; then
|
|
40
|
+
echo "📋 Modified file may have related rules that need review:$MATCHING_RULES"
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
exit 0
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
### What to look for
|
|
2
|
+
|
|
3
|
+
Read the full transcript for these signals:
|
|
4
|
+
|
|
5
|
+
**User corrections or redirections**
|
|
6
|
+
- "no", "actually", "that's not right", "you need to also...", "you missed..."
|
|
7
|
+
- User provides information Claude didn't know or couldn't infer from code
|
|
8
|
+
- User reminds Claude of a step, pattern, or relationship
|
|
9
|
+
- A correction about something other than current task requirements is ALWAYS rule-worthy
|
|
10
|
+
|
|
11
|
+
**Investigation and debugging**
|
|
12
|
+
- Claude tried multiple approaches, read logs, or tested hypotheses
|
|
13
|
+
- Investigation revealed non-obvious behavior or root causes
|
|
14
|
+
- Debugging strategies that worked (or didn't) for specific areas
|
|
15
|
+
|
|
16
|
+
**Architecture not evident in code**
|
|
17
|
+
- Files that must change together (templates + installation, routes + registration)
|
|
18
|
+
- Complex files, data flows, pipelines, or system interactions that would benefit from an overview
|
|
19
|
+
|
|
20
|
+
**Commands and workflows**
|
|
21
|
+
- Specific commands or flags needed for this area
|
|
22
|
+
- Order of operations that matters ("must run X before Y")
|
|
23
|
+
|
|
24
|
+
**Ignore:**
|
|
25
|
+
- Corrections to requirements for the current feature or bug
|
|
26
|
+
- Confusion isolated to the current work session (won't recur)
|
|
27
|
+
|
|
28
|
+
### Before creating a rule
|
|
29
|
+
|
|
30
|
+
**Critical check:** Read the actual source files that were modified. If the code already contains comments, guard patterns, or tests that explain the insight, the code is the documentation — skip the rule unless the file is complex and you've made a mistake or the user had to interrupt and correct you.
|
|
31
|
+
|
|
32
|
+
Show your thinking before proceeding with creating or updating rules.
|
|
33
|
+
|
|
34
|
+
### How to write rules
|
|
35
|
+
|
|
36
|
+
**Rules must be forward-looking, not historical.** You are reading a session transcript where bugs were found and fixed, but the rule should describe the *current* codebase, not tell the story of what went wrong, what was fixed, etc. The code has already been updated — past bugs are no longer relevant.
|
|
37
|
+
|
|
38
|
+
- **DO**: State constraints and requirements ("this script MUST copy directories recursively, not just files")
|
|
39
|
+
- **DO**: Explain *why* something matters ("errors in prompt copying are silently caught, so missing directories won't surface as errors")
|
|
40
|
+
- **DON'T**: Describe what old code did ("the old version only copied files, causing X to be missing")
|
|
41
|
+
- **DON'T**: Narrate the debugging journey ("we discovered that the catch block was swallowing errors")
|
|
42
|
+
- **DON'T**: Note issues or known gaps if they are actively being worked on!
|
|
43
|
+
|
|
44
|
+
Think of the reader as a developer about to modify these files. They need to know what constraints to preserve and what pitfalls to watch for — not what happened in the past if it is no longer relevant.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
FIRST: Read `.codeyam/rules/instructions.md` — it contains the required format, rule placement via the rule-path API, and an example rule. You MUST follow this format exactly when creating or editing rules.
|
|
2
|
+
|
|
3
|
+
THEN: Read the file {{CONTEXT_FILE}} and follow the instructions inside.
|
|
4
|
+
|
|
5
|
+
Analyze the conversation transcript for rule-worthy learnings:
|
|
6
|
+
- User corrections, redirections, or information Claude didn't know
|
|
7
|
+
- Investigation results and debugging knowledge
|
|
8
|
+
- Architecture and relationships not obvious from code
|
|
9
|
+
- Commands, workflows, and processes
|
|
10
|
+
|
|
11
|
+
Access and read files in the repo or in the .claude folder as needed.
|
|
12
|
+
|
|
13
|
+
Create new rules only when the learnings meet the guidelines in the context file.
|
|
14
|
+
|
|
15
|
+
IMPORTANT: If you create ANY rule files, write a short summary to `{{NOTIFICATION_FILE}}`. The summary should list each rule change, e.g.:
|
|
16
|
+
```
|
|
17
|
+
The background rule-reflection agent created the following rules:
|
|
18
|
+
- Created `.claude/rules/tooling/new-pattern.md` — documents X pattern
|
|
19
|
+
```
|
|
20
|
+
Only write the notification file when rules are created.
|
|
21
|
+
|
|
22
|
+
The project root is {{PROJECT_DIR}}
|
|
23
|
+
|
|
24
|
+
CRITICAL: All rule files MUST be written to {{PROJECT_DIR}}/.claude/rules/ (the project directory). Always use the full absolute path when writing rule files.
|
|
25
|
+
|
|
26
|
+
CRITICAL: Before writing any rule file, you MUST run the rule-path command to determine the correct subdirectory:
|
|
27
|
+
codeyam memory rule-path path/one path/two
|
|
28
|
+
Pass all paths from your frontmatter. The command returns the correct .claude/rules/ subdirectory as JSON. Do NOT guess the placement from the first path — rules with paths spanning multiple directories belong at their common ancestor.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
FIRST: Read `.codeyam/rules/instructions.md` — it contains the required format, rule placement via the rule-path API, and an example rule. You MUST follow this format exactly when creating or editing rules.
|
|
2
|
+
|
|
3
|
+
THEN: Read the file {{CONTEXT_FILE}} and follow the instructions inside.
|
|
4
|
+
|
|
5
|
+
The user interrupted Claude mid-response — a strong signal of confusion or misunderstanding.
|
|
6
|
+
Analyze both Claude's interrupted output and the user's follow-up to determine what went wrong.
|
|
7
|
+
|
|
8
|
+
Look for:
|
|
9
|
+
- Claude heading in a wrong direction that the user had to correct
|
|
10
|
+
- Misunderstanding of project conventions, architecture, or dependencies
|
|
11
|
+
- Missing context that caused Claude to make incorrect assumptions
|
|
12
|
+
- Patterns that would recur in future sessions without a rule
|
|
13
|
+
|
|
14
|
+
Access and read files in the repo or in the .claude folder as needed.
|
|
15
|
+
|
|
16
|
+
Create new rules only when the learnings meet the guidelines in the context file.
|
|
17
|
+
|
|
18
|
+
IMPORTANT: If you create ANY rule files, write a short summary to `{{NOTIFICATION_FILE}}`. The summary should list each rule change, e.g.:
|
|
19
|
+
```
|
|
20
|
+
The background rule-reflection agent created the following rules:
|
|
21
|
+
- Created `.claude/rules/tooling/new-pattern.md` — documents X pattern
|
|
22
|
+
```
|
|
23
|
+
Only write the notification file when rules are created.
|
|
24
|
+
|
|
25
|
+
The project root is {{PROJECT_DIR}}
|
|
26
|
+
|
|
27
|
+
CRITICAL: All rule files MUST be written to {{PROJECT_DIR}}/.claude/rules/ (the project directory). Always use the full absolute path when writing rule files.
|
|
28
|
+
|
|
29
|
+
CRITICAL: Before writing any rule file, you MUST run the rule-path command to determine the correct subdirectory:
|
|
30
|
+
codeyam memory rule-path path/one path/two
|
|
31
|
+
Pass all paths from your frontmatter. The command returns the correct .claude/rules/ subdirectory as JSON. Do NOT guess the placement from the first path — rules with paths spanning multiple directories belong at their common ancestor.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
FIRST: Read `.codeyam/rules/instructions.md` — it contains the required format, rule placement via the rule-path API, and an example rule. You MUST follow this format exactly when creating or editing rules.
|
|
2
|
+
|
|
3
|
+
THEN: Read the file {{CONTEXT_FILE}} and follow the instructions inside.
|
|
4
|
+
|
|
5
|
+
For each stale rule:
|
|
6
|
+
1. Review the inline rule content and the diff to determine if the rule needs updating
|
|
7
|
+
2. If it needs updating, edit the rule file in .claude/rules/ — also trim prose and unnecessary headers (most rules should be a few bullets)
|
|
8
|
+
3. Run `codeyam memory touch <rule-path1> <rule-path2> ...` with the SPECIFIC rule paths you reviewed to mark them as audited in .claude/codeyam-rule-state.json
|
|
9
|
+
Example: `codeyam memory touch tooling/cli-build.md packages/ai/execution-flow-prioritization.md`
|
|
10
|
+
|
|
11
|
+
Write a summary to `{{NOTIFICATION_FILE}}` listing each action taken, even if you only ran `codeyam memory touch` without content changes. Example:
|
|
12
|
+
```
|
|
13
|
+
The background rule-reflection agent updated the following rules:
|
|
14
|
+
- Reviewed `.claude/rules/example.md` — no content changes, ran `codeyam memory touch`
|
|
15
|
+
- Created `.claude/rules/tooling/new-pattern.md` — documents X pattern
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The project root is {{PROJECT_DIR}}
|
|
19
|
+
|
|
20
|
+
CRITICAL: All rule files MUST be written to {{PROJECT_DIR}}/.claude/rules/ (the project directory), NOT ~/.claude/rules/ (the user home directory). Always use the full absolute path when writing rule files.
|
|
21
|
+
|
|
22
|
+
CRITICAL: Before writing any rule file, you MUST run the rule-path command to determine the correct subdirectory:
|
|
23
|
+
codeyam memory rule-path path/one path/two
|
|
24
|
+
Pass all paths from your frontmatter. The command returns the correct .claude/rules/ subdirectory as JSON. Do NOT guess the placement from the first path — rules with paths spanning multiple directories belong at their common ancestor.
|
|
@@ -14,6 +14,7 @@ Supports four notification files (legacy combined + split agents):
|
|
|
14
14
|
- rule-notification-interruption.md (interruption review agent)
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
+
import json
|
|
17
18
|
import os
|
|
18
19
|
import sys
|
|
19
20
|
|
|
@@ -26,27 +27,53 @@ NOTIFICATION_FILES = [
|
|
|
26
27
|
]
|
|
27
28
|
|
|
28
29
|
|
|
30
|
+
def get_project_slug():
|
|
31
|
+
"""
|
|
32
|
+
Derive project slug from .codeyam/config.json (matching getProjectSlug() on the TS side).
|
|
33
|
+
Falls back to os.path.basename(project_dir) if config is absent or malformed.
|
|
34
|
+
"""
|
|
35
|
+
project_dir = os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
|
|
36
|
+
try:
|
|
37
|
+
config_path = os.path.join(project_dir, '.codeyam', 'config.json')
|
|
38
|
+
with open(config_path, 'r') as f:
|
|
39
|
+
config = json.load(f)
|
|
40
|
+
slug = config.get('projectSlug', '')
|
|
41
|
+
if slug:
|
|
42
|
+
return slug
|
|
43
|
+
except (IOError, json.JSONDecodeError, KeyError):
|
|
44
|
+
pass
|
|
45
|
+
return os.path.basename(project_dir)
|
|
46
|
+
|
|
47
|
+
|
|
29
48
|
def main():
|
|
30
49
|
collected = []
|
|
50
|
+
slug = get_project_slug()
|
|
51
|
+
|
|
52
|
+
# Check slug subdirectory first, then fall back to flat directory
|
|
53
|
+
dirs_to_check = [os.path.join(MARKER_DIR, slug), MARKER_DIR]
|
|
31
54
|
|
|
32
55
|
for filename in NOTIFICATION_FILES:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
for check_dir in dirs_to_check:
|
|
57
|
+
filepath = os.path.join(check_dir, filename)
|
|
58
|
+
if not os.path.exists(filepath):
|
|
59
|
+
continue
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
with open(filepath, 'r') as f:
|
|
63
|
+
content = f.read().strip()
|
|
64
|
+
except IOError:
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
if content:
|
|
68
|
+
collected.append(content)
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
os.remove(filepath)
|
|
72
|
+
except OSError:
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
# Found in this directory — don't check the fallback
|
|
76
|
+
break
|
|
50
77
|
|
|
51
78
|
if collected:
|
|
52
79
|
print('\n\n'.join(collected))
|
|
@@ -120,6 +120,51 @@ def read_rule_content(rule_name):
|
|
|
120
120
|
return text
|
|
121
121
|
|
|
122
122
|
|
|
123
|
+
def get_project_slug():
|
|
124
|
+
"""
|
|
125
|
+
Derive project slug from .codeyam/config.json (matching getProjectSlug() on the TS side).
|
|
126
|
+
Falls back to os.path.basename(project_dir) if config is absent or malformed.
|
|
127
|
+
"""
|
|
128
|
+
project_dir = os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
|
|
129
|
+
try:
|
|
130
|
+
config_path = os.path.join(project_dir, '.codeyam', 'config.json')
|
|
131
|
+
with open(config_path, 'r') as f:
|
|
132
|
+
config = json.load(f)
|
|
133
|
+
slug = config.get('projectSlug', '')
|
|
134
|
+
if slug:
|
|
135
|
+
return slug
|
|
136
|
+
except (IOError, json.JSONDecodeError, KeyError):
|
|
137
|
+
pass
|
|
138
|
+
return os.path.basename(project_dir)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def load_memory_settings():
|
|
142
|
+
"""
|
|
143
|
+
Load memory settings from .codeyam/config.json.
|
|
144
|
+
Returns dict with safe defaults when absent or malformed.
|
|
145
|
+
"""
|
|
146
|
+
defaults = {
|
|
147
|
+
'conversationReflection': True,
|
|
148
|
+
'ruleMaintenance': True,
|
|
149
|
+
'promptModel': 'haiku',
|
|
150
|
+
}
|
|
151
|
+
try:
|
|
152
|
+
project_dir = os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
|
|
153
|
+
config_path = os.path.join(project_dir, '.codeyam', 'config.json')
|
|
154
|
+
with open(config_path, 'r') as f:
|
|
155
|
+
config = json.load(f)
|
|
156
|
+
memory = config.get('memory', {})
|
|
157
|
+
if not isinstance(memory, dict):
|
|
158
|
+
return defaults
|
|
159
|
+
return {
|
|
160
|
+
'conversationReflection': memory.get('conversationReflection', True),
|
|
161
|
+
'ruleMaintenance': memory.get('ruleMaintenance', True),
|
|
162
|
+
'promptModel': memory.get('promptModel', 'haiku'),
|
|
163
|
+
}
|
|
164
|
+
except (IOError, json.JSONDecodeError, KeyError):
|
|
165
|
+
return defaults
|
|
166
|
+
|
|
167
|
+
|
|
123
168
|
def get_stale_rules():
|
|
124
169
|
"""
|
|
125
170
|
Run `codeyam memory status` and parse the output to find stale rules.
|
|
@@ -157,8 +202,8 @@ def get_stale_rules():
|
|
|
157
202
|
# Look for the next few lines for details
|
|
158
203
|
for j in range(i + 1, min(i + 4, len(lines))):
|
|
159
204
|
detail = lines[j].strip()
|
|
160
|
-
if detail.startswith('
|
|
161
|
-
rule_info['
|
|
205
|
+
if detail.startswith('Last audited:'):
|
|
206
|
+
rule_info['last_audited'] = detail.replace('Last audited:', '').strip()
|
|
162
207
|
elif detail.startswith('Newest file:'):
|
|
163
208
|
rule_info['newest_file'] = detail.replace('Newest file:', '').strip()
|
|
164
209
|
elif detail.startswith('File modified:'):
|
|
@@ -286,7 +331,7 @@ def build_stale_rules_context(stale_rules):
|
|
|
286
331
|
parts.append("For each rule, review the rule content and the diff of changes, then:")
|
|
287
332
|
parts.append("1. Determine if the rule content needs updating based on the code changes")
|
|
288
333
|
parts.append("2. Update the rule if needed")
|
|
289
|
-
parts.append("3.
|
|
334
|
+
parts.append("3. Run `codeyam memory touch <rule-path1> <rule-path2> ...` with the SPECIFIC rule paths you reviewed to mark them as audited\n")
|
|
290
335
|
|
|
291
336
|
for rule in stale_rules:
|
|
292
337
|
parts.append(f"### {rule['name']}")
|
|
@@ -298,8 +343,8 @@ def build_stale_rules_context(stale_rules):
|
|
|
298
343
|
parts.append(f" Changed file: {rule['newest_file']}")
|
|
299
344
|
if rule.get('file_modified'):
|
|
300
345
|
parts.append(f" File modified: {rule['file_modified']}")
|
|
301
|
-
if rule.get('
|
|
302
|
-
parts.append(f"
|
|
346
|
+
if rule.get('last_audited'):
|
|
347
|
+
parts.append(f" Last audited: {rule['last_audited']}")
|
|
303
348
|
if rule.get('diff'):
|
|
304
349
|
parts.append(f" Changes:")
|
|
305
350
|
for line in rule['diff'].split('\n'):
|
|
@@ -373,7 +418,7 @@ def build_interruption_context(conversation_snippets, follow_up_prompt, modified
|
|
|
373
418
|
return '\n'.join(parts)
|
|
374
419
|
|
|
375
420
|
|
|
376
|
-
def spawn_claude_agent(prompt, log_file, project_dir):
|
|
421
|
+
def spawn_claude_agent(prompt, log_file, project_dir, model='haiku'):
|
|
377
422
|
"""Spawn a detached claude -p agent as a background process."""
|
|
378
423
|
try:
|
|
379
424
|
log_fh = open(log_file, 'w')
|
|
@@ -381,7 +426,8 @@ def spawn_claude_agent(prompt, log_file, project_dir):
|
|
|
381
426
|
env['CODEYAM_RULE_AGENT'] = '1'
|
|
382
427
|
subprocess.Popen(
|
|
383
428
|
['claude', '-p', prompt,
|
|
384
|
-
'--model',
|
|
429
|
+
'--model', model,
|
|
430
|
+
'--no-session-persistence',
|
|
385
431
|
'--output-format', 'stream-json', '--verbose',
|
|
386
432
|
'--allowedTools', 'Read,Edit,Write,Bash,Glob,Grep'],
|
|
387
433
|
cwd=project_dir,
|
|
@@ -427,14 +473,17 @@ def handle_stop(hook_input):
|
|
|
427
473
|
agent spawn) runs first. The slow `get_stale_rules()` call (~10s) runs last
|
|
428
474
|
so the hook timeout doesn't kill us before the critical work is done.
|
|
429
475
|
"""
|
|
476
|
+
settings = load_memory_settings()
|
|
477
|
+
|
|
430
478
|
session_id = hook_input.get('session_id', '')
|
|
431
479
|
transcript_path = hook_input.get('transcript_path', '')
|
|
432
480
|
|
|
433
481
|
if not session_id or not transcript_path:
|
|
434
482
|
return
|
|
435
483
|
|
|
436
|
-
|
|
437
|
-
marker_dir
|
|
484
|
+
slug = get_project_slug()
|
|
485
|
+
marker_dir = Path('/tmp/claude-rule-markers') / slug
|
|
486
|
+
marker_dir.mkdir(parents=True, exist_ok=True)
|
|
438
487
|
marker_file = marker_dir / f'{session_id}.marker'
|
|
439
488
|
|
|
440
489
|
last_line, _ = read_marker(marker_file)
|
|
@@ -452,8 +501,8 @@ def handle_stop(hook_input):
|
|
|
452
501
|
invocation_ts = datetime.now().strftime('%Y%m%d-%H%M%S')
|
|
453
502
|
invocation_id = f'{session_id}-{invocation_ts}'
|
|
454
503
|
|
|
455
|
-
# Fast: spawn conversation review agent first
|
|
456
|
-
if len(conversation_snippets) > 0:
|
|
504
|
+
# Fast: spawn conversation review agent first (if enabled)
|
|
505
|
+
if settings['conversationReflection'] and len(conversation_snippets) > 0:
|
|
457
506
|
conv_context = build_conversation_context(conversation_snippets, modified_files)
|
|
458
507
|
conv_context_file = marker_dir / f'{invocation_id}-conversation.context'
|
|
459
508
|
conv_context_file.write_text(conv_context)
|
|
@@ -466,26 +515,27 @@ def handle_stop(hook_input):
|
|
|
466
515
|
NOTIFICATION_FILE=str(conv_notification_file),
|
|
467
516
|
PROJECT_DIR=project_dir,
|
|
468
517
|
)
|
|
469
|
-
spawn_claude_agent(conv_prompt, conv_log_file, project_dir)
|
|
518
|
+
spawn_claude_agent(conv_prompt, conv_log_file, project_dir, model=settings['promptModel'])
|
|
470
519
|
|
|
471
520
|
# Slow (~10s): check for stale rules last — if the hook timeout kills us
|
|
472
521
|
# here, the conversation agent and marker are already handled
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
522
|
+
if settings['ruleMaintenance']:
|
|
523
|
+
stale_rules = get_stale_rules()
|
|
524
|
+
|
|
525
|
+
if len(stale_rules) > 0:
|
|
526
|
+
stale_context = build_stale_rules_context(stale_rules)
|
|
527
|
+
stale_context_file = marker_dir / f'{invocation_id}-stale.context'
|
|
528
|
+
stale_context_file.write_text(stale_context)
|
|
529
|
+
|
|
530
|
+
stale_log_file = marker_dir / f'{invocation_id}-stale.log'
|
|
531
|
+
stale_notification_file = marker_dir / 'rule-notification-stale.md'
|
|
532
|
+
stale_prompt = load_prompt_template(
|
|
533
|
+
'stale-rules-prompt.txt',
|
|
534
|
+
CONTEXT_FILE=str(stale_context_file),
|
|
535
|
+
NOTIFICATION_FILE=str(stale_notification_file),
|
|
536
|
+
PROJECT_DIR=project_dir,
|
|
537
|
+
)
|
|
538
|
+
spawn_claude_agent(stale_prompt, stale_log_file, project_dir, model=settings['promptModel'])
|
|
489
539
|
|
|
490
540
|
|
|
491
541
|
def handle_user_prompt_submit(hook_input):
|
|
@@ -495,6 +545,12 @@ def handle_user_prompt_submit(hook_input):
|
|
|
495
545
|
marker file is stale (transcript has lines beyond the marker). If so, spawns a
|
|
496
546
|
rule-reflection agent focused on the interruption.
|
|
497
547
|
"""
|
|
548
|
+
settings = load_memory_settings()
|
|
549
|
+
|
|
550
|
+
# Interruption detection is part of conversation reflection
|
|
551
|
+
if not settings['conversationReflection']:
|
|
552
|
+
return
|
|
553
|
+
|
|
498
554
|
session_id = hook_input.get('session_id', '')
|
|
499
555
|
transcript_path = hook_input.get('transcript_path', '')
|
|
500
556
|
follow_up_prompt = hook_input.get('prompt', '')
|
|
@@ -502,8 +558,9 @@ def handle_user_prompt_submit(hook_input):
|
|
|
502
558
|
if not session_id or not transcript_path:
|
|
503
559
|
return
|
|
504
560
|
|
|
505
|
-
|
|
506
|
-
marker_dir
|
|
561
|
+
slug = get_project_slug()
|
|
562
|
+
marker_dir = Path('/tmp/claude-rule-markers') / slug
|
|
563
|
+
marker_dir.mkdir(parents=True, exist_ok=True)
|
|
507
564
|
marker_file = marker_dir / f'{session_id}.marker'
|
|
508
565
|
|
|
509
566
|
last_line, was_stop = read_marker(marker_file)
|
|
@@ -561,7 +618,7 @@ def handle_user_prompt_submit(hook_input):
|
|
|
561
618
|
NOTIFICATION_FILE=str(notification_file),
|
|
562
619
|
PROJECT_DIR=project_dir,
|
|
563
620
|
)
|
|
564
|
-
spawn_claude_agent(prompt, log_file, project_dir)
|
|
621
|
+
spawn_claude_agent(prompt, log_file, project_dir, model=settings['promptModel'])
|
|
565
622
|
|
|
566
623
|
|
|
567
624
|
def main():
|