@a-company/paradigm 5.10.0 → 5.21.0
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/dist/accept-orchestration-IUAWQZUN.js +18 -0
- package/dist/add-P76GEMGF.js +8 -0
- package/dist/agent-UUTYOFTH.js +33 -0
- package/dist/agent-loader-EPXURMO7.js +2 -0
- package/dist/agent-loader-PYGPX6D2.js +2 -0
- package/dist/agent-state-KSQ3S7OB.js +2 -0
- package/dist/agents-suggest-HYTFMQD3.js +10 -0
- package/dist/aggregate-W66DM3GA.js +10 -0
- package/dist/ambient-HYZR42NX.js +35 -0
- package/dist/assess-UFPYEJKP.js +9 -0
- package/dist/auto-RHJXOZFL.js +14 -0
- package/dist/beacon-5QVYV5DF.js +13 -0
- package/dist/calibration-OLJYB5HN.js +7 -0
- package/dist/check-THVGY4R5.js +14 -0
- package/dist/chunk-22ISTMKI.js +31 -0
- package/dist/chunk-2QO33NYK.js +3 -0
- package/dist/chunk-33LKBMVK.js +134 -0
- package/dist/chunk-4QADCWPU.js +7 -0
- package/dist/chunk-4TXOVRWD.js +3 -0
- package/dist/chunk-4UJ4NIEQ.js +4 -0
- package/dist/chunk-4ZGGWZ32.js +3 -0
- package/dist/chunk-5TAVYPOV.js +2 -0
- package/dist/chunk-6EX37L4Q.js +8 -0
- package/dist/chunk-AD5TAD2A.js +5 -0
- package/dist/chunk-AGVAHVUA.js +2 -0
- package/dist/chunk-AO7ZSRME.js +13 -0
- package/dist/chunk-BFD3GFRK.js +2 -0
- package/dist/chunk-D34YFK4M.js +6 -0
- package/dist/chunk-DVZWCXB6.js +2 -0
- package/dist/chunk-EKZDFEJW.js +2 -0
- package/dist/chunk-ET5XJTSX.js +2 -0
- package/dist/chunk-FYDRENK7.js +3 -0
- package/dist/chunk-HMQ5BHP2.js +743 -0
- package/dist/chunk-HXKWL3VK.js +29 -0
- package/dist/chunk-IZSBGW6E.js +2 -0
- package/dist/chunk-J32OPJEX.js +2 -0
- package/dist/chunk-JBDMCRPP.js +7 -0
- package/dist/chunk-JIXHEBGK.js +7 -0
- package/dist/chunk-JNSJVCTU.js +2 -0
- package/dist/chunk-JQKKVAAN.js +2 -0
- package/dist/chunk-KLBH26PA.js +429 -0
- package/dist/chunk-L6K5HNDL.js +24 -0
- package/dist/chunk-LKAT7IAK.js +2 -0
- package/dist/chunk-M4UMM6DC.js +5 -0
- package/dist/chunk-NKYNHSA5.js +424 -0
- package/dist/chunk-NW6OKHE6.js +5 -0
- package/dist/chunk-NXRVR37G.js +60 -0
- package/dist/chunk-ODVKPZZ4.js +2 -0
- package/dist/chunk-PUBB7LIT.js +5 -0
- package/dist/chunk-Q2J542ST.js +2 -0
- package/dist/chunk-QGZRM6ZB.js +2 -0
- package/dist/chunk-QNZEG7IT.js +13 -0
- package/dist/chunk-QT2LKB3P.js +7 -0
- package/dist/chunk-RVRARWSY.js +9 -0
- package/dist/chunk-T6IDXUUA.js +2 -0
- package/dist/chunk-TYWB5IQJ.js +3 -0
- package/dist/chunk-UIKLE3WD.js +2 -0
- package/dist/chunk-V7K6CQVX.js +111 -0
- package/dist/chunk-VCKKJDLP.js +8 -0
- package/dist/chunk-VG7FN2TU.js +4 -0
- package/dist/chunk-W5IWDW4Y.js +16 -0
- package/dist/chunk-W7C6FFMO.js +8 -0
- package/dist/chunk-WESTEMIM.js +10 -0
- package/dist/chunk-WR6D3SC6.js +5 -0
- package/dist/chunk-WS2N27RX.js +3 -0
- package/dist/chunk-XMAV5AG6.js +2 -0
- package/dist/chunk-XROULIQN.js +2 -0
- package/dist/chunk-XUFYOXOU.js +3 -0
- package/dist/chunk-Y4XFVDZC.js +3 -0
- package/dist/chunk-Y6KXTQBG.js +2 -0
- package/dist/{chunk-GTR2TBIJ.js → chunk-Z2UZUCY6.js} +237 -1047
- package/dist/chunk-Z34K6GY2.js +8 -0
- package/dist/claude-4LR3LJQZ.js +13 -0
- package/dist/claude-cli-UP6HGH7C.js +6 -0
- package/dist/claude-code-RLJ4GX77.js +11 -0
- package/dist/claude-code-teams-R37HJY3Y.js +29 -0
- package/dist/commands-LMUD5L6R.js +455 -0
- package/dist/compliance-GZ7UAOG3.js +6 -0
- package/dist/conductor-Y5IXELTL.js +4 -0
- package/dist/config-schema-HR7LDEQ6.js +2 -0
- package/dist/constellation-CG7C4WFE.js +13 -0
- package/dist/context-audit-RSSRX6XC.js +6 -0
- package/dist/cost-IDNVMAEV.js +10 -0
- package/dist/cost-PK4KIF7R.js +2 -0
- package/dist/cursor-cli-QKF7Z6M2.js +4 -0
- package/dist/cursorrules-U5O4G5T4.js +14 -0
- package/dist/decision-loader-2XPZE4EZ.js +2 -0
- package/dist/delete-P5VULXR4.js +14 -0
- package/dist/diff-RTFUKJHF.js +9 -0
- package/dist/discipline-H7LDI6NT.js +2 -0
- package/dist/dist-3ZCH25SG.js +2 -0
- package/dist/dist-KGRCLBJP-2QAPFYNF.js +39 -0
- package/dist/dist-R3RWD35F.js +2 -0
- package/dist/dist-VGFSP3XM.js +2 -0
- package/dist/dist-VXCZWVVJ.js +2 -0
- package/dist/dist-W3XCATBJ.js +2 -0
- package/dist/docs-EDQ2STFK.js +2 -0
- package/dist/docs-RXPN6CK7.js +12 -0
- package/dist/doctor-2T2QL6VM.js +2 -0
- package/dist/drift-ILZE5BFJ.js +13 -0
- package/dist/echo-UPTQUEDU.js +46 -0
- package/dist/edit-GUU3HBVW.js +9 -0
- package/dist/event-Y3VXC2RV.js +3 -0
- package/dist/explain-files-3GPZUETV.js +4 -0
- package/dist/export-CV5KCTPS.js +2 -0
- package/dist/flow-S3RQ4YPY.js +11 -0
- package/dist/global-C44FW4G2.js +13 -0
- package/dist/graduate-3BBSC27A.js +5 -0
- package/dist/graph-CNDE5TAT.js +2 -0
- package/dist/graph-server-COZR5C3Z.js +14 -0
- package/dist/habits-4J2KRYUL.js +42 -0
- package/dist/history-UW454SDP.js +12 -0
- package/dist/hooks-XH52VGOU.js +2 -0
- package/dist/index.js +15 -1039
- package/dist/init-24MAQJFM.js +2 -0
- package/dist/integrity-UYDOOJDP.js +7 -0
- package/dist/integrity-checker-DHGMZQDG.js +2 -0
- package/dist/journal-loader-GLH7XFTK.js +2 -0
- package/dist/lint-IGKE6UPS.js +26 -0
- package/dist/list-5IUGP3ZB.js +7 -0
- package/dist/list-YKIQNKGB.js +6 -0
- package/dist/lore-loader-RVQI5GXL.js +2 -0
- package/dist/lore-loader-XY5MZRR2.js +2 -0
- package/dist/lore-server-FC2GMDLT.js +14 -0
- package/dist/manual-RXSPSFLL.js +20 -0
- package/dist/mcp.js +93 -20484
- package/dist/migrate-X5OMAFAQ.js +59 -0
- package/dist/migrate-assessments-GEI5WMI2.js +4 -0
- package/dist/model-discovery-HMB3YI4L.js +2 -0
- package/dist/nomination-engine-XF7TWPAP.js +2 -0
- package/dist/notebook-PE3JSYZI.js +11 -0
- package/dist/notebook-loader-CENTDDUJ.js +2 -0
- package/dist/orchestrate-35HBQ3O3.js +8 -0
- package/dist/peers-P2KXU7ZK.js +5 -0
- package/dist/persona-STQWZH5P.js +29 -0
- package/dist/pipeline-MZUITRVN.js +4 -0
- package/dist/platform-server-2KXHGHFV.js +25 -0
- package/dist/plugin-update-checker-M7PW434O.js +2 -0
- package/dist/portal-check-3JVNLOEP.js +8 -0
- package/dist/portal-compliance-2UG4VKWH.js +2 -0
- package/dist/probe-5L5BQDGE.js +6 -0
- package/dist/project-type-SURTOIG7.js +2 -0
- package/dist/promote-NJQDZBZA.js +8 -0
- package/dist/providers-4PXMWA7V.js +8 -0
- package/dist/quiz-FE5UGAY2.js +10 -0
- package/dist/record-YXPB34MY.js +6 -0
- package/dist/reindex-PGDQSM42.js +2 -0
- package/dist/remember-MJRNTXYS.js +14 -0
- package/dist/retag-N5XF3KXP.js +6 -0
- package/dist/review-6UAH6V3R.js +11 -0
- package/dist/review-77QI6VOC.js +6 -0
- package/dist/ripple-ZGDITCGB.js +10 -0
- package/dist/roster-FLRZ5J42.js +2 -0
- package/dist/sentinel-HYAZ3CO5.js +19 -0
- package/dist/sentinel-bridge-VR357PKL.js +2 -0
- package/dist/sentinel-mcp.js +38 -3808
- package/dist/sentinel.js +1 -34
- package/dist/serve-JE6UF5P2.js +8 -0
- package/dist/serve-L52ZUTU6.js +10 -0
- package/dist/serve-OY6XYL7F.js +12 -0
- package/dist/server-2MNROHF6.js +7 -0
- package/dist/server-4YNUIK4W.js +8 -0
- package/dist/session-tracker-SKOMBDOW.js +2 -0
- package/dist/session-work-log-3MNUDEZ6.js +2 -0
- package/dist/session-work-log-J2H5OZBR.js +2 -0
- package/dist/setup-3F5IK7MO.js +31 -0
- package/dist/setup-KPIMRZ4Q.js +2 -0
- package/dist/shift-6GCNH666.js +11 -0
- package/dist/show-BOAVWZPZ.js +7 -0
- package/dist/show-PJ5LFLIL.js +5 -0
- package/dist/snapshot-L2G56RPL.js +8 -0
- package/dist/spawn-UH5RENSE.js +12 -0
- package/dist/status-77M3SDIF.js +8 -0
- package/dist/status-A37ECYNJ.js +6 -0
- package/dist/summary-ZJLQ6KHB.js +7 -0
- package/dist/sweep-HU74OPVW.js +17 -0
- package/dist/switch-CTW4PDGI.js +17 -0
- package/dist/symphony-3QMBGCZY.js +2 -0
- package/dist/symphony-QI63XL62.js +53 -0
- package/dist/symphony-loader-XACVV2E3.js +2 -0
- package/dist/symphony-peers-U4KHMKGI.js +2 -0
- package/dist/symphony-peers-X5NGWXFP.js +2 -0
- package/dist/symphony-relay-5GY5JIPT.js +3 -0
- package/dist/sync-QRDSFETO.js +2 -0
- package/dist/sync-llms-HL5PPW3M.js +15 -0
- package/dist/task-loader-NZFDTUQ5.js +2 -0
- package/dist/team-WGERKGNP.js +2 -0
- package/dist/test-BQJMS4Y2.js +111 -0
- package/dist/thread-HFXK65D4.js +41 -0
- package/dist/timeline-K3ZFKJ3R.js +6 -0
- package/dist/triage-FCWOZASE.js +18 -0
- package/dist/tutorial-UC6YQMNN.js +305 -0
- package/dist/university-content/courses/.purpose +74 -5
- package/dist/university-content/courses/para-701.json +807 -0
- package/dist/university-content/plsat/.purpose +3 -2
- package/dist/university-ui/assets/{index-BjewBB6s.js → index-CGFJczb1.js} +2 -2
- package/dist/university-ui/assets/{index-BjewBB6s.js.map → index-CGFJczb1.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/upgrade-B4IOLZYK.js +53 -0
- package/dist/validate-C6SMKGYD.js +9 -0
- package/dist/validate-LSCDOLBO.js +13 -0
- package/dist/validate-VZXTJHGO.js +6 -0
- package/dist/watch-LRM5XD46.js +8 -0
- package/dist/watch-PZCCUP6K.js +9 -0
- package/dist/wisdom-XZ3QKPNP.js +7 -0
- package/dist/work-log-loader-DL5GZ2BQ.js +2 -0
- package/dist/workspace-2ODL5WLY.js +2 -0
- package/package.json +1 -1
- package/platform-ui/dist/assets/AmbientSection-DqQ2mfCO.js +1 -0
- package/platform-ui/dist/assets/{CanvasSection-DwPTRdIN.js → CanvasSection-DLW0s-Bu.js} +1 -1
- package/platform-ui/dist/assets/{DocsSection-BJc_ws4I.js → DocsSection-BQ9Hi51g.js} +1 -1
- package/platform-ui/dist/assets/{GitSection-DhqBo1xc.js → GitSection-QQeUX6o3.js} +1 -1
- package/platform-ui/dist/assets/{GraphSection-D9fhVnZ0.js → GraphSection-0c9C-w7K.js} +2 -2
- package/platform-ui/dist/assets/{GraphSection-BlgXTl53.css → GraphSection-Bbs2a8sC.css} +1 -1
- package/platform-ui/dist/assets/LoreSection--t56kCj2.js +1 -0
- package/platform-ui/dist/assets/LoreSection-qnmm3o4y.css +1 -0
- package/platform-ui/dist/assets/SentinelSection-C4OoME9U.js +1 -0
- package/platform-ui/dist/assets/{SymphonySection-BRoBaUSS.js → SymphonySection-B-rvsLxq.js} +1 -1
- package/platform-ui/dist/assets/TeamSection-CBFmNEEo.js +1 -0
- package/platform-ui/dist/assets/index-Bxp0TVaf.css +1 -0
- package/platform-ui/dist/assets/index-DPpOdAtC.js +57 -0
- package/platform-ui/dist/index.html +2 -2
- package/dist/accept-orchestration-UQLM7PTQ.js +0 -189
- package/dist/add-FZRKEGH4.js +0 -81
- package/dist/agent-WERIO2XV.js +0 -523
- package/dist/agent-loader-TFIANSF4.js +0 -44
- package/dist/agent-state-S5DAWPTF.js +0 -24
- package/dist/agents-suggest-DNSYJ6IA.js +0 -83
- package/dist/aggregate-H57K7PNV.js +0 -88
- package/dist/assess-4WVXZLZQ.js +0 -68
- package/dist/auto-QFS5NHQU.js +0 -504
- package/dist/beacon-KXZXYQHX.js +0 -251
- package/dist/calibration-V46G7JTY.js +0 -135
- package/dist/check-OWAIWV23.js +0 -175
- package/dist/chunk-2IO7JAG2.js +0 -148
- package/dist/chunk-2T6BTYBN.js +0 -712
- package/dist/chunk-36TKPM5Z.js +0 -400
- package/dist/chunk-45MUDW6E.js +0 -804
- package/dist/chunk-4BLYIB7J.js +0 -5701
- package/dist/chunk-4L3UTYQX.js +0 -677
- package/dist/chunk-4NCFWYGG.js +0 -110
- package/dist/chunk-54LTTQBH.js +0 -138
- package/dist/chunk-5EWAQHFY.js +0 -269
- package/dist/chunk-5JGJACDU.js +0 -37
- package/dist/chunk-5OUOLN6M.js +0 -659
- package/dist/chunk-5VKJBNJL.js +0 -444
- package/dist/chunk-6N3JTACN.js +0 -2260
- package/dist/chunk-6QC3YGB6.js +0 -114
- package/dist/chunk-7N7GSU6K.js +0 -34
- package/dist/chunk-ABVQGRF7.js +0 -268
- package/dist/chunk-CL7JSK52.js +0 -129
- package/dist/chunk-CSD7IHSN.js +0 -152
- package/dist/chunk-EDOAWN7J.js +0 -717
- package/dist/chunk-EKGMAM62.js +0 -525
- package/dist/chunk-EZ3GOCYC.js +0 -132
- package/dist/chunk-F3BCHPYT.js +0 -143
- package/dist/chunk-FKJUBQU3.js +0 -3081
- package/dist/chunk-GT5QGC2H.js +0 -253
- package/dist/chunk-GZDFVP2N.js +0 -540
- package/dist/chunk-IRKUEJVW.js +0 -405
- package/dist/chunk-J2JEQRT3.js +0 -164
- package/dist/chunk-JASGXLK3.js +0 -679
- package/dist/chunk-KVDYJLTC.js +0 -121
- package/dist/chunk-L27I3CPZ.js +0 -357
- package/dist/chunk-LHLIAYQ3.js +0 -185
- package/dist/chunk-MCMOGQMU.js +0 -145
- package/dist/chunk-NQKQG45G.js +0 -688
- package/dist/chunk-PBHIFAL4.js +0 -259
- package/dist/chunk-PDX44BCA.js +0 -11
- package/dist/chunk-PMXRGPRQ.js +0 -305
- package/dist/chunk-RAB5IKPR.js +0 -487
- package/dist/chunk-RJE5G7WO.js +0 -590
- package/dist/chunk-RTHA3XRE.js +0 -880
- package/dist/chunk-S2HO5MLR.js +0 -621
- package/dist/chunk-S3ORKP3V.js +0 -716
- package/dist/chunk-TAIJOFOE.js +0 -124
- package/dist/chunk-TXESEO7Y.js +0 -245
- package/dist/chunk-UPLDI7CN.js +0 -1334
- package/dist/chunk-VL67H5IC.js +0 -506
- package/dist/chunk-VPPK3SY4.js +0 -1136
- package/dist/chunk-YMDLDELF.js +0 -314
- package/dist/chunk-YO6DVTL7.js +0 -99
- package/dist/chunk-YRZ5RPEB.js +0 -1561
- package/dist/chunk-ZDHLG5VP.js +0 -5676
- package/dist/chunk-ZGUAAVMA.js +0 -756
- package/dist/chunk-ZSYVKSY6.js +0 -2602
- package/dist/claude-FRRWJSTJ.js +0 -362
- package/dist/claude-cli-XJLK2X4L.js +0 -276
- package/dist/claude-code-HTBA4XRB.js +0 -126
- package/dist/claude-code-teams-T4SP24MD.js +0 -199
- package/dist/commands-5N4ILTPH.js +0 -5859
- package/dist/conductor-CQVGTEQN.js +0 -161
- package/dist/config-schema-EA4XALGG.js +0 -154
- package/dist/constellation-A26CCGQS.js +0 -225
- package/dist/context-audit-RLO3ETRP.js +0 -682
- package/dist/cost-BGM32XJU.js +0 -93
- package/dist/cost-VI46A4XL.js +0 -174
- package/dist/cursor-cli-JVEZGHWQ.js +0 -269
- package/dist/cursorrules-HLIKJJZT.js +0 -84
- package/dist/decision-loader-WWCLIQPJ.js +0 -20
- package/dist/delete-KBRPQLPC.js +0 -56
- package/dist/diff-D4X53HAC.js +0 -126
- package/dist/discipline-FA4OZXIS.js +0 -24
- package/dist/dist-34NA5RS5.js +0 -74
- package/dist/dist-5QE2BB2B-5S3T6Y3T.js +0 -6919
- package/dist/dist-77JDTVAY.js +0 -62
- package/dist/dist-OGTSAZ55.js +0 -1358
- package/dist/dist-QK4SQAK7.js +0 -64
- package/dist/dist-TA6LSC2Q.js +0 -20
- package/dist/docs-PBZB7LYP.js +0 -89
- package/dist/docs-QIYKO3BR.js +0 -155
- package/dist/doctor-ULBOHEIC.js +0 -11
- package/dist/drift-R5NRKFHI.js +0 -251
- package/dist/echo-O2LY7CC2.js +0 -248
- package/dist/edit-R2HNLMOG.js +0 -63
- package/dist/event-25OJKDCE.js +0 -31
- package/dist/export-IWVL7XLF.js +0 -38
- package/dist/flow-CRRVV3O3.js +0 -185
- package/dist/global-3NG5JXUB.js +0 -136
- package/dist/graduate-USAWGBJM.js +0 -160
- package/dist/graph-VHUMAAS6.js +0 -12
- package/dist/graph-server-YL22VBBN.js +0 -116
- package/dist/habits-OL5NGPXO.js +0 -1405
- package/dist/history-WOWC573W.js +0 -277
- package/dist/hooks-HFWSCGPV.js +0 -12
- package/dist/integrity-IHO4FZTS.js +0 -194
- package/dist/integrity-checker-PSKJA5SB.js +0 -12
- package/dist/journal-loader-5EYSBFFY.js +0 -18
- package/dist/lint-K6CJGGPH.js +0 -456
- package/dist/list-4YK7QKFF.js +0 -57
- package/dist/list-ENR7Q4CR.js +0 -56
- package/dist/lore-loader-7NO6N6FT.js +0 -26
- package/dist/lore-server-UNJY5KC3.js +0 -118
- package/dist/manual-G6FISID5.js +0 -204
- package/dist/migrate-LS45DNEV.js +0 -889
- package/dist/migrate-assessments-RGH4O6IX.js +0 -97
- package/dist/model-discovery-D2H3VBGC.js +0 -8
- package/dist/nomination-engine-RV5CNO5B.js +0 -42
- package/dist/notebook-YWIYGEHV.js +0 -155
- package/dist/orchestrate-JLILBBJE.js +0 -324
- package/dist/peers-DEOUIZM6.js +0 -82
- package/dist/persona-UHAHIVST.js +0 -390
- package/dist/pipeline-L4HCSBGN.js +0 -263
- package/dist/platform-server-H5YO3DQD.js +0 -1475
- package/dist/plugin-update-checker-KRRSGXMV.js +0 -12
- package/dist/portal-check-NPYGII2D.js +0 -42
- package/dist/portal-compliance-J7DGAPFX.js +0 -18
- package/dist/probe-MHL5HQZ2.js +0 -167
- package/dist/promote-F6ZYZZAL.js +0 -182
- package/dist/providers-GK7PB2OL.js +0 -104
- package/dist/quiz-M66SC7F7.js +0 -99
- package/dist/record-RA4WR2BO.js +0 -49
- package/dist/reindex-5LTD53ZC.js +0 -16
- package/dist/remember-HBWJ655S.js +0 -77
- package/dist/retag-3OLCVDEQ.js +0 -62
- package/dist/review-27ATYTD2.js +0 -33
- package/dist/review-57QMURZV.js +0 -334
- package/dist/ripple-JPBXP5I3.js +0 -215
- package/dist/sentinel-4XIG4STA.js +0 -63
- package/dist/sentinel-bridge-MDUXTQRL.js +0 -109
- package/dist/serve-CAH3PHE7.js +0 -33
- package/dist/serve-INL7SNBK.js +0 -36
- package/dist/serve-KBSE36PL.js +0 -49
- package/dist/server-54SKYFFY.js +0 -1647
- package/dist/server-XUOIO7E6.js +0 -338
- package/dist/session-tracker-C4BMD5WG.js +0 -13
- package/dist/session-work-log-MZ47OAPB.js +0 -20
- package/dist/setup-EDS27WUR.js +0 -25
- package/dist/setup-KO5AFC4K.js +0 -296
- package/dist/shift-D2JOHHBF.js +0 -668
- package/dist/show-5PV5KFJE.js +0 -176
- package/dist/show-NQKYX6WQ.js +0 -82
- package/dist/snapshot-BK4RBPCG.js +0 -62
- package/dist/spawn-RCHNXDHE.js +0 -196
- package/dist/status-WGIAQODY.js +0 -71
- package/dist/summary-NIRABMF5.js +0 -140
- package/dist/sweep-QMHNSIY5.js +0 -934
- package/dist/switch-6EJPZDIA.js +0 -232
- package/dist/symphony-4OCY36AI.js +0 -791
- package/dist/symphony-B75X2MME.js +0 -326
- package/dist/symphony-loader-UZGON56V.js +0 -90
- package/dist/symphony-peers-2ZQYLRNI.js +0 -34
- package/dist/symphony-peers-OL7F6M5S.js +0 -121
- package/dist/symphony-relay-UJYUXN65.js +0 -710
- package/dist/sync-VEHUH4OA.js +0 -11
- package/dist/sync-llms-YHCFIE6X.js +0 -166
- package/dist/task-loader-LDYWQSLM.js +0 -20
- package/dist/team-O5MIIFMA.js +0 -34
- package/dist/test-566CP5KC.js +0 -1017
- package/dist/thread-N754I4D5.js +0 -274
- package/dist/timeline-M3CICQFE.js +0 -112
- package/dist/triage-HHYGT3HY.js +0 -671
- package/dist/tutorial-KD22SUNO.js +0 -666
- package/dist/upgrade-H5PF32BW.js +0 -551
- package/dist/validate-CNKEKO6A.js +0 -134
- package/dist/validate-MB5ULIHS.js +0 -39
- package/dist/validate-QH3LADM6.js +0 -64
- package/dist/watch-2TKP5PVL.js +0 -199
- package/dist/watch-ZF4ML6CD.js +0 -111
- package/dist/wisdom-AATMGNFA.js +0 -319
- package/dist/work-log-loader-5L45XNYZ.js +0 -14
- package/dist/workspace-6E6OSRNU.js +0 -21
- package/platform-ui/dist/assets/AmbientSection-WtHfNedO.js +0 -1
- package/platform-ui/dist/assets/LoreSection-C3EixkjW.css +0 -1
- package/platform-ui/dist/assets/LoreSection-CwDDHrz9.js +0 -1
- package/platform-ui/dist/assets/SentinelSection-Cl7e5oZ6.js +0 -1
- package/platform-ui/dist/assets/TeamSection-CqSIMrKz.js +0 -1
- package/platform-ui/dist/assets/index-CfpZFjea.css +0 -1
- package/platform-ui/dist/assets/index-F0KL9xrN.js +0 -57
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {b}from'./chunk-JBDMCRPP.js';import {g}from'./chunk-T6IDXUUA.js';import {c}from'./chunk-JIXHEBGK.js';import {a as a$2,g as g$1,h,d as d$1,f}from'./chunk-UIKLE3WD.js';import {c as c$1,d,e}from'./chunk-HMQ5BHP2.js';import {a as a$1}from'./chunk-LKAT7IAK.js';import*as o from'fs';import*as a from'path';import {fileURLToPath}from'url';import t from'chalk';import U from'ora';function w(s){try{return o.readFileSync(s,"utf8").split(`
|
|
3
|
+
`).length}catch{return 0}}function W(s){let i=g$1(s);if(i&&f[i])return f[i].name;let e=a$2(s);if(e!=="backend")return e.charAt(0).toUpperCase()+e.slice(1)}function _(s){let i=[],e=0,n={name:"cursor",displayName:"Cursor"},d=a.join(s,".cursorrules"),r=a.join(s,".cursor","rules");if(o.existsSync(d)){let c=w(d);n.legacy={path:".cursorrules",lines:c,type:"legacy"},e+=c;}if(o.existsSync(r)){let c=o.readdirSync(r).filter(m=>m.endsWith(".mdc"));c.length>0&&(n.modern=c.map(m=>{let x=a.join(r,m),j=w(x);return e+=j,{path:`.cursor/rules/${m}`,lines:j,type:"modern"}}));}(n.legacy||n.modern)&&i.push(n);let u={name:"copilot",displayName:"GitHub Copilot"},l=a.join(s,".github","copilot-instructions.md"),f=a.join(s,".github","instructions");if(o.existsSync(l)){let c=w(l);u.legacy={path:".github/copilot-instructions.md",lines:c,type:"legacy"},e+=c;}if(o.existsSync(f)){let c=o.readdirSync(f).filter(m=>m.endsWith(".md"));c.length>0&&(u.modern=c.map(m=>{let x=a.join(f,m),j=w(x);return e+=j,{path:`.github/instructions/${m}`,lines:j,type:"modern"}}));}(u.legacy||u.modern)&&i.push(u);let h=a.join(s,".windsurfrules");if(o.existsSync(h)){let c=w(h);i.push({name:"windsurf",displayName:"Windsurf",legacy:{path:".windsurfrules",lines:c,type:"legacy"}}),e+=c;}let b=a.join(s,"CLAUDE.md");if(o.existsSync(b)){let c=w(b);i.push({name:"claude",displayName:"Claude",legacy:{path:"CLAUDE.md",lines:c,type:"legacy"}}),e+=c;}let p=a.join(s,"AGENTS.md");if(o.existsSync(p)){let c=w(p);i.push({name:"agents",displayName:"AGENTS.md",legacy:{path:"AGENTS.md",lines:c,type:"legacy"}}),e+=c;}let y=a$2(s),g=g$1(s);return {ides:i,hasExisting:i.length>0,totalLines:e,projectType:W(s),discipline:y!=="backend"?y:void 0,stack:g||void 0}}function O(s,i){let e=[];e.push("# Migrate IDE Instructions to Paradigm Format"),e.push(""),e.push("## Overview"),e.push(""),e.push(`Migrate existing IDE instruction files for **${i}** to Paradigm's managed, scoped format.`),e.push(""),e.push("## Source Files Found"),e.push("");for(let n of s.ides)if(n.legacy&&e.push(`- \`${n.legacy.path}\` (${n.legacy.lines} lines) - ${n.displayName} ${n.legacy.type} format`),n.modern)for(let d of n.modern)e.push(`- \`${d.path}\` (${d.lines} lines) - ${n.displayName} modern format`);return e.push(""),s.ides.some(n=>n.name==="cursor")&&(e.push("## Cursor Migration \u2192 `.cursor/rules/*.mdc`"),e.push(""),e.push("Split the existing `.cursorrules` into scoped `.mdc` files with YAML frontmatter:"),e.push(""),e.push("### File Structure"),e.push(""),e.push("```"),e.push(".cursor/rules/"),e.push("\u251C\u2500\u2500 project-core.mdc # Always applies - project overview, architecture"),e.push("\u251C\u2500\u2500 code-style.mdc # globs: **/*.{ts,tsx,js,jsx} - naming, formatting"),e.push("\u251C\u2500\u2500 components.mdc # globs: **/components/**/* - component patterns"),e.push("\u251C\u2500\u2500 api-patterns.mdc # globs: **/api/**/* - API conventions"),e.push("\u251C\u2500\u2500 testing.mdc # globs: **/*.test.* - testing guidelines"),e.push("\u2514\u2500\u2500 custom.mdc # Any project-specific rules"),e.push("```"),e.push(""),e.push("### Frontmatter Format"),e.push(""),e.push("```yaml"),e.push("---"),e.push("description: Brief description of what these rules cover"),e.push('globs: "**/*.ts" # File pattern (OR use alwaysApply)'),e.push("alwaysApply: true # Apply to all files (OR use globs)"),e.push("---"),e.push("```"),e.push("")),s.ides.some(n=>n.name==="copilot")&&(e.push("## Copilot Migration \u2192 `.github/instructions/*.instructions.md`"),e.push(""),e.push("Split into scoped instruction files with `applyTo` frontmatter:"),e.push(""),e.push("### File Structure"),e.push(""),e.push("```"),e.push(".github/"),e.push("\u251C\u2500\u2500 copilot-instructions.md # Always applies - core rules"),e.push("\u2514\u2500\u2500 instructions/"),e.push(" \u251C\u2500\u2500 typescript.instructions.md # applyTo: **/*.ts"),e.push(" \u251C\u2500\u2500 react.instructions.md # applyTo: **/*.tsx"),e.push(" \u251C\u2500\u2500 api.instructions.md # applyTo: **/api/**"),e.push(" \u2514\u2500\u2500 testing.instructions.md # applyTo: **/*.test.*"),e.push("```"),e.push(""),e.push("### Frontmatter Format"),e.push(""),e.push("```yaml"),e.push("---"),e.push('applyTo: "**/*.ts"'),e.push("---"),e.push("```"),e.push("")),e.push("## Migration Steps"),e.push(""),e.push("1. **Read each source file** and identify logical sections:"),e.push(" - Project overview / architecture"),e.push(" - Code style / naming conventions"),e.push(" - Language-specific patterns"),e.push(" - Framework-specific rules"),e.push(" - Testing guidelines"),e.push(" - API patterns"),e.push(""),e.push("2. **Create scoped target files** with appropriate frontmatter"),e.push(""),e.push("3. **Backup originals** by renaming to `.bak`:"),e.push(" - `.cursorrules` \u2192 `.cursorrules.bak`"),e.push(" - `.github/copilot-instructions.md` \u2192 `.github/copilot-instructions.md.bak`"),e.push(""),e.push("4. **Verify** the migration by checking that rules apply correctly"),e.push(""),e.push("## Tips"),e.push(""),e.push("- **Prefer specific globs** over `alwaysApply` when possible"),e.push("- **Keep files focused** - one concern per file"),e.push("- **Use descriptive names** that indicate the scope"),e.push("- **Paradigm will generate its own rules** - keep custom rules separate"),e.push("- After migration, run `paradigm sync` to add Paradigm-managed rules"),e.push(""),e.push("---"),e.push(""),e.push("*Generated by `paradigm init --migrate`*"),e.join(`
|
|
4
|
+
`)}function G(){let s=fileURLToPath(import.meta.url),i=a.dirname(s),e=[a.join(i,"..","..","templates","paradigm"),a.join(i,"..","templates","paradigm"),a.join(i,"..","..","src","templates","paradigm")];for(let n of e)if(o.existsSync(n))return n;return a.join(i,"..","templates","paradigm")}var A={directories:["prompts"],files:["echoes.yaml","docs/commands.md","docs/queries.md","specs/disciplines.md","specs/scan.md","specs/context-tracking.md"]};function z(s){for(let i of A.directories)if(s===i||s.startsWith(i+"/"))return true;return !!A.files.includes(s)}function M(s,i,e,n=""){o.existsSync(i)||o.mkdirSync(i,{recursive:true});let d=o.readdirSync(s,{withFileTypes:true});for(let r of d){let u=a.join(s,r.name),l=a.join(i,r.name),f=n?`${n}/${r.name}`:r.name;if(!z(f))if(r.isDirectory())M(u,l,e,f);else {let h=o.readFileSync(u,"utf8");h=h.replace(/\{\{PROJECT_NAME\}\}/g,e),o.writeFileSync(l,h,"utf8");}}}function L(s,i){if(console.log(t.blue(`
|
|
5
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510`)),console.log(t.blue("\u2502")+t.white.bold(" Welcome to Paradigm ")+t.blue("\u2502")),console.log(t.blue("\u2502")+t.gray(" Let's set up your project ")+t.blue("\u2502")),console.log(t.blue(`\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
6
|
+
`)),console.log(t.white(" \u{1F4C1} Project: ")+t.cyan(i)+(s.projectType?t.gray(` (${s.projectType} detected)`):"")),s.discipline&&console.log(t.white(" \u{1F3AF} Discipline: ")+t.cyan(s.discipline)+(s.stack?t.gray(` \u2192 stack: ${s.stack}`):"")),console.log(""),s.hasExisting){console.log(t.white(` \u{1F4C4} Found existing IDE instructions:
|
|
7
|
+
`));for(let e of s.ides)if(e.legacy&&console.log(t.green(" \u2713 ")+t.white(e.legacy.path)+t.gray(` (${e.legacy.lines} lines)`)),e.modern)for(let n of e.modern)console.log(t.green(" \u2713 ")+t.white(n.path)+t.gray(` (${n.lines} lines)`));console.log(""),console.log(t.gray(` Total: ${s.totalLines} lines of existing instructions`));}else console.log(t.gray(" \u{1F4C4} No existing IDE instructions found"));console.log(""),console.log(t.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log("");}function B(s,i){let n={cursor:".cursor/rules/",copilot:".github/instructions/",windsurf:".windsurfrules",claude:"CLAUDE.md"}[s]||".cursor/rules/";console.log(t.blue(`
|
|
8
|
+
\u2728 Paradigm initialized!
|
|
9
|
+
`)),console.log(t.white(" Created:")),console.log(t.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(t.white(" \u{1F4C1} .paradigm/")),console.log(t.gray(" \u251C\u2500\u2500 config.yaml Configuration")),console.log(t.gray(" \u251C\u2500\u2500 specs/ Logger, symbols, context")),console.log(t.gray(" \u2514\u2500\u2500 docs/ Patterns, troubleshooting")),console.log(t.white(" \u{1F4C4} .premise Project overview")),console.log(t.white(" \u{1F4C4} .purpose Feature context")),console.log(t.white(` \u{1F4C4} ${n.padEnd(20)} IDE instructions`)),console.log(""),console.log(t.gray(" Reference content (prompts, commands, etc.) available via MCP")),i.hasExisting&&(console.log(""),console.log(t.yellow(" \u26A0 Your existing IDE files were preserved.")),console.log(t.gray(" Run `paradigm init --migrate` to get a migration prompt."))),console.log(""),console.log(t.white(" Next steps:")),console.log(t.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(t.white(" 1. ")+t.gray("Review ")+t.cyan(".paradigm/config.yaml")),console.log(t.white(" 2. ")+t.gray("Edit ")+t.cyan(".purpose")+t.gray(" to define your features")),console.log(t.white(" 3. ")+t.gray("Run ")+t.cyan("paradigm beacon")+t.gray(" to generate AI context")),console.log(t.white(" 4. ")+t.gray("Run ")+t.cyan("paradigm doctor")+t.gray(" to verify setup")),console.log(t.white(" 5. ")+t.gray("Run ")+t.cyan("paradigm visualize")+t.gray(" to see your project")),console.log("");}async function ne(s){let i=process.cwd(),e$1=s.name||a.basename(i),n=U(),d$1=a$1.command("init").start("Initializing Paradigm",{project:e$1,quick:!!s.quick}),r=_(i);if(a$1.operation("detect-ide").debug("IDE detection complete",{hasExisting:r.hasExisting}),s.migrate){if(!r.hasExisting){console.log(t.yellow(`
|
|
10
|
+
No existing IDE instruction files found.
|
|
11
|
+
`)),console.log(t.gray(" Run `paradigm init` to create a fresh setup.\n"));return}console.log(t.blue(`
|
|
12
|
+
Migration Prompt
|
|
13
|
+
`)),console.log(t.gray(` Copy the following prompt to an AI agent:
|
|
14
|
+
`)),console.log(t.gray(` \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
15
|
+
`)),console.log(O(r,e$1)),console.log(t.gray(`
|
|
16
|
+
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
17
|
+
`));return}if(s.dryRun){L(r,e$1),console.log(t.white(" Would create (dry run):")),console.log(t.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(t.cyan(" \u{1F4C1} .paradigm/")),console.log(t.cyan(" \u251C\u2500\u2500 config.yaml")),console.log(t.cyan(" \u251C\u2500\u2500 specs/")),console.log(t.cyan(" \u2514\u2500\u2500 docs/")),console.log(t.cyan(" \u{1F4C4} .premise")),console.log(t.cyan(" \u{1F4C4} .purpose")),console.log(t.cyan(" \u{1F4C1} .cursor/rules/*.mdc")),console.log(""),console.log(t.gray(" Reference content (prompts, commands, etc.) served via MCP")),console.log(t.gray(` Run without --dry-run to create these files.
|
|
18
|
+
`));return}s.quick||(L(r,e$1),r.hasExisting&&!s.force&&(console.log(t.white(` What would you like to do?
|
|
19
|
+
`)),console.log(t.cyan(" paradigm init --migrate")),console.log(t.gray(` Get an AI-ready prompt to convert your existing rules
|
|
20
|
+
`)),console.log(t.cyan(" paradigm init --force")),console.log(t.gray(` Create .paradigm/ alongside existing files
|
|
21
|
+
`)),console.log(t.cyan(" paradigm init --dry-run")),console.log(t.gray(` Preview what would be created
|
|
22
|
+
`))));let u=G(),l=a.join(i,".paradigm");if(o.existsSync(l)){let g=o.statSync(l);if(g.isFile()){if(!s.force){console.log(t.yellow(" \u26A0 Legacy .paradigm file found.")),console.log(t.gray(" Run `paradigm upgrade --all` to migrate.\n"));return}o.unlinkSync(l);}else if(g.isDirectory()&&!s.force){console.log(t.yellow(` \u26A0 .paradigm/ already exists (use --force to overwrite)
|
|
23
|
+
`));return}}n.start("Creating .paradigm/ directory...");try{o.existsSync(l)||o.mkdirSync(l,{recursive:!0}),o.existsSync(u)?(M(u,l,e$1),o.existsSync(a.join(l,"fixtures.yaml"))||N(l),V(l,i,s.stack),n.succeed(t.green(".paradigm/ created"))):(n.warn(t.yellow("Templates not found, creating minimal structure")),Y(l,e$1));}catch(g){n.fail(t.red(`Failed: ${g.message}`));return}let f=a.join(i,".premise");(!o.existsSync(f)||s.force)&&(n.start("Creating .premise..."),o.writeFileSync(f,g(e$1)),n.succeed(t.green(".premise created")));let h=a.join(i,".purpose");(!o.existsSync(h)||s.force)&&(n.start("Creating .purpose..."),o.writeFileSync(h,c()),n.succeed(t.green(".purpose created")));let b$1=a.join(i,"portal.yaml");o.existsSync(b$1)||(console.log(t.gray(" \u25CB No portal.yaml (optional - create manually if you need gate/auth definitions)")),console.log(t.gray(" See: https://github.com/a-company/paradigm/blob/main/docs/guides/portals.md")));let p;s.ide?p=["cursor","copilot","windsurf","claude"].includes(s.ide.toLowerCase())?s.ide.toLowerCase():"cursor":(n.start("Detecting IDE..."),p=c$1(i).detected||"cursor",n.succeed(`Using ${t.cyan(p)}`));let y=d(i);if(y){n.start("Generating IDE instructions...");let g=e(i,p,y,true);g.success?n.succeed(t.green(g.message||"IDE instructions generated")):n.warn(t.yellow(g.message));}if(!s.quick){n.start("Creating scan index for MCP tools...");try{await b(i,{quiet:!0}),n.succeed(t.green("Scan index created"));}catch(g){n.warn(t.yellow("Could not create scan index: "+g.message)),console.log(t.gray(" Run `paradigm scan` manually after adding .purpose files"));}}B(p,r),d$1.success("Paradigm initialized",{project:e$1,ide:p});}function V(s,i,e){let n=a.join(s,"config.yaml");if(!o.existsSync(n))return;let d=a$2(i);if(d==="auto")return;let r=o.readFileSync(n,"utf8");r=r.replace(/^discipline:\s*auto\b.*$/m,`discipline: ${d}`);let u=e||g$1(i),l=u?h(u):d$1(d);if(!l){let y=function(){let g=Object.entries(p.symbolMapping).map(([m,x])=>` "${m}": "${x}"`).join(`
|
|
24
|
+
`);r=r.replace(/ symbol-mapping:\n(?:(?: .*| *)\n)*/,` symbol-mapping:
|
|
25
|
+
${g}
|
|
26
|
+
`);let c=p.purposeRequired.map(m=>` - pattern: "${m.pattern}"
|
|
27
|
+
depth: ${m.depth}`).join(`
|
|
28
|
+
`);r=r.replace(/purpose-required:\n(?: - pattern:.*\n depth:.*\n)*/,`purpose-required:
|
|
29
|
+
${c}
|
|
30
|
+
`),o.writeFileSync(n,r,"utf8");};let p=d$1(d);y();return}u&&(r=r.replace(/^(discipline:\s*.+)$/m,`$1
|
|
31
|
+
stack: ${u}`));let f=Object.entries(l.symbolMapping).map(([p,y])=>` "${p}": "${y}"`).join(`
|
|
32
|
+
`);r=r.replace(/ symbol-mapping:\n(?:(?: .*| *)\n)*/,` symbol-mapping:
|
|
33
|
+
${f}
|
|
34
|
+
`);let h$1=l.purposeRequired.map(p=>` - pattern: "${p.pattern}"
|
|
35
|
+
depth: ${p.depth}`).join(`
|
|
36
|
+
`);r=r.replace(/purpose-required:\n(?: - pattern:.*\n depth:.*\n)*/,`purpose-required:
|
|
37
|
+
${h$1}
|
|
38
|
+
`),o.writeFileSync(n,r,"utf8");}function Y(s,i){o.mkdirSync(a.join(s,"specs"),{recursive:true}),o.mkdirSync(a.join(s,"docs"),{recursive:true}),o.mkdirSync(a.join(s,"tasks"),{recursive:true}),o.mkdirSync(a.join(s,"lore"),{recursive:true});let e=`# Paradigm Configuration
|
|
39
|
+
version: "1.0"
|
|
40
|
+
project: "${i}"
|
|
41
|
+
|
|
42
|
+
agent-guidelines:
|
|
43
|
+
overview: |
|
|
44
|
+
This project uses Paradigm for structured AI-assisted development.
|
|
45
|
+
All context, symbols, and specifications live in the .paradigm/ directory.
|
|
46
|
+
how-to-use:
|
|
47
|
+
- "Check .paradigm/specs/ for philosophy and patterns before making changes"
|
|
48
|
+
- "Reference symbols using prefixes: #component ^gate !signal $flow ~aspect"
|
|
49
|
+
- "Use the Paradigm logger instead of raw console.log/print statements"
|
|
50
|
+
- "Check .paradigm/docs/ for command reference and troubleshooting"
|
|
51
|
+
update-rules:
|
|
52
|
+
- "When adding a feature, create/update the nearest .purpose file"
|
|
53
|
+
- "When adding authorization, update portal.yaml"
|
|
54
|
+
- "Always update references when renaming symbols"
|
|
55
|
+
|
|
56
|
+
symbol-system:
|
|
57
|
+
"#":
|
|
58
|
+
name: Component
|
|
59
|
+
description: Any documented code unit (feature, service, module, integration)
|
|
60
|
+
examples: ["#checkout", "#login-handler", "#Button", "#stripe-client"]
|
|
61
|
+
"$":
|
|
62
|
+
name: Flow
|
|
63
|
+
description: Multi-step processes or user journeys
|
|
64
|
+
examples: ["$checkout-flow", "$onboarding", "$auth-flow"]
|
|
65
|
+
"^":
|
|
66
|
+
name: Gate
|
|
67
|
+
description: Access control points and authorization rules
|
|
68
|
+
examples: ["^authenticated", "^admin-only", "^rate-limited"]
|
|
69
|
+
"!":
|
|
70
|
+
name: Signal
|
|
71
|
+
description: Events emitted for side effects
|
|
72
|
+
examples: ["!login-success", "!payment-failed", "!rate-limited"]
|
|
73
|
+
"~":
|
|
74
|
+
name: Aspect
|
|
75
|
+
description: Cross-cutting rules with required code anchors
|
|
76
|
+
examples: ["~audit-required", "~rate-limited", "~cached"]
|
|
77
|
+
|
|
78
|
+
logging:
|
|
79
|
+
enforce: true
|
|
80
|
+
default-level: debug
|
|
81
|
+
|
|
82
|
+
conventions:
|
|
83
|
+
- "Use kebab-case for all symbol IDs (feature-name, not featureName)"
|
|
84
|
+
- "Document flows when logic spans 3+ components"
|
|
85
|
+
- "Reference related items using symbol prefixes (# $ ^ ! ~)"
|
|
86
|
+
- "Update .purpose files when changing feature behavior"
|
|
87
|
+
- "ALWAYS use Paradigm logger, NEVER raw console.log/print"
|
|
88
|
+
`;o.writeFileSync(a.join(s,"config.yaml"),e,"utf8"),N(s);}function N(s){o.writeFileSync(a.join(s,"fixtures.yaml"),`# Test Fixtures for Flow Validation
|
|
89
|
+
# Use with paradigm_test_fixtures MCP tool
|
|
90
|
+
version: "1.0"
|
|
91
|
+
|
|
92
|
+
# User fixtures for authentication testing
|
|
93
|
+
users:
|
|
94
|
+
admin:
|
|
95
|
+
id: "user-admin"
|
|
96
|
+
email: "admin@test.com"
|
|
97
|
+
role: "admin"
|
|
98
|
+
token: "Bearer test-admin-token"
|
|
99
|
+
member:
|
|
100
|
+
id: "user-member"
|
|
101
|
+
email: "member@test.com"
|
|
102
|
+
role: "member"
|
|
103
|
+
token: "Bearer test-member-token"
|
|
104
|
+
outsider:
|
|
105
|
+
id: "user-outsider"
|
|
106
|
+
email: "outsider@test.com"
|
|
107
|
+
token: "Bearer test-outsider-token"
|
|
108
|
+
|
|
109
|
+
# Resource fixtures for entity testing
|
|
110
|
+
resources:
|
|
111
|
+
project:
|
|
112
|
+
id: "project-1"
|
|
113
|
+
name: "Test Project"
|
|
114
|
+
members: ["user-member"]
|
|
115
|
+
admins: ["user-admin"]
|
|
116
|
+
task:
|
|
117
|
+
id: "task-1"
|
|
118
|
+
projectId: "project-1"
|
|
119
|
+
title: "Sample Task"
|
|
120
|
+
assignees: ["user-member"]
|
|
121
|
+
|
|
122
|
+
# Payload fixtures for API testing
|
|
123
|
+
payloads:
|
|
124
|
+
createProject:
|
|
125
|
+
name: "New Project"
|
|
126
|
+
description: "Test project description"
|
|
127
|
+
createTask:
|
|
128
|
+
title: "New Task"
|
|
129
|
+
description: "Task description"
|
|
130
|
+
assignees: []
|
|
131
|
+
updateTask:
|
|
132
|
+
title: "Updated Task"
|
|
133
|
+
status: "in-progress"
|
|
134
|
+
`,"utf8");}export{ne as a};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a}from'./chunk-NKYNHSA5.js';import {v4}from'uuid';import*as c from'path';import*as f from'fs';import {fileURLToPath}from'url';var S={url:"http://localhost:3838",batchSize:50,flushIntervalMs:5e3,maxBufferSize:1e3,maxRetries:3,retryBackoffMs:1e3},I=class{url;service;version;environment;token;batchSize;maxBufferSize;maxRetries;retryBackoffMs;onDrop;onError;sessionId;logBuffer=[];metricsBuffer=[];flushTimer=null;closed=false;beforeUnloadHandler=null;constructor(e){this.url=(e.url??S.url).replace(/\/+$/,""),this.service=e.service,this.version=e.version,this.environment=e.environment,this.token=e.token,this.batchSize=e.batchSize??S.batchSize,this.maxBufferSize=e.maxBufferSize??S.maxBufferSize,this.maxRetries=e.maxRetries??S.maxRetries,this.retryBackoffMs=e.retryBackoffMs??S.retryBackoffMs,this.onDrop=e.onDrop,this.onError=e.onError,this.sessionId=v4();let t=e.flushIntervalMs??S.flushIntervalMs;this.flushTimer=setInterval(()=>{this.flush().catch(r=>{this.handleError(r);});},t),this.flushTimer&&typeof this.flushTimer=="object"&&"unref"in this.flushTimer&&this.flushTimer.unref(),typeof globalThis<"u"&&typeof globalThis.addEventListener=="function"&&(this.beforeUnloadHandler=()=>{this.flushSync();},globalThis.addEventListener("beforeunload",this.beforeUnloadHandler)),this.registerService();}debug(e,t,r){this.log("debug",e,t,r);}info(e,t,r){this.log("info",e,t,r);}warn(e,t,r){this.log("warn",e,t,r);}error(e,t,r){this.log("error",e,t,r);}log(e,t,r,s){if(this.closed)return;let i={level:e,symbol:t,message:r,service:this.service,sessionId:this.sessionId,environment:this.environment,data:s};this.pushToLogBuffer(i);}counter(e,t,r){this.metric({name:e,type:"counter",value:t??1,tags:r});}gauge(e,t,r){this.metric({name:e,type:"gauge",value:t,tags:r});}histogram(e,t,r){this.metric({name:e,type:"histogram",value:t,tags:r});}metric(e){if(this.closed)return;let t={...e,service:this.service,environment:this.environment};this.pushToMetricsBuffer(t);}async pushState(e,t,r){this.closed||await this.post("/api/state",{service:this.service,sessionId:this.sessionId,state:e,activeFlows:t,activeGates:r});}startSpan(e,t,r){let s=r?r.split("-")[0]||v4():v4(),i=v4(),n=new Date().toISOString(),o=Date.now(),a=this;return {traceId:s,spanId:i,async end(l="ok"){let u=new Date().toISOString(),h=Date.now()-o,p={traceId:s,spanId:i,parentSpanId:r,service:a.service,symbol:e,operation:t,startTime:n,endTime:u,durationMs:h,status:l};await a.post("/api/traces",p);}}}async flush(){let e=this.drainLogBuffer(),t=this.drainMetricsBuffer(),r=[];e.length>0&&r.push(this.sendLogs(e)),t.length>0&&r.push(this.sendMetrics(t)),await Promise.allSettled(r);}async close(){if(!this.closed){this.closed=true,this.flushTimer!==null&&(clearInterval(this.flushTimer),this.flushTimer=null),this.beforeUnloadHandler&&typeof globalThis<"u"&&typeof globalThis.removeEventListener=="function"&&(globalThis.removeEventListener("beforeunload",this.beforeUnloadHandler),this.beforeUnloadHandler=null);try{await this.flush();}catch{}}}getSessionId(){return this.sessionId}flushSync(){let e=this.drainLogBuffer(),t=this.drainMetricsBuffer(),r=typeof navigator<"u"&&typeof navigator.sendBeacon=="function"?navigator.sendBeacon.bind(navigator):void 0;r&&(e.length>0&&r(`${this.url}/api/logs`,JSON.stringify({entries:e})),t.length>0&&r(`${this.url}/api/metrics`,JSON.stringify({entries:t})));}registerService(){let e={name:this.service,version:this.version,pid:typeof process<"u"?process.pid:void 0,environment:this.environment};this.post("/api/services",e).catch(()=>{});}pushToLogBuffer(e){if(this.logBuffer.length>=this.maxBufferSize){let t=Math.max(1,Math.floor(this.maxBufferSize*.1));this.logBuffer.splice(0,t),this.onDrop&&this.onDrop(t);}this.logBuffer.push(e),this.logBuffer.length>=this.batchSize&&this.flush().catch(t=>{this.handleError(t);});}pushToMetricsBuffer(e){if(this.metricsBuffer.length>=this.maxBufferSize){let t=Math.max(1,Math.floor(this.maxBufferSize*.1));this.metricsBuffer.splice(0,t),this.onDrop&&this.onDrop(t);}this.metricsBuffer.push(e),this.metricsBuffer.length>=this.batchSize&&this.flush().catch(t=>{this.handleError(t);});}drainLogBuffer(){let e=this.logBuffer;return this.logBuffer=[],e}drainMetricsBuffer(){let e=this.metricsBuffer;return this.metricsBuffer=[],e}async sendLogs(e){try{await this.post("/api/logs",{entries:e});}catch(t){let r=this.maxBufferSize-this.logBuffer.length;if(r>0){let s=e.slice(0,r);this.logBuffer.unshift(...s);let i=e.length-s.length;i>0&&this.onDrop&&this.onDrop(i);}else this.onDrop&&this.onDrop(e.length);throw t}}async sendMetrics(e){try{await this.post("/api/metrics",{entries:e});}catch(t){let r=this.maxBufferSize-this.metricsBuffer.length;if(r>0){let s=e.slice(0,r);this.metricsBuffer.unshift(...s);let i=e.length-s.length;i>0&&this.onDrop&&this.onDrop(i);}else this.onDrop&&this.onDrop(e.length);throw t}}async post(e,t){let r=this.getFetch();if(!r)return;let s=`${this.url}${e}`,i={"Content-Type":"application/json"};this.token&&(i.Authorization=`Bearer ${this.token}`);let n;for(let o=0;o<=this.maxRetries;o++)try{let a=await r(s,{method:"POST",headers:i,body:JSON.stringify(t)});if(a.status>=400&&a.status<500){let l=await a.text().catch(()=>""),u=new Error(`Sentinel server returned ${a.status}: ${l}`);this.handleError(u);return}if(a.status>=500){let l=await a.text().catch(()=>"");if(n=new Error(`Sentinel server returned ${a.status}: ${l}`),o<this.maxRetries){await this.backoff(o);continue}throw this.handleError(n),n}return (a.headers.get("content-type")||"").includes("application/json")?await a.json():void 0}catch(a){if(n=a instanceof Error?a:new Error(String(a)),o<this.maxRetries){await this.backoff(o);continue}throw this.handleError(n),n}if(n)throw n}getFetch(){if(typeof globalThis<"u"&&typeof globalThis.fetch=="function")return globalThis.fetch}backoff(e){let t=this.retryBackoffMs*Math.pow(2,e),r=Math.floor(Math.random()*t*.25);return new Promise(s=>setTimeout(s,t+r))}handleError(e){if(this.onError){let t=e instanceof Error?e:new Error(String(e));this.onError(t);}}};function R(e){return new I(e)}var T=class{client;constructor(e){this.client=e;}send(e){this.client.log(e.level,e.symbol,e.message,{...e.data,symbolType:e.symbolType,correlationId:e.correlationId});}};function $(e){let t=e instanceof I?e:new I(e);return new T(t)}function B(e,t){let r=$(t);return e.addTransport(r),r}var j={minScore:30,maxResults:5,boostConfidence:true},k=class{constructor(e){this.storage=e;}match(e,t={}){let{minScore:r,maxResults:s,boostConfidence:i}={...j,...t},n=this.storage.getAllPatterns({includePrivate:true}),o=[];for(let a of n){if(!this.matchEnvironment(a,e))continue;let{score:l,matchedCriteria:u}=this.scoreMatch(a,e);if(l>=r){let h=l;if(i){let p=a.confidence.score/100;h=l*(.5+.5*p);}o.push({pattern:a,score:l,matchedCriteria:u,confidence:Math.round(h)}),this.storage.updatePatternConfidence(a.id,"matched");}}return o.sort((a,l)=>l.confidence-a.confidence).slice(0,s)}testPattern(e,t=100){let r=this.storage.getRecentIncidents({limit:t}),s=[],i=0;for(let n of r){if(!this.matchEnvironment(e,n))continue;let{score:o}=this.scoreMatch(e,n);o>=30&&(s.push(n),i+=o);}return {wouldMatch:s,matchCount:s.length,avgScore:s.length>0?Math.round(i/s.length):0}}scoreMatch(e,t){let r=0,s={symbols:[],errorKeywords:[],missingSignals:[]},i=this.matchSymbols(e.pattern.symbols,t.symbols,s.symbols);r+=Math.min(i,50);let n=this.matchErrorText(e,t,s.errorKeywords);r+=Math.min(n,25);let o=this.matchMissingSignals(e,t,s.missingSignals);return r+=Math.min(o,25),r=Math.min(r,100),{score:r,matchedCriteria:s}}matchSymbols(e,t,r){let s=0,i=["feature","component","flow","gate","signal","state","integration"];for(let n of i){let o=e[n],a=t[n];if(!(!o||!a)){if(typeof o=="string")this.matchSingleSymbol(o,a)&&(s+=o.includes("*")?5:10,r.push(n));else if(Array.isArray(o)){for(let l of o)if(this.matchSingleSymbol(l,a)){s+=7,r.push(n);break}}}}return s}matchSingleSymbol(e,t){if(e==="*")return true;if(e.endsWith("*")){let r=e.slice(0,-1);return t.startsWith(r)}if(e.startsWith("*")){let r=e.slice(1);return t.endsWith(r)}return e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(t):e===t}matchErrorText(e,t,r){let s=0,i=t.error.message.toLowerCase(),n=t.error.type?.toLowerCase();if(e.pattern.errorContains)for(let o of e.pattern.errorContains)i.includes(o.toLowerCase())&&(s+=5,r.push(o));if(e.pattern.errorMatches)try{new RegExp(e.pattern.errorMatches,"i").test(t.error.message)&&(s+=10,r.push(`regex:${e.pattern.errorMatches}`));}catch{}if(e.pattern.errorType&&n)for(let o of e.pattern.errorType)n.includes(o.toLowerCase())&&(s+=5,r.push(`type:${o}`));return s}matchMissingSignals(e,t,r){if(!e.pattern.missingSignals||!t.flowPosition?.missing)return 0;let s=0;for(let i of e.pattern.missingSignals)for(let n of t.flowPosition.missing)if(this.matchSingleSymbol(i,n)){s+=12,r.push(n);break}return s}matchEnvironment(e,t){return !e.pattern.environment||e.pattern.environment.length===0?true:e.pattern.environment.includes(t.environment)}},F=fileURLToPath(import.meta.url),E=c.dirname(F);function L(){let e=c.join(E,"universal-patterns.json"),t=f.readFileSync(e,"utf-8");return JSON.parse(t)}function O(){let e=c.join(E,"paradigm-patterns.json"),t=f.readFileSync(e,"utf-8");return JSON.parse(t)}function z(){let e=L(),t=O();return {version:"1.0.0",exportedAt:new Date().toISOString(),patterns:[...e.patterns,...t.patterns]}}function v(e,t){return e.startsWith(t)?e:`${t}${e}`}var H=class{flowId;sentinel;actual=[];expected=[];completed=false;constructor(e,t){this.flowId=v(e,"$"),this.sentinel=t;}expect(...e){return this.expected.push(...e),this}step(e){return this.actual.push(e),this}gate(e,t){let r=v(e,"^");return this.actual.push(r),t||this.fail(new Error(`Gate ${r} failed`)),this}signal(e,t){return this.actual.push(v(e,"!")),this}complete(){this.completed=true;}fail(e){if(this.completed)return;this.completed=true;let t=this.expected.filter(i=>!this.actual.includes(i)),r=this.actual.length>0?this.actual[this.actual.length-1]:void 0,s={flowId:this.flowId,expected:this.expected,actual:this.actual,missing:t,failedAt:r};this.sentinel.capture(e,{flow:this.flowId},s);}},oe=class{storage;matcher;config;ready=false;readyPromise=null;seeded=false;constructor(e){this.config=e,this.storage=new a(e.dbPath),this.matcher=new k(this.storage);}async init(){if(!this.ready)return this.readyPromise?this.readyPromise:(this.readyPromise=this.doInit(),this.readyPromise)}async doInit(){if(await this.storage.ensureReady(),!this.seeded){try{let{patterns:e}=z();for(let t of e)try{this.storage.addPattern(t);}catch{}}catch{}this.seeded=true;}this.ready=true;}ensureReady(){this.ready||this.readyPromise||(this.readyPromise=this.doInit());}component(e){let t=v(e,"#"),r=this;return {id:t,capture(s,i){return r.capture(s,{component:t,...i})},wrap(s){return((...i)=>{try{let n=s(...i);return n&&typeof n.catch=="function"?n.catch(o=>{throw r.capture(o,{component:t}),o}):n}catch(n){throw n instanceof Error&&r.capture(n,{component:t}),n}})}}}gate(e,t){if(!t){let r=v(e,"^");this.capture(new Error(`Gate ${r} failed`),{gate:r});}}signal(e,t){v(e,"!");}flow(e){return new H(e,this)}capture(e,t,r){this.ensureReady();let s={error:{message:e.message,stack:e.stack,type:e.constructor.name!=="Error"?e.constructor.name:void 0},symbols:t||{},environment:this.config.environment||"development",service:this.config.service,version:this.config.version,flowPosition:r},i=this.storage.recordIncident(s),n=this.storage.getIncident(i);return n&&this.config.onCapture&&this.config.onCapture(n),i}match(e){let t=this.storage.getIncident(e);return t?this.matcher.match(t):[]}express(){let e=this;return (t,r,s,i)=>{let n={},o=(r.path||r.url||"").split("/").filter(Boolean);o.length>=2&&(n.component=`#${o[1]}`);let a=e.capture(t,n);s.setHeader&&s.setHeader("X-Sentinel-Incident",a),i(t);}}close(){this.storage.close(),this.ready=false,this.readyPromise=null;}getStorage(){return this.storage}getMatcher(){return this.matcher}},G=[{dirs:["services","src/services"],prefix:"#",type:"components"},{dirs:["routes","src/routes","api","src/api"],prefix:"#",type:"components"},{dirs:["handlers","src/handlers"],prefix:"#",type:"components"},{dirs:["controllers","src/controllers"],prefix:"#",type:"components"},{dirs:["components","src/components"],prefix:"#",type:"components"},{dirs:["lib","src/lib"],prefix:"#",type:"components"},{dirs:["middleware","src/middleware"],prefix:"^",type:"gates"},{dirs:["guards","src/guards"],prefix:"^",type:"gates"},{dirs:["auth","src/auth"],prefix:"^",type:"gates"},{dirs:["events","src/events"],prefix:"!",type:"signals"},{dirs:["listeners","src/listeners"],prefix:"!",type:"signals"},{dirs:["flows","src/flows"],prefix:"$",type:"flows"},{dirs:["workflows","src/workflows"],prefix:"$",type:"flows"},{dirs:["pipelines","src/pipelines"],prefix:"$",type:"flows"}],C=new Set([".ts",".js",".tsx",".jsx",".mjs",".mts"]);function W(e){let t={components:[],gates:[],flows:[],signals:[],routes:{}},r=U(e);r&&(t.components.push(...r.components),t.gates.push(...r.gates),t.flows.push(...r.flows),t.signals.push(...r.signals));for(let s of G)for(let i of s.dirs){let n=c.join(e,i);if(!f.existsSync(n))continue;let o=P(n);for(let a of o){let l=c.extname(a);if(!C.has(l))continue;let u=c.basename(a,l);if(u==="index"||u.endsWith(".test")||u.endsWith(".spec"))continue;let h=`${s.prefix}${M(u)}`;t[s.type].includes(h)||t[s.type].push(h);}}return _(e,t),t}function ae(e){let t=W(e);return {version:"1.0",project:c.basename(e),symbols:{components:t.components.length>0?t.components:void 0,gates:t.gates.length>0?t.gates:void 0,flows:t.flows.length>0?t.flows:void 0,signals:t.signals.length>0?t.signals:void 0},routes:Object.keys(t.routes).length>0?t.routes:void 0}}function U(e){let t=c.join(e,".paradigm");if(!f.existsSync(t))return null;let r={components:[],gates:[],flows:[],signals:[],routes:{}},s=D(e,".purpose");for(let i of s)try{let n=f.readFileSync(i,"utf-8");N(n,r);}catch{}return r.components.length>0||r.gates.length>0||r.flows.length>0||r.signals.length>0?r:null}function N(e,t){let r=e.split(`
|
|
3
|
+
`),s="";for(let i of r){let n=i.trim();if(n==="components:"||n==="features:"){s="components";continue}if(n==="gates:"){s="gates";continue}if(n==="flows:"){s="flows";continue}if(n==="signals:"){s="signals";continue}if(s&&/^\s{2}\S/.test(i)){let o=n.match(/^([a-zA-Z][\w-]*):$/);if(o){let a=`${{components:"#",gates:"^",flows:"$",signals:"!"}[s]||"#"}${o[1]}`;t[s]?.includes(a)||t[s]?.push(a);}}n&&!i.startsWith(" ")&&!n.endsWith(":")&&(s="");}}function _(e,t){let r=["routes","src/routes","api","src/api"];for(let s of r){let i=c.join(e,s);if(!f.existsSync(i))continue;let n=P(i);for(let o of n){let a=c.extname(o);if(!C.has(a))continue;let l=c.basename(o,a);if(l==="index")continue;let u=`/api/${M(l)}`,h=`#${M(l)}`;t.routes[u]=h;}}}function M(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").replace(/\..*$/,"").toLowerCase()}function P(e){try{return f.readdirSync(e).filter(t=>{let r=c.join(e,t);try{return f.statSync(r).isFile()}catch{return !1}})}catch{return []}}function D(e,t,r=4,s=0){if(s>r)return [];let i=[],n=new Set(["node_modules","dist",".git","coverage",".next",".nuxt"]);try{let o=f.readdirSync(e,{withFileTypes:!0});for(let a of o)a.isFile()&&a.name===t?i.push(c.join(e,a.name)):a.isDirectory()&&!n.has(a.name)&&i.push(...D(c.join(e,a.name),t,r,s+1));}catch{}return i}var le=class{constructor(e,t){this.storage=e,this.similarityThreshold=t?.similarityThreshold??.6,this.decayHalfLifeDays=t?.decayHalfLifeDays??14,this.useStackFingerprint=t?.useStackFingerprint??true;}similarityThreshold;decayHalfLifeDays;useStackFingerprint;group(e){let t=this.storage.getGroups({limit:100});for(let s of t)if(this.shouldJoinGroup(e,s))return this.storage.addToGroup(s.id,e.id),s.id;let r=this.findSimilar(e,10);if(r.length>=1){let s=this.extractCommonSymbols([e,...r]),i=this.extractCommonErrorPatterns([e,...r]);return this.storage.createGroup({incidents:[e.id,...r.map(n=>n.id)],commonSymbols:s,commonErrorPatterns:i,firstSeen:this.getEarliestTimestamp([e,...r]),lastSeen:e.timestamp,environments:this.getUniqueEnvironments([e,...r])})}return null}findSimilar(e,t=10){let r=this.storage.getRecentIncidents({limit:500,status:"all"}),s=[];for(let i of r){if(i.id===e.id)continue;let n=this.calculateSimilarity(e,i);n>=this.similarityThreshold&&s.push({incident:i,score:n});}return s.sort((i,n)=>n.score-i.score).slice(0,t).map(i=>i.incident)}analyzeAndGroup(e={}){let t=e.minSize||3,r=this.storage.getRecentIncidents({limit:1e3}).filter(n=>!n.groupId),s=[],i=new Set;for(let n of r){if(i.has(n.id))continue;let o=r.filter(a=>a.id!==n.id&&!i.has(a.id)&&this.calculateSimilarity(n,a)>=this.similarityThreshold);if(o.length+1>=t){let a=[n,...o],l=this.extractCommonSymbols(a),u=this.extractCommonErrorPatterns(a),h=this.storage.createGroup({incidents:a.map(m=>m.id),commonSymbols:l,commonErrorPatterns:u,firstSeen:this.getEarliestTimestamp(a),lastSeen:this.getLatestTimestamp(a),environments:this.getUniqueEnvironments(a)});for(let m of a)i.add(m.id);let p=this.storage.getGroup(h);p&&s.push(p);}}return s}calculateSimilarity(e,t){let r=0,s=0,i=this.useStackFingerprint&&e.error.stack&&t.error.stack,n=i?.45:.6,o=i?.25:.3,a=.1,l=i?.2:0,u=["feature","component","flow","gate","signal","state","integration"];for(let g of u){let y=e.symbols[g],b=t.symbols[g];(y||b)&&(s+=n/u.length,y===b&&(r+=n/u.length));}let h=this.stringSimilarity(e.error.message,t.error.message);if(r+=o*h,s+=o,e.environment===t.environment&&(r+=a),s+=a,i){let g=this.fingerprintStack(e.error.stack),y=this.fingerprintStack(t.error.stack),b=this.compareFingerprints(g,y);r+=l*b,s+=l;}let p=s>0?r/s:0,m=Math.abs(new Date(e.timestamp).getTime()-new Date(t.timestamp).getTime())/(1e3*60*60*24),d=Math.pow(.5,m/this.decayHalfLifeDays);return p*d}fingerprintStack(e){return e.split(`
|
|
4
|
+
`).filter(t=>t.trim().startsWith("at ")).slice(0,10).map(t=>t.trim().replace(/:\d+:\d+\)?$/,"").replace(/\(.*[/\\]/,"(").replace(/^\s*at\s+/,""))}compareFingerprints(e,t){if(e.length===0&&t.length===0)return 1;if(e.length===0||t.length===0)return 0;let r=0,s=Math.max(e.length,t.length);for(let i=0;i<Math.min(e.length,t.length);i++)e[i]===t[i]&&r++;return r/s}stringSimilarity(e,t){let r=Math.max(e.length,t.length);return r===0?1:1-this.levenshteinDistance(e.toLowerCase(),t.toLowerCase())/r}levenshteinDistance(e,t){if(e.length===0)return t.length;if(t.length===0)return e.length;let r=[];for(let s=0;s<=t.length;s++)r[s]=[s];for(let s=0;s<=e.length;s++)r[0][s]=s;for(let s=1;s<=t.length;s++)for(let i=1;i<=e.length;i++){let n=e[i-1]===t[s-1]?0:1;r[s][i]=Math.min(r[s-1][i]+1,r[s][i-1]+1,r[s-1][i-1]+n);}return r[t.length][e.length]}shouldJoinGroup(e,t){let r=0,s=0;for(let[a,l]of Object.entries(t.commonSymbols))l&&(s++,e.symbols[a]===l&&r++);if(s===0)return false;let i=r/s,n=e.error.message.toLowerCase(),o=t.commonErrorPatterns.some(a=>n.includes(a.toLowerCase()));return i>=.5||o}extractCommonSymbols(e){if(e.length===0)return {};let t=e[0].symbols,r={};for(let[s,i]of Object.entries(t))i&&e.every(n=>n.symbols[s]===i)&&(r[s]=i);return r}extractCommonErrorPatterns(e){if(e.length===0)return [];let t=new Map,r=new Set(["the","a","an","is","are","was","were","in","on","at","to","for","of","with","error","failed","cannot"]);for(let i of e){let n=i.error.message.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(a=>a.length>2&&!r.has(a)),o=new Set(n);for(let a of o)t.set(a,(t.get(a)||0)+1);}let s=Math.ceil(e.length*.6);return Array.from(t.entries()).filter(([,i])=>i>=s).map(([i])=>i).slice(0,5)}getEarliestTimestamp(e){return e.reduce((t,r)=>r.timestamp<t?r.timestamp:t,e[0].timestamp)}getLatestTimestamp(e){return e.reduce((t,r)=>r.timestamp>t?r.timestamp:t,e[0].timestamp)}getUniqueEnvironments(e){return [...new Set(e.map(t=>t.environment))]}},ue=class{build(e){if(!e.flowPosition)return null;let t=[],r=new Date(e.timestamp).getTime();t.push({timestamp:new Date(r-5e3).toISOString(),symbol:e.flowPosition.flowId,type:"flow-started"});let s=1e3;for(let n of e.flowPosition.actual){let o=this.inferEventType(n);t.push({timestamp:new Date(r-4e3+s).toISOString(),symbol:n,type:o}),s+=Math.random()*1e3+500;}let i=e.flowPosition.failedAt||e.flowPosition.missing[0]||e.symbols.gate||e.symbols.signal||"unknown";return t.push({timestamp:e.timestamp,symbol:i,type:"error",data:{message:e.error.message,missing:e.flowPosition.missing}}),{incidentId:e.id,flowId:e.flowPosition.flowId,events:t,failure:{at:e.timestamp,symbol:i,reason:e.error.message}}}renderAscii(e){let t=[];t.push(`${e.flowId} Timeline`),t.push("\u2550".repeat(40)),t.push("");for(let s of e.events){let i=this.formatTime(s.timestamp),n=this.getEventIcon(s.type),o=this.getEventStatus(s.type),a=`${i} ${n} ${s.symbol}`;o&&(a+=` (${o})`),t.push(a),s.type==="error"&&s.data&&(t.push(` \u2514\u2500 ${s.data.message}`),s.data.missing&&Array.isArray(s.data.missing)&&s.data.missing.length>0&&t.push(` \u2514\u2500 Expected: ${s.data.missing.join(", ")}`));}let r=e.events.find(s=>s.type==="error")?.data?.missing;return r&&r.length>0&&(t.push(""),t.push(`Missing signals: ${r.join(", ")}`)),t.join(`
|
|
5
|
+
`)}renderStructured(e){return {incidentId:e.incidentId,flow:{id:e.flowId,eventCount:e.events.length},events:e.events.map(t=>({time:this.formatTime(t.timestamp),symbol:t.symbol,type:t.type,status:this.getEventStatus(t.type),data:t.data})),failure:{at:this.formatTime(e.failure.at),symbol:e.failure.symbol,reason:e.failure.reason}}}inferEventType(e){return e.startsWith("^")?"gate-passed":e.startsWith("!")?"signal-emitted":e.startsWith("%")?"state-changed":"signal-emitted"}getEventIcon(e){switch(e){case "flow-started":return "\u25B6";case "flow-ended":return "\u25A0";case "gate-passed":return "\u2713";case "gate-failed":return "\u2717";case "signal-emitted":return "\u26A1";case "state-changed":return "\u25C6";case "error":return "\u2717";default:return "\u2022"}}getEventStatus(e){switch(e){case "gate-passed":return "PASSED";case "gate-failed":return "FAILED";case "signal-emitted":return "EMITTED";case "state-changed":return "CHANGED";case "error":return "ERROR";default:return ""}}formatTime(e){let t=new Date(e),r=String(t.getHours()).padStart(2,"0"),s=String(t.getMinutes()).padStart(2,"0"),i=String(t.getSeconds()).padStart(2,"0"),n=String(t.getMilliseconds()).padStart(3,"0");return `${r}:${s}:${i}.${n}`}},ce=class{constructor(e){this.storage=e;}getStats(e=7){let t=new Date().toISOString(),r=new Date(Date.now()-e*24*60*60*1e3).toISOString();return this.storage.getStats({start:r,end:t})}getSymbolHealth(e){return this.storage.getSymbolHealth(e)}getTrendingIssues(e=7){let t=Date.now(),r=e*24*60*60*1e3/2,s=new Date(t-e*24*60*60*1e3).toISOString(),i=new Date(t-r).toISOString(),n=new Date(t).toISOString(),o=this.storage.getRecentIncidents({dateFrom:s,dateTo:i,limit:1e3}),a=this.storage.getRecentIncidents({dateFrom:i,dateTo:n,limit:1e3}),l=this.countSymbols(o),u=this.countSymbols(a),h=[],p=new Set([...l.keys(),...u.keys()]);for(let m of p){let d=l.get(m)||0,g=u.get(m)||0;if(d===0&&g>0)h.push({symbol:m,trend:g*100});else if(d>0){let y=(g-d)/d*100;h.push({symbol:m,trend:y});}}return h.filter(m=>m.trend>0).sort((m,d)=>d.trend-m.trend).slice(0,10)}getResolutionMetrics(){let e=this.getStats(30);return {avgTimeToResolve:e.resolution.avgTimeToResolve,resolvedWithPattern:e.resolution.resolvedWithPattern,resolvedManually:e.resolution.resolvedManually,totalResolved:e.incidents.resolved,resolutionRate:e.resolution.resolutionRate}}getPatternEffectiveness(){return this.storage.getAllPatterns({includePrivate:true}).filter(e=>e.confidence.timesMatched>0).map(e=>({patternId:e.id,name:e.name,matches:e.confidence.timesMatched,resolutions:e.confidence.timesResolved,recurrences:e.confidence.timesRecurred,effectiveness:e.confidence.timesMatched>0?Math.round((e.confidence.timesResolved-e.confidence.timesRecurred)/e.confidence.timesMatched*100):0})).sort((e,t)=>t.effectiveness-e.effectiveness)}getIncidentsByHour(e=7){let t=new Date(Date.now()-e*24*60*60*1e3).toISOString(),r=this.storage.getRecentIncidents({dateFrom:t,limit:1e4}),s=new Map;for(let i=0;i<24;i++)s.set(i,0);for(let i of r){let n=new Date(i.timestamp).getHours();s.set(n,(s.get(n)||0)+1);}return Array.from(s.entries()).map(([i,n])=>({hour:i,count:n}))}getIncidentsByEnvironment(){let e=this.getStats(30),t=e.incidents.total;return Object.entries(e.incidents.byEnvironment).map(([r,s])=>({environment:r,count:s,percentage:t>0?Math.round(s/t*100):0})).sort((r,s)=>s.count-r.count)}getSymbolCorrelation(){let e=this.storage.getRecentIncidents({limit:1e3}),t=new Map,r=new Map;for(let i of e){let n=this.getSymbolsFromIncident(i);for(let o of n)r.set(o,(r.get(o)||0)+1);for(let o=0;o<n.length;o++)for(let a=o+1;a<n.length;a++){let l=[n[o],n[a]].sort().join("|");t.set(l,(t.get(l)||0)+1);}}let s=[];for(let[i,n]of t){let[o,a]=i.split("|"),l=r.get(o)||1,u=r.get(a)||1,h=n/Math.max(l,u);h>.3&&s.push({symbol1:o,symbol2:a,correlation:Math.round(h*100)/100});}return s.sort((i,n)=>n.correlation-i.correlation).slice(0,20)}generateDashboard(e=7){let t=this.getStats(e),r=[];r.push("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),r.push("\u2551 PARADIGM SENTINEL DASHBOARD \u2551"),r.push("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563");let s=t.incidents.byDay[t.incidents.byDay.length-1]?.count||0;r.push(`\u2551 Open: ${String(t.incidents.open).padEnd(4)} \u2502 Investigating: ${String(t.incidents.total-t.incidents.open-t.incidents.resolved).padEnd(3)} \u2502 Resolved: ${String(t.incidents.resolved).padEnd(4)} \u2502 Today: +${s} \u2551`),r.push("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),r.push(""),r.push("Incidents by Day (last 7 days):"),r.push("\u2500".repeat(50));let i=Math.max(...t.incidents.byDay.map(n=>n.count),1);for(let n of t.incidents.byDay.slice(-7)){let o=Math.round(n.count/i*30),a="\u2588".repeat(o);r.push(`${n.date.substring(5)} ${a} ${n.count}`);}r.push(""),r.push("Most Affected Symbols:"),r.push("\u2500".repeat(50));for(let{symbol:n,count:o}of t.symbols.mostIncidents.slice(0,5))r.push(` ${n.padEnd(25)} ${o} incidents`);r.push(""),r.push("Top Patterns:"),r.push("\u2500".repeat(50));for(let{patternId:n,resolvedCount:o}of t.patterns.mostEffective.slice(0,5))r.push(` ${n.padEnd(25)} ${o} resolved`);return r.push(""),r.push("Resolution Stats:"),r.push("\u2500".repeat(50)),r.push(` Resolution rate: ${Math.round(t.resolution.resolutionRate)}%`),r.push(` With pattern: ${t.resolution.resolvedWithPattern}`),r.push(` Manual: ${t.resolution.resolvedManually}`),r.join(`
|
|
6
|
+
`)}countSymbols(e){let t=new Map;for(let r of e)for(let[,s]of Object.entries(r.symbols))s&&t.set(s,(t.get(s)||0)+1);return t}getSymbolsFromIncident(e){let t=[];for(let[,r]of Object.entries(e.symbols))r&&t.push(r);return t}},he=class{constructor(e=process.cwd()){this.projectRoot=e;}symbolCache=new Map;purposeCache=new Map;enrich(e){let t={};for(let[,s]of Object.entries(e.symbols))if(s){let i=this.getSymbolContext(s);i&&Object.keys(i).length>0&&(t[s]=i);}let r;return e.symbols.flow&&(r=this.getSymbolContext(e.symbols.flow)?.description),{...e,enriched:{symbols:t,flowDescription:r}}}getSymbolContext(e){let t=this.symbolCache.get(e);if(t)return t;let r={},s=this.findInSymbolIndex(e);s&&(r.description=s.description,r.definedIn=s.file,r.references=s.references,r.referencedBy=s.referencedBy);let i=this.findInPurposeFiles(e);return i&&(!r.description&&i.description&&(r.description=i.description),i.references&&(r.references=[...new Set([...r.references||[],...i.references])]),i.referencedBy&&(r.referencedBy=[...new Set([...r.referencedBy||[],...i.referencedBy])])),this.symbolCache.set(e,r),r}findInSymbolIndex(e){let t=c.join(this.projectRoot,".paradigm","index.json");if(!f.existsSync(t))return null;try{let r=f.readFileSync(t,"utf-8"),s=JSON.parse(r);return s.symbols&&Array.isArray(s.symbols)&&s.symbols.find(i=>i.id===e)||null}catch{return null}}findInPurposeFiles(e){let t=this.getSearchPathsForSymbol(e);for(let r of t){let s=c.join(this.projectRoot,r);if(!f.existsSync(s))continue;let i=this.purposeCache.get(s);if(i){if(i.symbol===e)return i;continue}try{let n=f.readFileSync(s,"utf-8"),o=this.parsePurposeFile(n);if(this.purposeCache.set(s,o),o.symbol===e)return o}catch{continue}}return null}getSearchPathsForSymbol(e){let t=[],r=e.replace(/^[@#$%^!&~?]/,""),s={"@":["features","src/features"],"#":["components","src/components"],$:["flows","src/flows"],"^":["middleware","gates","src/middleware"],"!":["signals","events","src/signals"],"%":["state","store","src/state"],"&":["integrations","services","src/integrations"]},i=e[0],n=s[i]||[];for(let o of n)t.push(c.join(o,r,".purpose")),t.push(c.join(o,`${r}.purpose`));return t.push(c.join(".paradigm","purposes",`${r}.yaml`)),t.push(c.join(".paradigm","purposes",`${r}.json`)),t}parsePurposeFile(e){let t={},r=e.split(`
|
|
7
|
+
`);for(let s of r){let i=s.trim();i.startsWith("symbol:")?t.symbol=i.substring(7).trim():i.startsWith("description:")?t.description=i.substring(12).trim():i.startsWith("purpose:")&&(t.description=i.substring(8).trim());}if(!t.description){let s=r.find(i=>i.trim()&&!i.startsWith("#"));s&&(t.description=s.trim());}return t}clearCache(){this.symbolCache.clear(),this.purposeCache.clear();}enrichBatch(e){return e.map(t=>this.enrich(t))}},fe=class{constructor(e){this.storage=e;}suggestFromIncident(e){let t=this.generatePatternId(e),r=this.buildSymbolCriteria(e.symbols),s=this.extractErrorKeywords(e.error.message);return {id:t,name:this.generatePatternName(e),description:`Auto-suggested pattern from incident ${e.id}`,pattern:{symbols:r,errorContains:s.length>0?s:void 0,missingSignals:e.flowPosition?.missing},resolution:{description:e.resolution?.notes||"Resolution approach TBD",strategy:this.inferStrategy([e]),priority:"medium"},source:"suggested",private:false,tags:this.generateTags(e)}}suggestFromGroup(e){let t=`group-${e.id.toLowerCase().replace(/[^a-z0-9]/g,"-")}`,r=this.buildSymbolCriteria(e.commonSymbols),s=e.incidents.slice(0,20).map(i=>this.storage.getIncident(i)).filter(i=>i!=null);return {id:t,name:e.name||`Pattern from group ${e.id}`,description:`Auto-suggested pattern from incident group with ${e.count} incidents`,pattern:{symbols:r,errorContains:e.commonErrorPatterns.length>0?e.commonErrorPatterns:void 0},resolution:{description:"Resolution approach TBD based on grouped incidents",strategy:s.length>0?this.inferStrategy(s):"fix-code",priority:this.getPriorityFromCount(e.count)},source:"suggested",private:false,tags:this.generateTagsFromGroup(e)}}findPatternCandidates(e=3){let t=this.storage.getRecentIncidents({limit:1e3,status:"resolved"}),r=new Map;for(let i of t){let n=this.getSymbolSignature(i.symbols),o=r.get(n)||[];o.push(i),r.set(n,o);}let s=[];for(let[,i]of r)if(i.length>=e){if(this.hasMatchingPattern(i[0]))continue;let n=this.suggestFromIncidents(i);s.push({incidents:i,suggestedPattern:n,occurrenceCount:i.length});}return s.sort((i,n)=>n.occurrenceCount-i.occurrenceCount)}suggestFromIncidents(e){let t=this.extractCommonSymbols(e),r=this.buildSymbolCriteria(t),s=this.extractCommonErrorKeywords(e),i=this.extractCommonMissingSignals(e);return {id:this.generatePatternId(e[0]),name:this.generatePatternName(e[0]),description:`Auto-suggested pattern from ${e.length} similar incidents`,pattern:{symbols:r,errorContains:s.length>0?s:void 0,missingSignals:i.length>0?i:void 0},resolution:{description:"Resolution approach based on previous resolutions",strategy:this.inferStrategy(e),priority:this.getPriorityFromCount(e.length)},source:"suggested",private:false,tags:this.generateTagsFromIncidents(e)}}buildSymbolCriteria(e){let t={};for(let[r,s]of Object.entries(e))s&&(t[r]=s);return t}extractErrorKeywords(e){let t=new Set(["the","a","an","is","are","was","were","in","on","at","to","for","of","with","and","or","but","not","no","be","been","have","has","had","do","does","did"]),r=e.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(s=>s.length>2&&!t.has(s));return [...new Set(r)].slice(0,5)}extractCommonErrorKeywords(e){let t=new Map;for(let s of e){let i=this.extractErrorKeywords(s.error.message);for(let n of i)t.set(n,(t.get(n)||0)+1);}let r=Math.ceil(e.length*.5);return Array.from(t.entries()).filter(([,s])=>s>=r).map(([s])=>s).slice(0,5)}extractCommonSymbols(e){if(e.length===0)return {};let t=e[0].symbols,r={};for(let[s,i]of Object.entries(t))i&&e.every(n=>n.symbols[s]===i)&&(r[s]=i);return r}extractCommonMissingSignals(e){let t=new Map;for(let s of e)if(s.flowPosition?.missing)for(let i of s.flowPosition.missing)t.set(i,(t.get(i)||0)+1);let r=Math.ceil(e.length*.5);return Array.from(t.entries()).filter(([,s])=>s>=r).map(([s])=>s)}generatePatternId(e){let t=[];e.symbols.gate?t.push(e.symbols.gate.replace(/[^a-z0-9]/gi,"")):e.symbols.feature?t.push(e.symbols.feature.replace(/[^a-z0-9]/gi,"")):e.symbols.component?t.push(e.symbols.component.replace(/[^a-z0-9]/gi,"")):e.symbols.integration?t.push(e.symbols.integration.replace(/[^a-z0-9]/gi,"")):t.push("unknown");let r=e.error.type?.toLowerCase()||"error";return t.push(r.replace(/[^a-z0-9]/gi,"")),t.push(String(Date.now()%1e3).padStart(3,"0")),t.join("-")}generatePatternName(e){let t=[];if(e.symbols.feature&&t.push(e.symbols.feature.replace("@","").replace(/-/g," ")),e.symbols.gate&&t.push("gate "+e.symbols.gate.replace("^","")),e.error.type&&t.push(e.error.type),t.length===0)return "Unnamed Pattern";let r=t.join(" - ");return r.charAt(0).toUpperCase()+r.slice(1)}generateTags(e){let t=[];return e.symbols.feature&&t.push("feature"),e.symbols.gate&&t.push("gate"),e.symbols.integration&&(t.push("integration"),t.push(e.symbols.integration.replace("&",""))),e.error.type&&t.push(e.error.type.toLowerCase()),t.push(e.environment),[...new Set(t)].slice(0,5)}generateTagsFromGroup(e){let t=["grouped"];e.commonSymbols.feature&&t.push("feature"),e.commonSymbols.gate&&t.push("gate"),e.commonSymbols.integration&&t.push("integration");for(let r of e.environments)t.push(r);return [...new Set(t)].slice(0,5)}generateTagsFromIncidents(e){let t=new Map;for(let r of e){let s=this.generateTags(r);for(let i of s)t.set(i,(t.get(i)||0)+1);}return Array.from(t.entries()).sort((r,s)=>s[1]-r[1]).slice(0,5).map(([r])=>r)}getSymbolSignature(e){let t=[];return e.feature&&t.push(`f:${e.feature}`),e.component&&t.push(`c:${e.component}`),e.flow&&t.push(`fl:${e.flow}`),e.gate&&t.push(`g:${e.gate}`),e.integration&&t.push(`i:${e.integration}`),t.sort().join("|")}hasMatchingPattern(e){let t=this.storage.getAllPatterns({includePrivate:true});for(let r of t){let s=0,i=["feature","component","flow","gate","signal","integration"];for(let n of i){let o=r.pattern.symbols[n],a=e.symbols[n];o&&a&&o===a&&s++;}if(s>=2)return true}return false}inferStrategy(e){let t=e.map(s=>s.error.message.toLowerCase()),r=s=>t.some(i=>s.some(n=>i.includes(n)));return r(["revert","rollback","regression","broke after deploy","since deploy"])?"rollback":r(["config","environment variable","env var","missing key","secret","credential"])?"config-change":r(["out of memory","oom","heap","memory limit","capacity","too many connections","pool exhausted"])?"scale-up":r(["timeout","network","econnrefused","econnreset","dns","socket hang up"])?"retry":r(["unavailable","service down","circuit breaker","fallback","503","502"])?"fallback":r(["validation","invalid","required","constraint","duplicate","not found","404"])?"fix-data":r(["permission","forbidden","403","401","unauthorized","access denied"])?"escalate":new Set(e.map(s=>s.error.type).filter(Boolean)).size>2?"investigate":"fix-code"}getPriorityFromCount(e){return e>=20?"critical":e>=10?"high":e>=5?"medium":"low"}},me=class{validate(e){let t=[],r=[];if(!e||typeof e!="object")return {valid:false,errors:["Invalid data: expected object"],warnings:[]};let s=e;if(s.version||t.push("Missing version field"),!Array.isArray(s.patterns))return t.push("Missing or invalid patterns array"),{valid:false,errors:t,warnings:r};for(let i=0;i<s.patterns.length;i++){let n=s.patterns[i],o=this.validatePattern(n,i);t.push(...o.errors),r.push(...o.warnings);}return {valid:t.length===0,errors:t,warnings:r}}validatePattern(e,t){let r=[],s=[],i=`Pattern[${t}]`;if(!e.id||typeof e.id!="string"?r.push(`${i}: Missing or invalid id`):/^[a-z0-9-]+$/.test(e.id)||s.push(`${i}: ID "${e.id}" should be kebab-case`),(!e.name||typeof e.name!="string")&&r.push(`${i}: Missing or invalid name`),!e.pattern||typeof e.pattern!="object")r.push(`${i}: Missing or invalid pattern criteria`);else {let n=e.pattern,o=n.symbols&&typeof n.symbols=="object"&&Object.keys(n.symbols).length>0,a=Array.isArray(n.errorContains)&&n.errorContains.length>0,l=n.errorMatches&&typeof n.errorMatches=="string",u=Array.isArray(n.missingSignals)&&n.missingSignals.length>0;!o&&!a&&!l&&!u&&r.push(`${i}: Pattern must have at least one matching criteria`);}if(!e.resolution||typeof e.resolution!="object")r.push(`${i}: Missing or invalid resolution`);else {let n=e.resolution;(!n.description||typeof n.description!="string")&&r.push(`${i}: Missing resolution description`),!n.strategy||typeof n.strategy!="string"?r.push(`${i}: Missing resolution strategy`):["retry","fallback","fix-data","fix-code","ignore","escalate"].includes(n.strategy)||r.push(`${i}: Invalid strategy "${n.strategy}"`),!n.priority||typeof n.priority!="string"?s.push(`${i}: Missing priority, will default to medium`):["low","medium","high","critical"].includes(n.priority)||s.push(`${i}: Invalid priority "${n.priority}"`);}return {errors:r,warnings:s}}loadFromFile(e){if(!f.existsSync(e))throw new Error(`File not found: ${e}`);let t=f.readFileSync(e,"utf-8"),r=JSON.parse(t),s=this.validate(r);if(!s.valid)throw new Error(`Invalid pattern file: ${s.errors.join(", ")}`);return this.normalizeExport(r)}async loadFromUrl(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch patterns: ${t.statusText}`);let r=await t.json(),s=this.validate(r);if(!s.valid)throw new Error(`Invalid pattern data: ${s.errors.join(", ")}`);return this.normalizeExport(r)}normalizeExport(e){let t=e.patterns.map(r=>this.normalizePattern(r));return {version:e.version||"1.0.0",exportedAt:e.exportedAt||new Date().toISOString(),patterns:t}}normalizePattern(e){let t=e.pattern,r=e.resolution,s=e.confidence||{};return {id:e.id,name:e.name,description:e.description||"",pattern:{symbols:t.symbols||{},errorContains:t.errorContains,errorMatches:t.errorMatches,errorType:t.errorType,missingSignals:t.missingSignals,environment:t.environment},resolution:{description:r.description,strategy:r.strategy,priority:r.priority||"medium",codeHint:r.codeHint,codeSnippet:r.codeSnippet,symbolsToModify:r.symbolsToModify,filesLikelyInvolved:r.filesLikelyInvolved,commitRef:r.commitRef,prRef:r.prRef,docsRef:r.docsRef},confidence:{score:s.score||50,timesMatched:s.timesMatched||0,timesResolved:s.timesResolved||0,timesRecurred:s.timesRecurred||0,avgTimeToResolve:s.avgTimeToResolve,lastMatched:s.lastMatched,lastResolved:s.lastResolved},source:e.source||"imported",private:!!e.private,tags:e.tags||[],createdAt:e.createdAt||new Date().toISOString(),updatedAt:e.updatedAt||new Date().toISOString()}}mergePatterns(...e){let t=new Map;for(let r of e)for(let s of r.patterns)t.set(s.id,s);return {version:"1.0.0",exportedAt:new Date().toISOString(),patterns:Array.from(t.values())}}};export{I as a,R as b,T as c,$ as d,B as e,k as f,L as g,O as h,z as i,H as j,oe as k,W as l,ae as m,le as n,ue as o,ce as p,he as q,fe as r,me as s};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var h="0.1.0",d="1.0.0";function l(t,a){let s={$meta:m(a.projectName,t),components:{},features:{},flows:{},state:{},gates:{},signals:{},aspects:{},screens:{},symbolMap:{}};for(let e of t.symbols)f(e,s,a);if(a.screenDefinitions)for(let[e,o]of Object.entries(a.screenDefinitions))s.screens[e]||(s.screens[e]={id:e,name:i(e),route:o.route,path:"",components:o.components,features:o.features});let n={};for(let e of Object.values(s.components))e.componentType&&(n[e.componentType]=(n[e.componentType]||0)+1);for(let e of Object.values(s.features))e.componentType&&(n[e.componentType]=(n[e.componentType]||0)+1);return Object.keys(n).length>0&&(s.$meta.componentTypes=n),I(s),s}function m(t,a){return {version:d,project:t,generatedAt:new Date().toISOString(),paradigmVersion:h,sources:{purposeFiles:a.purposeFiles.length,portalFiles:a.portalFiles.length,premiseFiles:a.symbols.filter(s=>s.source==="premise").length>0?1:0}}}function f(t,a,s){let{type:n}=t;switch(n){case "component":g(t,a,s);break;case "feature":y(t,a,s);break;case "flow":b(t,a);break;case "state":S(t,a);break;case "gate":w(t,a);break;case "signal":k(t,a);break;case "aspect":v(t,a);break;}}function g(t,a,s){let n=c(t.symbol),e=u(n,t.data,s.visualTagMappings),o={id:n,name:i(n),symbol:t.symbol,category:"components",path:t.filePath,description:t.description,visualTags:e,related:t.references,componentType:t.componentType,parent:t.parentSymbol};a.components[n]=o,a.symbolMap[t.symbol]={category:"components",id:n};}function y(t,a,s){let n=c(t.symbol),e=u(n,t.data,s.visualTagMappings),o={id:n,name:i(n),symbol:t.symbol,category:"features",path:t.filePath,description:t.description,visualTags:e,related:t.references,componentType:t.componentType,parent:t.parentSymbol};a.features[n]=o,a.symbolMap[t.symbol]={category:"features",id:n};}function b(t,a){let s=c(t.symbol),n=t.data,e=[];if(n?.steps)for(let r=0;r<n.steps.length;r++){let p=n.steps[r];e.push({id:`${s}-step-${r}`,name:p.action||`Step ${r+1}`,target:p.component,description:p.description,order:r});}let o={id:s,name:i(s),symbol:t.symbol,path:t.filePath,description:t.description,steps:e};a.flows[s]=o,a.symbolMap[t.symbol]={category:"flows",id:s};}function S(t,a){let s=c(t.symbol),n={id:s,name:i(s),symbol:t.symbol,path:t.filePath,description:t.description,consumers:t.referencedBy};a.state[s]=n,a.symbolMap[t.symbol]={category:"state",id:s};}function w(t,a){let s=c(t.symbol),n={id:s,name:i(s),symbol:t.symbol,category:"gates",path:t.filePath,description:t.description,related:t.references};a.gates[s]=n,a.symbolMap[t.symbol]={category:"gates",id:s};}function k(t,a){let s=c(t.symbol),n={id:s,name:i(s),symbol:t.symbol,category:"signals",path:t.filePath,description:t.description,related:t.references};a.signals[s]=n,a.symbolMap[t.symbol]={category:"signals",id:s};}function v(t,a){let s=c(t.symbol),n={id:s,name:i(s),symbol:t.symbol,category:"aspects",path:t.filePath,description:t.description,related:t.references};a.aspects[s]=n,a.symbolMap[t.symbol]={category:"aspects",id:s};}function I(t){for(let a of Object.values(t.screens))if(a.components)for(let s of a.components){let n=t.components[s];n&&(n.screens=n.screens||[],n.screens.includes(a.id)||n.screens.push(a.id));}}function c(t){return t.slice(1)}function i(t){return t.split("-").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}function u(t,a,s){let n=[];if(s?.[t])return s[t];let e=[[/button/i,"button"],[/btn/i,"button"],[/form/i,"form"],[/input/i,"input"],[/field/i,"input"],[/select/i,"input"],[/card/i,"card"],[/list/i,"list"],[/table/i,"list"],[/modal/i,"modal"],[/dialog/i,"modal"],[/drawer/i,"modal"],[/nav/i,"nav"],[/menu/i,"menu"],[/dropdown/i,"menu"],[/header/i,"header"],[/footer/i,"footer"],[/sidebar/i,"sidebar"],[/hero/i,"hero"],[/grid/i,"grid"],[/chart/i,"chart"],[/graph/i,"chart"],[/icon/i,"icon"],[/image/i,"image"],[/avatar/i,"avatar"],[/badge/i,"badge"],[/tag/i,"badge"],[/tab/i,"tab"],[/accordion/i,"accordion"],[/toast/i,"toast"],[/notification/i,"toast"],[/alert/i,"toast"],[/spinner/i,"spinner"],[/loader/i,"spinner"],[/loading/i,"spinner"],[/skeleton/i,"skeleton"]];for(let[o,r]of e)o.test(t)&&n.push(r);return n}function M(t){return JSON.stringify(t,null,2)}function P(t={}){let{indexPath:a=".paradigm/scan-index.json or .paradigm-scan-index.json",enableAllModes:s=true,customInstructions:n=[]}=t,e=[];if(e.push("## Paradigm Scan Protocol"),e.push(""),e.push('When the user says "**paradigm scan**" with an image attached:'),e.push(""),e.push("### 1. Analyze the Image"),e.push(""),e.push("Identify visual elements in the image:"),e.push("- UI components (buttons, forms, cards, modals, etc.)"),e.push("- Data displays (lists, tables, charts)"),e.push("- Navigation elements (menus, tabs, breadcrumbs)"),e.push("- Layout regions (header, sidebar, main content, footer)"),e.push("- Interactive states (loading, errors, empty states)"),e.push(""),e.push("### 2. Cross-Reference with Paradigm Index"),e.push(""),e.push(`Reference the scan index at \`${a}\` to map visual elements to code:`),e.push(""),e.push("```"),e.push("// Example index structure"),e.push("{"),e.push(' "components": { "Button": { "symbol": "#Button", "path": "...", "visualTags": ["button"] } },'),e.push(' "features": { "checkout": { "symbol": "@checkout", "path": "..." } },'),e.push(' "flows": { "checkout-flow": { "symbol": "$checkout-flow", "steps": [...] } },'),e.push(' "state": { "cartStore": { "symbol": "%cart", "slices": ["items", "total"] } },'),e.push(' "gates": { "auth-required": { "symbol": "^auth-required", "path": "..." } }'),e.push("}"),e.push("```"),e.push(""),e.push("### 3. Return Structured Results"),e.push(""),e.push("Format your response as:"),e.push(""),e.push("```markdown"),e.push("## \u{1F52D} Paradigm Scan Results"),e.push(""),e.push("### Components"),e.push("| Element | Symbol | Path | Confidence |"),e.push("|---------|--------|------|------------|"),e.push("| Primary Button | `#Button` | `src/components/Button.tsx` | \u25CF\u25CF\u25CF\u25CF |"),e.push(""),e.push("### Features"),e.push("- **`@checkout`** \u2014 Handles the checkout process shown"),e.push(""),e.push("### Flows"),e.push("- **`$checkout-flow`** \u2014 Steps: cart \u2192 shipping \u2192 **payment** \u2190 (you are here) \u2192 confirmation"),e.push(""),e.push("### State"),e.push("- `%cart.items` \u2014 Powers the item list"),e.push("- `%cart.total` \u2014 Drives the price display"),e.push(""),e.push("### Gates"),e.push("- `^auth-required` \u2014 User must be logged in"),e.push(""),e.push("### \u26A0\uFE0F Uncovered Elements"),e.push(`- The "Apply Coupon" input doesn't have a mapped component`),e.push("```"),e.push(""),s&&(e.push("### Scan Modes"),e.push(""),e.push("| Mode | Trigger | Use Case |"),e.push("|------|---------|----------|"),e.push("| `paradigm scan` | Default | Map any image to paradigm elements |"),e.push("| `paradigm scan ui` | Screenshot | Map running app screenshot to code |"),e.push("| `paradigm scan design` | Mockup | Gap analysis vs. design files |"),e.push("| `paradigm scan error` | Error screenshot | Find related error handlers |"),e.push("| `paradigm scan arch` | Architecture diagram | Map diagram boxes to features |"),e.push("| `paradigm scan flow` | Flow diagram | Match steps to `$flow` definitions |"),e.push("| `paradigm scan diff` | Two images | Show what paradigm elements changed |"),e.push("")),e.push("### Confidence Levels"),e.push(""),e.push("- **\u25CF\u25CF\u25CF\u25CF** High \u2014 Visual element clearly matches component name/tags"),e.push("- **\u25CF\u25CF\u25CF\u25CB** Medium \u2014 Likely match based on context"),e.push("- **\u25CF\u25CF\u25CB\u25CB** Low \u2014 Possible match, needs verification"),e.push("- **\u25CF\u25CB\u25CB\u25CB** Tentative \u2014 Best guess, may be incorrect"),e.push(""),e.push("### After Scanning"),e.push(""),e.push("Once the user has the scan results, they can:"),e.push(""),e.push('1. **Reference specific items**: "I want to modify `#CheckoutButton`"'),e.push('2. **Ask about flows**: "Walk me through `$checkout-flow`"'),e.push('3. **Check gates**: "What permissions does `^premium-checkout` require?"'),e.push('4. **Explore state**: "What components use `%cart.items`?"'),e.push(""),n.length>0){e.push("### Project-Specific Instructions"),e.push("");for(let o of n)e.push(`- ${o}`);e.push("");}return e.push("### Index Regeneration"),e.push(""),e.push("If the scan index is outdated, run:"),e.push("```bash"),e.push("paradigm index"),e.push("```"),e.join(`
|
|
3
|
+
`)}export{l as a,M as b,P as c};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as i from'fs';import*as a from'path';import*as P from'os';import*as x from'crypto';import {exec}from'child_process';var U=a.join(P.homedir(),".claude","plugins"),C=a.join(P.homedir(),".paradigm","plugin-update-check.json"),A=6;function $(e,s={}){return new Promise((n,l)=>{exec(e,{timeout:s.timeout||3e3,cwd:s.cwd},(r,t)=>{if(r)return l(r);n(t.trim());});})}function k(e){try{return i.existsSync(e)?JSON.parse(i.readFileSync(e,"utf8")):null}catch{return null}}function b(){return k(C)}function H(e){let s=a.dirname(C);i.existsSync(s)||i.mkdirSync(s,{recursive:true}),i.writeFileSync(C,JSON.stringify(e,null,2));}function E(){let e=b();return e?Date.now()-new Date(e.lastCheck).getTime()<A*3600*1e3:false}function V(e){let s=x.createHash("sha256"),n=new Set([".md",".json",".sh",".yaml",".yml",".ts",".js"]),l=new Set([".git","node_modules",".cache"]);function r(t){let o;try{o=i.readdirSync(t,{withFileTypes:!0});}catch{return}o.sort((c,u)=>c.name.localeCompare(u.name));for(let c of o){if(l.has(c.name))continue;let u=a.join(t,c.name);if(c.isDirectory())r(u);else if(c.isFile()){let p=a.extname(c.name).toLowerCase();if(n.has(p))try{let f=i.readFileSync(u,"utf8"),y=a.relative(e,u);s.update(y+"\0"+f);}catch{}}}}return r(e),s.digest("hex").slice(0,12)}function N(){let e=[],s=a.join(U,"marketplaces"),n=a.join(U,"cache");if(!i.existsSync(s))return e;let l;try{l=i.readdirSync(s).filter(r=>{let t=a.join(s,r);return i.statSync(t).isDirectory()&&i.existsSync(a.join(t,".git"))});}catch{return e}for(let r of l){let t=a.join(s,r),o=a.join(t,"plugins");if(!i.existsSync(o))continue;let c;try{c=i.readdirSync(o).filter(u=>i.statSync(a.join(o,u)).isDirectory());}catch{continue}for(let u of c){let p=a.join(o,u,".claude-plugin","plugin.json"),f=k(p);if(!f)continue;let y=f.version||"unknown",d=a.join(n,r,u),m="unknown",D="unknown";if(i.existsSync(d))try{let S=i.readdirSync(d).filter(h=>i.statSync(a.join(d,h)).isDirectory()).sort((h,R)=>{let j=h.split(".").map(Number),v=R.split(".").map(Number);for(let g=0;g<3;g++)if((j[g]||0)!==(v[g]||0))return (j[g]||0)-(v[g]||0);return 0}).reverse();if(S.length>0){m=S[0];let h=k(a.join(d,S[0],".claude-plugin","plugin.json"));h?.sha&&(D=h.sha);}}catch{}let w=r;try{let h=i.readFileSync(a.join(t,".git","config"),"utf8").match(/github\.com[:/]([^/]+\/[^/\s.]+)/);h&&(w=h[1].replace(/\.git$/,""));}catch{}e.push({repo:w,plugin:u,installedVersion:m,installedSha:D,marketplacePath:t,localVersion:y,pluginSourceDir:a.join(o,u),pluginCacheDir:i.existsSync(d)&&m!=="unknown"?a.join(d,m):""});}}return e}async function I(e){let s=null,n=e.installedSha;try{n=await $("git rev-parse HEAD",{cwd:e.marketplacePath});}catch{}try{let p=(await $("git ls-remote origin HEAD",{cwd:e.marketplacePath,timeout:3e3})).match(/^([a-f0-9]+)/);p&&(s=p[1]);}catch{}let l=s!==null&&s!==n,r=e.localVersion!==e.installedVersion&&e.installedVersion!=="unknown",t=V(e.pluginSourceDir),o=e.pluginCacheDir?V(e.pluginCacheDir):"",c=o!==""&&t!==o;return {repo:e.repo,plugin:e.plugin,installedVersion:e.installedVersion,installedSha:n,localVersion:e.localVersion,remoteSha:s,marketplacePath:e.marketplacePath,hasRemoteUpdate:l,hasCacheStale:r||c,marketplaceContentHash:t,cachedContentHash:o,hasContentDrift:c}}function J(){let e=b();if(!e?.results)return null;let s=e.results.filter(t=>t.hasRemoteUpdate||t.hasCacheStale);if(s.length===0)return null;let n=[];n.push("--- PLUGIN UPDATES AVAILABLE ---"),n.push("Updates available for installed Claude Code plugins:");let l=[],r=[];for(let t of s)if(t.hasRemoteUpdate){let o=t.installedVersion!=="unknown"?`${t.installedVersion} \u2192 ${t.localVersion}`:"newer commits available";n.push(` - ${t.plugin} (${t.repo}): ${o}`),l.push(`git -C ${t.marketplacePath} pull origin main`),r.push(`/plugin marketplace add ${t.repo}`);}else t.hasContentDrift?(n.push(` - ${t.plugin} (${t.repo}): content changed (hash ${t.cachedContentHash} \u2192 ${t.marketplaceContentHash}, reinstall needed)`),r.push(`/plugin marketplace add ${t.repo}`)):t.hasCacheStale&&(n.push(` - ${t.plugin} (${t.repo}): ${t.installedVersion} \u2192 ${t.localVersion} (reinstall needed)`),r.push(`/plugin marketplace add ${t.repo}`));if(n.push(""),n.push("Tell the user about these updates and suggest the following steps:"),l.length>0&&(n.push(""),n.push("Step 1 \u2014 Pull latest from remote:"),n.push(` ${l.join(` && \\
|
|
3
|
+
`)}`)),r.length>0){let t=l.length>0?2:1;n.push(""),n.push(`Step ${t} \u2014 Reinstall to update the cached version:`);for(let o of r)n.push(` ${o}`);n.push(""),n.push(`Step ${t+1} \u2014 Restart the Claude Code session to load the new version.`);}return n.push("---"),n.join(`
|
|
4
|
+
`)}function O(){E()||(async()=>{try{let e=await L();H({lastCheck:new Date().toISOString(),results:e});}catch{}})();}async function L(){let e=N();if(e.length===0)return [];let s=await Promise.all(e.map(n=>I(n)));return H({lastCheck:new Date().toISOString(),results:s}),s}export{J as a,O as b,L as c};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {h,g as g$1}from'./chunk-AD5TAD2A.js';import {d}from'./chunk-5TAVYPOV.js';import*as i from'fs';import*as a from'path';import*as D from'os';import*as x from'crypto';import*as p from'js-yaml';function T(){let n=a.join(D.homedir(),".paradigm");return i.existsSync(n)||i.mkdirSync(n,{recursive:true}),n}function N(n){let s=a.resolve(n);return x.createHash("sha256").update(s).digest("hex").slice(0,12)}function f(n){let s=N(n),t=a.join(T(),"sessions",s);i.existsSync(t)||i.mkdirSync(t,{recursive:true});let e=a.join(t,"pending-handoffs");return i.existsSync(e)||i.mkdirSync(e,{recursive:true}),t}function b(n){let s=f(n),t=a.join(s,"_project-meta.json"),o={name:a.basename(a.resolve(n)),path:a.resolve(n),lastSeen:new Date().toISOString()};i.writeFileSync(t,JSON.stringify(o,null,2));}function M(n,s){let t=f(n),e=a.join(t,"pending-handoffs",`${s.id}.json`);i.writeFileSync(e,JSON.stringify(s,null,2));}function E(n){let s=f(n),t=a.join(s,"pending-handoffs");if(!i.existsSync(t))return [];let e=[];try{let o=i.readdirSync(t);for(let l of o)if(l.endsWith(".json"))try{let u=i.readFileSync(a.join(t,l),"utf8"),m=JSON.parse(u);m.status==="pending"&&e.push(m);}catch{}}catch{}return e.sort((o,l)=>new Date(o.timestamp).getTime()-new Date(l.timestamp).getTime()),e}function O(n,s){let t=f(n),e=a.join(t,"pending-handoffs",`${s}.json`);if(i.existsSync(e))try{let o=i.readFileSync(e,"utf8"),l=JSON.parse(o);l.status="delivered",i.writeFileSync(e,JSON.stringify(l,null,2));}catch{}}function g(){let n=a.join(T(),"wisdom");return i.existsSync(n)||i.mkdirSync(n,{recursive:true}),n}function A(){let n=a.join(g(),"antipatterns.yaml");if(!i.existsSync(n))return [];try{let s=i.readFileSync(n,"utf8");return p.load(s)?.antipatterns||[]}catch{return []}}function W(){let n=a.join(g(),"decisions");if(!i.existsSync(n))return [];let s=[];try{let t=i.readdirSync(n);for(let e of t)if(!(!e.endsWith(".yaml")&&!e.endsWith(".yml")))try{let o=i.readFileSync(a.join(n,e),"utf8"),l=p.load(o);s.push(l);}catch{}}catch{}return s.sort((t,e)=>t.id.localeCompare(e.id)),s}function H(){let n=a.join(g(),"preferences.yaml");if(!i.existsSync(n))return null;try{let s=i.readFileSync(n,"utf8");return p.load(s)}catch{return null}}function L(n){let s=a.join(g(),"antipatterns.yaml"),t={version:"1.0",antipatterns:[]};if(i.existsSync(s))try{let e=i.readFileSync(s,"utf8");t=p.load(e),t.antipatterns||(t.antipatterns=[]);}catch{}t.antipatterns.push({...n,added:new Date().toISOString()}),i.writeFileSync(s,p.dump(t,{lineWidth:-1}));}function _(n){let s=a.join(g(),"decisions");i.existsSync(s)||i.mkdirSync(s,{recursive:true});let t=n.title.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),e=`${n.id}-${t}.yaml`,o=a.join(s,e);i.writeFileSync(o,p.dump(n,{lineWidth:-1}));}var S={"claude-opus-4":{input:15,output:75,name:"Claude Opus 4"},"claude-sonnet-4":{input:3,output:15,name:"Claude Sonnet 4"},"claude-haiku-3.5":{input:.8,output:4,name:"Claude Haiku 3.5"}},w=50,j=".paradigm/session-breadcrumbs.json",P=".paradigm/session-checkpoint.json",F=10080*60*1e3,k=class{session;rootDir=null;_recovered=false;lastLoreEntryId=null;constructor(){this.session=this.createNewSession();}setRootDir(s){this.rootDir=s;try{let{clearSessionWorkLog:t}=(h(),d(g$1));t(s);}catch{}}createNewSession(){return {sessionId:`s${Date.now().toString(36)}`,startTime:Date.now(),lastActivity:Date.now(),model:"claude-sonnet-4",resourceReads:[],toolCalls:[],breadcrumbs:[],totals:{resourceReadCount:0,toolCallCount:0,totalBytes:0,totalTokens:0,estimatedCostUsd:0}}}addBreadcrumb(s,t,e={}){this.session.breadcrumbs.push({timestamp:Date.now(),action:s,tool:e.tool,symbol:e.symbol,summary:t}),this.session.breadcrumbs.length>w&&(this.session.breadcrumbs=this.session.breadcrumbs.slice(-w)),this.persistBreadcrumbs();}getBreadcrumbs(s=20){return this.session.breadcrumbs.slice(-s)}persistBreadcrumbs(){if(!this.rootDir)return;let s={sessionId:this.session.sessionId,startTime:this.session.startTime,lastActivity:this.session.lastActivity,breadcrumbs:this.session.breadcrumbs,symbolsModified:this.extractSymbolsFromBreadcrumbs(),filesExplored:this.extractFilesFromBreadcrumbs()},t;try{t=JSON.stringify(s,null,2);}catch(e){console.error("[paradigm-mcp] persistBreadcrumbs: JSON.stringify failed:",e.message);return}try{let e=a.join(this.rootDir,j),o=a.dirname(e);i.existsSync(o)||i.mkdirSync(o,{recursive:!0}),i.writeFileSync(e,t);}catch(e){console.error("[paradigm-mcp] persistBreadcrumbs: local write failed:",e.message);}try{let e=f(this.rootDir);i.writeFileSync(a.join(e,"breadcrumbs.json"),t),b(this.rootDir);}catch(e){console.error("[paradigm-mcp] persistBreadcrumbs: global write failed:",e.message);}}loadPreviousSession(){if(!this.rootDir)return null;try{let s=f(this.rootDir),t=a.join(s,"breadcrumbs.json");if(i.existsSync(t)){let e=i.readFileSync(t,"utf8");return JSON.parse(e)}}catch{}try{let s=a.join(this.rootDir,j);if(!i.existsSync(s))return null;let t=i.readFileSync(s,"utf8");return JSON.parse(t)}catch{return null}}saveCheckpoint(s){let t={phase:s.phase,context:s.context,timestamp:Date.now(),sessionId:this.session.sessionId,externalId:s.externalId,plan:s.plan,modifiedFiles:s.modifiedFiles,symbolsTouched:s.symbolsTouched,decisions:s.decisions,recentBreadcrumbs:this.session.breadcrumbs.slice(-10)},e=this.persistCheckpoint(t);return {checkpoint:t,persisted:e}}loadCheckpoint(){if(!this.rootDir)return null;let s=null;try{let t=f(this.rootDir),e=a.join(t,"checkpoint.json");if(i.existsSync(e)){let o=i.readFileSync(e,"utf8");s=JSON.parse(o);}}catch{}if(!s)try{let t=a.join(this.rootDir,P);if(i.existsSync(t)){let e=i.readFileSync(t,"utf8");s=JSON.parse(e);}}catch{}if(s&&Date.now()-s.timestamp>F)return null;if(s)for(let t of ["modifiedFiles","symbolsTouched","decisions"]){let e=s[t];if(typeof e=="string")try{s[t]=JSON.parse(e);}catch{s[t]=[];}}return s}persistCheckpoint(s){let t={local:false,global:false};if(!this.rootDir)return console.error("[paradigm-mcp] persistCheckpoint: rootDir not set, skipping write"),t;let e;try{e=JSON.stringify(s,null,2);}catch(o){return console.error("[paradigm-mcp] persistCheckpoint: JSON.stringify failed:",o.message),t}try{let o=a.join(this.rootDir,P),l=a.dirname(o);i.existsSync(l)||i.mkdirSync(l,{recursive:!0}),i.writeFileSync(o,e),t.local=!0;}catch(o){console.error("[paradigm-mcp] persistCheckpoint: local write failed:",o.message);}try{let o=f(this.rootDir);i.writeFileSync(a.join(o,"checkpoint.json"),e),b(this.rootDir),t.global=!0;}catch(o){console.error("[paradigm-mcp] persistCheckpoint: global write failed:",o.message);}return t}setLastLoreEntryId(s){this.lastLoreEntryId=s;}getLastLoreEntryId(){return this.lastLoreEntryId}hasRecoveredThisSession(){return this._recovered}markRecovered(){this._recovered=true;}extractSymbolsFromBreadcrumbs(){let s=new Set;for(let t of this.session.breadcrumbs)t.symbol&&s.add(t.symbol);return Array.from(s)}extractFilesFromBreadcrumbs(){let s=new Set;for(let t of this.session.breadcrumbs){let e=t.summary.match(/\b[\w./]+\.(ts|js|tsx|jsx|py|go|rs|yaml|json|md)\b/g);if(e)for(let o of e)s.add(o);}return Array.from(s)}estimateTokens(s){let t=typeof s=="number"?s:s.length;return Math.ceil(t/3.5)}calculateCost(s,t=true){let e=S[this.session.model],o=t?e.output:e.input;return s/1e6*o}setModel(s){this.session.model=s,this.recalculateTotals();}getModel(){return this.session.model}trackResourceRead(s,t){let e=this.extractResourceType(s),o=this.estimateTokens(t);this.session.resourceReads.push({timestamp:Date.now(),resourceType:e,uri:s,bytes:t,tokens:o}),this.session.lastActivity=Date.now(),this.updateTotals(t,o);}trackToolCall(s,t){let e=this.estimateTokens(t);this.session.toolCalls.push({timestamp:Date.now(),toolName:s,responseBytes:t,responseTokens:e}),this.session.lastActivity=Date.now(),this.updateTotals(t,e);}updateTotals(s,t){this.session.totals.resourceReadCount=this.session.resourceReads.length,this.session.totals.toolCallCount=this.session.toolCalls.length,this.session.totals.totalBytes+=s,this.session.totals.totalTokens+=t,this.session.totals.estimatedCostUsd=this.calculateCost(this.session.totals.totalTokens);}recalculateTotals(){this.session.totals.estimatedCostUsd=this.calculateCost(this.session.totals.totalTokens);}extractResourceType(s){return s.replace("paradigm://","").split("/")[0]||"unknown"}getStats(){return {...this.session}}getCostBreakdown(){let s={},t=0,e=0;for(let r of this.session.resourceReads)s[r.resourceType]||(s[r.resourceType]={count:0,bytes:0,tokens:0}),s[r.resourceType].count++,s[r.resourceType].bytes+=r.bytes,s[r.resourceType].tokens+=r.tokens,t+=r.bytes,e+=r.tokens;let o={},l=0,u=0;for(let r of this.session.toolCalls)o[r.toolName]||(o[r.toolName]={count:0,bytes:0,tokens:0}),o[r.toolName].count++,o[r.toolName].bytes+=r.responseBytes,o[r.toolName].tokens+=r.responseTokens,l+=r.responseBytes,u+=r.responseTokens;let m=e+u,h=this.calculateCost(m);return {model:S[this.session.model].name,modelId:this.session.model,pricing:S[this.session.model],resources:{count:this.session.resourceReads.length,bytes:t,tokens:e,costUsd:this.calculateCost(e),byType:s},tools:{count:this.session.toolCalls.length,bytes:l,tokens:u,costUsd:this.calculateCost(u),byName:o},total:{tokens:m,costUsd:h}}}getHandoffRecommendation(s=2e5,t){let e=this.session.totals.totalTokens,o=e*4,l=t||e+o,u=Math.round(l/s*100),m,h;u>=85?(m="handoff-urgent",h="Context is nearly full. Initiate handoff immediately to preserve session continuity."):u>=70?(m="handoff-recommended",h="Context usage is high. Consider initiating handoff soon to ensure smooth transition."):u>=50?(m="consider-handoff",h="Context usage is moderate. Plan a good stopping point for potential handoff."):(m="continue",h="Context usage is healthy. Continue working.");let r=[],C=Math.round((Date.now()-this.session.startTime)/6e4),v=this.session.toolCalls.length+this.session.resourceReads.length;return v>50&&r.push(`High number of MCP interactions (${v})`),C>30&&r.push(`Session duration >30 min (${C} min)`),this.session.totals.totalBytes>5e5&&r.push(`Large data volume (${Math.round(this.session.totals.totalBytes/1024)}KB)`),{recommendation:m,message:h,usagePercent:u,signals:r}}getDurationMinutes(){return Math.round((Date.now()-this.session.startTime)/6e4)}reset(){this.session=this.createNewSession(),this._recovered=false,this.lastLoreEntryId=null;}},y=null;function G(){return y||(y=new k),y}function $(){y&&y.reset();}
|
|
3
|
+
export{M as a,E as b,O as c,A as d,W as e,H as f,L as g,_ as h,S as i,G as j,$ as k};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var e=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var k=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var l=(a,b)=>()=>(a&&(b=a(a=0)),b);var m=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:true});},j=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of h(b))!i.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=g(b,d))||f.enumerable});return a};var n=a=>j(e({},"__esModule",{value:true}),a);export{k as a,l as b,m as c,n as d};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as s from'fs';import*as a from'path';import*as F from'os';import*as p from'crypto';var g=a.join(F.homedir(),".paradigm","score"),k=a.join(F.homedir(),".paradigm","mail"),h=a.join(g,"agents"),S=a.join(g,"threads"),x=a.join(g,"file-requests"),O=a.join(g,"trust.yaml"),K=3600*1e3,T={users:{},defaults:{level:"restricted",autoApprove:[],neverApprove:[".env*","**/*.key","**/*.pem","**/credentials*","**/secrets/**"]}};function Y(){if(s.existsSync(k)&&!s.existsSync(g))try{s.renameSync(k,g);}catch{}}function d(){Y();for(let t of [h,S,x])s.existsSync(t)||s.mkdirSync(t,{recursive:true});}var tt=d;function u(t){return a.join(h,t)}function v(t){let n=u(t);return s.existsSync(n)||s.mkdirSync(n,{recursive:true}),n}function m(t){if(!s.existsSync(t))return [];let e=s.readFileSync(t,"utf-8").split(`
|
|
3
|
+
`).filter(i=>i.trim().length>0),r=[];for(let i of e)try{r.push(JSON.parse(i));}catch{}return r}function E(t,n){let e=a.dirname(t);s.existsSync(e)||s.mkdirSync(e,{recursive:true}),s.appendFileSync(t,JSON.stringify(n)+`
|
|
4
|
+
`,"utf-8");}function w(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,40)||"unknown"}function C(t){try{let n=a.join(t,".paradigm","config.yaml");if(s.existsSync(n)){let r=s.readFileSync(n,"utf-8").match(/^project:\s*(.+)$/m);if(r)return w(r[1].trim().replace(/["']/g,""))}}catch{}return w(a.basename(t))}function J(t,n){return `${C(t)}/${n||"core"}`}function et(t,n,e){d();let r=J(t,n),i=v(r),o=C(t),c={id:r,name:e||`${o} (${n||"core"})`,type:"agent",project:o,role:n||"core",pid:process.pid,startedAt:new Date().toISOString(),label:e};return s.writeFileSync(a.join(i,"identity.json"),JSON.stringify(c,null,2),"utf-8"),c}function Q(t){let n=u(t);if(!s.existsSync(n))return false;try{return s.rmSync(n,{recursive:!0,force:!0}),!0}catch{return false}}function P(){if(d(),!s.existsSync(h))return [];let t=[],n=s.readdirSync(h,{withFileTypes:true}).filter(e=>e.isDirectory());for(let e of n){let r=a.join(h,e.name),i=s.readdirSync(r,{withFileTypes:true}).filter(o=>o.isDirectory());for(let o of i){let c=a.join(r,o.name,"identity.json");if(s.existsSync(c))try{let f=s.readFileSync(c,"utf-8"),l=JSON.parse(f);t.push(l);}catch{}}}return t}function nt(){let t=P(),n=0;for(let e of t)b(e.pid)||(Q(e.id),n++);return n}function rt(t){let n=J(t),e=a.join(u(n),"identity.json");if(!s.existsSync(e))return null;try{return JSON.parse(s.readFileSync(e,"utf-8"))}catch{return null}}function st(t,n){let e=a.join(u(t),"identity.json");if(s.existsSync(e))try{let r=JSON.parse(s.readFileSync(e,"utf-8"));r.lastPoll=new Date().toISOString(),n!==void 0&&(r.statusBlurb=n||void 0),s.writeFileSync(e,JSON.stringify(r,null,2),"utf-8");}catch{}}function it(t,n){let e=a.join(u(t),"identity.json");if(s.existsSync(e))try{let r=JSON.parse(s.readFileSync(e,"utf-8"));r.statusBlurb=n||void 0,s.writeFileSync(e,JSON.stringify(r,null,2),"utf-8");}catch{}}function ot(t,n=6e4){if(!t.lastPoll)return true;let e=new Date(t.lastPoll).getTime();return Date.now()-e>n}function at(){let n=P().filter(e=>b(e.pid));try{let e=a.join(F.homedir(),".conductor","sessions");if(s.existsSync(e)){let r=s.readdirSync(e).filter(i=>i.endsWith(".json"));for(let i of r)try{let o=s.readFileSync(a.join(e,i),"utf-8"),c=JSON.parse(o),f=parseInt(a.basename(i,".json"),10);!n.some(l=>l.pid===f)&&b(f)&&n.push({id:`conductor/${f}`,name:c.label||`Session ${f}`,type:"agent",project:c.projectDir?a.basename(c.projectDir):"unknown",role:"conductor",pid:f,startedAt:c.registeredAt||new Date().toISOString()});}catch{}}}catch{}return n}function y(t){return a.join(u(t),"inbox.jsonl")}function j(t){return a.join(u(t),"outbox.jsonl")}function $(t){return a.join(u(t),"ack.json")}function ct(t){let n=y(t);if(!s.existsSync(n))return {hasNew:false,inboxSize:0};let r=s.statSync(n).size;if(!q(t))return {hasNew:r>0,inboxSize:r};let o=a.join(u(t),"ack-size.json");if(s.existsSync(o))try{let c=JSON.parse(s.readFileSync(o,"utf-8"));return {hasNew:r>(c.size||0),inboxSize:r}}catch{}return {hasNew:r>0,inboxSize:r}}function ft(t){let n=y(t),e=a.join(u(t),"ack-size.json");try{let r=s.existsSync(n)?s.statSync(n).size:0;v(t),s.writeFileSync(e,JSON.stringify({size:r}),"utf-8");}catch{}}function N(t,n){v(t),E(y(t),n);}function ut(t,n){let e=m(y(t));if(!n){let i=q(t);if(i){let o=e.findIndex(c=>c.id===i);if(o>=0)return e.slice(o+1)}return e}let r=e.findIndex(i=>i.id===n);return r>=0?e.slice(r+1):e}function V(t,n){v(t),E(j(t),n);}function lt(t){return m(j(t))}function dt(t,n){let e=$(t);v(t),s.writeFileSync(e,JSON.stringify({lastAck:n}),"utf-8");}function q(t){let n=$(t);if(!s.existsSync(n))return null;try{return JSON.parse(s.readFileSync(n,"utf-8")).lastAck||null}catch{return null}}function pt(t){let n=q(t);if(!n)return 0;let e=y(t),r=m(e),i=r.findIndex(f=>f.id===n);if(i<0)return 0;let o=r.slice(i+1),c=r.length-o.length;return o.length===0?s.existsSync(e)&&s.writeFileSync(e,"","utf-8"):s.writeFileSync(e,o.map(f=>JSON.stringify(f)).join(`
|
|
5
|
+
`)+`
|
|
6
|
+
`,"utf-8"),c}function I(t){return a.join(S,`${t}.json`)}function gt(t,n){d();let e="thr-"+p.randomBytes(4).toString("hex"),r=new Date().toISOString(),i={id:e,topic:t,initiator:n,participants:[n],status:"active",createdAt:r,lastActivity:r,messageCount:0};return s.writeFileSync(I(e),JSON.stringify(i,null,2),"utf-8"),i}function z(t){let n=I(t);if(!s.existsSync(n))return null;try{return JSON.parse(s.readFileSync(n,"utf-8"))}catch{return null}}function yt(t){if(d(),!s.existsSync(S))return [];let n=s.readdirSync(S).filter(r=>r.endsWith(".json")),e=[];for(let r of n)try{let i=s.readFileSync(a.join(S,r),"utf-8"),o=JSON.parse(i);(!t||o.status===t)&&e.push(o);}catch{}return e.sort((r,i)=>i.lastActivity.localeCompare(r.lastActivity))}function _(t,n){let e=z(t);if(!e)return false;let r={...e,...n};return s.writeFileSync(I(t),JSON.stringify(r,null,2),"utf-8"),true}function ht(t,n){return _(t,{status:"resolved",resolvedAt:new Date().toISOString(),decision:n})}function St(t){let n=P(),e=[];for(let r of n){let i=m(y(r.id)),o=m(j(r.id));for(let c of [...i,...o])(c.threadRoot===t||c.id===t)&&(e.some(f=>f.id===c.id)||e.push(c));}return e.sort((r,i)=>r.timestamp.localeCompare(i.timestamp))}function L(t){return {id:p.randomUUID(),parentId:t.parentId,threadRoot:t.threadRoot,timestamp:new Date().toISOString(),sender:t.sender,recipients:t.recipients,intent:t.intent,content:{text:t.text,diff:t.diff,decision:t.decision},symbols:t.symbols||[],attachments:t.attachments,metadata:t.metadata}}function B(t){d(),V(t.sender.id,t);let n=0;if(t.recipients&&t.recipients.length>0)for(let e of t.recipients)N(e.id,t),n++;else {let e=P();for(let r of e)r.id!==t.sender.id&&(N(r.id,t),n++);}if(t.threadRoot){let e=z(t.threadRoot);if(e){let i=e.participants.some(o=>o.id===t.sender.id)?e.participants:[...e.participants,t.sender];_(t.threadRoot,{participants:i,lastActivity:t.timestamp,messageCount:e.messageCount+1});}}return n}function A(t){return a.join(x,`${t}.json`)}function U(){if(!s.existsSync(O))return T;try{let t=s.readFileSync(O,"utf-8");try{return JSON.parse(t)}catch{return T}}catch{return T}}function xt(t){d();let n="freq-"+p.randomBytes(4).toString("hex"),e={request:{requestId:n,filePath:t.filePath,reason:t.reason,requester:t.requester,urgency:t.urgency||"normal",snippet:t.snippet,threadRoot:t.threadRoot},status:"pending",createdAt:new Date().toISOString()};return s.writeFileSync(A(n),JSON.stringify(e,null,2),"utf-8"),e}function G(t){let n=A(t);if(!s.existsSync(n))return null;try{return JSON.parse(s.readFileSync(n,"utf-8"))}catch{return null}}function Z(t){if(d(),!s.existsSync(x))return [];let n=s.readdirSync(x).filter(r=>r.endsWith(".json")),e=[];for(let r of n)try{let i=s.readFileSync(a.join(x,r),"utf-8"),o=JSON.parse(i);(!t||o.status===t)&&e.push(o);}catch{}return e.sort((r,i)=>i.createdAt.localeCompare(r.createdAt))}function mt(t,n,e){let r=G(t);if(!r)return {success:false,error:`File request not found: ${t}`};if(r.status!=="pending")return {success:false,error:`Request already ${r.status}`};let i=a.resolve(n,r.request.filePath);if(!i.startsWith(a.resolve(n)))return {success:false,error:"File path escapes project directory"};if(!s.existsSync(i))return {success:false,error:`File not found: ${r.request.filePath}`};try{let o=s.readFileSync(i,"utf-8"),c="utf8";if(e){let W=[/(?:api[_-]?key|secret|token|password|credential|auth)\s*[:=]/i,/(?:^|\s)(?:export\s+)?[A-Z_]+(?:KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL)\s*=/,/-----BEGIN (?:RSA |EC )?PRIVATE KEY-----/];o=o.split(`
|
|
7
|
+
`).map(D=>{for(let H of W)if(H.test(D))return "[REDACTED]";return D}).join(`
|
|
8
|
+
`);}let f=p.createHash("sha256").update(o).digest("hex"),l={requestId:t,filePath:r.request.filePath,content:o,encoding:c,size:Buffer.byteLength(o),hash:f};r.status="approved",r.resolvedAt=new Date().toISOString(),r.delivery=l,s.writeFileSync(A(t),JSON.stringify(r,null,2),"utf-8");let M=L({sender:{id:"system",name:"File Transfer",type:"human"},recipients:[r.request.requester],intent:"fileDelivery",text:`File delivered: ${r.request.filePath} (${l.size} bytes, SHA-256: ${f.slice(0,12)}...)`,threadRoot:r.request.threadRoot,symbols:[]});return M.attachments=[{name:a.basename(r.request.filePath),type:"file",content:l.content,encoding:l.encoding}],B(M),{success:!0,delivery:l}}catch(o){return {success:false,error:`Failed to read file: ${o.message}`}}}function vt(t,n){let e=G(t);if(!e||e.status!=="pending")return false;e.status="denied",e.resolvedAt=new Date().toISOString(),e.denyReason=n,s.writeFileSync(A(t),JSON.stringify(e,null,2),"utf-8");let r=L({sender:{id:"system",name:"File Transfer",type:"human"},recipients:[e.request.requester],intent:"fileDenied",text:`File request denied: ${e.request.filePath}${n?` \u2014 ${n}`:""}`,threadRoot:e.request.threadRoot,symbols:[]});return B(r),true}function R(t,n){let e=n.replace(/\./g,"\\.").replace(/\*\*/g,"{{GLOBSTAR}}").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]").replace(/\{\{GLOBSTAR\}\}/g,".*");return new RegExp(`^${e}$`).test(t)}function X(t,n,e){let r=n||U();if(e&&r.users[e]){for(let i of r.users[e].neverApprove)if(R(t,i))return true}for(let i of r.defaults.neverApprove)if(R(t,i))return true;return false}function At(t,n,e){let r=n||U();if(X(t,r,e))return false;if(e&&r.users[e]){for(let i of r.users[e].autoApprove)if(R(t,i))return true}for(let i of r.defaults.autoApprove)if(R(t,i))return true;return false}function Rt(){let t=Z("pending"),n=0;for(let e of t)Date.now()-new Date(e.createdAt).getTime()>K&&(e.status="expired",e.resolvedAt=new Date().toISOString(),s.writeFileSync(A(e.request.requestId),JSON.stringify(e,null,2),"utf-8"),n++);return n}function b(t){try{return process.kill(t,0),!0}catch{return false}}export{z as A,yt as B,_ as C,ht as D,St as E,L as F,B as G,U as H,xt as I,G as J,Z as K,mt as L,vt as M,X as N,At as O,Rt as P,g as a,d as b,tt as c,u as d,m as e,E as f,J as g,et as h,Q as i,P as j,nt as k,rt as l,st as m,it as n,ot as o,at as p,ct as q,ft as r,N as s,ut as t,V as u,lt as v,dt as w,q as x,pt as y,gt as z};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {c,b as b$1}from'./chunk-5TAVYPOV.js';import*as i from'fs';import*as f from'path';var W={};c(W,{appendSessionWorkEntry:()=>b,clearSessionWorkLog:()=>E,getAgentEntries:()=>p,getAgentVerdicts:()=>k,getContributingAgents:()=>x,readSessionWorkLog:()=>l});function b(e,t){try{let n=f.join(e,u),o=f.dirname(n);if(i.existsSync(o)||i.mkdirSync(o,{recursive:!0}),i.existsSync(n)&&i.readFileSync(n,"utf8").trim().split(`
|
|
3
|
+
`).filter(r=>r.trim()).length>=v)return;let g=JSON.stringify(t)+`
|
|
4
|
+
`;i.appendFileSync(n,g,"utf8"),t.type==="user-verdict"&&t.agent&&t.symbols?.length&&import('./agent-loader-EPXURMO7.js').then(({loadAgentProfile:c,saveAgentProfile:s})=>{try{let r=c(e,t.agent);if(r?.expertise){let d=t.verdict==="accepted"?.03:t.verdict==="dismissed"?-.02:t.verdict==="revised"?-.01:0;if(d!==0){for(let S of t.symbols){let a=r.expertise.find(y=>y.symbol===S);a&&(a.confidence=Math.max(0,Math.min(1,a.confidence+d)),a.sessions=(a.sessions||0)+1,a.lastTouch=new Date().toISOString());}s(t.agent,r,"global");}}}catch{}}).catch(()=>{});}catch{}}function l(e){try{let t=f.join(e,u);return i.existsSync(t)?i.readFileSync(t,"utf8").trim().split(`
|
|
5
|
+
`).filter(n=>n.trim()).map(n=>{try{return JSON.parse(n)}catch{return null}}).filter(n=>n!==null):[]}catch{return []}}function E(e){try{let t=f.join(e,u);i.existsSync(t)&&i.writeFileSync(t,"","utf8");}catch{}}function x(e){let t=l(e),n=new Set;for(let o of t)o.agent&&n.add(o.agent);return Array.from(n)}function p(e,t){return l(e).filter(n=>n.agent===t)}function k(e,t){let n=p(e,t),o=n.filter(s=>s.type==="agent-contribution"),g=n.filter(s=>s.type==="user-verdict"),c=[];for(let s of o)c.push({contribution:s});for(let s of g){let r=c.find(d=>!d.verdict&&d.contribution);r?r.verdict=s:c.push({verdict:s});}return c}var u,v,A=b$1(()=>{u=".paradigm/events/session-log.jsonl",v=200;});export{b as a,l as b,E as c,x as d,p as e,k as f,W as g,A as h};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as c from'fs';import*as a from'path';import {Glob}from'glob';function s(t){let e=r=>{if(r.includes("*"))try{return new Glob(r,{cwd:t,nodir:!0}).walkSync().length>0}catch{return false}return c.existsSync(a.join(t,r))};return e("project.godot")||e("Assets/ProjectSettings")?"game":e("Package.swift")&&!e("package.json")?e("Sources/*/App")||e("**/AppDelegate.swift")?"macos-app":"ios-app":e("pubspec.yaml")?"flutter-app":e("supabase")&&(e("next.config.*")||e("vite.config.*"))?"saas-web-app":e("next.config.*")||e("vite.config.*")||e("nuxt.config.*")?"web-app":e("Dockerfile")||e("prisma")||e("drizzle.config.*")?"backend-api":e("Cargo.toml")?"rust-project":e("pyproject.toml")||e("setup.py")||e("requirements.txt")?"python-project":"generic"}var n={"saas-web-app":["architect","builder","reviewer","tester","security","documentor","designer","copywriter","performance","devops","dba","e2e","dx","seo","pm","product","sales","legal","a11y","qa","advocate","debugger","release","narrator"],"web-app":["architect","builder","reviewer","tester","security","documentor","designer","copywriter","performance","devops","e2e","seo","a11y","qa","debugger"],"backend-api":["architect","builder","reviewer","tester","security","documentor","devops","dba","performance","dx","qa","debugger","release"],"ios-app":["architect","builder","reviewer","tester","security","documentor","designer","mobile","performance","a11y","qa","debugger"],"macos-app":["architect","builder","reviewer","tester","security","documentor","designer","performance","qa","debugger"],"flutter-app":["architect","builder","reviewer","tester","security","documentor","designer","mobile","performance","a11y","debugger"],game:["architect","builder","reviewer","tester","documentor","gamedev","3d","audio","designer","performance","debugger"],"rust-project":["architect","builder","reviewer","tester","security","documentor","performance","debugger","qa"],"python-project":["architect","builder","reviewer","tester","security","documentor","performance","debugger","qa"],generic:["architect","builder","reviewer","tester","security","documentor","debugger","qa"]};export{s as a,n as b};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as i from'fs';import*as c from'path';import*as a from'js-yaml';var v={architect:{tier:"high",description:"Complex planning needs best reasoning"},security:{tier:"high",description:"Deep security analysis"},reviewer:{tier:"medium",description:"Balanced critique"},builder:{tier:"low",description:"Fast implementation, lower cost"},tester:{tier:"low",description:"Quick validation"}},p={architect:{role:`You design system architecture, write specifications, and plan features.
|
|
3
|
+
You do NOT write implementation code - that's the Builder's job.
|
|
4
|
+
When your spec is ready, hand off to Builder with 'paradigm team handoff --to builder'.`,focus:{reads:["@features","$flows","specs/*.md","health.yaml"],writes:["specs/*.md",".purpose"]},triggers:[{type:"keyword",match:["design","architect","plan","spec"]},{type:"symbol",match:["@*","$*"]}],handoff_to:["builder","reviewer"],defaultModel:"opus",context:{include:["specs/*.md",".purpose","**/.purpose","portal.yaml"],exclude:["src/**","tests/**","node_modules/**"]}},builder:{role:`You implement code based on specifications from the Architect.
|
|
5
|
+
Follow the spec exactly. If spec is unclear, hand back to Architect.
|
|
6
|
+
When implementation is ready, hand off to Reviewer with 'paradigm team handoff --to reviewer'.`,focus:{reads:["#components","specs/*.md","src/**","tests/**"],writes:["src/**","tests/**"]},triggers:[{type:"keyword",match:["implement","build","code","fix"]},{type:"handoff",from:"architect"}],handoff_to:["reviewer","architect"],defaultModel:"haiku",context:{include:["src/**","tests/**","{feature}.purpose"],exclude:["specs/*.md","node_modules/**"]}},reviewer:{role:`You review code for correctness, security, and adherence to specs.
|
|
7
|
+
Check all ^gate requirements are met.
|
|
8
|
+
Approve or request changes. Do NOT implement fixes yourself.
|
|
9
|
+
Hand back to Builder for fixes, or to Tester when approved.`,focus:{reads:["^gates","!signals","portal.yaml","src/**","specs/*.md"],writes:["reviews/*.md"]},triggers:[{type:"keyword",match:["review","check","audit","approve"]},{type:"handoff",from:"builder"}],handoff_to:["builder","tester"],defaultModel:"sonnet",context:{include:["src/**","specs/*.md","portal.yaml",".purpose"],exclude:["tests/**","node_modules/**"]}},tester:{role:`You verify implementations work correctly.
|
|
10
|
+
Run tests, check portal validations, verify health status.
|
|
11
|
+
Report issues back to Builder. Update health.yaml when verified.`,focus:{reads:["tests/**","portal.yaml","health.yaml","#components"],writes:["tests/**","health.yaml"]},triggers:[{type:"keyword",match:["test","verify","qa","validate"]},{type:"handoff",from:"reviewer"}],handoff_to:["builder","architect"],defaultModel:"haiku",context:{include:["tests/**","health.yaml","{feature}.purpose"],exclude:["src/**","specs/**","node_modules/**"]}},security:{role:`You audit for security issues, especially around ^gates.
|
|
12
|
+
Review auth flows, check for vulnerabilities.
|
|
13
|
+
Flag issues but do NOT implement fixes - hand to Builder for that.`,focus:{reads:["^gates","!signals","portal.yaml","src/**"],writes:["security/*.md"]},triggers:[{type:"keyword",match:["security","audit","vulnerability","auth"]}],handoff_to:["builder","architect"],defaultModel:"opus",context:{include:["portal.yaml","src/middleware/**","src/auth/**"],exclude:["src/routes/**","tests/**","node_modules/**"]}}};function l(e){return c.join(e,".paradigm")}function d(e){return c.join(l(e),"agents.yaml")}function h(e){return c.join(l(e),"team-state.yaml")}function f(e){return c.join(l(e),"handoffs")}function _(e){return i.existsSync(d(e))}function D(e){let t=d(e);if(!i.existsSync(t))return null;try{let n=i.readFileSync(t,"utf8");return a.load(n)}catch{return null}}function F(e,t){let n=d(e),r=l(e);i.existsSync(r)||i.mkdirSync(r,{recursive:true});let o=a.dump(t,{lineWidth:-1,noRefs:true,quotingType:'"'});i.writeFileSync(n,o);}function u(e){let t=h(e);if(!i.existsSync(t))return {current:null,queue:[],recent:[],blocked:[]};try{let n=i.readFileSync(t,"utf8");return a.load(n)}catch{return {current:null,queue:[],recent:[],blocked:[]}}}function g(e,t){let n=h(e),r=l(e);i.existsSync(r)||i.mkdirSync(r,{recursive:true});let o=a.dump(t,{lineWidth:-1,noRefs:true,quotingType:'"'});i.writeFileSync(n,o);}function y(e,t){let n=c.join(f(e),`${t}.yaml`);if(!i.existsSync(n))return null;try{let r=i.readFileSync(n,"utf8");return a.load(r)}catch{return null}}function H(e,t){let n=f(e);i.existsSync(n)||i.mkdirSync(n,{recursive:true});let r=c.join(n,`${t.id}.yaml`),o=a.dump(t,{lineWidth:-1,noRefs:true,quotingType:'"'});i.writeFileSync(r,o);}function x(e){let t=f(e);if(!i.existsSync(t))return [];let n=i.readdirSync(t).filter(o=>o.endsWith(".yaml")),r=[];for(let o of n){let s=o.replace(".yaml",""),m=y(e,s);m&&r.push(m);}return r.sort((o,s)=>new Date(s.timestamp).getTime()-new Date(o.timestamp).getTime())}function R(e){return x(e).filter(t=>t.status==="pending")}function C(e="project",t){let n={};for(let[r,o]of Object.entries(p))if(n[r]={name:r,...o},t&&t[r]){let s=t[r].id.toLowerCase();s.includes("opus")||s.includes("gpt-4")&&!s.includes("mini")||s.includes("o1")&&!s.includes("mini")||s.includes("pro")&&!s.includes("mini")||s.includes("large")?n[r].defaultModel="opus":s.includes("haiku")||s.includes("mini")||s.includes("flash")||s.includes("small")?n[r].defaultModel="haiku":n[r].defaultModel="sonnet";}return {version:"1.0.0",team:{name:`${e}-team`,default_agent:"architect",require_handoff:false},agents:n}}function q(e,t){let n=u(e);n.recent.unshift({...t,timestamp:new Date().toISOString()}),n.recent=n.recent.slice(0,20),g(e,n);}function I(e,t,n){let r=u(e);r.current={agent:t,task:n,started:new Date().toISOString(),symbols_touched:[]},g(e,r);}function P(e){let t=u(e);t.current=null,g(e,t);}export{v as a,l as b,d as c,_ as d,D as e,F as f,u as g,g as h,H as i,x as j,R as k,C as l,q as m,I as n,P as o};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as y from'fs';import*as C from'path';import*as O from'js-yaml';var K=".paradigm/scan-index.json",X=".paradigm/flow-index.json",z=".paradigm/config.yaml",B="portal.yaml",J=".paradigm/university/index.yaml",w={enabled:true,title:null,theme:"dark",customCss:null,customContent:"docs/",exclude:{tags:[],patterns:[]},sidebar:{collapsed:[]},output:".paradigm/docs-site"};function G(s){let t=C.join(s,z);if(!y.existsSync(t))return {...w};try{let e=y.readFileSync(t,"utf8"),a=O.load(e);if(!a||!a.docs)return {...w};let n=a.docs;return {enabled:n.enabled??w.enabled,title:n.title??w.title,theme:n.theme??w.theme,customCss:n.customCss??w.customCss,customContent:n.customContent??w.customContent,exclude:{tags:n.exclude?.tags??w.exclude.tags,patterns:n.exclude?.patterns??w.exclude.patterns},sidebar:{collapsed:n.sidebar?.collapsed??w.sidebar.collapsed},output:n.output??w.output}}catch{return {...w}}}function T(s){let t=C.join(s,K);if(!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8");return JSON.parse(e)}catch{return null}}function M(s){let t=C.join(s,X);if(!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8");return JSON.parse(e)}catch{return null}}function D(s){let t=C.join(s,B);if(!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8");return O.load(e)}catch{return null}}function N(s){let t=C.join(s,J);if(!y.existsSync(t))return null;try{let e=y.readFileSync(t,"utf8");return O.load(e)}catch{return null}}function L(s){let t=s.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!t)return null;try{return {frontmatter:O.load(t[1]),body:t[2].trim()}}catch{return null}}function U(s){let t=new Map,e=[s.components,s.features,s.flows,s.state,s.gates,s.signals,s.aspects];for(let a of e)if(a)for(let[n,o]of Object.entries(a))t.set(n,o);return t}function V(s){return {components:"component",features:"component",flows:"flow",state:"component",gates:"gate",signals:"signal",aspects:"aspect"}[s]||"component"}function R(s,t){if(t.exclude.tags.length>0&&s.visualTags){for(let e of s.visualTags)if(t.exclude.tags.includes(e))return true}if(t.exclude.patterns.length>0&&s.path){for(let e of t.exclude.patterns)if(e.endsWith("*")){let a=e.slice(0,-1);if(s.path.includes(a))return true}else if(s.path.includes(e))return true}return false}function W(s,t){let e=C.join(s,t);if(!y.existsSync(e))return [];let a=[];try{let n=y.readdirSync(e).filter(o=>o.endsWith(".md"));for(let o of n)try{let l=y.readFileSync(C.join(e,o),"utf8"),i=o.replace(/\.md$/,""),g=L(l);g?a.push({slug:i,title:g.frontmatter.title||i,body:g.body,order:typeof g.frontmatter.order=="number"?g.frontmatter.order:void 0,description:g.frontmatter.description||void 0}):a.push({slug:i,title:i,body:l.trim()});}catch{}}catch{}return a.sort((n,o)=>n.order!=null&&o.order!=null?n.order-o.order:n.order!=null?-1:o.order!=null?1:n.title.localeCompare(o.title)),a}function Y(s,t,e){let a=e||G(s),n=C.join(s,a.customContent),o=C.join(n,`${t}.md`);if(!y.existsSync(o))return null;try{let l=y.readFileSync(o,"utf8"),i=L(l);return i?{slug:t,title:i.frontmatter.title||t,body:i.body,order:typeof i.frontmatter.order=="number"?i.frontmatter.order:void 0,description:i.frontmatter.description||void 0}:{slug:t,title:t,body:l.trim()}}catch{return null}}function Q(s,t){let e=t||G(s),a=T(s),n=M(s),o=D(s),l=W(s,e.customContent),i=N(s),g=a?.$meta?.project||C.basename(s),$=e.title||`${g} Docs`,c=[],u={},d=0;if(l.length>0&&c.push({id:"custom-pages",label:"Pages",collapsed:e.sidebar.collapsed.includes("custom-pages"),items:l.map(f=>({id:f.slug,label:f.title,kind:"custom",description:f.description}))}),i&&i.entries.length>0){let f=i.entries.filter(h=>(h.type==="note"||h.type==="policy")&&h.symbols.length>0);f.length>0&&c.push({id:"guides",label:"Guides",collapsed:e.sidebar.collapsed.includes("guides"),items:f.map(h=>({id:h.id,label:h.title,kind:"guide",description:void 0,badge:h.symbols.length>0?`${h.symbols.length} symbols`:void 0}))});}if(a){let f=Object.values(a.components||{}).filter(r=>!R(r,e));if(f.length>0){let r=new Map;for(let P of f){let j=P.componentType||"other";r.has(j)||r.set(j,[]),r.get(j).push(P);}let k=[...r.entries()].sort((P,j)=>j[1].length-P[1].length).map(([P,j])=>({id:`components-${P}`,label:`${P.charAt(0).toUpperCase()+P.slice(1)} (${j.length})`,collapsed:e.sidebar.collapsed.includes(`components-${P}`),items:j.sort((F,H)=>F.name.localeCompare(H.name)).map(F=>({id:F.id,label:F.name,kind:"component",description:F.description,badge:F.componentType}))}));c.push({id:"components",label:`Components (${f.length})`,collapsed:e.sidebar.collapsed.includes("components"),items:[],subgroups:k}),u.components=f.length,d+=f.length;}let h=Object.values(a.features||{}).filter(r=>!R(r,e));h.length>0&&(c.push({id:"features",label:`Features (${h.length})`,collapsed:e.sidebar.collapsed.includes("features"),items:h.sort((r,S)=>r.name.localeCompare(S.name)).map(r=>({id:r.id,label:r.name,kind:"component",description:r.description}))}),u.features=h.length,d+=h.length);let v=Object.values(a.flows||{}).filter(r=>!R(r,e)),p=new Set(v.map(r=>r.id)),m=[];if(n)for(let[r,S]of Object.entries(n.flows)){let k=r.replace(/^\$/,"");p.has(k)||m.push({id:k,label:S.name||k,kind:"flow",description:S.description});}let x=[...v.sort((r,S)=>r.name.localeCompare(S.name)).map(r=>({id:r.id,label:r.name,kind:"flow",description:r.description})),...m];x.length>0&&(c.push({id:"flows",label:`Flows (${x.length})`,collapsed:e.sidebar.collapsed.includes("flows"),items:x}),u.flows=x.length,d+=x.length);let b=Object.values(a.gates||{}).filter(r=>!R(r,e));b.length>0&&(c.push({id:"gates",label:`Gates (${b.length})`,collapsed:e.sidebar.collapsed.includes("gates"),items:b.sort((r,S)=>r.name.localeCompare(S.name)).map(r=>({id:r.id,label:r.name,kind:"gate",description:r.description}))}),u.gates=b.length,d+=b.length);let I=Object.values(a.signals||{}).filter(r=>!R(r,e));I.length>0&&(c.push({id:"signals",label:`Signals (${I.length})`,collapsed:e.sidebar.collapsed.includes("signals"),items:I.sort((r,S)=>r.name.localeCompare(S.name)).map(r=>({id:r.id,label:r.name,kind:"signal",description:r.description}))}),u.signals=I.length,d+=I.length);let E=Object.values(a.aspects||{}).filter(r=>!R(r,e));E.length>0&&(c.push({id:"aspects",label:`Aspects (${E.length})`,collapsed:e.sidebar.collapsed.includes("aspects"),items:E.sort((r,S)=>r.name.localeCompare(S.name)).map(r=>({id:r.id,label:r.name,kind:"aspect",description:r.description}))}),u.aspects=E.length,d+=E.length);}if(o){let f=Object.keys(o.routes||{}).length,h=Object.keys(o.gates||{}).length;c.push({id:"portal",label:"Portal",collapsed:e.sidebar.collapsed.includes("portal"),items:[{id:"portal-overview",label:"Authorization Overview",kind:"portal",description:`${h} gates, ${f} routes`,badge:`${f} routes`}]});}return {title:$,project:g,generatedAt:new Date().toISOString(),groups:c,totalSymbols:d,symbolCounts:u}}function Z(s,t){let e=T(s);if(!e)return null;let a=U(e),n=a.get(t);if(!n)return null;let o=[];for(let[p,m]of a)p!==t&&m.related&&m.related.includes(n.symbol)&&o.push(m.symbol);let l=(n.related||[]).slice(),i=[],g=M(s);if(g)for(let[p,m]of Object.entries(g.flows)){let x=(m.steps||[]).map(b=>b.symbol);(x.includes(n.symbol)||x.includes(`#${t}`))&&i.push({id:p.replace(/^\$/,""),name:m.name||p});}if(e.flows)for(let[p,m]of Object.entries(e.flows)){if(i.some(b=>b.id===p))continue;let x=(m.steps||[]).map(b=>b.symbol).filter(Boolean);(x.includes(n.symbol)||x.includes(`#${t}`))&&i.push({id:p,name:m.name});}let $=[],c=D(s);if(c&&n.category==="gates"){let p=Object.keys(c.gates||{}).find(m=>m.replace(/^\^/,"")===t);p&&$.push({id:p.replace(/^\^/,""),description:c.gates[p].description});}else if(c){let p=new Set((n.related||[]).filter(m=>m.startsWith("^")));for(let[m,x]of Object.entries(c.routes||{}))for(let b of x){let I=b.replace(/^\^/,"");if(p.has(b)||p.has(`^${I}`)){let E=c.gates[b]||c.gates[`^${I}`]||c.gates[I];E&&!$.some(r=>r.id===I)&&$.push({id:I,description:E.description});}}}let u=[];if(e.aspects)for(let[p,m]of Object.entries(e.aspects))m.related&&m.related.includes(n.symbol)&&u.push(m.symbol);for(let p of n.related||[])p.startsWith("~")&&!u.includes(p)&&u.push(p);let d=[],f=N(s);if(f)for(let p of f.entries)p.symbols.includes(n.symbol)&&d.push({id:p.id,title:p.title});let h=n.parent||void 0,v=[];if(e.components)for(let p of Object.values(e.components))p.parent===n.symbol&&v.push(p.symbol);return {id:n.id,symbol:n.symbol,name:n.name,description:n.description||"",category:n.category||"components",componentType:n.componentType,tags:n.visualTags||[],path:n.path||"",related:n.related||[],referencedBy:o,references:l,flows:i,gates:$,aspects:u,guides:d,parent:h,children:v}}function q(s,t){let e=M(s),a=T(s);if(e){let n=e.flows[`$${t}`]?`$${t}`:t,o=e.flows[n];if(o){let l=(o.steps||[]).map(g=>({type:g.type||"action",symbol:g.symbol||"",description:g.description})),i=a?.flows?.[t.replace(/^\$/,"")];return {id:t.replace(/^\$/,""),symbol:`$${t.replace(/^\$/,"")}`,name:o.name||t,description:o.description,trigger:o.trigger,steps:l,successSignal:o.successSignal,errorSignal:o.errorSignal,tags:i?.visualTags||[],path:i?.path||o.definedIn||""}}}if(a?.flows){let n=t.replace(/^\$/,""),o=a.flows[n];if(o){let l=(o.steps||[]).map(i=>({type:"action",symbol:i.symbol||"",description:i.action||i.name}));return {id:n,symbol:`$${n}`,name:o.name,description:o.description,steps:l,tags:o.visualTags||[],path:o.path||""}}}return null}function tt(s){let t=D(s);if(!t)return {version:"0",gates:[],routes:[]};let e=new Map;for(let[o,l]of Object.entries(t.routes||{}))for(let i of l){let g=i.replace(/^\^/,"");e.has(g)||e.set(g,[]),e.get(g).push(o);}let a=Object.entries(t.gates||{}).map(([o,l])=>{let i=o.replace(/^\^/,"");return {symbol:`^${i}`,description:l.description,check:l.check,routes:e.get(i)||[]}}),n=Object.entries(t.routes||{}).map(([o,l])=>{let i=o.indexOf(" "),g=i>0?o.substring(0,i):"GET";return {route:i>0?o.substring(i+1):o,method:g,gates:l.map(c=>{let u=c.replace(/^\^/,""),d=t.gates[c]||t.gates[`^${u}`]||t.gates[u];return {symbol:`^${u}`,description:d?.description}})}});return {version:t.version||"1.0",gates:a,routes:n}}function et(s,t,e){let a=e||20,n=[],o=t.toLowerCase(),l=T(s);if(l){let c=U(l);for(let[u,d]of c){let f=A(d.name,d.description||"",d.visualTags||[],o);f>0&&n.push({id:d.id,kind:V(d.category),label:d.name,description:d.description||"",matchContext:_(d.name,d.description||"",o),score:f});}}let i=G(s),g=W(s,i.customContent);for(let c of g){let u=c.body.substring(0,200),d=A(c.title,u,[],o);d>0&&n.push({id:c.slug,kind:"custom",label:c.title,description:c.description||u.substring(0,100),matchContext:_(c.title,c.body,o),score:d});}let $=D(s);if($)for(let[c,u]of Object.entries($.gates||{})){let d=c.replace(/^\^/,""),f=A(d,u.description,[],o);f>0&&n.push({id:d,kind:"portal",label:`^${d}`,description:u.description,score:f});}return n.sort((c,u)=>u.score-c.score||c.label.localeCompare(u.label)),n.slice(0,a)}function A(s,t,e,a){let n=s.toLowerCase(),o=t.toLowerCase();return n===a?1:n.startsWith(a)?.8:n.includes(a)?.6:o.includes(a)?.5:e.some(l=>l.toLowerCase().includes(a))?.3:0}function _(s,t,e){let n=t.toLowerCase().indexOf(e);if(n<0)return s.toLowerCase().includes(e)?s:void 0;let o=Math.max(0,n-40),l=Math.min(t.length,n+e.length+40),i=t.substring(o,l).trim();return o>0&&(i=`...${i}`),l<t.length&&(i=`${i}...`),i}export{G as a,W as b,Y as c,Q as d,Z as e,q as f,tt as g,et as h};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as i from'fs';import*as l from'path';import*as c from'js-yaml';var f=".paradigm/university",y="content";function U(s){let t=s.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!t)return null;try{return {frontmatter:c.load(t[1]),body:t[2].trim()}}catch{return null}}function j(s,t){return `---
|
|
3
|
+
${c.dump(s,{lineWidth:-1,noRefs:true,sortKeys:false})}---
|
|
4
|
+
|
|
5
|
+
${t}
|
|
6
|
+
`}function b(s){let t=l.join(s,f,"index.yaml");if(!i.existsSync(t))return null;try{return c.load(i.readFileSync(t,"utf8"))}catch{return null}}function h(s,t,e){let n=l.join(s,f,y);for(let r of ["notes","policies","quizzes","paths"]){let a=l.join(n,r,`${t}${e}`);if(i.existsSync(a))return a}return null}function F(s,t){let e=h(s,t,".md");if(!e)return null;try{let n=U(i.readFileSync(e,"utf8"));if(!n)return null;let r=n.frontmatter;return {frontmatter:{...r,tags:r.tags||[],symbols:r.symbols||[],prerequisites:r.prerequisites||[]},body:n.body}}catch{return null}}function z(s,t){let e=h(s,t,".yaml");if(!e)return null;try{let n=c.load(i.readFileSync(e,"utf8"));return n?.id?{...n,tags:n.tags||[],symbols:n.symbols||[],questions:n.questions||[]}:null}catch{return null}}function D(s,t){let e=h(s,t,".yaml");if(!e)return null;try{let n=c.load(i.readFileSync(e,"utf8"));return n?.id?n:null}catch{return null}}function w(s,t){let e=l.join(s,f,"diplomas");if(!i.existsSync(e))return [];let n=[];try{for(let r of i.readdirSync(e).filter(a=>a.endsWith(".yaml")))try{let a=c.load(i.readFileSync(l.join(e,r),"utf8"));if(!a?.id||t?.student&&a.student!==t.student||t?.type&&a.type!==t.type)continue;n.push(a);}catch{}}catch{}return n.sort((r,a)=>a.earnedAt.localeCompare(r.earnedAt))}function I(s,t,e){let n=t.type==="policy"?"policies":"notes",r=l.join(s,f,y,n);i.mkdirSync(r,{recursive:true});let a=l.join(r,`${t.id}.md`);return i.writeFileSync(a,j(t,e),"utf8"),a}function $(s,t){let e=l.join(s,f,y,"quizzes");i.mkdirSync(e,{recursive:true});let n=l.join(e,`${t.id}.yaml`);return i.writeFileSync(n,c.dump(t,{lineWidth:-1,noRefs:true}),"utf8"),n}function k(s,t){let e=l.join(s,f,"diplomas");i.mkdirSync(e,{recursive:true});let n=l.join(e,`${t.id}.yaml`);return i.writeFileSync(n,c.dump(t,{lineWidth:-1,noRefs:true}),"utf8"),n}function q(s){let t=l.join(s,f),e=l.join(t,y),n=[];for(let u of ["notes","policies"]){let o=l.join(e,u);if(i.existsSync(o))try{for(let p of i.readdirSync(o).filter(m=>m.endsWith(".md")))try{let m=i.readFileSync(l.join(o,p),"utf8"),S=U(m);if(!S)continue;let d=S.frontmatter;n.push({id:d.id||p.replace(".md",""),title:d.title||p,type:d.type||(u==="policies"?"policy":"note"),author:d.author||"unknown",created:d.created||"",updated:d.updated||"",tags:Array.isArray(d.tags)?d.tags:[],symbols:Array.isArray(d.symbols)?d.symbols:[],difficulty:d.difficulty||"beginner",file:`${y}/${u}/${p}`});}catch{}}catch{}}let r=l.join(e,"quizzes");if(i.existsSync(r))try{for(let u of i.readdirSync(r).filter(o=>o.endsWith(".yaml")))try{let o=c.load(i.readFileSync(l.join(r,u),"utf8"));if(!o?.id)continue;n.push({id:o.id,title:o.title||u,type:"quiz",author:o.author||"unknown",created:o.created||"",updated:o.updated||"",tags:o.tags||[],symbols:o.symbols||[],difficulty:o.difficulty||"beginner",file:`${y}/quizzes/${u}`});}catch{}}catch{}let a=l.join(e,"paths");if(i.existsSync(a))try{for(let u of i.readdirSync(a).filter(o=>o.endsWith(".yaml")))try{let o=c.load(i.readFileSync(l.join(a,u),"utf8"));if(!o?.id)continue;n.push({id:o.id,title:o.title||u,type:"path",author:o.author||"unknown",created:o.created||"",updated:o.updated||"",tags:o.tags||[],symbols:[],file:`${y}/paths/${u}`});}catch{}}catch{}let g=0,v=l.join(t,"diplomas");if(i.existsSync(v))try{g=i.readdirSync(v).filter(u=>u.endsWith(".yaml")).length;}catch{}let x={version:"1.0",generatedAt:new Date().toISOString(),totalContent:n.length,entries:n,diplomaCount:g};return i.mkdirSync(t,{recursive:true}),i.writeFileSync(l.join(t,"index.yaml"),c.dump(x,{lineWidth:-1,noRefs:true}),"utf8"),x}function Q(s,t){let e=b(s);if(!e)return [];let n=[...e.entries];if(t.type&&(n=n.filter(r=>r.type===t.type)),t.tag&&(n=n.filter(r=>r.tags.some(a=>a.startsWith(t.tag)))),t.difficulty&&(n=n.filter(r=>r.difficulty===t.difficulty)),t.symbol&&(n=n.filter(r=>r.symbols.includes(t.symbol))),t.query){let r=t.query.toLowerCase();n=n.filter(a=>a.title.toLowerCase().includes(r)||a.id.toLowerCase().includes(r));}return n.slice(0,t.limit||20)}export{b as a,F as b,z as c,D as d,w as e,I as f,$ as g,k as h,q as i,Q as j};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as i from'fs';import*as o from'path';import*as d from'js-yaml';var u=".paradigm/tasks",m="entries",P="index.yaml";function b(n,t){let s=o.join(n,u,m,t);if(!i.existsSync(s))return `T-${t}-001`;let e=i.readdirSync(s).filter(a=>a.startsWith("T-")&&a.endsWith(".yaml")).map(a=>{let l=a.match(/T-\d{4}-\d{2}-\d{2}-(\d+)\.yaml/);return l?parseInt(l[1],10):0}),r=e.length>0?Math.max(...e)+1:1;return `T-${t}-${String(r).padStart(3,"0")}`}var k={high:0,medium:1,low:2};function w(n,t){let s=n;return t.status&&t.status!=="all"&&(s=s.filter(e=>e.status===t.status)),t.priority&&(s=s.filter(e=>e.priority===t.priority)),t.tag&&(s=s.filter(e=>e.tags.includes(t.tag))),s.sort((e,r)=>{let a=(k[e.priority]??1)-(k[r.priority]??1);return a!==0?a:new Date(r.created).getTime()-new Date(e.created).getTime()}),t.limit&&(s=s.slice(0,t.limit)),s}async function _(n,t){let s=o.join(n,u,m);if(!i.existsSync(s))return [];let e={status:"open",limit:20,...t},r=[],a=i.readdirSync(s).filter(l=>/^\d{4}-\d{2}-\d{2}$/.test(l)).sort().reverse();for(let l of a){let f=o.join(s,l),p=i.readdirSync(f).filter(c=>c.endsWith(".yaml")).sort();for(let c of p)try{let g=i.readFileSync(o.join(f,c),"utf8"),y=d.load(g);r.push(y);}catch{}}return w(r,e)}async function v(n,t){let s=t.match(/^T-(\d{4}-\d{2}-\d{2})-/);if(s){let r=o.join(n,u,m,s[1],`${t}.yaml`);if(i.existsSync(r))try{return d.load(i.readFileSync(r,"utf8"))}catch{return null}}return (await _(n,{status:"all",limit:9999})).find(r=>r.id===t)||null}async function I(n,t){let s=new Date,e=s.toISOString().slice(0,10),r=o.join(n,u,m,e);i.mkdirSync(r,{recursive:true});let a=b(n,e),l={id:a,blurb:t.blurb,priority:t.priority||"medium",status:"open",tags:t.tags||[],created:s.toISOString(),session_link:t.session_link,related_lore:t.related_lore};return i.writeFileSync(o.join(r,`${a}.yaml`),d.dump(l,{lineWidth:-1,noRefs:true})),await x(n),a}async function S(n,t,s){let e=await v(n,t);if(!e)return false;let r=e.created.slice(0,10),a=o.join(n,u,m,r,`${t}.yaml`);if(!i.existsSync(a))return false;let{id:l,created:f,...p}=s,c={...e,...p};return i.writeFileSync(a,d.dump(c,{lineWidth:-1,noRefs:true})),await x(n),true}async function j(n,t){return S(n,t,{status:"done",completed:new Date().toISOString()})}async function F(n,t){return S(n,t,{status:"shelved",shelved:new Date().toISOString()})}async function x(n){let t=o.join(n,u,m),s=o.join(n,u),e=0,r=0,a=0,l=0;if(i.existsSync(t)){let p=i.readdirSync(t).filter(c=>/^\d{4}-\d{2}-\d{2}$/.test(c));for(let c of p){let g=o.join(t,c),y=i.readdirSync(g).filter(h=>h.endsWith(".yaml"));for(let h of y)try{let T=d.load(i.readFileSync(o.join(g,h),"utf8"));e++,T.status==="open"?r++:T.status==="done"?a++:T.status==="shelved"&&l++;}catch{}}}let f={version:"1.0",total:e,open:r,done:a,shelved:l,last_updated:new Date().toISOString()};return i.mkdirSync(s,{recursive:true}),i.writeFileSync(o.join(s,P),d.dump(f,{lineWidth:-1,noRefs:true})),f}export{_ as a,v as b,I as c,S as d,j as e,F as f,x as g};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var i={opus:{input:15,output:75},sonnet:{input:3,output:15},haiku:{input:.25,output:1.25}};function s(e,n){let t=i[n],o=e.input/1e6*t.input,r=e.output/1e6*t.output;return o+r}function a(e){return e<.01?`$${(e*100).toFixed(3)}\xA2`:`$${e.toFixed(4)}`}function u(e){return e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()}export{i as a,s as b,a as c,u as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as d from'fs';import*as l from'path';import*as c from'js-yaml';var m=[{id:"explore-before-implement",name:"Explore Before Implementing",description:"Call ripple/navigate/search before modifying existing symbols to understand impact",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple","paradigm_navigate","paradigm_search","paradigm_related"]}},enabled:true},{id:"ripple-before-modify",name:"Ripple Before Modifying",description:"Run ripple analysis before modifying symbols with dependents",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple"]}},enabled:true},{id:"check-fragility",name:"Check Fragility",description:"Check history fragility for symbols before modifying frequently-broken code",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_history_fragility"]}},enabled:true},{id:"wisdom-before-implement",name:"Check Team Wisdom",description:"Check team wisdom (preferences, antipatterns, decisions) before implementing",category:"collaboration",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_wisdom_context","paradigm_wisdom_expert"]}},enabled:true},{id:"verify-before-done",name:"Verify Before Done",description:"Run postflight compliance checks before finishing a session",category:"verification",trigger:"on-stop",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight"]}},enabled:true},{id:"postflight-compliance",name:"Postflight Compliance",description:"Ensure postflight checks pass without errors before finishing",category:"verification",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight","paradigm_reindex"]}},enabled:true},{id:"test-new-components",name:"Test New Components",description:"New components should have associated tests or test plan documented",category:"testing",trigger:"postflight",severity:"advisory",check:{type:"tests-exist",params:{patterns:["**/*.test.*","**/*.spec.*","**/tests/**"]}},enabled:true},{id:"purpose-coverage",name:"Purpose File Coverage",description:"All modified source directories should have .purpose file coverage",category:"documentation",trigger:"postflight",severity:"warn",check:{type:"file-exists",params:{patterns:["**/.purpose"]}},enabled:true},{id:"record-lore-for-significant",name:"Record Lore for Significant Changes",description:"Sessions modifying 3+ files should record a lore entry",category:"documentation",trigger:"on-stop",severity:"warn",check:{type:"lore-recorded",params:{}},enabled:true},{id:"gates-for-routes",name:"Gates for Routes",description:"API routes should have corresponding gate declarations in portal.yaml",category:"security",trigger:"postflight",severity:"warn",check:{type:"gates-declared",params:{requireRoutes:true}},enabled:true},{id:"commit-message-symbols",name:"Commit Message Format",description:"Commit messages should follow type(#symbol): format and include a Symbols: trailer",category:"documentation",trigger:"on-commit",severity:"advisory",check:{type:"commit-message-format",params:{messagePatterns:["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"]}},enabled:true},{id:"flow-coverage-for-multi-component",name:"Flow Coverage",description:"Changes spanning 3+ components should have a documented $flow",category:"documentation",trigger:"postflight",severity:"advisory",check:{type:"flow-coverage",params:{minSteps:3}},enabled:true},{id:"context-session-awareness",name:"Context Awareness",description:"Use session recovery or context check tools for session continuity",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"context-checked",params:{contextTools:["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]}},enabled:true},{id:"aspect-anchors-valid",name:"Aspect Anchors Valid",description:"Aspects touched during the session should have their code anchors validated",category:"verification",trigger:"postflight",severity:"advisory",check:{type:"aspect-anchored",params:{checkAnchors:true}},enabled:true}];var C=m,_=30*1e3;function k(e){try{let t=l.join(e,".paradigm","config.yaml");if(d.existsSync(t)){let s=d.readFileSync(t,"utf8"),o=c.load(s)?.limits;if(o?.habitsCacheTtlMs&&typeof o.habitsCacheTtlMs=="number")return o.habitsCacheTtlMs}}catch{}return _}var f=new Map;function E(e){let t=l.resolve(e),s=f.get(t),i=k(t);if(s&&Date.now()-s.loadedAt<i)return s.habits;let o=T(t);return f.set(t,{habits:o,loadedAt:Date.now()}),o}function T(e){let t=new Map;for(let a of C)t.set(a.id,{...a});let s=process.env.HOME||process.env.USERPROFILE||"~",i=y(l.join(s,".paradigm","habits.yaml"));i&&v(t,i);let o=h(l.join(s,".paradigm","habits"));for(let a of o)t.set(a.id,a);let r=y(l.join(e,".paradigm","habits.yaml"));r&&v(t,r);let u=h(l.join(e,".paradigm","habits"));for(let a of u)t.set(a.id,a);return Array.from(t.values())}function h(e){if(!d.existsSync(e))return [];try{let t=d.readdirSync(e).filter(i=>i.endsWith(".habit")).sort(),s=[];for(let i of t)try{let o=d.readFileSync(l.join(e,i),"utf8"),r=c.load(o);r?.id&&r?.name&&s.push(r);}catch{}return s}catch{return []}}function y(e){if(!d.existsSync(e))return null;try{let t=d.readFileSync(e,"utf8");return c.load(t)}catch{return null}}function v(e,t){if(t.habits)for(let s of t.habits)e.set(s.id,{...s});if(t.overrides)for(let[s,i]of Object.entries(t.overrides)){let o=e.get(s);o&&D(o,i);}}function D(e,t){t.severity!==void 0&&(e.severity=t.severity),t.enabled!==void 0&&(e.enabled=t.enabled);}function p(e,t){return e.filter(s=>s.enabled&&s.trigger===t)}function M(e){return e.filter(t=>t.enabled)}function x(e){let t=l.resolve(e);f.delete(t);}function R(e,t,s){let i=p(e,t),o=[];for(let n of i){let H=F(n,s);o.push(H);}let r=o.filter(n=>n.result==="followed").length,u=o.filter(n=>n.result==="skipped").length,a=o.filter(n=>n.result==="partial").length,g=o.filter(n=>n.result==="skipped"&&n.habit.severity==="block").length;return {trigger:t,evaluations:o,summary:{total:o.length,followed:r,skipped:u,partial:a,blockingViolations:g},blocksCompletion:g>0}}function F(e,t){switch(e.check.type){case "tool-called":return A(e,t);case "file-exists":return P(e,t);case "lore-recorded":return j(e,t);case "symbols-registered":return S(e,t);case "gates-declared":return W(e,t);case "tests-exist":return $(e,t);case "file-modified":return N(e,t);case "git-clean":return q(e,t);case "commit-message-format":return B(e,t);case "flow-coverage":return I(e,t);case "context-checked":return O(e,t);case "aspect-anchored":return U(e,t);default:return {habit:e,result:"partial",reason:`Unknown check type: ${e.check.type}`}}}function A(e,t){let s=e.check.params.tools||[];if(s.length===0)return {habit:e,result:"followed",reason:"No tools required"};let i=s.filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, habit not applicable"}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] were called before modifying code`}}function P(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified, check not applicable"};if(t.filesModified.some(o=>o.endsWith(".purpose")||o.includes(".paradigm/")))return {habit:e,result:"followed",reason:"Purpose files were updated alongside source changes"};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".yml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/"));return i.length===0?{habit:e,result:"followed",reason:"Only non-source files modified"}:{habit:e,result:"skipped",reason:`${i.length} source file(s) modified without .purpose updates`,evidence:i.slice(0,5)}}function j(e,t){let s=t.filesModified.filter(i=>!i.endsWith(".md")&&!i.endsWith(".json")&&!i.endsWith(".yaml")&&!i.endsWith(".yml")&&!i.endsWith(".lock")&&!i.endsWith(".purpose")&&!i.includes(".paradigm/"));return s.length<3?{habit:e,result:"followed",reason:"Session not significant enough to require lore (< 3 source files)"}:t.loreRecorded?{habit:e,result:"followed",reason:"Lore entry was recorded for this session"}:t.toolsCalled.includes("paradigm_lore_record")?{habit:e,result:"followed",reason:"paradigm_lore_record was called during session"}:{habit:e,result:"skipped",reason:`${s.length} source files modified but no lore entry recorded`,evidence:s.slice(0,5)}}function S(e,t){if(t.symbolsTouched.length===0)return {habit:e,result:"followed",reason:"No symbols touched"};let i=["paradigm_purpose_add_component","paradigm_purpose_add_signal","paradigm_purpose_add_flow","paradigm_purpose_add_gate","paradigm_purpose_add_aspect","paradigm_purpose_add_state","paradigm_purpose_init"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Purpose tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"partial",reason:`${t.symbolsTouched.length} symbol(s) touched but no purpose registration tools called`}}function W(e,t){if(!t.taskAddsRoutes)return {habit:e,result:"followed",reason:"Task does not add routes"};if(t.hasPortalRoutes)return {habit:e,result:"followed",reason:"Portal.yaml has route declarations"};let i=["paradigm_gates_for_route","paradigm_portal_add_route","paradigm_portal_add_gate"].filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Gate tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:"Task adds routes but no gate declarations or portal tools called"}}function $(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=t.filesModified.filter(o=>o.includes(".test.")||o.includes(".spec.")||o.includes("/tests/")||o.includes("/test/")||o.includes("__tests__"));if(s.length>0)return {habit:e,result:"followed",reason:`Test files modified: ${s.length}`,evidence:s.slice(0,5)};let i=t.filesModified.filter(o=>!o.endsWith(".md")&&!o.endsWith(".json")&&!o.endsWith(".yaml")&&!o.endsWith(".lock")&&!o.endsWith(".purpose")&&!o.includes(".paradigm/")&&!o.includes("node_modules/"));return i.length===0?{habit:e,result:"followed",reason:"No new source files to test"}:{habit:e,result:"partial",reason:`${i.length} source file(s) modified but no test files updated`,evidence:i.slice(0,5)}}function N(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let s=e.check.params.patterns||[];if(s.length===0)return {habit:e,result:"followed",reason:"No patterns specified"};let i=t.filesModified.filter(o=>s.some(r=>o.includes(r)||l.basename(o)===r));return i.length>0?{habit:e,result:"followed",reason:`Matching files: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:`None of [${s.join(", ")}] found in modified files`}}function q(e,t){return t.filesModified.length===0?{habit:e,result:"followed",reason:"No files modified"}:t.gitClean===void 0?{habit:e,result:"partial",reason:"Git status not available"}:t.gitClean?{habit:e,result:"followed",reason:"Working tree is clean \u2014 changes committed"}:{habit:e,result:"skipped",reason:"Uncommitted changes in working tree"}}function B(e,t){if(!t.commitMessage)return {habit:e,result:"followed",reason:"No commit message to check (not a commit trigger)"};let s=e.check.params.messagePatterns||["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"],i=s.filter(o=>new RegExp(o,"m").test(t.commitMessage));if(i.length===s.length)return {habit:e,result:"followed",reason:"Commit message matches all required patterns",evidence:i};if(i.length>0){let o=s.filter(r=>!new RegExp(r,"m").test(t.commitMessage));return {habit:e,result:"partial",reason:`Commit message matches ${i.length}/${s.length} patterns. Missing: ${o.join(", ")}`}}return {habit:e,result:"skipped",reason:"Commit message does not match required format patterns"}}function I(e,t){let s=t.symbolsTouched.filter(r=>r.startsWith("#"));if(s.length<3)return {habit:e,result:"followed",reason:"Fewer than 3 components touched \u2014 flow not required"};if(t.hasFlowCoverage)return {habit:e,result:"followed",reason:"Flow coverage exists for multi-component changes"};let o=["paradigm_flow_validate","paradigm_flows_affected","paradigm_purpose_add_flow"].filter(r=>t.toolsCalled.includes(r));return o.length>0?{habit:e,result:"followed",reason:`Flow tools called: ${o.join(", ")}`,evidence:o}:{habit:e,result:"skipped",reason:`${s.length} components touched without flow coverage or flow tools called`,evidence:s.slice(0,5)}}function O(e,t){let i=(e.check.params.contextTools||["paradigm_context_check","paradigm_session_recover","paradigm_session_checkpoint"]).filter(o=>t.toolsCalled.includes(o));return i.length>0?{habit:e,result:"followed",reason:`Context tools called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications made, context check not applicable"}:{habit:e,result:"skipped",reason:"No context/session tools called during session"}}function U(e,t){let s=t.symbolsTouched.filter(i=>i.startsWith("~"));return s.length===0?{habit:e,result:"followed",reason:"No aspects touched"}:t.aspectAnchorsValid===true?{habit:e,result:"followed",reason:"Aspect anchors validated and valid"}:t.toolsCalled.includes("paradigm_aspect_check")?{habit:e,result:"followed",reason:"paradigm_aspect_check was called to validate anchors"}:{habit:e,result:"skipped",reason:`${s.length} aspect(s) touched without anchor validation`,evidence:s.slice(0,5)}}function V(e){return {toolsCalled:e.toolsCalled||[],filesModified:e.filesModified||[],symbolsTouched:e.symbolsTouched||[],loreRecorded:e.loreRecorded||false,hasPortalRoutes:e.hasPortalRoutes||false,taskAddsRoutes:e.taskAddsRoutes||false,taskDescription:e.taskDescription,gitClean:e.gitClean,commitMessage:e.commitMessage,hasFlowCoverage:e.hasFlowCoverage,aspectAnchorsValid:e.aspectAnchorsValid}}export{E as a,M as b,x as c,R as d,V as e};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as i from'fs';import*as b from'path';import*as l from'js-yaml';var p=class{logsDir;currentLog=null;constructor(t){this.logsDir=b.join(t,".paradigm","orchestrations");}startOrchestration(t,s,o){return this.ensureLogsDir(),this.currentLog={id:t,task:s,mode:o,started:new Date().toISOString(),status:"running",agents:[],totals:{duration_ms:0,tokens:0,cost_usd:0,agents_spawned:0,files_created:0,files_modified:0}},this.currentLog}logAgentCompletion(t,s){if(this.currentLog&&this.currentLog.id===t){this.currentLog.agents.push(s),this.currentLog.totals.agents_spawned++,this.currentLog.totals.tokens+=s.tokens.total,this.currentLog.totals.cost_usd+=s.cost_usd;for(let o of s.artifacts)o.action==="created"?this.currentLog.totals.files_created++:o.action==="modified"&&this.currentLog.totals.files_modified++;}}completeOrchestration(t,s){if(!this.currentLog)return null;this.currentLog.completed=new Date().toISOString(),this.currentLog.status=t,this.currentLog.totals.duration_ms=s,this.saveOrchestration(this.currentLog);let o=this.currentLog;return this.currentLog=null,o}saveOrchestration(t){this.ensureLogsDir();let s=`${t.started.slice(0,10)}-${this.sanitizeFilename(t.task)}.yaml`,o=b.join(this.logsDir,s),a=l.dump(t,{lineWidth:-1,noRefs:true,quotingType:'"'});i.writeFileSync(o,a);}loadOrchestration(t){let s=this.listLogFiles();for(let o of s)try{let a=i.readFileSync(o,"utf-8"),e=l.load(a);if(e.id===t)return e}catch{}return null}listOrchestrations(t){let s=this.listLogFiles(),o=[];for(let a of s)try{let e=i.readFileSync(a,"utf-8"),r=l.load(e);if(t?.from&&new Date(r.started)<t.from||t?.to&&new Date(r.started)>t.to||t?.status&&r.status!==t.status)continue;o.push({id:r.id,task:r.task,mode:r.mode,started:r.started,status:r.status,agents_spawned:r.totals.agents_spawned,tokens:r.totals.tokens,cost_usd:r.totals.cost_usd,duration_ms:r.totals.duration_ms});}catch{}return o.sort((a,e)=>new Date(e.started).getTime()-new Date(a.started).getTime()),t?.limit?o.slice(0,t.limit):o}getCostSummary(t,s){let o=this.listOrchestrations({from:t,to:s}),a=this.listLogFiles(),e=0,r=0,c={},d={},g={};for(let m of a)try{let f=i.readFileSync(m,"utf-8"),u=l.load(f),L=new Date(u.started);if(t&&L<t||s&&L>s)continue;e+=u.totals.cost_usd,r+=u.totals.tokens;let h=u.started.slice(0,10);g[h]||(g[h]={cost:0,tokens:0}),g[h].cost+=u.totals.cost_usd,g[h].tokens+=u.totals.tokens;for(let n of u.agents)c[n.name]||(c[n.name]={tokens:0,cost:0,count:0}),c[n.name].tokens+=n.tokens.total,c[n.name].cost+=n.cost_usd,c[n.name].count++,d[n.model]||(d[n.model]={tokens:0,cost:0,count:0}),d[n.model].tokens+=n.tokens.total,d[n.model].cost+=n.cost_usd,d[n.model].count++;}catch{}let k=Object.entries(g).map(([m,f])=>({date:m,...f})).sort((m,f)=>m.date.localeCompare(f.date));return {totalCost:e,totalTokens:r,orchestrationCount:o.length,byAgent:c,byModel:d,byDay:k}}exportToJson(t){let s=this.listLogFiles(),o=[];for(let a of s)try{let e=i.readFileSync(a,"utf-8"),r=l.load(e),c=new Date(r.started);if(t?.from&&c<t.from||t?.to&&c>t.to)continue;o.push(r);}catch{}return JSON.stringify(o,null,2)}exportToCsv(t){let s=this.listOrchestrations(t),o=["id","task","mode","started","status","agents_spawned","tokens","cost_usd","duration_ms"],a=s.map(e=>[e.id,`"${e.task.replace(/"/g,'""')}"`,e.mode,e.started,e.status,e.agents_spawned,e.tokens,e.cost_usd.toFixed(4),e.duration_ms]);return [o.join(","),...a.map(e=>e.join(","))].join(`
|
|
3
|
+
`)}ensureLogsDir(){i.existsSync(this.logsDir)||i.mkdirSync(this.logsDir,{recursive:true});}listLogFiles(){return i.existsSync(this.logsDir)?i.readdirSync(this.logsDir).filter(t=>t.endsWith(".yaml")).map(t=>b.join(this.logsDir,t)):[]}sanitizeFilename(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,50)}};export{p as a};
|