safeword 0.78.2 → 0.78.3
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/codex-plugin/.codex-plugin/plugin.json +1 -1
- package/codex-plugin/hooks.json +5 -5
- package/codex-plugin/skills/bdd/references/SCENARIOS.md +3 -0
- package/codex-plugin/skills/bdd/references/TDD.md +11 -5
- package/codex-plugin/skills/closeout/SKILL.md +24 -16
- package/codex-plugin/skills/finish-review/SKILL.md +4 -3
- package/codex-plugin/skills/lint/SKILL.md +1 -1
- package/codex-plugin/skills/review-spec/SKILL.md +5 -1
- package/codex-plugin/skills/self-review/SKILL.md +2 -2
- package/codex-plugin/skills/ticket-system/SKILL.md +3 -0
- package/dist/{architecture-N5ZC4CDU.js → architecture-RQ377ZER.js} +6 -6
- package/dist/{architecture-document-UBA5UT4J.js → architecture-document-KS3CLSYN.js} +6 -6
- package/dist/{architecture-monorepo-E4JUYJGV.js → architecture-monorepo-NJWWU65G.js} +4 -4
- package/dist/{boundary-HLJILY7R.js → boundary-OPTC2RVJ.js} +6 -6
- package/dist/{chunk-NOTBZCKG.js → chunk-2XR7J5WL.js} +93 -42
- package/dist/chunk-2XR7J5WL.js.map +1 -0
- package/dist/{chunk-4CZS4YJV.js → chunk-3OKZ3X4O.js} +3 -3
- package/dist/{chunk-J7UDLLTK.js → chunk-76XHADUG.js} +39 -25
- package/dist/chunk-76XHADUG.js.map +1 -0
- package/dist/{chunk-4CKCRZDO.js → chunk-7ULZND56.js} +2 -2
- package/dist/{chunk-34NCOTP5.js → chunk-7XELS325.js} +2 -2
- package/dist/{chunk-USPVNZ63.js → chunk-BZWO3BVD.js} +11 -7
- package/dist/chunk-BZWO3BVD.js.map +1 -0
- package/dist/{chunk-GZ36UZJG.js → chunk-CFME47IY.js} +6 -6
- package/dist/{chunk-SME5SU3O.js → chunk-CNBZ3S5U.js} +255 -45
- package/dist/chunk-CNBZ3S5U.js.map +1 -0
- package/dist/{chunk-AV5LTEME.js → chunk-CRGPYC35.js} +8 -6
- package/dist/{chunk-AV5LTEME.js.map → chunk-CRGPYC35.js.map} +1 -1
- package/dist/{chunk-BQTC6YGN.js → chunk-D5ENZR6N.js} +2 -2
- package/dist/{chunk-V63TSN3C.js → chunk-FOYGZ4MK.js} +31 -10
- package/dist/chunk-FOYGZ4MK.js.map +1 -0
- package/dist/{chunk-ZRV7TOCX.js → chunk-G5AFQXXW.js} +2 -2
- package/dist/{chunk-S2T356DA.js → chunk-HF3DXZEA.js} +7 -10
- package/dist/chunk-HF3DXZEA.js.map +1 -0
- package/dist/{chunk-NSZGI7HK.js → chunk-HNCUIXDY.js} +9 -9
- package/dist/{chunk-NSZGI7HK.js.map → chunk-HNCUIXDY.js.map} +1 -1
- package/dist/{chunk-KXHVFCDT.js → chunk-IDRLACDS.js} +145 -19
- package/dist/chunk-IDRLACDS.js.map +1 -0
- package/dist/{chunk-BSOUMHMQ.js → chunk-IPTM5VE7.js} +101 -1094
- package/dist/chunk-IPTM5VE7.js.map +1 -0
- package/dist/chunk-JBOLNV2L.js +21 -0
- package/dist/chunk-JBOLNV2L.js.map +1 -0
- package/dist/chunk-JSR3HXFT.js +1231 -0
- package/dist/chunk-JSR3HXFT.js.map +1 -0
- package/dist/{chunk-I4KBHRZW.js → chunk-LH2FAQTI.js} +4 -4
- package/dist/{chunk-WVDRXD67.js → chunk-MLBZFB5A.js} +1 -1
- package/dist/chunk-MLBZFB5A.js.map +1 -0
- package/dist/{chunk-KFVEPQ7X.js → chunk-MVFHTUQ3.js} +2 -2
- package/dist/{chunk-BAVDDAN3.js → chunk-MZKTOX6X.js} +7 -7
- package/dist/{chunk-TJ627SKI.js → chunk-O3GZ77F7.js} +15 -1
- package/dist/chunk-O3GZ77F7.js.map +1 -0
- package/dist/{chunk-Q5KLE6ZF.js → chunk-OKPRQGFG.js} +2 -2
- package/dist/{chunk-QUDIOBHP.js → chunk-PD7ZXRHV.js} +139 -18
- package/dist/chunk-PD7ZXRHV.js.map +1 -0
- package/dist/chunk-QAHJSG53.js +30 -0
- package/dist/chunk-QAHJSG53.js.map +1 -0
- package/dist/{chunk-QTG2EXFT.js → chunk-QLOUSTQE.js} +2 -2
- package/dist/{chunk-QTG2EXFT.js.map → chunk-QLOUSTQE.js.map} +1 -1
- package/dist/{chunk-3SOJBMM6.js → chunk-R6BSRNU4.js} +6 -6
- package/dist/{chunk-3SOJBMM6.js.map → chunk-R6BSRNU4.js.map} +1 -1
- package/dist/{chunk-664YNAMR.js → chunk-RTFPKJJV.js} +5 -5
- package/dist/{chunk-GKR44BCH.js → chunk-RVDXBHUG.js} +2 -2
- package/dist/chunk-THLEVFEX.js +22 -0
- package/dist/chunk-THLEVFEX.js.map +1 -0
- package/dist/{chunk-A7Z27COA.js → chunk-VFWAZLEF.js} +3 -3
- package/dist/{chunk-3EJNDIAO.js → chunk-VZ5B2SIO.js} +2 -2
- package/dist/chunk-WAMQTZAH.js +19 -0
- package/dist/chunk-WAMQTZAH.js.map +1 -0
- package/dist/{chunk-FDHJ63FZ.js → chunk-WVA4Q6BX.js} +1 -1
- package/dist/{chunk-FDHJ63FZ.js.map → chunk-WVA4Q6BX.js.map} +1 -1
- package/dist/{cleanup-X556LNWM.js → cleanup-ELVHZPRC.js} +9 -9
- package/dist/{cleanup-command-RV2Q7G72.js → cleanup-command-5BY4FWAT.js} +12 -12
- package/dist/cli.js +143 -108
- package/dist/cli.js.map +1 -1
- package/dist/{clients-HP23HRN2.js → clients-WRPBRO6V.js} +2 -2
- package/dist/{codex-bootstrap-MGY2D6HU.js → codex-bootstrap-GYG7N4XU.js} +77 -34
- package/dist/codex-bootstrap-GYG7N4XU.js.map +1 -0
- package/dist/{codex-hook-IPX3PDXX.js → codex-hook-7ILIPLYM.js} +56 -48
- package/dist/codex-hook-7ILIPLYM.js.map +1 -0
- package/dist/{codify-J5ZLJ3HK.js → codify-HSDVRZFI.js} +11 -8
- package/dist/codify-HSDVRZFI.js.map +1 -0
- package/dist/{commands-L4AINARC.js → commands-X4KBCMHS.js} +115 -60
- package/dist/commands-X4KBCMHS.js.map +1 -0
- package/dist/{config-LUSJAK6B.js → config-TXJRCN3W.js} +2 -2
- package/dist/{configured-paths-SPQ5XWOM.js → configured-paths-4CRHLBIF.js} +4 -4
- package/dist/contract-B7NDKO5B.js +8 -0
- package/dist/{coordinator-SA75UB3C.js → coordinator-ZMD3467F.js} +231 -144
- package/dist/coordinator-ZMD3467F.js.map +1 -0
- package/dist/corpus-PUBXCCSN.js +15 -0
- package/dist/{doctor-DSC36R4U.js → doctor-RPXETRSJ.js} +18 -18
- package/dist/{feature-directories-VOHVV26X.js → feature-directories-ASNDEM7J.js} +6 -6
- package/dist/{finalization-7SMLMVLV.js → finalization-BGPOEBAL.js} +2 -2
- package/dist/{gh-cli-ZMO7D2KE.js → gh-cli-OTX7PORT.js} +2 -2
- package/dist/{github-rest-KGKS4V2H.js → github-rest-JCW32377.js} +2 -2
- package/dist/index.js +2 -2
- package/dist/{job-CDADLJDF.js → job-NXXG4U5K.js} +20 -21
- package/dist/job-NXXG4U5K.js.map +1 -0
- package/dist/{learning-sync-6BTHM6ZC.js → learning-sync-2WIAOTW3.js} +4 -4
- package/dist/{legacy-global-guidance-2JL4Y5EB.js → legacy-global-guidance-WTDI53H7.js} +5 -5
- package/dist/{lint-gherkin-COSHVS6Z.js → lint-gherkin-LS3CHW3J.js} +7 -7
- package/dist/{operations-XVRQSLJG.js → operations-OZKEQCS4.js} +12 -12
- package/dist/{output-3LB2OEHN.js → output-ZYTEW6SC.js} +2 -2
- package/dist/{packet-5WT5M3OS.js → packet-7S6CZJQR.js} +2 -2
- package/dist/presets/typescript/index.js +2 -2
- package/dist/{profile-UMKQ5JVO.js → profile-SDFSBKH5.js} +7 -7
- package/dist/{prompt-GWYDFMLO.js → prompt-LYPODDC3.js} +2 -2
- package/dist/remove-P5JQNS5P.js +23 -0
- package/dist/{retro-IFSVU5KS.js → retro-EQK2Z2Z6.js} +8 -8
- package/dist/{retro-draft-spool-4S3TCHWL.js → retro-draft-spool-MDPBVM6J.js} +2 -2
- package/dist/{retro-extract-OSBFAXLU.js → retro-extract-CZMDD4WB.js} +2 -2
- package/dist/{review-pr-6S2352CK.js → review-pr-CWRD446M.js} +2 -2
- package/dist/{review-pr-publication-CGHCRRUI.js → review-pr-publication-AIX2U3VM.js} +2 -2
- package/dist/{run-5JESKXUR.js → run-T45X6Z6C.js} +4 -4
- package/dist/{self-report-VPHBPPSJ.js → self-report-V7PHKTS6.js} +2 -2
- package/dist/status-F5TFEIZ6.js +21 -0
- package/dist/{status-EX4L3ELO.js → status-S24PDFXB.js} +18 -18
- package/dist/{sync-config-O7J7IDGE.js → sync-config-EUVBPUUG.js} +5 -5
- package/dist/{sync-tracker-U2GYOFUO.js → sync-tracker-5FSIIAMS.js} +6 -6
- package/dist/{test-execution-6LIPMBIH.js → test-execution-HASVO6EL.js} +8 -7
- package/dist/{test-execution-6LIPMBIH.js.map → test-execution-HASVO6EL.js.map} +1 -1
- package/dist/{test-plan-VASHZXJ7.js → test-plan-EM3PVGIX.js} +7 -6
- package/dist/{test-plan-VASHZXJ7.js.map → test-plan-EM3PVGIX.js.map} +1 -1
- package/dist/{ticket-new-3YXDIWPC.js → ticket-new-H6ZNIRS4.js} +11 -11
- package/dist/ticket-new-H6ZNIRS4.js.map +1 -0
- package/dist/{ticket-sync-LLUBXZ2R.js → ticket-sync-7QRH6PVT.js} +5 -5
- package/dist/{tracker-map-HR4MBYG5.js → tracker-map-7AGCTWBZ.js} +2 -2
- package/dist/{tracker-sync-YDICZN66.js → tracker-sync-MLVYGFQJ.js} +2 -2
- package/package.json +1 -1
- package/templates/SAFEWORD.md +2 -2
- package/templates/commands/lint.md +1 -1
- package/templates/scripts/closeout-cleanup.ts +127 -31
- package/templates/skills/bdd/SCENARIOS.md +3 -0
- package/templates/skills/bdd/TDD.md +11 -5
- package/templates/skills/closeout/SKILL.md +25 -17
- package/templates/skills/finish-review/SKILL.md +4 -3
- package/templates/skills/lint/SKILL.md +1 -1
- package/templates/skills/review-spec/SKILL.md +5 -1
- package/templates/skills/self-review/SKILL.md +2 -2
- package/templates/skills/ticket-system/SKILL.md +3 -0
- package/dist/chunk-6S7CTKGC.js +0 -128
- package/dist/chunk-6S7CTKGC.js.map +0 -1
- package/dist/chunk-BSOUMHMQ.js.map +0 -1
- package/dist/chunk-J7UDLLTK.js.map +0 -1
- package/dist/chunk-KXHVFCDT.js.map +0 -1
- package/dist/chunk-NOTBZCKG.js.map +0 -1
- package/dist/chunk-QUDIOBHP.js.map +0 -1
- package/dist/chunk-S2T356DA.js.map +0 -1
- package/dist/chunk-SME5SU3O.js.map +0 -1
- package/dist/chunk-TJ627SKI.js.map +0 -1
- package/dist/chunk-USPVNZ63.js.map +0 -1
- package/dist/chunk-V63TSN3C.js.map +0 -1
- package/dist/chunk-WRUXO3WA.js +0 -48
- package/dist/chunk-WRUXO3WA.js.map +0 -1
- package/dist/chunk-WVDRXD67.js.map +0 -1
- package/dist/codex-bootstrap-MGY2D6HU.js.map +0 -1
- package/dist/codex-hook-IPX3PDXX.js.map +0 -1
- package/dist/codify-J5ZLJ3HK.js.map +0 -1
- package/dist/commands-L4AINARC.js.map +0 -1
- package/dist/contract-KEZY6YC3.js +0 -8
- package/dist/coordinator-SA75UB3C.js.map +0 -1
- package/dist/corpus-PPOBTF4J.js +0 -15
- package/dist/job-CDADLJDF.js.map +0 -1
- package/dist/remove-E6HGNHOU.js +0 -22
- package/dist/status-7VIGNTUI.js +0 -21
- package/dist/ticket-new-3YXDIWPC.js.map +0 -1
- /package/dist/{architecture-N5ZC4CDU.js.map → architecture-RQ377ZER.js.map} +0 -0
- /package/dist/{architecture-document-UBA5UT4J.js.map → architecture-document-KS3CLSYN.js.map} +0 -0
- /package/dist/{architecture-monorepo-E4JUYJGV.js.map → architecture-monorepo-NJWWU65G.js.map} +0 -0
- /package/dist/{boundary-HLJILY7R.js.map → boundary-OPTC2RVJ.js.map} +0 -0
- /package/dist/{chunk-4CZS4YJV.js.map → chunk-3OKZ3X4O.js.map} +0 -0
- /package/dist/{chunk-4CKCRZDO.js.map → chunk-7ULZND56.js.map} +0 -0
- /package/dist/{chunk-34NCOTP5.js.map → chunk-7XELS325.js.map} +0 -0
- /package/dist/{chunk-GZ36UZJG.js.map → chunk-CFME47IY.js.map} +0 -0
- /package/dist/{chunk-BQTC6YGN.js.map → chunk-D5ENZR6N.js.map} +0 -0
- /package/dist/{chunk-ZRV7TOCX.js.map → chunk-G5AFQXXW.js.map} +0 -0
- /package/dist/{chunk-I4KBHRZW.js.map → chunk-LH2FAQTI.js.map} +0 -0
- /package/dist/{chunk-KFVEPQ7X.js.map → chunk-MVFHTUQ3.js.map} +0 -0
- /package/dist/{chunk-BAVDDAN3.js.map → chunk-MZKTOX6X.js.map} +0 -0
- /package/dist/{chunk-Q5KLE6ZF.js.map → chunk-OKPRQGFG.js.map} +0 -0
- /package/dist/{chunk-664YNAMR.js.map → chunk-RTFPKJJV.js.map} +0 -0
- /package/dist/{chunk-GKR44BCH.js.map → chunk-RVDXBHUG.js.map} +0 -0
- /package/dist/{chunk-A7Z27COA.js.map → chunk-VFWAZLEF.js.map} +0 -0
- /package/dist/{chunk-3EJNDIAO.js.map → chunk-VZ5B2SIO.js.map} +0 -0
- /package/dist/{cleanup-X556LNWM.js.map → cleanup-ELVHZPRC.js.map} +0 -0
- /package/dist/{cleanup-command-RV2Q7G72.js.map → cleanup-command-5BY4FWAT.js.map} +0 -0
- /package/dist/{clients-HP23HRN2.js.map → clients-WRPBRO6V.js.map} +0 -0
- /package/dist/{config-LUSJAK6B.js.map → config-TXJRCN3W.js.map} +0 -0
- /package/dist/{configured-paths-SPQ5XWOM.js.map → configured-paths-4CRHLBIF.js.map} +0 -0
- /package/dist/{contract-KEZY6YC3.js.map → contract-B7NDKO5B.js.map} +0 -0
- /package/dist/{corpus-PPOBTF4J.js.map → corpus-PUBXCCSN.js.map} +0 -0
- /package/dist/{doctor-DSC36R4U.js.map → doctor-RPXETRSJ.js.map} +0 -0
- /package/dist/{feature-directories-VOHVV26X.js.map → feature-directories-ASNDEM7J.js.map} +0 -0
- /package/dist/{finalization-7SMLMVLV.js.map → finalization-BGPOEBAL.js.map} +0 -0
- /package/dist/{gh-cli-ZMO7D2KE.js.map → gh-cli-OTX7PORT.js.map} +0 -0
- /package/dist/{github-rest-KGKS4V2H.js.map → github-rest-JCW32377.js.map} +0 -0
- /package/dist/{learning-sync-6BTHM6ZC.js.map → learning-sync-2WIAOTW3.js.map} +0 -0
- /package/dist/{legacy-global-guidance-2JL4Y5EB.js.map → legacy-global-guidance-WTDI53H7.js.map} +0 -0
- /package/dist/{lint-gherkin-COSHVS6Z.js.map → lint-gherkin-LS3CHW3J.js.map} +0 -0
- /package/dist/{operations-XVRQSLJG.js.map → operations-OZKEQCS4.js.map} +0 -0
- /package/dist/{output-3LB2OEHN.js.map → output-ZYTEW6SC.js.map} +0 -0
- /package/dist/{packet-5WT5M3OS.js.map → packet-7S6CZJQR.js.map} +0 -0
- /package/dist/{profile-UMKQ5JVO.js.map → profile-SDFSBKH5.js.map} +0 -0
- /package/dist/{prompt-GWYDFMLO.js.map → prompt-LYPODDC3.js.map} +0 -0
- /package/dist/{remove-E6HGNHOU.js.map → remove-P5JQNS5P.js.map} +0 -0
- /package/dist/{retro-IFSVU5KS.js.map → retro-EQK2Z2Z6.js.map} +0 -0
- /package/dist/{retro-draft-spool-4S3TCHWL.js.map → retro-draft-spool-MDPBVM6J.js.map} +0 -0
- /package/dist/{retro-extract-OSBFAXLU.js.map → retro-extract-CZMDD4WB.js.map} +0 -0
- /package/dist/{review-pr-6S2352CK.js.map → review-pr-CWRD446M.js.map} +0 -0
- /package/dist/{review-pr-publication-CGHCRRUI.js.map → review-pr-publication-AIX2U3VM.js.map} +0 -0
- /package/dist/{run-5JESKXUR.js.map → run-T45X6Z6C.js.map} +0 -0
- /package/dist/{self-report-VPHBPPSJ.js.map → self-report-V7PHKTS6.js.map} +0 -0
- /package/dist/{status-7VIGNTUI.js.map → status-F5TFEIZ6.js.map} +0 -0
- /package/dist/{status-EX4L3ELO.js.map → status-S24PDFXB.js.map} +0 -0
- /package/dist/{sync-config-O7J7IDGE.js.map → sync-config-EUVBPUUG.js.map} +0 -0
- /package/dist/{sync-tracker-U2GYOFUO.js.map → sync-tracker-5FSIIAMS.js.map} +0 -0
- /package/dist/{ticket-sync-LLUBXZ2R.js.map → ticket-sync-7QRH6PVT.js.map} +0 -0
- /package/dist/{tracker-map-HR4MBYG5.js.map → tracker-map-7AGCTWBZ.js.map} +0 -0
- /package/dist/{tracker-sync-YDICZN66.js.map → tracker-sync-MLVYGFQJ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli-protocol/review-presentation.ts","../src/cli-protocol/result.ts"],"sourcesContent":["import type { CliResult } from './result.js';\n\ntype ReviewCoverage = 'standard' | 'independent' | 'incomplete';\ntype ReviewVerdict = 'approve' | 'request_changes';\n\nconst REVIEW_AGENTS = new Set(['claude', 'codex']);\nconst REVIEW_AUTHORS = new Set(['claude', 'codex', 'cursor']);\nconst REPLACED_REVIEW_FINDINGS = new Set([\n 'REVIEW_INDEPENDENCE',\n 'REVIEW_NOT_REQUESTED',\n 'REVIEW_STALE',\n]);\nconst RETRYABLE_REVIEW_FAILURES = new Set([\n 'timed_out',\n 'process_failed',\n 'invalid_output',\n 'REVIEWER_PROVENANCE_MISSING',\n 'REVIEWER_PROVENANCE_CONTRADICTORY',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction reviewCoverage(data: Record<string, unknown>): ReviewCoverage {\n const author = data.author_agent;\n const reviewer = data.actual_reviewer;\n if (typeof author !== 'string' || !REVIEW_AUTHORS.has(author) || typeof reviewer !== 'string') {\n return 'incomplete';\n }\n if (data.independence === 'degraded' && REVIEW_AGENTS.has(reviewer) && reviewer === author)\n return 'standard';\n if (data.independence === 'cross-agent' && REVIEW_AGENTS.has(reviewer) && reviewer !== author) {\n return 'independent';\n }\n return 'incomplete';\n}\n\nfunction reviewVerdict(data: Record<string, unknown>): ReviewVerdict | undefined {\n const output = data.reviewer_output;\n if (!isRecord(output)) return undefined;\n if (\n typeof output.reviewer_agent !== 'string' ||\n !REVIEW_AGENTS.has(output.reviewer_agent) ||\n output.reviewer_agent !== data.actual_reviewer\n ) {\n return undefined;\n }\n return output.verdict === 'approve' || output.verdict === 'request_changes'\n ? output.verdict\n : undefined;\n}\n\nfunction reviewVerdictMatchesStatus(status: unknown, verdict: ReviewVerdict | undefined): boolean {\n if (status === 'approved') return verdict === 'approve';\n if (status === 'changes_requested') return verdict === 'request_changes';\n return status === 'blocked' && verdict !== undefined;\n}\n\nfunction reviewPolicyMatchesStatus(data: Record<string, unknown>): boolean {\n if (data.status === 'blocked') {\n return data.review_policy === 'prefer' || data.review_policy === 'require';\n }\n return (\n (data.status === 'approved' || data.status === 'changes_requested') &&\n data.review_policy === undefined\n );\n}\n\nfunction reviewStateMatchesStatus(state: CliResult['state'], status: unknown): boolean {\n if (status === 'approved') return state === 'healthy';\n return (status === 'changes_requested' || status === 'blocked') && state === 'action_required';\n}\n\nfunction isConsistentReviewResult(\n data: Record<string, unknown>,\n state: CliResult['state'],\n verdict: ReviewVerdict | undefined,\n): boolean {\n return (\n reviewStateMatchesStatus(state, data.status) &&\n reviewPolicyMatchesStatus(data) &&\n reviewVerdictMatchesStatus(data.status, verdict)\n );\n}\n\nfunction incompleteCoverageLine(data: Record<string, unknown>): string {\n return data.status === 'blocked' && data.review_policy === 'require'\n ? 'Review incomplete — required independent coverage is unsatisfied.'\n : 'Review incomplete.';\n}\n\nfunction blockedReviewCoverageLine(\n data: Record<string, unknown>,\n coverage: ReviewCoverage,\n verdict: ReviewVerdict,\n): string {\n if (coverage === 'standard' && data.review_policy === 'require') {\n return verdict === 'request_changes'\n ? 'Review blocked — changes requested with standard coverage; required independent coverage is unsatisfied.'\n : 'Review blocked — standard coverage achieved; required independent coverage is unsatisfied.';\n }\n return incompleteCoverageLine(data);\n}\n\nfunction specialReviewCoverageLine(status: unknown, state: CliResult['state']): string | undefined {\n if (status === 'existing_route' && state === 'healthy') return 'Review not requested.';\n if (status === 'pending' && state === 'action_required') {\n return 'Review running in the background.';\n }\n if (status === 'stale' && state === 'action_required') {\n return 'Review stale — sources changed during the check.';\n }\n return undefined;\n}\n\nfunction reviewCoverageLine(data: Record<string, unknown>, state: CliResult['state']): string {\n const status = data.status;\n const specialLine = specialReviewCoverageLine(status, state);\n if (specialLine !== undefined) return specialLine;\n\n const verdict = reviewVerdict(data);\n if (!reviewStateMatchesStatus(state, status)) return incompleteCoverageLine(data);\n if (!reviewPolicyMatchesStatus(data)) return 'Review incomplete.';\n if (!reviewVerdictMatchesStatus(status, verdict)) return incompleteCoverageLine(data);\n // Preserve an explicit narrowing guard for blockedReviewCoverageLine below.\n if (verdict === undefined) return incompleteCoverageLine(data);\n const coverage = reviewCoverage(data);\n if (status === 'blocked') return blockedReviewCoverageLine(data, coverage, verdict);\n if (coverage === 'incomplete') return 'Review incomplete.';\n if (verdict === 'request_changes') return `Review changes requested — ${coverage} coverage.`;\n return `Review complete — ${coverage} coverage.`;\n}\n\nfunction isCompletedStandardReview(\n data: Record<string, unknown>,\n state: CliResult['state'],\n): boolean {\n const verdict = reviewVerdict(data);\n return (\n data.status === 'approved' &&\n isConsistentReviewResult(data, state, verdict) &&\n reviewCoverage(data) === 'standard'\n );\n}\n\nfunction reviewUpgradeSuggestion(\n data: Record<string, unknown>,\n state: CliResult['state'],\n): string | undefined {\n if (!isCompletedStandardReview(data, state)) return undefined;\n const author = data.author_agent;\n const reviewer = data.assigned_reviewer;\n if (\n typeof author !== 'string' ||\n typeof reviewer !== 'string' ||\n !REVIEW_AGENTS.has(reviewer) ||\n reviewer === author\n ) {\n return undefined;\n }\n const label = `${reviewer.charAt(0).toUpperCase()}${reviewer.slice(1)}`;\n return suggestionForFailure(data.preferred_failure, label);\n}\n\nfunction suggestionForFailure(failure: unknown, label: string): string | undefined {\n if (failure === 'not_installed') {\n return `To add independent coverage, install or update ${label}, then retry review.`;\n }\n if (failure === 'untrusted_install') {\n return `To add independent coverage, move ${label} to a trusted non-writable-by-group directory, then retry review.`;\n }\n if (failure === 'unsupported') {\n return `To add independent coverage, update ${label}, then retry review.`;\n }\n if (failure === 'probe_timed_out' || failure === 'launch_failed') {\n return `To add independent coverage, run ${label} --help to diagnose it, then retry review.`;\n }\n if (failure === 'not_authenticated') {\n return `To add independent coverage, sign in to ${label}, then retry review.`;\n }\n if (RETRYABLE_REVIEW_FAILURES.has(String(failure))) {\n return `To add independent coverage, retry ${label} review.`;\n }\n return undefined;\n}\n\nexport function reviewResultLines(\n result: CliResult,\n options: { verbose?: boolean },\n): string[] | undefined {\n if (!isRecord(result.data) || result.data.command !== 'review run') return undefined;\n if (result.state === 'failed' && result.errors.length > 0) return undefined;\n const messages = result.findings\n .filter(finding => !REPLACED_REVIEW_FINDINGS.has(finding.code))\n .map(finding => finding.message);\n messages.push(...result.errors.map(error => error.message));\n const lines = [reviewCoverageLine(result.data, result.state), ...messages];\n if (options.verbose === true) {\n const suggestion = reviewUpgradeSuggestion(result.data, result.state);\n if (suggestion !== undefined) lines.push(suggestion);\n }\n return lines;\n}\n","import { reviewResultLines } from './review-presentation.js';\n\ntype ResultState = 'healthy' | 'changed' | 'action_required' | 'failed';\n\nexport interface Finding {\n readonly code: string;\n readonly message: string;\n readonly severity: 'info' | 'warning' | 'error';\n readonly detail?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\ninterface ResultError {\n readonly code: string;\n readonly message: string;\n readonly retryable: boolean;\n readonly detail?: string;\n}\n\ninterface CommandNextAction {\n readonly command: string;\n readonly mutates: boolean;\n readonly requiresHuman: boolean;\n}\n\ninterface HumanNextAction {\n readonly kind: 'human';\n readonly instruction: string;\n readonly mutates: false;\n readonly requiresHuman: true;\n}\n\nexport type NextAction = CommandNextAction | HumanNextAction;\n\ninterface RecoveryAction {\n readonly command: string;\n readonly description: string;\n readonly requiresHuman: boolean;\n}\n\nexport interface Effect {\n readonly kind: string;\n readonly target: string;\n readonly operation?: string;\n}\n\nexport interface Effects {\n readonly files: readonly Effect[];\n readonly packages: readonly Effect[];\n readonly configuration: readonly Effect[];\n readonly network: readonly Effect[];\n readonly destructive: readonly Effect[];\n}\n\nexport interface CliResult {\n readonly schemaVersion: 1;\n readonly ok: boolean;\n readonly state: ResultState;\n readonly changed: boolean;\n readonly findings: readonly Finding[];\n readonly effects: Effects;\n readonly errors: readonly ResultError[];\n readonly recovery: readonly RecoveryAction[];\n readonly nextActions: readonly NextAction[];\n /** Process status for commands that must preserve a delegated program's exit. */\n readonly exitCode?: number;\n readonly presentation?: {\n readonly kind: 'raw';\n readonly body: string;\n };\n readonly data?: unknown;\n}\n\ninterface ResultInput {\n readonly state: ResultState;\n readonly changed?: boolean;\n readonly findings?: readonly Finding[];\n readonly effects?: Partial<Effects>;\n readonly errors?: readonly ResultError[];\n readonly recovery?: readonly RecoveryAction[];\n readonly nextActions?: readonly NextAction[];\n readonly exitCode?: number;\n readonly presentation?: NonNullable<CliResult['presentation']>;\n readonly data?: unknown;\n}\n\nconst EMPTY_EFFECTS: Effects = {\n files: [],\n packages: [],\n configuration: [],\n network: [],\n destructive: [],\n};\n\nexport function combineEffects(groups: readonly Partial<Effects>[]): Effects {\n return {\n files: groups.flatMap(effects => effects.files ?? []),\n packages: groups.flatMap(effects => effects.packages ?? []),\n configuration: groups.flatMap(effects => effects.configuration ?? []),\n network: groups.flatMap(effects => effects.network ?? []),\n destructive: groups.flatMap(effects => effects.destructive ?? []),\n };\n}\n\n/** Aggregate state precedence shared by commands that combine several results. */\nexport function combinedResultState(results: readonly CliResult[]): CliResult['state'] {\n if (results.some(result => result.state === 'failed')) return 'failed';\n if (results.some(result => result.state === 'action_required')) return 'action_required';\n if (results.some(result => result.state === 'changed')) return 'changed';\n return 'healthy';\n}\n\nexport function createResult(input: ResultInput): CliResult {\n return {\n schemaVersion: 1,\n ok: input.state !== 'failed',\n state: input.state,\n changed: input.changed ?? input.state === 'changed',\n findings: input.findings ?? [],\n effects: { ...EMPTY_EFFECTS, ...input.effects },\n errors: input.errors ?? [],\n recovery: input.recovery ?? [],\n nextActions: input.nextActions ?? [],\n ...(input.exitCode !== undefined && { exitCode: input.exitCode }),\n ...(input.presentation !== undefined && { presentation: input.presentation }),\n ...(input.data !== undefined && { data: input.data }),\n };\n}\n\nexport function withDeprecation(\n result: CliResult,\n legacy: string,\n replacement: string,\n compatibility: {\n readonly introducedIn: string;\n readonly retention: 'indefinite';\n readonly redundantOptions?: readonly {\n readonly key: string;\n readonly flag: string;\n readonly replacement: string;\n }[];\n },\n options: Readonly<Record<string, unknown>> = {},\n): CliResult {\n const redundantOptionFindings: Finding[] = (compatibility.redundantOptions ?? [])\n .filter(option => options[option.key] === true)\n .map(option => ({\n code: 'CLI_OPTION_REDUNDANT',\n message: `\\`${option.flag}\\` is accepted for compatibility but has no effect; use \\`${option.replacement}\\`.`,\n severity: 'warning',\n metadata: {\n option: option.flag,\n replacement: option.replacement,\n retention: compatibility.retention,\n },\n }));\n return {\n ...result,\n findings: [\n ...result.findings,\n {\n code: 'CLI_ALIAS_DEPRECATED',\n message: `\\`${legacy}\\` is deprecated; use \\`${replacement}\\`.`,\n severity: 'warning',\n metadata: {\n replacement,\n introduced_in: compatibility.introducedIn,\n retention: compatibility.retention,\n },\n },\n ...redundantOptionFindings,\n ],\n };\n}\n\nexport function exitStatusFor(result: CliResult): number {\n if (result.exitCode !== undefined) return result.exitCode;\n if (result.state === 'failed') return 1;\n if (result.state === 'action_required') return 2;\n return 0;\n}\n\nfunction toWireResult(result: CliResult): Record<string, unknown> {\n return {\n schema_version: result.schemaVersion,\n ok: result.ok,\n state: result.state,\n changed: result.changed,\n findings: result.findings.map(({ code, message, severity, detail, metadata }) => ({\n code,\n message,\n severity,\n ...(detail !== undefined && { detail }),\n ...(metadata !== undefined && { metadata }),\n })),\n effects: result.effects,\n errors: result.errors.map(({ code, message, retryable, detail }) => ({\n code,\n message,\n retryable,\n ...(detail !== undefined && { detail }),\n })),\n recovery: result.recovery.map(({ command, description, requiresHuman }) => ({\n command,\n description,\n requires_human: requiresHuman,\n })),\n next_actions: result.nextActions.map(action =>\n 'command' in action\n ? {\n command: action.command,\n mutates: action.mutates,\n requires_human: action.requiresHuman,\n }\n : {\n kind: action.kind,\n instruction: action.instruction,\n mutates: action.mutates,\n requires_human: action.requiresHuman,\n },\n ),\n ...(result.data !== undefined && { data: result.data }),\n };\n}\n\nexport function renderJsonResult(result: CliResult): string {\n return JSON.stringify(toWireResult(result));\n}\n\nconst VERDICTS: Readonly<Record<ResultState, string>> = {\n healthy: 'Healthy',\n changed: 'Complete',\n action_required: 'Needs attention',\n failed: 'Failed',\n};\n\nfunction uniqueMessages(result: CliResult): string[] {\n const messages = result.findings.map(finding => finding.message);\n messages.push(...result.errors.map(error => error.message));\n return [...new Set(messages)];\n}\n\nfunction suppressHumanOutput(result: CliResult, options: { quiet?: boolean }): boolean {\n return options.quiet === true && result.state === 'healthy';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction effectLines(category: string, effects: unknown): string[] {\n if (!Array.isArray(effects)) return [];\n return effects.flatMap(effect =>\n isRecord(effect) && typeof effect.kind === 'string' && typeof effect.target === 'string'\n ? [`${category}: ${effect.kind} ${effect.target}`]\n : [],\n );\n}\n\nfunction nextActionLabel(action: NextAction): string {\n return 'command' in action ? action.command : action.instruction;\n}\n\nfunction plannedEffectLines(data: unknown): string[] {\n if (!isRecord(data)) return [];\n const plan = data.plan;\n if (!isRecord(plan)) return [];\n const effects = plan.effects;\n if (!isRecord(effects)) return [];\n const categories = ['files', 'packages', 'configuration', 'network', 'destructive'];\n const lines = categories.flatMap(category => effectLines(category, effects[category]));\n return lines.length === 0 ? [] : ['Planned effects:', ...lines];\n}\n\nconst SURFACE_LABELS: Readonly<Record<string, string>> = {\n project: 'Project',\n claude: 'Claude',\n codex: 'Codex',\n cursor: 'Cursor',\n};\n\nconst SURFACE_OUTCOMES: Readonly<Record<string, string>> = {\n healthy: 'ready',\n changed: 'updated',\n action_required: 'needs attention',\n failed: 'failed',\n};\n\n/** Labelled surfaces of a `command`-tagged result payload, or [] when it is not that command. */\nfunction labelledSurfaces(\n data: unknown,\n command: string,\n): { readonly label: string; readonly surface: Record<string, unknown> }[] {\n if (!isRecord(data) || data.command !== command || !Array.isArray(data.surfaces)) return [];\n return data.surfaces.flatMap(surface => {\n if (!isRecord(surface) || typeof surface.name !== 'string') return [];\n const label = SURFACE_LABELS[surface.name];\n return label === undefined ? [] : [{ label, surface }];\n });\n}\n\nfunction installSurfaceLines(data: unknown): string[] {\n return labelledSurfaces(data, 'install').flatMap(({ label, surface }) => {\n if (surface.selected === false) return [`${label}: not selected`];\n const outcome = typeof surface.state === 'string' ? SURFACE_OUTCOMES[surface.state] : undefined;\n return outcome === undefined ? [] : [`${label}: ${outcome}`];\n });\n}\n\nfunction installActivationLines(data: unknown): string[] {\n return labelledSurfaces(data, 'install').flatMap(({ label, surface }) => {\n if (!Array.isArray(surface.activation_actions)) return [];\n return surface.activation_actions.flatMap(action =>\n typeof action === 'string' ? [`${label} activation: ${action}`] : [],\n );\n });\n}\n\nfunction doctorDiagnosticCauses(data: unknown): ReadonlySet<string> {\n if (!isRecord(data) || data.command !== 'doctor' || !Array.isArray(data.diagnostics)) {\n return new Set();\n }\n return new Set(\n data.diagnostics.flatMap(diagnostic =>\n isRecord(diagnostic) && typeof diagnostic.cause === 'string' ? [diagnostic.cause] : [],\n ),\n );\n}\n\nfunction doctorDiagnosticLines(data: unknown): string[] {\n if (!isRecord(data) || data.command !== 'doctor' || !Array.isArray(data.coverage)) return [];\n\n const coverage = data.coverage.flatMap(item => {\n if (!isRecord(item) || typeof item.surface !== 'string') return [];\n const label = SURFACE_LABELS[item.surface] ?? item.surface;\n const outcome = typeof item.state === 'string' ? SURFACE_OUTCOMES[item.state] : undefined;\n const evidence = isRecord(item.evidence)\n ? Object.entries(item.evidence)\n .filter((entry): entry is [string, string | number | boolean] =>\n ['string', 'number', 'boolean'].includes(typeof entry[1]),\n )\n .map(([key, value]) => `${key.replaceAll('_', ' ')}=${String(value)}`)\n : [];\n const evidenceSuffix = evidence.length === 0 ? '' : ` (${evidence.join(', ')})`;\n return [`- ${label}: ${outcome ?? 'unknown'}${evidenceSuffix}`];\n });\n const diagnostics = Array.isArray(data.diagnostics)\n ? data.diagnostics.flatMap(item => {\n if (\n !isRecord(item) ||\n typeof item.surface !== 'string' ||\n typeof item.code !== 'string' ||\n typeof item.cause !== 'string'\n ) {\n return [];\n }\n const label = SURFACE_LABELS[item.surface] ?? item.surface;\n return [`- ${label} [${item.code}]: ${item.cause}`];\n })\n : [];\n\n return [\n ...(coverage.length === 0 ? [] : ['Diagnostic coverage:', ...coverage]),\n ...(diagnostics.length === 0 ? [] : ['Causes:', ...diagnostics]),\n ];\n}\n\nconst EFFECT_LABELS: Readonly<Record<string, string>> = {\n create: 'Created',\n update: 'Updated',\n delete: 'Deleted',\n install: 'Installed',\n uninstall: 'Uninstalled',\n remove: 'Removed',\n write: 'Written',\n};\n\nfunction completedEffectLines(result: CliResult): string[] {\n const visibleCategories = [\n result.effects.files,\n result.effects.packages,\n result.effects.configuration,\n result.effects.destructive,\n ];\n const lines = visibleCategories.flatMap(effects =>\n effects.map(effect => `${EFFECT_LABELS[effect.kind] ?? 'Changed'}: ${effect.target}`),\n );\n lines.push(\n ...result.effects.network.map(\n effect => `Network: ${effect.operation ?? effect.kind} ${effect.target}`,\n ),\n );\n return lines;\n}\n\nexport function renderHumanResult(\n result: CliResult,\n options: { quiet?: boolean; verbose?: boolean } = {},\n): string {\n const rendered = renderHumanStreams(result, options);\n return rendered.stdout || rendered.stderr;\n}\n\nexport interface HumanResultStreams {\n readonly stdout: string;\n readonly stderr: string;\n}\n\nfunction resultBodyLines(result: CliResult, options: { verbose?: boolean }): string[] {\n const reviewLines = reviewResultLines(result, options);\n if (reviewLines !== undefined) return reviewLines;\n const diagnosticCauses = doctorDiagnosticCauses(result.data);\n const messages = uniqueMessages(result).filter(message => !diagnosticCauses.has(message));\n const lines = [\n VERDICTS[result.state],\n `Changed: ${result.changed ? 'yes' : 'no'}`,\n ...installSurfaceLines(result.data),\n ...installActivationLines(result.data),\n ...doctorDiagnosticLines(result.data),\n ...messages,\n ...plannedEffectLines(result.data),\n ];\n\n if (options.verbose === true) {\n const details = [\n ...result.findings.map(finding => finding.detail),\n ...result.errors.map(error => error.detail),\n ].filter((detail): detail is string => detail !== undefined);\n lines.push(...completedEffectLines(result), ...details);\n }\n return lines;\n}\n\nexport function renderHumanStreams(\n result: CliResult,\n options: { quiet?: boolean; verbose?: boolean } = {},\n): HumanResultStreams {\n if (result.presentation?.kind === 'raw') {\n return {\n stdout: result.presentation.body.replace(/\\n$/, ''),\n stderr: options.quiet === true ? '' : uniqueMessages(result).join('\\n'),\n };\n }\n if (suppressHumanOutput(result, options)) return { stdout: '', stderr: '' };\n\n const lines = resultBodyLines(result, options);\n\n const primaryAction = result.nextActions[0];\n if (primaryAction !== undefined) lines.push(`Next: ${nextActionLabel(primaryAction)}`);\n const body = lines.join('\\n');\n return result.state === 'failed' ? { stdout: '', stderr: body } : { stdout: body, stderr: '' };\n}\n"],"mappings":"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","names":["isRecord"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createResult
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FOYGZ4MK.js";
|
|
4
4
|
|
|
5
5
|
// src/cli-protocol/plan.ts
|
|
6
6
|
import { createHash } from "crypto";
|
|
@@ -61,4 +61,4 @@ export {
|
|
|
61
61
|
createPlan,
|
|
62
62
|
toWirePlan
|
|
63
63
|
};
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
64
|
+
//# sourceMappingURL=chunk-G5AFQXXW.js.map
|
|
@@ -103,10 +103,10 @@ function scanTreeForFile(directory, filename, depth, maxDepth) {
|
|
|
103
103
|
}
|
|
104
104
|
return void 0;
|
|
105
105
|
}
|
|
106
|
-
function findFileMatchingInTree(cwd, predicate, maxDepth = 10) {
|
|
107
|
-
return scanTreeForMatch(cwd, predicate, 0, maxDepth);
|
|
106
|
+
function findFileMatchingInTree(cwd, predicate, maxDepth = 10, excludedDirectories = /* @__PURE__ */ new Set()) {
|
|
107
|
+
return scanTreeForMatch(cwd, predicate, 0, maxDepth, excludedDirectories);
|
|
108
108
|
}
|
|
109
|
-
function scanTreeForMatch(directory, predicate, depth, maxDepth) {
|
|
109
|
+
function scanTreeForMatch(directory, predicate, depth, maxDepth, excludedDirectories) {
|
|
110
110
|
if (depth > maxDepth) return void 0;
|
|
111
111
|
let entries;
|
|
112
112
|
try {
|
|
@@ -119,12 +119,9 @@ function scanTreeForMatch(directory, predicate, depth, maxDepth) {
|
|
|
119
119
|
}
|
|
120
120
|
for (const entry of entries) {
|
|
121
121
|
if (!isScannableSubdirectory(entry)) continue;
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
depth + 1,
|
|
126
|
-
maxDepth
|
|
127
|
-
);
|
|
122
|
+
const child = nodePath.join(directory, entry.name);
|
|
123
|
+
if (excludedDirectories.has(child)) continue;
|
|
124
|
+
const result = scanTreeForMatch(child, predicate, depth + 1, maxDepth, excludedDirectories);
|
|
128
125
|
if (result !== void 0) return result;
|
|
129
126
|
}
|
|
130
127
|
return void 0;
|
|
@@ -239,4 +236,4 @@ export {
|
|
|
239
236
|
readJson,
|
|
240
237
|
writeJson
|
|
241
238
|
};
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-HF3DXZEA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/fs.ts"],"sourcesContent":["/**\n * File system utilities for CLI operations\n */\n\nimport {\n chmodSync,\n type Dirent,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmdirSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport nodePath from 'node:path';\n\n// Get the directory of this module (for locating templates)\nconst __dirname = import.meta.dirname;\n\n/**\n * Get path to bundled templates directory.\n * Works in both development (src/) and production (dist/) contexts.\n *\n * Note: We check for SAFEWORD.md to distinguish from src/templates/ which\n * contains TypeScript source files (config.ts, content.ts).\n *\n * Path resolution (bundled with tsup):\n * - From dist/chunk-*.js: __dirname = packages/cli/dist/ → ../templates\n */\nexport function getTemplatesDirectory(): string {\n const knownTemplateFile = 'SAFEWORD.md';\n\n // Try different relative paths - the bundled code ends up in dist/ directly (flat)\n // while source is in src/utils/\n const candidates = [\n nodePath.join(__dirname, '..', 'templates'), // From dist/ (flat bundled)\n nodePath.join(__dirname, '..', '..', 'templates'), // From src/utils/ or dist/utils/\n nodePath.join(__dirname, 'templates'), // Direct sibling (unlikely but safe)\n ];\n\n for (const candidate of candidates) {\n if (existsSync(nodePath.join(candidate, knownTemplateFile))) {\n return candidate;\n }\n }\n\n throw new Error('Templates directory not found');\n}\n\n/**\n * Check if a path exists\n * @param path\n */\n/** True when `path` exists and is a directory (a file is not). */\nexport function isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Resolve an existing directory to a normalized canonical path. */\nexport function canonicalDirectory(path: unknown): string | undefined {\n if (typeof path !== 'string' || path.trim() === '') return undefined;\n try {\n if (!statSync(path).isDirectory()) return undefined;\n return nodePath.normalize(realpathSync(path));\n } catch {\n return undefined;\n }\n}\n\nexport function exists(path: string): boolean {\n return existsSync(path);\n}\n\n/**\n * Directories to exclude when scanning subdirectories for language manifests.\n * These contain vendored/generated files that would cause false positives.\n */\nconst SUBDIRECTORY_EXCLUDE = new Set([\n 'node_modules',\n '.git',\n '.safeword',\n 'vendor',\n // Go toolchains ignore testdata/ entirely; repos keep fixture go.mod files there\n // (with real module directives) that must not surface as discovered packages.\n 'testdata',\n 'dist',\n 'build',\n 'target',\n 'coverage',\n 'dbt_packages',\n 'out',\n '.next',\n '.nuxt',\n '.output',\n '__pycache__',\n '.venv',\n 'venv',\n]);\n\n/**\n * Check if a file exists anywhere in the project tree.\n * Recursively scans subdirectories, skipping excluded directories.\n *\n * @param cwd - Project root directory\n * @param filename - File to search for (e.g., 'pyproject.toml')\n * @returns true if found anywhere in the project tree\n */\nexport function existsInTree(cwd: string, filename: string): boolean {\n return findInTree(cwd, filename) !== undefined;\n}\n\n/**\n * Find a file anywhere in the project tree.\n * Recursively scans subdirectories, skipping excluded directories.\n * Root is checked first; deeper matches use depth-first traversal.\n *\n * @param cwd - Project root directory\n * @param filename - File to search for (e.g., 'pyproject.toml')\n * @param maxDepth - Maximum directory depth to scan (default: 10)\n * @returns Directory path where file was found, or undefined\n */\nexport function findInTree(cwd: string, filename: string, maxDepth = 10): string | undefined {\n // Check root first\n if (existsSync(nodePath.join(cwd, filename))) {\n return cwd;\n }\n\n return scanTreeForFile(cwd, filename, 1, maxDepth);\n}\n\n/** Whether a dirent is a subdirectory safe to recurse into (not hidden, not excluded). */\nfunction isScannableSubdirectory(entry: Dirent): boolean {\n return (\n entry.isDirectory() && !entry.name.startsWith('.') && !SUBDIRECTORY_EXCLUDE.has(entry.name)\n );\n}\n\n/** Return scannable subdirectory paths (excludes hidden dirs and SUBDIRECTORY_EXCLUDE). */\nfunction getScannableSubdirectories(directory: string): string[] {\n try {\n return readdirSync(directory, { withFileTypes: true })\n .filter(entry => isScannableSubdirectory(entry))\n .map(entry => nodePath.join(directory, entry.name));\n } catch {\n return [];\n }\n}\n\nfunction scanTreeForFile(\n directory: string,\n filename: string,\n depth: number,\n maxDepth: number,\n): string | undefined {\n if (depth > maxDepth) return undefined;\n\n const subdirectories = getScannableSubdirectories(directory);\n\n // Check all children at this level first\n for (const subdirectory of subdirectories) {\n if (existsSync(nodePath.join(subdirectory, filename))) {\n return subdirectory;\n }\n }\n\n // Then recurse deeper\n for (const subdirectory of subdirectories) {\n const result = scanTreeForFile(subdirectory, filename, depth + 1, maxDepth);\n if (result !== undefined) return result;\n }\n\n return undefined;\n}\n\n/**\n * Find the first directory (root first, then descending) that contains a file\n * whose name matches `predicate`. Skips hidden dirs + SUBDIRECTORY_EXCLUDE. The\n * predicate analogue of {@link findInTree} — share this instead of re-walking\n * the tree (and re-declaring the exclude set) in callers.\n * @param cwd - Project root directory\n * @param predicate - Matches a filename (e.g. a Python test-file name)\n * @param maxDepth - Maximum directory depth to scan (default: 10)\n * @returns Directory containing a match, or undefined\n */\nexport function findFileMatchingInTree(\n cwd: string,\n predicate: (filename: string) => boolean,\n maxDepth = 10,\n excludedDirectories: ReadonlySet<string> = new Set(),\n): string | undefined {\n return scanTreeForMatch(cwd, predicate, 0, maxDepth, excludedDirectories);\n}\n\nfunction scanTreeForMatch(\n directory: string,\n predicate: (filename: string) => boolean,\n depth: number,\n maxDepth: number,\n excludedDirectories: ReadonlySet<string>,\n): string | undefined {\n if (depth > maxDepth) return undefined;\n\n let entries;\n try {\n entries = readdirSync(directory, { withFileTypes: true });\n } catch {\n return undefined;\n }\n\n if (entries.some(entry => entry.isFile() && predicate(entry.name))) {\n return directory;\n }\n\n for (const entry of entries) {\n if (!isScannableSubdirectory(entry)) continue;\n const child = nodePath.join(directory, entry.name);\n if (excludedDirectories.has(child)) continue;\n const result = scanTreeForMatch(child, predicate, depth + 1, maxDepth, excludedDirectories);\n if (result !== undefined) return result;\n }\n\n return undefined;\n}\n\n/**\n * Index multiple files in a single tree walk — the multi-file analogue of\n * `findInTree`. Returns a Map from each requested filename to the directory of\n * its **shallowest** occurrence (root-first, level-order — same ordering as\n * `findInTree`), omitting names not found. One traversal regardless of how many\n * filenames are requested, so callers that probe many manifests stay O(one walk)\n * even on large/deep monorepos. Stops early once every name is located.\n */\nexport function indexFilesInTree(\n cwd: string,\n filenames: Iterable<string>,\n maxDepth = 10,\n): Map<string, string> {\n const wanted = [...filenames];\n const found = new Map<string, string>();\n // Cursor instead of Array.shift() so the BFS stays O(dirs), not O(dirs²) on\n // wide/deep monorepos — the very repos this single-walk index exists to serve.\n const queue: { directory: string; depth: number }[] = [{ directory: cwd, depth: 0 }];\n\n let head = 0;\n while (head < queue.length) {\n const item = queue[head];\n head += 1;\n if (item === undefined) break;\n for (const name of wanted) {\n if (!found.has(name) && existsSync(nodePath.join(item.directory, name))) {\n found.set(name, item.directory);\n }\n }\n if (found.size === wanted.length) break;\n if (item.depth >= maxDepth) continue;\n for (const subdirectory of getScannableSubdirectories(item.directory)) {\n queue.push({ directory: subdirectory, depth: item.depth + 1 });\n }\n }\n return found;\n}\n\n/**\n * Every directory (root included) that DIRECTLY contains `filename`, in root-first\n * BFS order, skipping hidden dirs and SUBDIRECTORY_EXCLUDE. The collect-all analogue\n * of {@link findInTree} (which stops at the first match) — used to enumerate orphan\n * language manifests (a `go.mod` / `pyproject.toml` / `Cargo.toml` that is not enrolled\n * in any declared workspace) across a polyglot monorepo in one bounded walk.\n */\nexport function findAllInTree(cwd: string, filename: string, maxDepth = 10): string[] {\n const found: string[] = [];\n // Cursor-based BFS (not Array.shift()) so the walk stays O(dirs) on wide/deep trees,\n // mirroring indexFilesInTree.\n const queue: { directory: string; depth: number }[] = [{ directory: cwd, depth: 0 }];\n let head = 0;\n while (head < queue.length) {\n const item = queue[head];\n head += 1;\n if (item === undefined) break;\n if (existsSync(nodePath.join(item.directory, filename))) found.push(item.directory);\n if (item.depth >= maxDepth) continue;\n for (const subdirectory of getScannableSubdirectories(item.directory)) {\n queue.push({ directory: subdirectory, depth: item.depth + 1 });\n }\n }\n return found;\n}\n\n/**\n * Create directory recursively\n * @param path\n */\nexport function ensureDirectory(path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\n/**\n * Read file as string\n * @param path\n */\nexport function readFile(path: string): string {\n return readFileSync(path, 'utf8');\n}\n\n/**\n * Read file as string, return null if not exists\n * @param path\n */\nexport function readFileSafe(path: string): string | undefined {\n if (!existsSync(path)) return undefined;\n return readFileSync(path, 'utf8');\n}\n\n/**\n * Write file, creating parent directories if needed\n * @param path\n * @param content\n */\nexport function writeFile(path: string, content: string): void {\n ensureDirectory(nodePath.dirname(path));\n writeFileSync(path, content);\n}\n\n/**\n * Remove file or directory recursively\n * @param path\n */\nexport function remove(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true, force: true });\n }\n}\n\n/**\n * Remove directory only if empty, returns true if removed\n * @param path\n */\nexport function removeIfEmpty(path: string): boolean {\n if (!existsSync(path)) return false;\n try {\n rmdirSync(path); // Non-recursive, throws if not empty\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Make all shell scripts in a directory executable\n * @param dirPath\n */\nexport function makeScriptsExecutable(dirPath: string): void {\n if (!existsSync(dirPath)) return;\n for (const file of readdirSync(dirPath)) {\n if (file.endsWith('.sh')) {\n chmodSync(nodePath.join(dirPath, file), 0o755);\n }\n }\n}\n\n/**\n * Read and parse a JSON file, best-effort: returns `undefined` when no JSON\n * value can be obtained from the path — whether it is absent, empty, unparseable\n * (e.g. JSONC comments or malformed), or unreadable as a file at all. The read is\n * inside the `try` so a directory at the path (`EISDIR`) or a permission error\n * (`EACCES`) degrades to `undefined` like a parse failure, instead of throwing\n * uncaught and crashing callers (e.g. reconcile's jsonMerge). All callers already\n * treat the result as `T | undefined`.\n * @param path\n */\nexport function readJson(path: string): unknown {\n try {\n const content = readFileSafe(path);\n if (!content) return undefined;\n return JSON.parse(content) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Write JSON file with formatting\n * @param path\n * @param data\n */\nexport function writeJson(path: string, data: unknown): void {\n writeFile(path, `${JSON.stringify(data, undefined, 2)}\\n`);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -75,31 +75,31 @@ var CLAUDE_HISTORICAL_CATALOGUE = {
|
|
|
75
75
|
".claude/skills/bdd/DISCOVERY.md": "c229895c53030b8f44ff563dd3728d8f4a4e4e593d8c29ae9349283ea25b5d91",
|
|
76
76
|
".claude/skills/bdd/DONE.md": "e9f22430341cf225eaf58ef6335720c5033cb8f6779425d5740adc0ff80a5f60",
|
|
77
77
|
".claude/skills/bdd/PLAN_IMPLEMENTATION.md": "8ed89fca82f6e71b77351674f12d5d7c1380574e326e05ca1912caf84ff4ff9b",
|
|
78
|
-
".claude/skills/bdd/SCENARIOS.md": "
|
|
78
|
+
".claude/skills/bdd/SCENARIOS.md": "c808d4c8455f8f6248f85e2d2403e881bdab83e0ac19e8c3dd9c28fb9c2ee8f4",
|
|
79
79
|
".claude/skills/bdd/SKILL.md": "df9f7927be3289f3ffb0444d49ae25fe601ce33b9661f7a809f74dff8da40ff0",
|
|
80
80
|
".claude/skills/bdd/SPLITTING.md": "e232a37a4d76f0dfc51e65965c1e1b7f1572e0dedce0fb8c031e75bd6544a708",
|
|
81
|
-
".claude/skills/bdd/TDD.md": "
|
|
81
|
+
".claude/skills/bdd/TDD.md": "2865c9efa57682eb211cc101f9db15f529bd605c3a2bebb57131e2a6d3aec79d",
|
|
82
82
|
".claude/skills/bdd/VERIFY.md": "85abadfe756a3f391779fe500cd5c66597a33e0cab7fcef55f6b633b30818f31",
|
|
83
83
|
".claude/skills/brainstorm/SKILL.md": "fe99638bd1621cbd5fe3780a8d39023d4b175e3be2aef2e60d0ebe7558848f2e",
|
|
84
84
|
".claude/skills/cleanup-zombies/SKILL.md": "e0af9635774767cf36eb69726e11c642ec1dad42839c11407ea8ef60f89fc289",
|
|
85
|
-
".claude/skills/closeout/SKILL.md": "
|
|
85
|
+
".claude/skills/closeout/SKILL.md": "3eda7ae5172eb795da38c31a6e96d07a40154fd7a3ae4d9824c9c044b286f571",
|
|
86
86
|
".claude/skills/debug/SKILL.md": "ae56c4c9287f76a2250d13fa9908f5726ed4edbe4080ece10d1559507e242bd0",
|
|
87
87
|
".claude/skills/elicit/SKILL.md": "2638c773ce241a886563d1db8abbee70d72edefa780f762c0ed095df0f65cee5",
|
|
88
88
|
".claude/skills/explain/SKILL.md": "6673eccef3a9e68659c4e4b81b1e63bf9da03b1ae802dc7d22f419cb7c65472d",
|
|
89
89
|
".claude/skills/figure-it-out/SKILL.md": "18e2b44e9a91562079b3e1f52fcd9f952b5f57a0f0e7647b0273809848a75c0d",
|
|
90
90
|
".claude/skills/finish-review/REVIEWER.md": "0ecee21a63f91e09d3136f62cf8f7590ba9a640b85cad7b7b35c1ae334ff43c2",
|
|
91
|
-
".claude/skills/finish-review/SKILL.md": "
|
|
92
|
-
".claude/skills/lint/SKILL.md": "
|
|
91
|
+
".claude/skills/finish-review/SKILL.md": "e9ed5d198994b6cca12c62b1a4c13a1db2d82d65fc8a9173a41c5b5cf312cd52",
|
|
92
|
+
".claude/skills/lint/SKILL.md": "fdde749fe9ce764f6f9325f963c092d457960494fe78dd04d65d53a50e7cfd19",
|
|
93
93
|
".claude/skills/quality-review/SKILL.md": "b940905d31cd4931665e023a65824a923a2bd5d7f590358355576cff8f3bc42a",
|
|
94
94
|
".claude/skills/refactor/SKILL.md": "a51a858fb13b50cbc86789edbde8a39e364b5cdd7d5d3b025d555d90b221760e",
|
|
95
95
|
".claude/skills/retro-filer/SKILL.md": "ea126f3805a2befefb4db2011439f075ebfd6eca31b78bd5f284ac11d667b4f0",
|
|
96
96
|
".claude/skills/retro/SKILL.md": "166e5109193bad4c26e060f6841d71c03f9155c7e74e1853c43b99b01c25d379",
|
|
97
|
-
".claude/skills/review-spec/SKILL.md": "
|
|
98
|
-
".claude/skills/self-review/SKILL.md": "
|
|
97
|
+
".claude/skills/review-spec/SKILL.md": "ee3d3cf1c548e67dfcfb58f55c2d667fee7466b1f0ab6cad050c67c1b940fe33",
|
|
98
|
+
".claude/skills/self-review/SKILL.md": "e5ff994ec84573e6f129127bad89617f0a67b67c5cf792cedac558b6e419ac3b",
|
|
99
99
|
".claude/skills/spike/SKILL.md": "905aab56037ad5a258bafa91cb2ebf05cff1acffbc9e1fd6f7a1f27230672f37",
|
|
100
100
|
".claude/skills/tdd-review/SKILL.md": "4b945f122a90d23462845d7bdbbd0b736aa69d423a2d7e99ebf646bf118faa4f",
|
|
101
101
|
".claude/skills/testing/SKILL.md": "697a4b090935989e0c8a53462d2b44087afafa50adc69e9a98da14bed23dbde9",
|
|
102
|
-
".claude/skills/ticket-system/SKILL.md": "
|
|
102
|
+
".claude/skills/ticket-system/SKILL.md": "97595a9875cdca30ea26c809a26e5be7df338a42034d6122b559e70275f2477e",
|
|
103
103
|
".claude/skills/verify/SKILL.md": "26763f7fbc900b6994938db93e3b1e1e601ccded59d74c45f528a73fe71ec92f"
|
|
104
104
|
},
|
|
105
105
|
hook_files: {
|
|
@@ -1571,4 +1571,4 @@ export {
|
|
|
1571
1571
|
acceptedHistoricalHookEntries,
|
|
1572
1572
|
cataloguedClaudeLegacyPaths
|
|
1573
1573
|
};
|
|
1574
|
-
//# sourceMappingURL=chunk-
|
|
1574
|
+
//# sourceMappingURL=chunk-HNCUIXDY.js.map
|