@codeyam/codeyam-cli 0.1.0-staging.483fdc2 → 0.1.0-staging.62d4615
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 +3 -3
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +9 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +154 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +11 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +2 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +70 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +20 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +84 -19
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +14 -0
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
- package/analyzer-template/packages/analyze/index.ts +2 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +51 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +5 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +4 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +194 -15
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +260 -22
- package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +3 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +3 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/project/constructMockCode.ts +36 -1
- package/analyzer-template/project/writeMockDataTsx.ts +111 -17
- package/analyzer-template/project/writeScenarioComponents.ts +60 -12
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- package/background/src/lib/virtualized/project/constructMockCode.js +30 -1
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +95 -13
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +43 -9
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +12 -21
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +4 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +23 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +4 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +128 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +285 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +83 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +96 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +33 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.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 +0 -28
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +14 -9
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +1 -0
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-B86KKU7e.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-C6PKeMYR.js} +3 -8
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-BNLaXBHR.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-DD1r_QU0.js} +6 -11
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DfKzxuoe.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-C5lqplTC.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-n38keI1k.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-Dk8wkAS7.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-DXnyr8uP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-Bh6jH0cL.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-BUvfJMNR.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-d4e77269.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-DCHBwHou.js +76 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-D6oziHts.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-CS5f3WzT.js → settings-B2X7lJgQ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-TD1f-DHV.js → index-C0KrUQp-.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-C2h1v1XD.js +260 -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-memory-hook.sh +9 -10
- package/codeyam-cli/templates/codeyam:memory.md +10 -9
- package/codeyam-cli/templates/codeyam:new-rule.md +0 -39
- package/codeyam-cli/templates/rule-notification-hook.py +54 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +356 -89
- package/codeyam-cli/templates/rules-instructions.md +19 -22
- package/package.json +2 -2
- package/packages/ai/src/lib/analyzeScope.js +7 -1
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +134 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +11 -2
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +2 -2
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +63 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +15 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +78 -17
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +10 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +39 -3
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/analyze/index.js +1 -0
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +41 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +3 -0
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +5 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +9 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +116 -13
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +231 -22
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/index.js +1 -0
- package/packages/analyze/src/lib/index.js.map +1 -1
- package/codeyam-cli/src/utils/reviewedRules.js +0 -92
- package/codeyam-cli/src/utils/reviewedRules.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-CX9f-5xM.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-bba56ec1.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-DuTFSyJ2.js +0 -92
- package/codeyam-cli/src/webserver/build/client/assets/root-DTfSQARG.js +0 -62
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BQ-1XyEa.js +0 -258
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '../../../templates/prompts');
|
|
4
|
+
let _guidanceCache = null;
|
|
5
|
+
function loadGuidance() {
|
|
6
|
+
if (_guidanceCache === null) {
|
|
7
|
+
_guidanceCache = readFileSync(path.join(TEMPLATES_DIR, 'conversation-guidance.txt'), 'utf-8');
|
|
8
|
+
}
|
|
9
|
+
return _guidanceCache;
|
|
10
|
+
}
|
|
11
|
+
function buildStaleRulesSection(staleRules) {
|
|
12
|
+
const parts = [];
|
|
13
|
+
for (const rule of staleRules) {
|
|
14
|
+
parts.push(`### ${rule.name}`);
|
|
15
|
+
if (rule.rule_content) {
|
|
16
|
+
parts.push(' Rule content:');
|
|
17
|
+
for (const line of rule.rule_content.split('\n')) {
|
|
18
|
+
parts.push(` ${line}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (rule.newest_file) {
|
|
22
|
+
parts.push(` Changed file: ${rule.newest_file}`);
|
|
23
|
+
}
|
|
24
|
+
if (rule.file_modified) {
|
|
25
|
+
parts.push(` File modified: ${rule.file_modified}`);
|
|
26
|
+
}
|
|
27
|
+
if (rule.rule_timestamp) {
|
|
28
|
+
parts.push(` Rule timestamp: ${rule.rule_timestamp}`);
|
|
29
|
+
}
|
|
30
|
+
if (rule.diff) {
|
|
31
|
+
parts.push(' Changes:');
|
|
32
|
+
for (const line of rule.diff.split('\n')) {
|
|
33
|
+
parts.push(` ${line}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
parts.push('');
|
|
37
|
+
}
|
|
38
|
+
return parts;
|
|
39
|
+
}
|
|
40
|
+
function buildConversationSection(snippets, modifiedFiles) {
|
|
41
|
+
const parts = [];
|
|
42
|
+
parts.push(loadGuidance());
|
|
43
|
+
if (modifiedFiles.size > 0) {
|
|
44
|
+
parts.push('Files modified this session:');
|
|
45
|
+
const sorted = Array.from(modifiedFiles).sort((a, b) => a[0].localeCompare(b[0]));
|
|
46
|
+
for (const [filePath, toolName] of sorted) {
|
|
47
|
+
parts.push(`- ${filePath} (${toolName})`);
|
|
48
|
+
}
|
|
49
|
+
parts.push('');
|
|
50
|
+
}
|
|
51
|
+
parts.push('### Session transcript\n');
|
|
52
|
+
const summaryLines = [];
|
|
53
|
+
for (const snippet of snippets) {
|
|
54
|
+
const content = snippet.content.replace(/\n/g, ' ');
|
|
55
|
+
summaryLines.push(`[${snippet.role}]: ${content}`);
|
|
56
|
+
}
|
|
57
|
+
parts.push(summaryLines.join('\n'));
|
|
58
|
+
return parts;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build context for stale rules review only.
|
|
62
|
+
* Returns the stale rules section string, or empty string if no stale rules.
|
|
63
|
+
*/
|
|
64
|
+
export function buildStaleRulesContext(staleRules) {
|
|
65
|
+
if (staleRules.length === 0) {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
const parts = [];
|
|
69
|
+
parts.push('# Reflection Step\n');
|
|
70
|
+
parts.push('Please review the stale rules below to determine if any need updating based on recent code changes.\n');
|
|
71
|
+
parts.push('Please show your thinking regarding the stale rules.\n');
|
|
72
|
+
parts.push('## Stale Rules to Review\n');
|
|
73
|
+
parts.push('The following rules have files that changed since the rule was last reviewed.');
|
|
74
|
+
parts.push('For each rule, review the rule content and the diff of changes, then:');
|
|
75
|
+
parts.push('1. Determine if the rule content needs updating based on the code changes');
|
|
76
|
+
parts.push('2. Update the rule if needed');
|
|
77
|
+
parts.push('3. ALWAYS update the timestamp (run `codeyam memory touch`)\n');
|
|
78
|
+
parts.push(...buildStaleRulesSection(staleRules));
|
|
79
|
+
return parts.join('\n');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build context for conversation review only.
|
|
83
|
+
* Returns the conversation review section string, or empty string if no snippets.
|
|
84
|
+
*/
|
|
85
|
+
export function buildConversationContext(snippets, modifiedFiles) {
|
|
86
|
+
if (snippets.length === 0) {
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
const parts = [];
|
|
90
|
+
parts.push('## Conversation Review\n');
|
|
91
|
+
parts.push('Review this session for rule-worthy learnings: architectural decisions, tribal knowledge, ' +
|
|
92
|
+
'confusion, mistakes, or corrections that future sessions would benefit from knowing.\n');
|
|
93
|
+
parts.push(...buildConversationSection(snippets, modifiedFiles));
|
|
94
|
+
return parts.join('\n');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=contextBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextBuilder.js","sourceRoot":"","sources":["../../../../../src/utils/ruleReflection/contextBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CONFUSION_SIGNALS, hasConfusionSignals } from "./confusionDetector.js";
|
|
2
|
+
export { parseTranscript } from "./transcriptParser.js";
|
|
3
|
+
export { buildStaleRulesContext, buildConversationContext, } from "./contextBuilder.js";
|
|
4
|
+
export { buildStaleRulesPrompt, buildConversationPrompt, } from "./promptBuilder.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/ruleReflection/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '../../../templates/prompts');
|
|
4
|
+
function loadTemplate(name, vars) {
|
|
5
|
+
let text = readFileSync(path.join(TEMPLATES_DIR, name), 'utf-8');
|
|
6
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
7
|
+
text = text.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
|
|
8
|
+
}
|
|
9
|
+
return text;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build the prompt for the stale rules `claude -p` invocation.
|
|
13
|
+
* Reads from templates/prompts/stale-rules-prompt.txt.
|
|
14
|
+
*/
|
|
15
|
+
export function buildStaleRulesPrompt(contextFilePath, projectDir, notificationFilePath) {
|
|
16
|
+
return loadTemplate('stale-rules-prompt.txt', {
|
|
17
|
+
CONTEXT_FILE: contextFilePath,
|
|
18
|
+
NOTIFICATION_FILE: notificationFilePath,
|
|
19
|
+
PROJECT_DIR: projectDir,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the prompt for the conversation review `claude -p` invocation.
|
|
24
|
+
* Reads from templates/prompts/conversation-prompt.txt.
|
|
25
|
+
*/
|
|
26
|
+
export function buildConversationPrompt(contextFilePath, projectDir, notificationFilePath) {
|
|
27
|
+
return loadTemplate('conversation-prompt.txt', {
|
|
28
|
+
CONTEXT_FILE: contextFilePath,
|
|
29
|
+
NOTIFICATION_FILE: notificationFilePath,
|
|
30
|
+
PROJECT_DIR: projectDir,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=promptBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../../../../src/utils/ruleReflection/promptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;AAE5E,SAAS,YAAY,CAAC,IAAY,EAAE,IAA4B;IAC9D,IAAI,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAuB,EACvB,UAAkB,EAClB,oBAA4B;IAE5B,OAAO,YAAY,CAAC,wBAAwB,EAAE;QAC5C,YAAY,EAAE,eAAe;QAC7B,iBAAiB,EAAE,oBAAoB;QACvC,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,eAAuB,EACvB,UAAkB,EAClB,oBAA4B;IAE5B,OAAO,YAAY,CAAC,yBAAyB,EAAE;QAC7C,YAAY,EAAE,eAAe;QAC7B,iBAAiB,EAAE,oBAAoB;QACvC,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a JSONL transcript string and extract conversation snippets and modified files.
|
|
3
|
+
* Ported from rule-reflection-hook.py get_conversation_context().
|
|
4
|
+
*
|
|
5
|
+
* @param jsonlContent - Raw JSONL string (one JSON object per line)
|
|
6
|
+
* @param lastLine - Line offset to start from (skip already-processed lines)
|
|
7
|
+
*/
|
|
8
|
+
export function parseTranscript(jsonlContent, lastLine = 0) {
|
|
9
|
+
const allLines = jsonlContent.split('\n').filter((line) => line.trim());
|
|
10
|
+
const currentLineCount = allLines.length;
|
|
11
|
+
const newLines = allLines.slice(lastLine);
|
|
12
|
+
if (newLines.length === 0) {
|
|
13
|
+
return {
|
|
14
|
+
userTurnCount: 0,
|
|
15
|
+
snippets: [],
|
|
16
|
+
modifiedFiles: new Set(),
|
|
17
|
+
currentLineCount,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
let userTurnCount = 0;
|
|
21
|
+
const snippets = [];
|
|
22
|
+
const modifiedFiles = new Set();
|
|
23
|
+
for (const line of newLines) {
|
|
24
|
+
let obj;
|
|
25
|
+
try {
|
|
26
|
+
obj = JSON.parse(line);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const msgType = obj.type;
|
|
32
|
+
if (msgType !== 'user' && msgType !== 'assistant') {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const message = obj.message;
|
|
36
|
+
if (!message)
|
|
37
|
+
continue;
|
|
38
|
+
const content = message.content;
|
|
39
|
+
const isExternalUser = msgType === 'user' && obj.userType === 'external';
|
|
40
|
+
if (typeof content === 'string') {
|
|
41
|
+
if (obj.isMeta || content.length < 20) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (content.startsWith('[{') || content.includes('<tool_result')) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (isExternalUser && !content.startsWith('<')) {
|
|
48
|
+
userTurnCount++;
|
|
49
|
+
}
|
|
50
|
+
snippets.push({
|
|
51
|
+
role: message.role || msgType,
|
|
52
|
+
content,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (Array.isArray(content)) {
|
|
56
|
+
for (const item of content) {
|
|
57
|
+
if (typeof item !== 'object' || item === null) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const typedItem = item;
|
|
61
|
+
// Extract text snippets
|
|
62
|
+
if (typedItem.type === 'text') {
|
|
63
|
+
const text = typedItem.text || '';
|
|
64
|
+
if (text.length > 20) {
|
|
65
|
+
snippets.push({
|
|
66
|
+
role: message.role || msgType,
|
|
67
|
+
content: text,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Track file modifications from tool_use entries
|
|
72
|
+
if (typedItem.type === 'tool_use') {
|
|
73
|
+
const toolName = typedItem.name || '';
|
|
74
|
+
const toolInput = typedItem.input || {};
|
|
75
|
+
if ((toolName === 'Edit' || toolName === 'Write') &&
|
|
76
|
+
typeof toolInput.file_path === 'string') {
|
|
77
|
+
modifiedFiles.add([toolInput.file_path, toolName]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { userTurnCount, snippets, modifiedFiles, currentLineCount };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=transcriptParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptParser.js","sourceRoot":"","sources":["../../../../../src/utils/ruleReflection/transcriptParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/utils/ruleReflection/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { loadRuleState, saveRuleState, syncRuleState, touchTimestamps, setReviewed, getRuleTimestamp, isRuleReviewed, hashRuleContent, } from "../ruleState.js";
|
|
5
|
+
describe('ruleState', () => {
|
|
6
|
+
let tempDir;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codeyam-rulestate-'));
|
|
9
|
+
// Create .claude directory
|
|
10
|
+
fs.mkdirSync(path.join(tempDir, '.claude', 'rules'), { recursive: true });
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
describe('hashRuleContent', () => {
|
|
16
|
+
it('produces consistent hashes for identical content', () => {
|
|
17
|
+
const content = '# My Rule\n\nSome content here.';
|
|
18
|
+
expect(hashRuleContent(content)).toBe(hashRuleContent(content));
|
|
19
|
+
});
|
|
20
|
+
it('strips category field from hash calculation', () => {
|
|
21
|
+
const withCategory = '---\ncategory: testing\n---\n# My Rule\n\nSome content.';
|
|
22
|
+
const withoutCategory = '---\n---\n# My Rule\n\nSome content.';
|
|
23
|
+
expect(hashRuleContent(withCategory)).toBe(hashRuleContent(withoutCategory));
|
|
24
|
+
});
|
|
25
|
+
it('produces different hashes for different content', () => {
|
|
26
|
+
const a = '# Rule A\n\nContent A';
|
|
27
|
+
const b = '# Rule B\n\nContent B';
|
|
28
|
+
expect(hashRuleContent(a)).not.toBe(hashRuleContent(b));
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('loadRuleState', () => {
|
|
32
|
+
it('returns empty state when file does not exist', async () => {
|
|
33
|
+
const state = await loadRuleState(tempDir);
|
|
34
|
+
expect(state).toEqual({ version: 1, rules: {} });
|
|
35
|
+
});
|
|
36
|
+
it('loads existing state from file', async () => {
|
|
37
|
+
const data = {
|
|
38
|
+
version: 1,
|
|
39
|
+
rules: {
|
|
40
|
+
'test-rule.md': {
|
|
41
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
42
|
+
contentHash: 'abc123',
|
|
43
|
+
reviewed: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'codeyam-rule-state.json'), JSON.stringify(data));
|
|
48
|
+
const state = await loadRuleState(tempDir);
|
|
49
|
+
expect(state.rules['test-rule.md']).toEqual({
|
|
50
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
51
|
+
contentHash: 'abc123',
|
|
52
|
+
reviewed: true,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it('returns empty state for unknown version', async () => {
|
|
56
|
+
const data = { version: 999, rules: {} };
|
|
57
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'codeyam-rule-state.json'), JSON.stringify(data));
|
|
58
|
+
const state = await loadRuleState(tempDir);
|
|
59
|
+
expect(state).toEqual({ version: 1, rules: {} });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('saveRuleState', () => {
|
|
63
|
+
it('writes state to .claude/codeyam-rule-state.json', async () => {
|
|
64
|
+
const data = {
|
|
65
|
+
version: 1,
|
|
66
|
+
rules: {
|
|
67
|
+
'my-rule.md': {
|
|
68
|
+
contentHash: 'hash123',
|
|
69
|
+
reviewed: false,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
await saveRuleState(tempDir, data);
|
|
74
|
+
const content = fs.readFileSync(path.join(tempDir, '.claude', 'codeyam-rule-state.json'), 'utf-8');
|
|
75
|
+
const parsed = JSON.parse(content);
|
|
76
|
+
expect(parsed.version).toBe(1);
|
|
77
|
+
expect(parsed.rules['my-rule.md'].contentHash).toBe('hash123');
|
|
78
|
+
});
|
|
79
|
+
it('creates .claude directory if it does not exist', async () => {
|
|
80
|
+
const freshDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codeyam-fresh-'));
|
|
81
|
+
try {
|
|
82
|
+
await saveRuleState(freshDir, { version: 1, rules: {} });
|
|
83
|
+
expect(fs.existsSync(path.join(freshDir, '.claude', 'codeyam-rule-state.json'))).toBe(true);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
fs.rmSync(freshDir, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('syncRuleState', () => {
|
|
91
|
+
function makeRule(filePath, content) {
|
|
92
|
+
const absolutePath = path.join(tempDir, '.claude', 'rules', filePath);
|
|
93
|
+
return {
|
|
94
|
+
filePath,
|
|
95
|
+
absolutePath,
|
|
96
|
+
frontmatter: {},
|
|
97
|
+
body: content,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
it('creates entries for new rules', async () => {
|
|
101
|
+
const ruleContent = '# New Rule\n\nThis is a new rule.';
|
|
102
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'rules', 'new-rule.md'), ruleContent);
|
|
103
|
+
const rules = [makeRule('new-rule.md', ruleContent)];
|
|
104
|
+
const state = await syncRuleState(tempDir, rules);
|
|
105
|
+
expect(state.rules['new-rule.md']).toBeDefined();
|
|
106
|
+
expect(state.rules['new-rule.md'].reviewed).toBe(false);
|
|
107
|
+
expect(state.rules['new-rule.md'].contentHash).toBeTruthy();
|
|
108
|
+
});
|
|
109
|
+
it('preserves reviewed status when content has not changed', async () => {
|
|
110
|
+
const ruleContent = '# Existing Rule\n\nSame content.';
|
|
111
|
+
const hash = hashRuleContent(ruleContent);
|
|
112
|
+
// Write initial state with reviewed: true
|
|
113
|
+
await saveRuleState(tempDir, {
|
|
114
|
+
version: 1,
|
|
115
|
+
rules: {
|
|
116
|
+
'existing.md': {
|
|
117
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
118
|
+
contentHash: hash,
|
|
119
|
+
reviewed: true,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'rules', 'existing.md'), ruleContent);
|
|
124
|
+
const rules = [makeRule('existing.md', ruleContent)];
|
|
125
|
+
const state = await syncRuleState(tempDir, rules);
|
|
126
|
+
expect(state.rules['existing.md'].reviewed).toBe(true);
|
|
127
|
+
expect(state.rules['existing.md'].timestamp).toBe('2026-01-01T00:00:00Z');
|
|
128
|
+
});
|
|
129
|
+
it('resets reviewed to false when content changes', async () => {
|
|
130
|
+
const oldContent = '# Old Rule\n\nOld content.';
|
|
131
|
+
const newContent = '# Old Rule\n\nUpdated content.';
|
|
132
|
+
await saveRuleState(tempDir, {
|
|
133
|
+
version: 1,
|
|
134
|
+
rules: {
|
|
135
|
+
'changing.md': {
|
|
136
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
137
|
+
contentHash: hashRuleContent(oldContent),
|
|
138
|
+
reviewed: true,
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'rules', 'changing.md'), newContent);
|
|
143
|
+
const rules = [makeRule('changing.md', newContent)];
|
|
144
|
+
const state = await syncRuleState(tempDir, rules);
|
|
145
|
+
expect(state.rules['changing.md'].reviewed).toBe(false);
|
|
146
|
+
expect(state.rules['changing.md'].contentHash).toBe(hashRuleContent(newContent));
|
|
147
|
+
// Timestamp should be preserved
|
|
148
|
+
expect(state.rules['changing.md'].timestamp).toBe('2026-01-01T00:00:00Z');
|
|
149
|
+
});
|
|
150
|
+
it('removes entries for deleted rules', async () => {
|
|
151
|
+
await saveRuleState(tempDir, {
|
|
152
|
+
version: 1,
|
|
153
|
+
rules: {
|
|
154
|
+
'deleted.md': {
|
|
155
|
+
contentHash: 'old-hash',
|
|
156
|
+
reviewed: true,
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
// Sync with empty rules list
|
|
161
|
+
const state = await syncRuleState(tempDir, []);
|
|
162
|
+
expect(state.rules['deleted.md']).toBeUndefined();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('touchTimestamps', () => {
|
|
166
|
+
it('sets timestamp to now for listed rules', async () => {
|
|
167
|
+
await saveRuleState(tempDir, {
|
|
168
|
+
version: 1,
|
|
169
|
+
rules: {
|
|
170
|
+
'rule-a.md': { contentHash: 'hash-a', reviewed: false },
|
|
171
|
+
'rule-b.md': {
|
|
172
|
+
contentHash: 'hash-b',
|
|
173
|
+
reviewed: false,
|
|
174
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const before = Date.now();
|
|
179
|
+
await touchTimestamps(tempDir, ['rule-a.md', 'rule-b.md']);
|
|
180
|
+
const after = Date.now();
|
|
181
|
+
const state = await loadRuleState(tempDir);
|
|
182
|
+
for (const rulePath of ['rule-a.md', 'rule-b.md']) {
|
|
183
|
+
const ts = new Date(state.rules[rulePath].timestamp).getTime();
|
|
184
|
+
expect(ts).toBeGreaterThanOrEqual(before);
|
|
185
|
+
expect(ts).toBeLessThanOrEqual(after);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
it('does not modify rules not in the list', async () => {
|
|
189
|
+
await saveRuleState(tempDir, {
|
|
190
|
+
version: 1,
|
|
191
|
+
rules: {
|
|
192
|
+
'touched.md': { contentHash: 'hash-t', reviewed: false },
|
|
193
|
+
'untouched.md': {
|
|
194
|
+
contentHash: 'hash-u',
|
|
195
|
+
reviewed: true,
|
|
196
|
+
timestamp: '2026-01-01T00:00:00Z',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
await touchTimestamps(tempDir, ['touched.md']);
|
|
201
|
+
const state = await loadRuleState(tempDir);
|
|
202
|
+
expect(state.rules['untouched.md'].timestamp).toBe('2026-01-01T00:00:00Z');
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
describe('setReviewed', () => {
|
|
206
|
+
it('marks a rule as reviewed and updates content hash', async () => {
|
|
207
|
+
const ruleContent = '# Test Rule\n\nSome content.';
|
|
208
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'rules', 'test.md'), ruleContent);
|
|
209
|
+
await saveRuleState(tempDir, {
|
|
210
|
+
version: 1,
|
|
211
|
+
rules: {
|
|
212
|
+
'test.md': { contentHash: 'old-hash', reviewed: false },
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
await setReviewed(tempDir, 'test.md', true);
|
|
216
|
+
const state = await loadRuleState(tempDir);
|
|
217
|
+
expect(state.rules['test.md'].reviewed).toBe(true);
|
|
218
|
+
expect(state.rules['test.md'].contentHash).toBe(hashRuleContent(ruleContent));
|
|
219
|
+
});
|
|
220
|
+
it('marks a rule as unreviewed', async () => {
|
|
221
|
+
await saveRuleState(tempDir, {
|
|
222
|
+
version: 1,
|
|
223
|
+
rules: {
|
|
224
|
+
'test.md': { contentHash: 'hash', reviewed: true },
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
await setReviewed(tempDir, 'test.md', false);
|
|
228
|
+
const state = await loadRuleState(tempDir);
|
|
229
|
+
expect(state.rules['test.md'].reviewed).toBe(false);
|
|
230
|
+
});
|
|
231
|
+
it('creates entry for new rule when marking as reviewed', async () => {
|
|
232
|
+
const ruleContent = '# Brand New Rule\n\nContent.';
|
|
233
|
+
fs.writeFileSync(path.join(tempDir, '.claude', 'rules', 'brand-new.md'), ruleContent);
|
|
234
|
+
await setReviewed(tempDir, 'brand-new.md', true);
|
|
235
|
+
const state = await loadRuleState(tempDir);
|
|
236
|
+
expect(state.rules['brand-new.md']).toBeDefined();
|
|
237
|
+
expect(state.rules['brand-new.md'].reviewed).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe('getRuleTimestamp', () => {
|
|
241
|
+
it('returns timestamp when it exists', () => {
|
|
242
|
+
const state = {
|
|
243
|
+
version: 1,
|
|
244
|
+
rules: {
|
|
245
|
+
'rule.md': {
|
|
246
|
+
contentHash: 'hash',
|
|
247
|
+
reviewed: false,
|
|
248
|
+
timestamp: '2026-02-01T00:00:00Z',
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
expect(getRuleTimestamp(state, 'rule.md')).toBe('2026-02-01T00:00:00Z');
|
|
253
|
+
});
|
|
254
|
+
it('returns null when rule has no timestamp', () => {
|
|
255
|
+
const state = {
|
|
256
|
+
version: 1,
|
|
257
|
+
rules: {
|
|
258
|
+
'rule.md': { contentHash: 'hash', reviewed: false },
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
expect(getRuleTimestamp(state, 'rule.md')).toBeNull();
|
|
262
|
+
});
|
|
263
|
+
it('returns null when rule does not exist', () => {
|
|
264
|
+
const state = { version: 1, rules: {} };
|
|
265
|
+
expect(getRuleTimestamp(state, 'nonexistent.md')).toBeNull();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe('isRuleReviewed', () => {
|
|
269
|
+
it('returns true for reviewed rules', () => {
|
|
270
|
+
const state = {
|
|
271
|
+
version: 1,
|
|
272
|
+
rules: {
|
|
273
|
+
'rule.md': { contentHash: 'hash', reviewed: true },
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
expect(isRuleReviewed(state, 'rule.md')).toBe(true);
|
|
277
|
+
});
|
|
278
|
+
it('returns false for unreviewed rules', () => {
|
|
279
|
+
const state = {
|
|
280
|
+
version: 1,
|
|
281
|
+
rules: {
|
|
282
|
+
'rule.md': { contentHash: 'hash', reviewed: false },
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
expect(isRuleReviewed(state, 'rule.md')).toBe(false);
|
|
286
|
+
});
|
|
287
|
+
it('returns false for nonexistent rules', () => {
|
|
288
|
+
const state = { version: 1, rules: {} };
|
|
289
|
+
expect(isRuleReviewed(state, 'nonexistent.md')).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=ruleState.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleState.test.js","sourceRoot":"","sources":["../../../../../../src/utils/rules/__tests__/ruleState.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,GAEhB,MAAM,cAAc,CAAC;AAGtB,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACvE,2BAA2B;QAC3B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,iCAAiC,CAAC;YAClD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,YAAY,GAChB,yDAAyD,CAAC;YAC5D,MAAM,eAAe,GAAG,sCAAsC,CAAC;YAC/D,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CACxC,eAAe,CAAC,eAAe,CAAC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,GAAG,uBAAuB,CAAC;YAClC,MAAM,CAAC,GAAG,uBAAuB,CAAC;YAClC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,GAAkB;gBAC1B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,cAAc,EAAE;wBACd,SAAS,EAAE,sBAAsB;wBACjC,WAAW,EAAE,QAAQ;wBACrB,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF,CAAC;YACF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACrB,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1C,SAAS,EAAE,sBAAsB;gBACjC,WAAW,EAAE,QAAQ;gBACrB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACzC,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACrB,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAkB;gBAC1B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,YAAY,EAAE;wBACZ,WAAW,EAAE,SAAS;wBACtB,QAAQ,EAAE,KAAK;qBAChB;iBACF;aACF,CAAC;YAEF,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEnC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,OAAO,CACR,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzD,MAAM,CACJ,EAAE,CAAC,UAAU,CACX,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAC1D,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,SAAS,QAAQ,CAAC,QAAgB,EAAE,OAAe;YACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtE,OAAO;gBACL,QAAQ;gBACR,YAAY;gBACZ,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,WAAW,GAAG,mCAAmC,CAAC;YACxD,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,WAAW,CACZ,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAElD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAE1C,0CAA0C;YAC1C,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,aAAa,EAAE;wBACb,SAAS,EAAE,sBAAsB;wBACjC,WAAW,EAAE,IAAI;wBACjB,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF,CAAC,CAAC;YAEH,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,WAAW,CACZ,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAElD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,UAAU,GAAG,4BAA4B,CAAC;YAChD,MAAM,UAAU,GAAG,gCAAgC,CAAC;YAEpD,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,aAAa,EAAE;wBACb,SAAS,EAAE,sBAAsB;wBACjC,WAAW,EAAE,eAAe,CAAC,UAAU,CAAC;wBACxC,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF,CAAC,CAAC;YAEH,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,UAAU,CACX,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAElD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CACjD,eAAe,CAAC,UAAU,CAAC,CAC5B,CAAC;YACF,gCAAgC;YAChC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,YAAY,EAAE;wBACZ,WAAW,EAAE,UAAU;wBACvB,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,WAAW,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;oBACvD,WAAW,EAAE;wBACX,WAAW,EAAE,QAAQ;wBACrB,QAAQ,EAAE,KAAK;wBACf,SAAS,EAAE,sBAAsB;qBAClC;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEzB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAE3C,KAAK,MAAM,QAAQ,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;gBAClD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAU,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChE,MAAM,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,YAAY,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;oBACxD,cAAc,EAAE;wBACd,WAAW,EAAE,QAAQ;wBACrB,QAAQ,EAAE,IAAI;wBACd,SAAS,EAAE,sBAAsB;qBAClC;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAE/C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAChD,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,WAAW,GAAG,8BAA8B,CAAC;YACnD,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EACjD,WAAW,CACZ,CAAC;YAEF,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;iBACxD;aACF,CAAC,CAAC;YAEH,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAE5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAC7C,eAAe,CAAC,WAAW,CAAC,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACnD;aACF,CAAC,CAAC;YAEH,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAE7C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,WAAW,GAAG,8BAA8B,CAAC;YACnD,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,EACtD,WAAW,CACZ,CAAC;YAEF,MAAM,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAEjD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAkB;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE;wBACT,WAAW,EAAE,MAAM;wBACnB,QAAQ,EAAE,KAAK;wBACf,SAAS,EAAE,sBAAsB;qBAClC;iBACF;aACF,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAkB;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;iBACpD;aACF,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,KAAK,GAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAkB;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACnD;aACF,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAkB;gBAC3B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE;oBACL,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;iBACpD;aACF,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/rules/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/rules/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -26,19 +26,6 @@ export function parseFrontmatter(content) {
|
|
|
26
26
|
.trim())
|
|
27
27
|
.filter(Boolean);
|
|
28
28
|
}
|
|
29
|
-
// Parse category
|
|
30
|
-
const categoryMatch = yamlContent.match(/category:\s*([^\n]+)/);
|
|
31
|
-
if (categoryMatch) {
|
|
32
|
-
const cat = categoryMatch[1].trim().replace(/['"]/g, '');
|
|
33
|
-
if (cat === 'architecture' || cat === 'testing' || cat === 'faq') {
|
|
34
|
-
frontmatter.category = cat;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
// Parse timestamp
|
|
38
|
-
const timestampMatch = yamlContent.match(/timestamp:\s*([^\n]+)/);
|
|
39
|
-
if (timestampMatch) {
|
|
40
|
-
frontmatter.timestamp = timestampMatch[1].trim().replace(/['"]/g, '');
|
|
41
|
-
}
|
|
42
29
|
return { frontmatter, body };
|
|
43
30
|
}
|
|
44
31
|
/**
|
|
@@ -88,19 +75,4 @@ export async function loadAllRules(rulesDir) {
|
|
|
88
75
|
}
|
|
89
76
|
return rules;
|
|
90
77
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Update the timestamp in a rule file's frontmatter
|
|
93
|
-
*/
|
|
94
|
-
export function updateTimestamp(content, newTimestamp) {
|
|
95
|
-
const frontmatterRegex = /^(---\n[\s\S]*?)(timestamp:\s*[^\n]*)([\s\S]*?---)/;
|
|
96
|
-
if (frontmatterRegex.test(content)) {
|
|
97
|
-
return content.replace(frontmatterRegex, `$1timestamp: ${newTimestamp}$3`);
|
|
98
|
-
}
|
|
99
|
-
// If no timestamp exists, add it before closing ---
|
|
100
|
-
const addTimestampRegex = /^(---\n[\s\S]*?)(---)/;
|
|
101
|
-
if (addTimestampRegex.test(content)) {
|
|
102
|
-
return content.replace(addTimestampRegex, `$1timestamp: ${newTimestamp}\n$2`);
|
|
103
|
-
}
|
|
104
|
-
return content;
|
|
105
|
-
}
|
|
106
78
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/utils/rules/parser.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/utils/rules/parser.ts"],"names":[],"mappings":"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"}
|