newcraw 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/REPL-CTTH53A7.js +50 -0
- package/dist/{acp-J4WDYGRX.js → acp-25PIN25O.js} +69 -40
- package/dist/acp-25PIN25O.js.map +7 -0
- package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-BXDD54YP.js} +13 -10
- package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-BXDD54YP.js.map} +1 -1
- package/dist/{ask-MGUO3L35.js → ask-EL4XAA5P.js} +62 -52
- package/dist/ask-EL4XAA5P.js.map +7 -0
- package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-DKMSJXWW.js} +5 -4
- package/dist/{chunk-2C43OXE7.js → chunk-2OVXJBJV.js} +38 -59
- package/dist/chunk-2OVXJBJV.js.map +7 -0
- package/dist/{chunk-53A4JHFW.js → chunk-3D3C7MRI.js} +23 -4
- package/dist/chunk-3D3C7MRI.js.map +7 -0
- package/dist/{chunk-VKI7ORIO.js → chunk-3ZQRACCP.js} +37 -18
- package/dist/{chunk-VKI7ORIO.js.map → chunk-3ZQRACCP.js.map} +1 -1
- package/dist/chunk-4A6CDBDH.js +822 -0
- package/dist/chunk-4A6CDBDH.js.map +7 -0
- package/dist/{chunk-VQSCECTS.js → chunk-53VETVCP.js} +6 -4
- package/dist/{chunk-VQSCECTS.js.map → chunk-53VETVCP.js.map} +1 -1
- package/dist/{chunk-WWDVA4NV.js → chunk-6WT3ZRYF.js} +22 -6
- package/dist/{chunk-WWDVA4NV.js.map → chunk-6WT3ZRYF.js.map} +1 -1
- package/dist/{chunk-RUXIBQ3B.js → chunk-7E2L7EH2.js} +4 -4
- package/dist/{chunk-VHS2MZQS.js → chunk-7PWVUHQ2.js} +9 -6
- package/dist/{chunk-VHS2MZQS.js.map → chunk-7PWVUHQ2.js.map} +1 -1
- package/dist/{chunk-2EFL22PV.js → chunk-ADJ4YEII.js} +7 -3
- package/dist/chunk-ADJ4YEII.js.map +7 -0
- package/dist/chunk-AKNZJBBU.js +372 -0
- package/dist/chunk-AKNZJBBU.js.map +7 -0
- package/dist/chunk-ALQSPHXV.js +135 -0
- package/dist/chunk-ALQSPHXV.js.map +7 -0
- package/dist/{chunk-XS6PU75S.js → chunk-APSIF3YK.js} +1 -1
- package/dist/{chunk-IM33F5CM.js → chunk-BMJ5XGFR.js} +1668 -1623
- package/dist/chunk-BMJ5XGFR.js.map +7 -0
- package/dist/chunk-BQCOSNM3.js +93 -0
- package/dist/chunk-BQCOSNM3.js.map +7 -0
- package/dist/{chunk-OJIMOLIC.js → chunk-BTCASL4X.js} +3621 -7413
- package/dist/chunk-BTCASL4X.js.map +7 -0
- package/dist/chunk-CHB5K4GI.js +107 -0
- package/dist/chunk-CHB5K4GI.js.map +7 -0
- package/dist/{chunk-QH2M65BR.js → chunk-D2FSAFMO.js} +7 -3
- package/dist/{chunk-QH2M65BR.js.map → chunk-D2FSAFMO.js.map} +1 -1
- package/dist/chunk-D4OZACS2.js +35 -0
- package/dist/{chunk-IIFUDVGS.js → chunk-ENLHVQCX.js} +310 -177
- package/dist/chunk-ENLHVQCX.js.map +7 -0
- package/dist/{chunk-A7X6OCZE.js → chunk-ERKWSZ3K.js} +1 -1
- package/dist/{chunk-UYRR6F5S.js → chunk-FSSZHQEJ.js} +9 -3
- package/dist/{chunk-UYRR6F5S.js.map → chunk-FSSZHQEJ.js.map} +1 -1
- package/dist/chunk-GV73HKJO.js +5473 -0
- package/dist/chunk-GV73HKJO.js.map +7 -0
- package/dist/{chunk-GZTCXXSS.js → chunk-GZ4BEVMZ.js} +57 -46
- package/dist/{chunk-GZTCXXSS.js.map → chunk-GZ4BEVMZ.js.map} +1 -1
- package/dist/chunk-HLBLZKZH.js +45 -0
- package/dist/chunk-HLBLZKZH.js.map +7 -0
- package/dist/chunk-JLVECHVJ.js +36 -0
- package/dist/chunk-JLVECHVJ.js.map +7 -0
- package/dist/chunk-KNSAVNMD.js +683 -0
- package/dist/{chunk-F3COCCAE.js.map → chunk-KNSAVNMD.js.map} +1 -1
- package/dist/{chunk-V5U6BHT2.js → chunk-KRN3WHHL.js} +7 -3
- package/dist/{chunk-V5U6BHT2.js.map → chunk-KRN3WHHL.js.map} +1 -1
- package/dist/{chunk-3LMXSKZ7.js → chunk-NFYAVT54.js} +1 -1
- package/dist/chunk-NT7RDVDA.js +33 -0
- package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
- package/dist/chunk-NW7WSLD5.js +166 -0
- package/dist/{chunk-ZYSVG4X3.js.map → chunk-NW7WSLD5.js.map} +2 -2
- package/dist/{chunk-HSJ6HYAO.js → chunk-P52SGBC4.js} +18 -10
- package/dist/chunk-P52SGBC4.js.map +7 -0
- package/dist/{chunk-XXU2NVOE.js → chunk-PC6QOCGI.js} +30 -6
- package/dist/chunk-PC6QOCGI.js.map +7 -0
- package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
- package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
- package/dist/{chunk-DEF3KFP7.js → chunk-QZFKONA3.js} +4 -2
- package/dist/{chunk-DEF3KFP7.js.map → chunk-QZFKONA3.js.map} +1 -1
- package/dist/{chunk-JWXQNBBA.js → chunk-RE226X4F.js} +7 -1
- package/dist/{chunk-JWXQNBBA.js.map → chunk-RE226X4F.js.map} +1 -1
- package/dist/chunk-RF57YWGW.js +88 -0
- package/dist/chunk-RF57YWGW.js.map +7 -0
- package/dist/chunk-UGBECBIR.js +62 -0
- package/dist/chunk-UGBECBIR.js.map +7 -0
- package/dist/chunk-UYWZQVH5.js +35 -0
- package/dist/chunk-UYWZQVH5.js.map +7 -0
- package/dist/{chunk-LOIZNQOU.js → chunk-VHZRJ7RI.js} +9 -3
- package/dist/{chunk-LOIZNQOU.js.map → chunk-VHZRJ7RI.js.map} +1 -1
- package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
- package/dist/chunk-VSSVN6WG.js.map +7 -0
- package/dist/{chunk-OZHBEG7U.js → chunk-XV7LPJNT.js} +15 -5
- package/dist/{chunk-OZHBEG7U.js.map → chunk-XV7LPJNT.js.map} +1 -1
- package/dist/chunk-Y7MDOB3N.js +65 -0
- package/dist/chunk-Y7MDOB3N.js.map +7 -0
- package/dist/{chunk-BWYKUDJR.js → chunk-ZLAB3Z4G.js} +14 -8
- package/dist/{chunk-BWYKUDJR.js.map → chunk-ZLAB3Z4G.js.map} +1 -1
- package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
- package/dist/chunk-ZMO4E7IW.js.map +7 -0
- package/dist/{cli-KZGF3FV5.js → cli-Z2BNJWHT.js} +251 -485
- package/dist/cli-Z2BNJWHT.js.map +7 -0
- package/dist/commands-3Y3OQOXT.js +54 -0
- package/dist/{config-GTJWCNPF.js → config-5RS7HDIK.js} +9 -6
- package/dist/{context-WF3TTXQU.js → context-XZXRRYKS.js} +8 -7
- package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
- package/dist/{customCommands-QOWK57EX.js → customCommands-6KDAODFQ.js} +6 -5
- package/dist/{env-37BAP7QF.js → env-WIM2DQ4L.js} +10 -7
- package/dist/{gateway-IZYO6YFJ.js → gateway-DKHC7H3K.js} +542 -96
- package/dist/gateway-DKHC7H3K.js.map +7 -0
- package/dist/identity-3KZQQVBG.js +16 -0
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
- package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-4S452GGD.js} +6 -5
- package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-MSMG4QUR.js} +6 -5
- package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
- package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-CYG6MLKP.js} +15 -4
- package/dist/kodeAgentStreamJsonSession-CYG6MLKP.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
- package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-WX3N6CL6.js} +6 -5
- package/dist/{llm-CYUDKJNR.js → llm-V2W4KJIA.js} +239 -57
- package/dist/llm-V2W4KJIA.js.map +7 -0
- package/dist/{llmLazy-IXVVBRTN.js → llmLazy-I7SO67YA.js} +2 -2
- package/dist/{loader-OEJ6C3TN.js → loader-YJGRGJNH.js} +6 -5
- package/dist/{mcp-KE3SILMX.js → mcp-WG3RQQCZ.js} +10 -9
- package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-PKWDUKTN.js} +14 -7
- package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-PKWDUKTN.js.map} +1 -1
- package/dist/{messages-WCSGGSEU.js → messages-RXHQ6VKL.js} +2 -2
- package/dist/{model-4TQIV5J2.js → model-JNWAZGT7.js} +10 -7
- package/dist/{openai-KTZV6F7N.js → openai-6NL5UXO7.js} +8 -7
- package/dist/{outputStyles-WX5RYQOA.js → outputStyles-BVPXT3MW.js} +6 -5
- package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-XHI3TCRJ.js} +11 -8
- package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-XHI3TCRJ.js.map} +1 -1
- package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-WDFL352C.js} +8 -7
- package/dist/prompts-C4RUFGX2.js +58 -0
- package/dist/query-IA3UKMGR.js +58 -0
- package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
- package/dist/{ripgrep-KDPQAMB2.js → ripgrep-BHDXRABJ.js} +5 -4
- package/dist/sandbox-QOXESHL4.js +63 -0
- package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-RIAMO2YA.js} +5 -4
- package/dist/{state-MSCYLB6Y.js → state-TM2XZQE2.js} +6 -3
- package/dist/structuredOutput-KAVFUV2Z.js +9 -0
- package/dist/theme-BXUQNXSD.js +15 -0
- package/dist/thinking-BCZ4WDT6.js +18 -0
- package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
- package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
- package/dist/toolPermissionContextState-ILRPUITK.js +24 -0
- package/dist/toolPermissionContextState-ILRPUITK.js.map +7 -0
- package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-LNYZ6XFE.js} +9 -8
- package/dist/toolPermissionSettings-LNYZ6XFE.js.map +7 -0
- package/dist/tools-HIPUGTF5.js +55 -0
- package/dist/tools-HIPUGTF5.js.map +7 -0
- package/dist/{userInput-LJL4CVOB.js → userInput-I33T2RX2.js} +49 -34
- package/dist/{userInput-LJL4CVOB.js.map → userInput-I33T2RX2.js.map} +1 -1
- package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
- package/dist/uuid-RQH3OZ3W.js.map +7 -0
- package/dist/workspace-EP63OB5S.js +21 -0
- package/dist/workspace-EP63OB5S.js.map +7 -0
- package/package.json +1 -1
- package/web/dist/assets/index-XuLVvSQF.js +251 -0
- package/web/dist/assets/index-pSid9IlY.css +10 -0
- package/web/dist/index.html +2 -2
- package/dist/REPL-IAK7ZN2Z.js +0 -42
- package/dist/acp-J4WDYGRX.js.map +0 -7
- package/dist/ask-MGUO3L35.js.map +0 -7
- package/dist/chunk-2C43OXE7.js.map +0 -7
- package/dist/chunk-2EFL22PV.js.map +0 -7
- package/dist/chunk-53A4JHFW.js.map +0 -7
- package/dist/chunk-755HIAI3.js.map +0 -7
- package/dist/chunk-AXWJI6N5.js +0 -11
- package/dist/chunk-F3COCCAE.js +0 -654
- package/dist/chunk-HSJ6HYAO.js.map +0 -7
- package/dist/chunk-IIFUDVGS.js.map +0 -7
- package/dist/chunk-IM33F5CM.js.map +0 -7
- package/dist/chunk-KQSHIOZK.js +0 -24
- package/dist/chunk-OJIMOLIC.js.map +0 -7
- package/dist/chunk-XMGUQHMF.js.map +0 -7
- package/dist/chunk-XXU2NVOE.js.map +0 -7
- package/dist/chunk-ZYSVG4X3.js +0 -151
- package/dist/cli-KZGF3FV5.js.map +0 -7
- package/dist/commands-AVEBLFVS.js +0 -46
- package/dist/gateway-IZYO6YFJ.js.map +0 -7
- package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
- package/dist/llm-CYUDKJNR.js.map +0 -7
- package/dist/prompts-LE6GK75N.js +0 -48
- package/dist/query-GGIP6PWG.js +0 -50
- package/dist/theme-GAMFOLBW.js +0 -14
- package/dist/tools-3HOUIDM3.js +0 -47
- package/web/dist/assets/index-COAJqX1Z.css +0 -1
- package/web/dist/assets/index-CzS_4LmC.js +0 -179
- /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-CTTH53A7.js.map} +0 -0
- /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-DKMSJXWW.js.map} +0 -0
- /package/dist/{chunk-RUXIBQ3B.js.map → chunk-7E2L7EH2.js.map} +0 -0
- /package/dist/{chunk-XS6PU75S.js.map → chunk-APSIF3YK.js.map} +0 -0
- /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
- /package/dist/{chunk-A7X6OCZE.js.map → chunk-ERKWSZ3K.js.map} +0 -0
- /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFYAVT54.js.map} +0 -0
- /package/dist/{commands-AVEBLFVS.js.map → commands-3Y3OQOXT.js.map} +0 -0
- /package/dist/{config-GTJWCNPF.js.map → config-5RS7HDIK.js.map} +0 -0
- /package/dist/{context-WF3TTXQU.js.map → context-XZXRRYKS.js.map} +0 -0
- /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
- /package/dist/{customCommands-QOWK57EX.js.map → customCommands-6KDAODFQ.js.map} +0 -0
- /package/dist/{env-37BAP7QF.js.map → env-WIM2DQ4L.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-4S452GGD.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-MSMG4QUR.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
- /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
- /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-WX3N6CL6.js.map} +0 -0
- /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-I7SO67YA.js.map} +0 -0
- /package/dist/{mcp-KE3SILMX.js.map → loader-YJGRGJNH.js.map} +0 -0
- /package/dist/{messages-WCSGGSEU.js.map → mcp-WG3RQQCZ.js.map} +0 -0
- /package/dist/{model-4TQIV5J2.js.map → messages-RXHQ6VKL.js.map} +0 -0
- /package/dist/{openai-KTZV6F7N.js.map → model-JNWAZGT7.js.map} +0 -0
- /package/dist/{outputStyles-WX5RYQOA.js.map → openai-6NL5UXO7.js.map} +0 -0
- /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-BVPXT3MW.js.map} +0 -0
- /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-WDFL352C.js.map} +0 -0
- /package/dist/{query-GGIP6PWG.js.map → prompts-C4RUFGX2.js.map} +0 -0
- /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-IA3UKMGR.js.map} +0 -0
- /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
- /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-BHDXRABJ.js.map} +0 -0
- /package/dist/{state-MSCYLB6Y.js.map → sandbox-QOXESHL4.js.map} +0 -0
- /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-RIAMO2YA.js.map} +0 -0
- /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-TM2XZQE2.js.map} +0 -0
- /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
- /package/dist/{tools-3HOUIDM3.js.map → theme-BXUQNXSD.js.map} +0 -0
- /package/dist/{uuid-VA3KVASX.js.map → thinking-BCZ4WDT6.js.map} +0 -0
|
@@ -1,66 +1,79 @@
|
|
|
1
1
|
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
2
|
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
buildSkillMatchDirective,
|
|
5
|
+
createQueryOptions,
|
|
6
|
+
matchSkillForPrompt
|
|
7
|
+
} from "./chunk-RF57YWGW.js";
|
|
3
8
|
import {
|
|
4
9
|
getSystemPrompt,
|
|
5
10
|
query
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-XXU2NVOE.js";
|
|
11
|
+
} from "./chunk-BTCASL4X.js";
|
|
12
|
+
import "./chunk-GV73HKJO.js";
|
|
13
|
+
import "./chunk-53VETVCP.js";
|
|
14
|
+
import "./chunk-NFYAVT54.js";
|
|
15
|
+
import "./chunk-APSIF3YK.js";
|
|
16
|
+
import "./chunk-PC6QOCGI.js";
|
|
13
17
|
import "./chunk-JX5ZQYTQ.js";
|
|
14
18
|
import "./chunk-XJQATPV7.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-BWYKUDJR.js";
|
|
23
|
-
import "./chunk-2EFL22PV.js";
|
|
19
|
+
import "./chunk-D2FSAFMO.js";
|
|
20
|
+
import "./chunk-Y7MDOB3N.js";
|
|
21
|
+
import "./chunk-7E2L7EH2.js";
|
|
22
|
+
import "./chunk-6WT3ZRYF.js";
|
|
23
|
+
import "./chunk-P52SGBC4.js";
|
|
24
|
+
import "./chunk-UGBECBIR.js";
|
|
25
|
+
import "./chunk-ZLAB3Z4G.js";
|
|
24
26
|
import "./chunk-U7S4MEYP.js";
|
|
25
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-FSSZHQEJ.js";
|
|
26
28
|
import "./chunk-TY3CCSAT.js";
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-INJSFEKL.js";
|
|
29
|
-
import "./chunk-2UO3BFZH.js";
|
|
29
|
+
import "./chunk-VHZRJ7RI.js";
|
|
30
30
|
import {
|
|
31
31
|
createUserMessage
|
|
32
|
-
} from "./chunk-
|
|
33
|
-
import
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
} from "./chunk-ERKWSZ3K.js";
|
|
33
|
+
import "./chunk-RE226X4F.js";
|
|
34
|
+
import "./chunk-4A6CDBDH.js";
|
|
35
|
+
import "./chunk-KRN3WHHL.js";
|
|
36
|
+
import "./chunk-7ZFLZNOW.js";
|
|
37
|
+
import "./chunk-7PWVUHQ2.js";
|
|
38
|
+
import "./chunk-INJSFEKL.js";
|
|
39
|
+
import "./chunk-ADJ4YEII.js";
|
|
40
|
+
import "./chunk-JLVECHVJ.js";
|
|
41
|
+
import "./chunk-2OVXJBJV.js";
|
|
42
|
+
import "./chunk-2UO3BFZH.js";
|
|
43
|
+
import "./chunk-CHB5K4GI.js";
|
|
44
|
+
import "./chunk-KNSAVNMD.js";
|
|
36
45
|
import {
|
|
37
46
|
getContext
|
|
38
|
-
} from "./chunk-
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
47
|
+
} from "./chunk-3D3C7MRI.js";
|
|
48
|
+
import "./chunk-QZFKONA3.js";
|
|
49
|
+
import "./chunk-ENLHVQCX.js";
|
|
50
|
+
import "./chunk-NT7RDVDA.js";
|
|
51
|
+
import "./chunk-GZ4BEVMZ.js";
|
|
43
52
|
import {
|
|
44
53
|
getMessagesPath,
|
|
54
|
+
init_log,
|
|
55
|
+
init_state,
|
|
45
56
|
overwriteLog,
|
|
46
57
|
setCwd
|
|
47
|
-
} from "./chunk-
|
|
48
|
-
import "./chunk-
|
|
58
|
+
} from "./chunk-BMJ5XGFR.js";
|
|
59
|
+
import "./chunk-UYWZQVH5.js";
|
|
60
|
+
import "./chunk-NW7WSLD5.js";
|
|
49
61
|
import {
|
|
50
62
|
getTotalCost
|
|
51
|
-
} from "./chunk-
|
|
52
|
-
import "./chunk-
|
|
63
|
+
} from "./chunk-ZMO4E7IW.js";
|
|
64
|
+
import "./chunk-HLBLZKZH.js";
|
|
65
|
+
import "./chunk-D4OZACS2.js";
|
|
53
66
|
|
|
54
67
|
// src/app/ask.ts
|
|
55
68
|
import { last } from "lodash-es";
|
|
69
|
+
init_state();
|
|
70
|
+
init_log();
|
|
56
71
|
async function ask({
|
|
57
|
-
commands,
|
|
58
72
|
safeMode,
|
|
59
73
|
hasPermissionsToUseTool,
|
|
60
74
|
messageLogName,
|
|
61
75
|
prompt,
|
|
62
76
|
cwd,
|
|
63
|
-
tools,
|
|
64
77
|
verbose = false,
|
|
65
78
|
initialMessages,
|
|
66
79
|
persistSession = true,
|
|
@@ -69,32 +82,29 @@ async function ask({
|
|
|
69
82
|
await setCwd(cwd);
|
|
70
83
|
const message = createUserMessage(prompt);
|
|
71
84
|
const messages = [...initialMessages ?? [], message];
|
|
72
|
-
const [systemPrompt, context,
|
|
85
|
+
const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([
|
|
73
86
|
getSystemPrompt({ domain }),
|
|
74
87
|
getContext(),
|
|
75
|
-
|
|
88
|
+
createQueryOptions({
|
|
89
|
+
messages,
|
|
90
|
+
safeMode,
|
|
91
|
+
messageLogName,
|
|
92
|
+
verbose,
|
|
93
|
+
persistSession
|
|
94
|
+
}),
|
|
95
|
+
matchSkillForPrompt(prompt)
|
|
76
96
|
]);
|
|
97
|
+
if (skillMatch) {
|
|
98
|
+
systemPrompt.unshift(buildSkillMatchDirective(skillMatch));
|
|
99
|
+
}
|
|
77
100
|
for await (const m of query(
|
|
78
101
|
messages,
|
|
79
102
|
systemPrompt,
|
|
80
103
|
context,
|
|
81
104
|
hasPermissionsToUseTool,
|
|
82
105
|
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
tools,
|
|
86
|
-
verbose,
|
|
87
|
-
safeMode,
|
|
88
|
-
forkNumber: 0,
|
|
89
|
-
messageLogName: "unused",
|
|
90
|
-
maxThinkingTokens: 0,
|
|
91
|
-
persistSession
|
|
92
|
-
},
|
|
93
|
-
abortController: new AbortController(),
|
|
94
|
-
messageId: void 0,
|
|
95
|
-
readFileTimestamps: {},
|
|
96
|
-
setToolJSX: () => {
|
|
97
|
-
}
|
|
106
|
+
...queryOpts,
|
|
107
|
+
abortController: new AbortController()
|
|
98
108
|
}
|
|
99
109
|
)) {
|
|
100
110
|
messages.push(m);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/app/ask.ts"],
|
|
4
|
+
"sourcesContent": ["import { last } from 'lodash-es'\r\nimport { getSystemPrompt } from '@constants/prompts'\r\nimport { getContext } from '@context'\r\nimport { getTotalCost } from '@costTracker'\r\nimport { Message, query } from '@query'\r\nimport type { CanUseToolFn } from '@newcraw-types/canUseTool'\r\nimport { setCwd } from '@utils/state'\r\nimport { getMessagesPath, overwriteLog } from '@utils/log'\r\nimport { createUserMessage } from '@utils/messages'\r\nimport { createQueryOptions } from '@core/queryOptionsFactory'\r\nimport { matchSkillForPrompt, buildSkillMatchDirective } from '@core/skillMatcher'\r\n\r\ntype Props = {\r\n safeMode?: boolean\r\n hasPermissionsToUseTool: CanUseToolFn\r\n messageLogName: string\r\n prompt: string\r\n cwd: string\r\n verbose?: boolean\r\n initialMessages?: Message[]\r\n persistSession?: boolean\r\n domain?: string\r\n}\r\n\r\nexport async function ask({\r\n safeMode,\r\n hasPermissionsToUseTool,\r\n messageLogName,\r\n prompt,\r\n cwd,\r\n verbose = false,\r\n initialMessages,\r\n persistSession = true,\r\n domain,\r\n}: Props): Promise<{\r\n resultText: string\r\n totalCost: number\r\n messageHistoryFile: string\r\n}> {\r\n await setCwd(cwd)\r\n const message = createUserMessage(prompt)\r\n const messages: Message[] = [...(initialMessages ?? []), message]\r\n\r\n const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([\r\n getSystemPrompt({ domain }),\r\n getContext(),\r\n createQueryOptions({\r\n messages,\r\n safeMode,\r\n messageLogName,\r\n verbose,\r\n persistSession,\r\n }),\r\n matchSkillForPrompt(prompt),\r\n ])\r\n\r\n if (skillMatch) {\r\n systemPrompt.unshift(buildSkillMatchDirective(skillMatch))\r\n }\r\n\r\n for await (const m of query(\r\n messages,\r\n systemPrompt,\r\n context,\r\n hasPermissionsToUseTool,\r\n {\r\n ...queryOpts,\r\n abortController: new AbortController(),\r\n },\r\n )) {\r\n messages.push(m)\r\n }\r\n\r\n const result = last(messages)\r\n if (!result || result.type !== 'assistant') {\r\n throw new Error('Expected content to be an assistant message')\r\n }\r\n\r\n const textContent = result.message.content.find(c => c.type === 'text')\r\n if (!textContent) {\r\n throw new Error(\r\n `Expected at least one text content item, but got ${JSON.stringify(\r\n result.message.content,\r\n null,\r\n 2,\r\n )}`,\r\n )\r\n }\r\n\r\n const messageHistoryFile = getMessagesPath(messageLogName, 0, 0)\r\n overwriteLog(messageHistoryFile, messages)\r\n\r\n return {\r\n resultText: textContent.text,\r\n totalCost: getTotalCost(),\r\n messageHistoryFile,\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAMrB;AACA;AAiBA,eAAsB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAIG;AACD,QAAM,OAAO,GAAG;AAChB,QAAM,UAAU,kBAAkB,MAAM;AACxC,QAAM,WAAsB,CAAC,GAAI,mBAAmB,CAAC,GAAI,OAAO;AAEhE,QAAM,CAAC,cAAc,SAAS,WAAW,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvE,gBAAgB,EAAE,OAAO,CAAC;AAAA,IAC1B,WAAW;AAAA,IACX,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,oBAAoB,MAAM;AAAA,EAC5B,CAAC;AAED,MAAI,YAAY;AACd,iBAAa,QAAQ,yBAAyB,UAAU,CAAC;AAAA,EAC3D;AAEA,mBAAiB,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,iBAAiB,IAAI,gBAAgB;AAAA,IACvC;AAAA,EACF,GAAG;AACD,aAAS,KAAK,CAAC;AAAA,EACjB;AAEA,QAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,CAAC,UAAU,OAAO,SAAS,aAAa;AAC1C,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,QAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACtE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,oDAAoD,KAAK;AAAA,QACvD,OAAO,QAAQ;AAAA,QACf;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,qBAAqB,gBAAgB,gBAAgB,GAAG,CAAC;AAC/D,eAAa,oBAAoB,QAAQ;AAEzC,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,10 +5,11 @@ import {
|
|
|
5
5
|
checkAndNotifyUpdate,
|
|
6
6
|
getLatestVersion,
|
|
7
7
|
getUpdateCommandSuggestions
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-XV7LPJNT.js";
|
|
9
|
+
import "./chunk-BMJ5XGFR.js";
|
|
10
|
+
import "./chunk-UYWZQVH5.js";
|
|
11
|
+
import "./chunk-NW7WSLD5.js";
|
|
12
|
+
import "./chunk-D4OZACS2.js";
|
|
12
13
|
export {
|
|
13
14
|
assertMinVersion,
|
|
14
15
|
checkAndNotifyUpdate,
|
|
@@ -4,19 +4,26 @@ import {
|
|
|
4
4
|
getSessionPlugins
|
|
5
5
|
} from "./chunk-2UO3BFZH.js";
|
|
6
6
|
import {
|
|
7
|
-
debug
|
|
8
|
-
|
|
7
|
+
debug,
|
|
8
|
+
init_debugLogger
|
|
9
|
+
} from "./chunk-GZ4BEVMZ.js";
|
|
9
10
|
import {
|
|
10
11
|
getCwd,
|
|
11
|
-
|
|
12
|
+
getNewcrawBaseDir,
|
|
13
|
+
init_env,
|
|
14
|
+
init_log,
|
|
15
|
+
init_state,
|
|
12
16
|
logError
|
|
13
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-BMJ5XGFR.js";
|
|
14
18
|
|
|
15
19
|
// src/services/plugins/customCommands.ts
|
|
20
|
+
init_state();
|
|
16
21
|
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
17
22
|
import { basename, dirname, join, relative, sep } from "path";
|
|
18
|
-
import { homedir } from "os";
|
|
19
23
|
import { memoize } from "lodash-es";
|
|
24
|
+
init_env();
|
|
25
|
+
init_debugLogger();
|
|
26
|
+
init_log();
|
|
20
27
|
import { execFile } from "child_process";
|
|
21
28
|
import { promisify } from "util";
|
|
22
29
|
import matter from "gray-matter";
|
|
@@ -110,8 +117,8 @@ function parseFrontmatter(content) {
|
|
|
110
117
|
function isSkillMarkdownFile(filePath) {
|
|
111
118
|
return /^skill\.md$/i.test(basename(filePath));
|
|
112
119
|
}
|
|
113
|
-
function
|
|
114
|
-
return
|
|
120
|
+
function getUserNewcrawBaseDir() {
|
|
121
|
+
return getNewcrawBaseDir();
|
|
115
122
|
}
|
|
116
123
|
function toBoolean(value) {
|
|
117
124
|
if (typeof value === "boolean") return value;
|
|
@@ -356,6 +363,9 @@ function loadPluginSkillDirectoryCommandsFromBaseDir(args) {
|
|
|
356
363
|
hasUserSpecifiedDescription: !!frontmatter.description,
|
|
357
364
|
source: "pluginDir",
|
|
358
365
|
scope: "project",
|
|
366
|
+
runtime: frontmatter.runtime,
|
|
367
|
+
executionScript: frontmatter["execution-script"],
|
|
368
|
+
dependencies: frontmatter.dependencies,
|
|
359
369
|
userFacingName() {
|
|
360
370
|
return effectiveDeclaredName ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName) : name;
|
|
361
371
|
},
|
|
@@ -581,6 +591,9 @@ function loadSkillDirectoryCommandsFromBaseDir(skillsDir, source, scope) {
|
|
|
581
591
|
hasUserSpecifiedDescription: !!frontmatter.description,
|
|
582
592
|
source,
|
|
583
593
|
scope,
|
|
594
|
+
runtime: frontmatter.runtime,
|
|
595
|
+
executionScript: frontmatter["execution-script"],
|
|
596
|
+
dependencies: frontmatter.dependencies,
|
|
584
597
|
userFacingName() {
|
|
585
598
|
return effectiveDeclaredName || name;
|
|
586
599
|
},
|
|
@@ -609,40 +622,24 @@ ARGUMENTS: ${trimmedArgs}`;
|
|
|
609
622
|
var loadCustomCommands = memoize(
|
|
610
623
|
async () => {
|
|
611
624
|
const cwd = getCwd();
|
|
612
|
-
const
|
|
625
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
613
626
|
const sessionPlugins = getSessionPlugins();
|
|
614
|
-
const
|
|
615
|
-
const
|
|
616
|
-
const
|
|
617
|
-
const
|
|
618
|
-
const projectLegacySkillsDir = join(cwd, ".claude", "skills");
|
|
619
|
-
const userLegacySkillsDir = join(homedir(), ".claude", "skills");
|
|
620
|
-
const projectKodeSkillsDir = join(cwd, ".newcraw", "skills");
|
|
621
|
-
const userKodeSkillsDir = join(userKodeBaseDir, "skills");
|
|
627
|
+
const projectCommandsDir = join(cwd, ".newcraw", "commands");
|
|
628
|
+
const userCommandsDir = join(userBaseDir, "commands");
|
|
629
|
+
const projectSkillsDir = join(cwd, ".newcraw", "skills");
|
|
630
|
+
const userSkillsDir = join(userBaseDir, "skills");
|
|
622
631
|
const abortController = new AbortController();
|
|
623
632
|
const timeout = setTimeout(() => abortController.abort(), 3e3);
|
|
624
633
|
try {
|
|
625
634
|
const commandFiles = applySkillFilePreference([
|
|
626
635
|
...loadCommandMarkdownFilesFromBaseDir(
|
|
627
|
-
|
|
636
|
+
projectCommandsDir,
|
|
628
637
|
"localSettings",
|
|
629
638
|
"project",
|
|
630
639
|
abortController.signal
|
|
631
640
|
),
|
|
632
641
|
...loadCommandMarkdownFilesFromBaseDir(
|
|
633
|
-
|
|
634
|
-
"localSettings",
|
|
635
|
-
"project",
|
|
636
|
-
abortController.signal
|
|
637
|
-
),
|
|
638
|
-
...loadCommandMarkdownFilesFromBaseDir(
|
|
639
|
-
userLegacyCommandsDir,
|
|
640
|
-
"userSettings",
|
|
641
|
-
"user",
|
|
642
|
-
abortController.signal
|
|
643
|
-
),
|
|
644
|
-
...loadCommandMarkdownFilesFromBaseDir(
|
|
645
|
-
userKodeCommandsDir,
|
|
642
|
+
userCommandsDir,
|
|
646
643
|
"userSettings",
|
|
647
644
|
"user",
|
|
648
645
|
abortController.signal
|
|
@@ -651,22 +648,12 @@ var loadCustomCommands = memoize(
|
|
|
651
648
|
const fileCommands = commandFiles.map(createPromptCommandFromFile).filter((cmd) => cmd !== null);
|
|
652
649
|
const skillDirCommands = [
|
|
653
650
|
...loadSkillDirectoryCommandsFromBaseDir(
|
|
654
|
-
|
|
655
|
-
"localSettings",
|
|
656
|
-
"project"
|
|
657
|
-
),
|
|
658
|
-
...loadSkillDirectoryCommandsFromBaseDir(
|
|
659
|
-
projectKodeSkillsDir,
|
|
651
|
+
projectSkillsDir,
|
|
660
652
|
"localSettings",
|
|
661
653
|
"project"
|
|
662
654
|
),
|
|
663
655
|
...loadSkillDirectoryCommandsFromBaseDir(
|
|
664
|
-
|
|
665
|
-
"userSettings",
|
|
666
|
-
"user"
|
|
667
|
-
),
|
|
668
|
-
...loadSkillDirectoryCommandsFromBaseDir(
|
|
669
|
-
userKodeSkillsDir,
|
|
656
|
+
userSkillsDir,
|
|
670
657
|
"userSettings",
|
|
671
658
|
"user"
|
|
672
659
|
)
|
|
@@ -719,15 +706,11 @@ var loadCustomCommands = memoize(
|
|
|
719
706
|
},
|
|
720
707
|
() => {
|
|
721
708
|
const cwd = getCwd();
|
|
722
|
-
const
|
|
709
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
723
710
|
const dirs = [
|
|
724
|
-
join(
|
|
725
|
-
join(cwd, ".claude", "commands"),
|
|
726
|
-
join(userKodeBaseDir, "commands"),
|
|
711
|
+
join(userBaseDir, "commands"),
|
|
727
712
|
join(cwd, ".newcraw", "commands"),
|
|
728
|
-
join(
|
|
729
|
-
join(cwd, ".claude", "skills"),
|
|
730
|
-
join(userKodeBaseDir, "skills"),
|
|
713
|
+
join(userBaseDir, "skills"),
|
|
731
714
|
join(cwd, ".newcraw", "skills")
|
|
732
715
|
];
|
|
733
716
|
const exists = dirs.map((d) => existsSync(d) ? "1" : "0").join("");
|
|
@@ -738,21 +721,17 @@ var reloadCustomCommands = () => {
|
|
|
738
721
|
loadCustomCommands.cache.clear();
|
|
739
722
|
};
|
|
740
723
|
function getCustomCommandDirectories() {
|
|
741
|
-
const
|
|
724
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
742
725
|
return {
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
userKodeCommands: join(userKodeBaseDir, "commands"),
|
|
748
|
-
projectKodeCommands: join(getCwd(), ".newcraw", "commands"),
|
|
749
|
-
userKodeSkills: join(userKodeBaseDir, "skills"),
|
|
750
|
-
projectKodeSkills: join(getCwd(), ".newcraw", "skills")
|
|
726
|
+
userCommands: join(userBaseDir, "commands"),
|
|
727
|
+
projectCommands: join(getCwd(), ".newcraw", "commands"),
|
|
728
|
+
userSkills: join(userBaseDir, "skills"),
|
|
729
|
+
projectSkills: join(getCwd(), ".newcraw", "skills")
|
|
751
730
|
};
|
|
752
731
|
}
|
|
753
732
|
function hasCustomCommands() {
|
|
754
733
|
const dirs = getCustomCommandDirectories();
|
|
755
|
-
return existsSync(dirs.
|
|
734
|
+
return existsSync(dirs.userCommands) || existsSync(dirs.projectCommands) || existsSync(dirs.userSkills) || existsSync(dirs.projectSkills);
|
|
756
735
|
}
|
|
757
736
|
|
|
758
737
|
export {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/plugins/customCommands.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\nimport { memoize } from 'lodash-es'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { getNewcrawBaseDir } from '@utils/config/env'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\n\nconst execFileAsync = promisify(execFile)\n\nexport async function executeBashCommands(content: string): Promise<string> {\n const bashCommandRegex = /!\\`([^`]+)\\`/g\n const matches = [...content.matchAll(bashCommandRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const command = match[1].trim()\n\n try {\n const parts = command.split(/\\s+/)\n const cmd = parts[0]\n const args = parts.slice(1)\n\n const { stdout, stderr } = await execFileAsync(cmd, args, {\n timeout: 5000,\n encoding: 'utf8',\n cwd: getCwd(),\n })\n\n const output = stdout.trim() || stderr.trim() || '(no output)'\n result = result.replace(fullMatch, output)\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\n command,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error executing: ${command})`)\n }\n }\n\n return result\n}\n\nexport async function resolveFileReferences(content: string): Promise<string> {\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\n const matches = [...content.matchAll(fileRefRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const filePath = match[1]\n\n if (filePath.startsWith('agent-')) {\n continue\n }\n\n try {\n const fullPath = join(getCwd(), filePath)\n\n if (existsSync(fullPath)) {\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\n\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\n result = result.replace(fullMatch, formattedContent)\n } else {\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\n }\n }\n\n return result\n}\n\nexport interface CustomCommandFrontmatter {\n description?: string\n 'allowed-tools'?: string[]\n 'argument-hint'?: string\n when_to_use?: string\n version?: string\n model?: string\n maxThinkingTokens?: number | string\n max_thinking_tokens?: number | string\n 'max-thinking-tokens'?: number | string\n name?: string\n 'disable-model-invocation'?: boolean | string\n runtime?: 'python' | 'node' | 'bash'\n 'execution-script'?: string\n dependencies?: string\n}\n\nexport interface CustomCommandWithScope {\n type: 'prompt'\n name: string\n description: string\n isEnabled: boolean\n isHidden: boolean\n aliases?: string[]\n progressMessage: string\n userFacingName(): string\n getPromptForCommand(args: string): Promise<MessageParam[]>\n allowedTools?: string[]\n maxThinkingTokens?: number\n argumentHint?: string\n whenToUse?: string\n version?: string\n model?: string\n isSkill?: boolean\n disableModelInvocation?: boolean\n hasUserSpecifiedDescription?: boolean\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\n scope?: 'user' | 'project'\n filePath?: string\n runtime?: 'python' | 'node' | 'bash'\n executionScript?: string\n dependencies?: string\n}\n\nexport interface CustomCommandFile {\n frontmatter: CustomCommandFrontmatter\n content: string\n filePath: string\n}\n\nexport function parseFrontmatter(content: string): {\n frontmatter: CustomCommandFrontmatter\n content: string\n} {\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const parsed = matter(content, {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n })\n return {\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\n content: parsed.content ?? '',\n }\n}\n\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\n\nfunction isSkillMarkdownFile(filePath: string): boolean {\n return /^skill\\.md$/i.test(basename(filePath))\n}\n\nfunction getUserNewcrawBaseDir(): string {\n return getNewcrawBaseDir()\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n }\n return false\n}\n\nfunction parseAllowedTools(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(Boolean)\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return []\n return trimmed\n .split(/\\s+/)\n .map(v => v.trim())\n .filter(Boolean)\n }\n return []\n}\n\nfunction parseMaxThinkingTokens(\n frontmatter: CustomCommandFrontmatter,\n): number | undefined {\n const raw =\n (frontmatter as any).maxThinkingTokens ??\n (frontmatter as any).max_thinking_tokens ??\n (frontmatter as any)['max-thinking-tokens'] ??\n (frontmatter as any)['max_thinking_tokens']\n if (raw === undefined || raw === null) return undefined\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nfunction sourceLabel(source: CommandSource): string {\n if (source === 'localSettings') return 'project'\n if (source === 'userSettings') return 'user'\n if (source === 'pluginDir') return 'plugin'\n return 'unknown'\n}\n\nfunction extractDescriptionFromMarkdown(\n markdown: string,\n fallback: string,\n): string {\n const lines = markdown.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\n if (heading?.[1]) return heading[1].trim()\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\n }\n return fallback\n}\n\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\n const relPath = relative(baseDir, dirPath)\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\n return relPath.split(sep).join(':')\n}\n\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\n if (isSkillMarkdownFile(filePath)) {\n const skillDir = dirname(filePath)\n const parentDir = dirname(skillDir)\n const skillName = basename(skillDir)\n const namespace = namespaceFromDirPath(parentDir, baseDir)\n return namespace ? `${namespace}:${skillName}` : skillName\n }\n\n const dir = dirname(filePath)\n const namespace = namespaceFromDirPath(dir, baseDir)\n const fileName = basename(filePath).replace(/\\.md$/i, '')\n return namespace ? `${namespace}:${fileName}` : fileName\n}\n\ntype CommandFileRecord = {\n baseDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n source: CommandSource\n scope: 'user' | 'project'\n}\n\nfunction buildPluginQualifiedName(\n pluginName: string,\n localName: string,\n): string {\n const p = pluginName.trim()\n const l = localName.trim()\n if (!p) return l\n if (!l || l === p) return p\n return `${p}:${l}`\n}\n\nfunction nameForPluginCommandFile(\n filePath: string,\n commandsDir: string,\n pluginName: string,\n): string {\n const rel = relative(commandsDir, filePath)\n const noExt = rel.replace(/\\.md$/i, '')\n const localName = noExt.split(sep).filter(Boolean).join(':')\n return buildPluginQualifiedName(pluginName, localName)\n}\n\nfunction createPluginPromptCommandFromFile(record: {\n pluginName: string\n commandsDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n}): CustomCommandWithScope | null {\n const name = nameForPluginCommandFile(\n record.filePath,\n record.commandsDir,\n record.pluginName,\n )\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(record.content, 'Custom command')\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n return {\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage: 'running',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: false,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction loadPluginCommandsFromDir(args: {\n pluginName: string\n commandsDir: string\n signal: AbortSignal\n}): CustomCommandWithScope[] {\n let commandsBaseDir = args.commandsDir\n let files: string[] = []\n try {\n const st = statSync(args.commandsDir)\n if (st.isFile()) {\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\n files = [args.commandsDir]\n commandsBaseDir = dirname(args.commandsDir)\n } else if (st.isDirectory()) {\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\n } else {\n return []\n }\n } catch {\n return []\n }\n\n const out: CustomCommandWithScope[] = []\n for (const filePath of files) {\n if (args.signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n const cmd = createPluginPromptCommandFromFile({\n pluginName: args.pluginName,\n commandsDir: commandsBaseDir,\n filePath,\n frontmatter,\n content,\n })\n if (cmd) out.push(cmd)\n } catch {\n }\n }\n return out\n}\n\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\n pluginName: string\n skillsDir: string\n}): CustomCommandWithScope[] {\n if (!existsSync(args.skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(args.skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = buildPluginQualifiedName(args.pluginName, dirName)\n if (!validateName(dirName)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n runtime: frontmatter.runtime,\n executionScript: frontmatter['execution-script'],\n dependencies: frontmatter.dependencies,\n userFacingName() {\n return effectiveDeclaredName\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\n : name\n },\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = argsText.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nfunction applySkillFilePreference(\n files: CommandFileRecord[],\n): CommandFileRecord[] {\n const grouped = new Map<string, CommandFileRecord[]>()\n for (const file of files) {\n const key = dirname(file.filePath)\n const existing = grouped.get(key) ?? []\n existing.push(file)\n grouped.set(key, existing)\n }\n\n const result: CommandFileRecord[] = []\n for (const group of grouped.values()) {\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\n if (skillFiles.length > 0) {\n result.push(skillFiles[0]!)\n continue\n }\n result.push(...group)\n }\n return result\n}\n\nfunction createPromptCommandFromFile(\n record: CommandFileRecord,\n): CustomCommandWithScope | null {\n const isSkill = isSkillMarkdownFile(record.filePath)\n const name = nameForCommandFile(record.filePath, record.baseDir)\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(\n record.content,\n isSkill ? 'Skill' : 'Custom command',\n )\n\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n const description = `${descriptionText} (${sourceLabel(record.source)})`\n const progressMessage = isSkill ? 'loading' : 'running'\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\n\n return {\n type: 'prompt',\n name,\n description,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage,\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: record.source,\n scope: record.scope,\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n if (isSkill && skillBaseDir) {\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\n }\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction listMarkdownFilesRecursively(\n baseDir: string,\n signal: AbortSignal,\n): string[] {\n const results: string[] = []\n const queue: string[] = [baseDir]\n while (queue.length > 0) {\n if (signal.aborted) break\n const currentDir = queue.pop()!\n let entries\n try {\n entries = readdirSync(currentDir, { withFileTypes: true })\n } catch {\n continue\n }\n for (const entry of entries) {\n if (signal.aborted) break\n const fullPath = join(currentDir, entry.name)\n if (entry.isDirectory()) {\n queue.push(fullPath)\n continue\n }\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\n results.push(fullPath)\n }\n }\n }\n return results\n}\n\nfunction loadCommandMarkdownFilesFromBaseDir(\n baseDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n signal: AbortSignal,\n): CommandFileRecord[] {\n if (!existsSync(baseDir)) return []\n const files = listMarkdownFilesRecursively(baseDir, signal)\n const records: CommandFileRecord[] = []\n for (const filePath of files) {\n if (signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\n } catch {\n }\n }\n return records\n}\n\nfunction loadSkillDirectoryCommandsFromBaseDir(\n skillsDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n): CustomCommandWithScope[] {\n if (!existsSync(skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = dirName\n if (!validateName(name)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel(source)})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source,\n scope,\n runtime: frontmatter.runtime,\n executionScript: frontmatter['execution-script'],\n dependencies: frontmatter.dependencies,\n userFacingName() {\n return effectiveDeclaredName || name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nexport const loadCustomCommands = memoize(\n async (): Promise<CustomCommandWithScope[]> => {\n const cwd = getCwd()\n const userBaseDir = getUserNewcrawBaseDir()\n const sessionPlugins = getSessionPlugins()\n\n const projectCommandsDir = join(cwd, '.newcraw', 'commands')\n const userCommandsDir = join(userBaseDir, 'commands')\n\n const projectSkillsDir = join(cwd, '.newcraw', 'skills')\n const userSkillsDir = join(userBaseDir, 'skills')\n\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 3000)\n\n try {\n const commandFiles = applySkillFilePreference([\n ...loadCommandMarkdownFilesFromBaseDir(\n projectCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ])\n\n const fileCommands = commandFiles\n .map(createPromptCommandFromFile)\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\n\n const skillDirCommands: CustomCommandWithScope[] = [\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectSkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userSkillsDir,\n 'userSettings',\n 'user',\n ),\n ]\n\n const pluginCommands: CustomCommandWithScope[] = []\n if (sessionPlugins.length > 0) {\n for (const plugin of sessionPlugins) {\n for (const commandsDir of plugin.commandsDirs) {\n pluginCommands.push(\n ...loadPluginCommandsFromDir({\n pluginName: plugin.name,\n commandsDir,\n signal: abortController.signal,\n }),\n )\n }\n for (const skillsDir of plugin.skillsDirs) {\n pluginCommands.push(\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\n pluginName: plugin.name,\n skillsDir,\n }),\n )\n }\n }\n }\n\n const ordered = [\n ...fileCommands,\n ...skillDirCommands,\n ...pluginCommands,\n ].filter(cmd => cmd.isEnabled)\n\n const seen = new Set<string>()\n const unique: CustomCommandWithScope[] = []\n for (const cmd of ordered) {\n const key = cmd.userFacingName()\n if (seen.has(key)) continue\n seen.add(key)\n unique.push(cmd)\n }\n\n return unique\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return []\n } finally {\n clearTimeout(timeout)\n }\n },\n () => {\n const cwd = getCwd()\n const userBaseDir = getUserNewcrawBaseDir()\n const dirs = [\n join(userBaseDir, 'commands'),\n join(cwd, '.newcraw', 'commands'),\n join(userBaseDir, 'skills'),\n join(cwd, '.newcraw', 'skills'),\n ]\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\n },\n)\n\nexport const reloadCustomCommands = (): void => {\n loadCustomCommands.cache.clear()\n}\n\nexport function getCustomCommandDirectories(): {\n userCommands: string\n projectCommands: string\n userSkills: string\n projectSkills: string\n} {\n const userBaseDir = getUserNewcrawBaseDir()\n return {\n userCommands: join(userBaseDir, 'commands'),\n projectCommands: join(getCwd(), '.newcraw', 'commands'),\n userSkills: join(userBaseDir, 'skills'),\n projectSkills: join(getCwd(), '.newcraw', 'skills'),\n }\n}\n\nexport function hasCustomCommands(): boolean {\n const dirs = getCustomCommandDirectories()\n return (\n existsSync(dirs.userCommands) ||\n existsSync(dirs.projectCommands) ||\n existsSync(dirs.userSkills) ||\n existsSync(dirs.projectSkills)\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["namespace"]
|
|
7
|
+
}
|
|
@@ -4,20 +4,31 @@ import {
|
|
|
4
4
|
getCurrentProjectConfig,
|
|
5
5
|
getGlobalConfig,
|
|
6
6
|
getOrCreateUserID,
|
|
7
|
+
init_config,
|
|
7
8
|
saveCurrentProjectConfig
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ENLHVQCX.js";
|
|
9
10
|
import {
|
|
10
11
|
SESSION_ID,
|
|
11
12
|
env,
|
|
12
13
|
execFileNoThrow,
|
|
13
14
|
getCwd,
|
|
15
|
+
init_env,
|
|
16
|
+
init_execFileNoThrow,
|
|
17
|
+
init_log,
|
|
18
|
+
init_state,
|
|
14
19
|
logError
|
|
15
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-BMJ5XGFR.js";
|
|
16
21
|
import {
|
|
17
|
-
MACRO
|
|
18
|
-
|
|
22
|
+
MACRO,
|
|
23
|
+
init_macros
|
|
24
|
+
} from "./chunk-NW7WSLD5.js";
|
|
25
|
+
|
|
26
|
+
// src/context/index.ts
|
|
27
|
+
init_config();
|
|
28
|
+
init_log();
|
|
19
29
|
|
|
20
30
|
// src/utils/config/style.ts
|
|
31
|
+
init_state();
|
|
21
32
|
import { readFileSync as readFileSync2 } from "fs";
|
|
22
33
|
import { memoize } from "lodash-es";
|
|
23
34
|
|
|
@@ -181,9 +192,11 @@ ${styles.join("\n\n")}`;
|
|
|
181
192
|
});
|
|
182
193
|
|
|
183
194
|
// src/context/index.ts
|
|
195
|
+
init_state();
|
|
184
196
|
import { memoize as memoize4, omit } from "lodash-es";
|
|
185
197
|
|
|
186
198
|
// src/utils/system/git.ts
|
|
199
|
+
init_execFileNoThrow();
|
|
187
200
|
import { memoize as memoize2 } from "lodash-es";
|
|
188
201
|
var getIsGit = memoize2(async () => {
|
|
189
202
|
const { code } = await execFileNoThrow("git", [
|
|
@@ -258,11 +271,17 @@ async function getGitState() {
|
|
|
258
271
|
}
|
|
259
272
|
|
|
260
273
|
// src/context/index.ts
|
|
274
|
+
init_execFileNoThrow();
|
|
261
275
|
import { join as join2 } from "path";
|
|
262
276
|
import { readFile } from "fs/promises";
|
|
263
277
|
import { existsSync as existsSync2, readdirSync } from "fs";
|
|
264
278
|
|
|
265
279
|
// src/utils/identity/user.ts
|
|
280
|
+
init_config();
|
|
281
|
+
init_env();
|
|
282
|
+
init_execFileNoThrow();
|
|
283
|
+
init_log();
|
|
284
|
+
init_macros();
|
|
266
285
|
import { memoize as memoize3 } from "lodash-es";
|
|
267
286
|
var getGitEmail = memoize3(async () => {
|
|
268
287
|
const result = await execFileNoThrow("git", ["config", "user.email"]);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/context/index.ts", "../src/utils/config/style.ts", "../src/utils/config/projectInstructions.ts", "../src/utils/system/git.ts", "../src/utils/identity/user.ts"],
|
|
4
|
+
"sourcesContent": ["import {\r\n getCurrentProjectConfig,\r\n saveCurrentProjectConfig,\r\n} from '@utils/config'\r\nimport { logError } from '@utils/log'\r\nimport { getCodeStyle } from '@utils/config/style'\r\nimport { getCwd } from '@utils/state'\r\nimport { memoize, omit } from 'lodash-es'\r\nimport { getIsGit } from '@utils/system/git'\r\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\r\nimport { join } from 'path'\r\nimport { readFile } from 'fs/promises'\r\nimport { existsSync, readdirSync } from 'fs'\r\nimport { getModelManager } from '@utils/model'\r\nimport { lastX } from '@utils/text/generators'\r\nimport { getGitEmail } from '@utils/identity/user'\r\nimport {\r\n getProjectInstructionFiles,\r\n readAndConcatProjectInstructionFiles,\r\n} from '@utils/config/projectInstructions'\r\nexport async function getInstructionFilesNote(): Promise<string | null> {\r\n try {\r\n const cwd = getCwd()\r\n const instructionFiles = getProjectInstructionFiles(cwd)\r\n const legacyPath = join(cwd, 'CLAUDE.md')\r\n const hasLegacy = existsSync(legacyPath)\r\n\r\n if (instructionFiles.length === 0 && !hasLegacy) {\r\n return null\r\n }\r\n\r\n const fileTypes = new Set<string>()\r\n for (const f of instructionFiles) fileTypes.add(f.filename)\r\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\r\n\r\n const allFiles = [\r\n ...instructionFiles.map(f => f.absolutePath),\r\n ...(hasLegacy ? [legacyPath] : []),\r\n ]\r\n\r\n return `NOTE: Additional project instruction files (${Array.from(fileTypes).join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\r\n .map(_ => `- ${_}`)\r\n .join('\\n')}`\r\n } catch (error) {\r\n logError(error)\r\n return null\r\n }\r\n}\r\n\r\nexport function setContext(key: string, value: string): void {\r\n const projectConfig = getCurrentProjectConfig()\r\n const context = omit(\r\n { ...projectConfig.context, [key]: value },\r\n 'codeStyle',\r\n 'directoryStructure',\r\n )\r\n saveCurrentProjectConfig({ ...projectConfig, context })\r\n}\r\n\r\nexport function removeContext(key: string): void {\r\n const projectConfig = getCurrentProjectConfig()\r\n const context = omit(\r\n projectConfig.context,\r\n key,\r\n 'codeStyle',\r\n 'directoryStructure',\r\n )\r\n saveCurrentProjectConfig({ ...projectConfig, context })\r\n}\r\n\r\nexport const getReadme = memoize(async (): Promise<string | null> => {\r\n try {\r\n const readmePath = join(getCwd(), 'README.md')\r\n if (!existsSync(readmePath)) {\r\n return null\r\n }\r\n const content = await readFile(readmePath, 'utf-8')\r\n return content\r\n } catch (e) {\r\n logError(e)\r\n return null\r\n }\r\n})\r\n\r\nexport async function getProjectDocsForCwd(\r\n cwd: string,\r\n): Promise<string | null> {\r\n try {\r\n const instructionFiles = getProjectInstructionFiles(cwd)\r\n const legacyPath = join(cwd, 'CLAUDE.md')\r\n\r\n const docs = []\r\n\r\n if (instructionFiles.length > 0) {\r\n const { content } = readAndConcatProjectInstructionFiles(\r\n instructionFiles,\r\n { includeHeadings: true },\r\n )\r\n if (content.trim().length > 0) docs.push(content)\r\n }\r\n\r\n if (existsSync(legacyPath)) {\r\n try {\r\n const content = await readFile(legacyPath, 'utf-8')\r\n docs.push(\r\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\r\n )\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n\r\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\r\n } catch (e) {\r\n logError(e)\r\n return null\r\n }\r\n}\r\n\r\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\r\n return getProjectDocsForCwd(getCwd())\r\n})\r\n\r\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\r\n if (process.env.NODE_ENV === 'test') {\r\n return null\r\n }\r\n if (!(await getIsGit())) {\r\n return null\r\n }\r\n\r\n try {\r\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\r\n execFileNoThrow(\r\n 'git',\r\n ['branch', '--show-current'],\r\n undefined,\r\n undefined,\r\n false,\r\n ).then(({ stdout }) => stdout.trim()),\r\n execFileNoThrow(\r\n 'git',\r\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\r\n undefined,\r\n undefined,\r\n false,\r\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\r\n execFileNoThrow(\r\n 'git',\r\n ['status', '--short'],\r\n undefined,\r\n undefined,\r\n false,\r\n ).then(({ stdout }) => stdout.trim()),\r\n execFileNoThrow(\r\n 'git',\r\n ['log', '--oneline', '-n', '5'],\r\n undefined,\r\n undefined,\r\n false,\r\n ).then(({ stdout }) => stdout.trim()),\r\n execFileNoThrow(\r\n 'git',\r\n [\r\n 'log',\r\n '--oneline',\r\n '-n',\r\n '5',\r\n '--author',\r\n (await getGitEmail()) || '',\r\n ],\r\n undefined,\r\n undefined,\r\n false,\r\n ).then(({ stdout }) => stdout.trim()),\r\n ])\r\n const statusLines = status.split('\\n').length\r\n const truncatedStatus =\r\n statusLines > 200\r\n ? status.split('\\n').slice(0, 200).join('\\n') +\r\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\r\n : status\r\n\r\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\r\n } catch (error) {\r\n logError(error)\r\n return null\r\n }\r\n})\r\n\r\nexport const getContext = memoize(\r\n async (): Promise<{\r\n [k: string]: string\r\n }> => {\r\n const codeStyle = getCodeStyle()\r\n const projectConfig = getCurrentProjectConfig()\r\n const dontCrawl = projectConfig.dontCrawlDirectory\r\n const [\r\n gitStatus,\r\n directoryStructure,\r\n instructionFilesNote,\r\n readme,\r\n projectDocs,\r\n ] = await Promise.all([\r\n getGitStatus(),\r\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\r\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\r\n getReadme(),\r\n getProjectDocs(),\r\n ])\r\n return {\r\n ...projectConfig.context,\r\n ...(directoryStructure ? { directoryStructure } : {}),\r\n ...(gitStatus ? { gitStatus } : {}),\r\n ...(codeStyle ? { codeStyle } : {}),\r\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\r\n ...(readme ? { readme } : {}),\r\n ...(projectDocs ? { projectDocs } : {}),\r\n }\r\n },\r\n)\r\n\r\nexport const getDirectoryStructure = memoize(\r\n async function (): Promise<string> {\r\n let lines: string\r\n try {\r\n const entries = readdirSync(getCwd(), { withFileTypes: true })\r\n lines = entries\r\n .map(entry => `${entry.isDirectory() ? 'd' : 'f'} ${entry.name}`)\r\n .join('\\n')\r\n } catch (error) {\r\n logError(error)\r\n return ''\r\n }\r\n\r\n return `Below is a snapshot of this project's file structure at the start of the conversation. This snapshot will NOT update during the conversation.\r\n\r\n${lines}`\r\n },\r\n)\r\n", "import { readFileSync } from 'fs'\r\nimport { memoize } from 'lodash-es'\r\nimport { getCwd } from '@utils/state'\r\nimport { getProjectInstructionFiles } from './projectInstructions'\r\n\r\nconst STYLE_PROMPT =\r\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\r\n\r\nexport const getCodeStyle = memoize((): string => {\r\n const styles: string[] = []\r\n\r\n const instructionFiles = getProjectInstructionFiles(getCwd())\r\n for (const file of instructionFiles) {\r\n try {\r\n styles.push(\r\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\r\n )\r\n } catch {\r\n }\r\n }\r\n\r\n if (styles.length === 0) {\r\n return ''\r\n }\r\n\r\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\r\n})\r\n", "import { existsSync, readFileSync } from 'fs'\r\nimport { dirname, join, parse, relative, resolve, sep } from 'path'\r\n\r\nexport type ProjectInstructionFile = {\r\n absolutePath: string\r\n relativePathFromGitRoot: string\r\n filename: 'AGENTS.override.md' | 'AGENTS.md'\r\n}\r\n\r\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024\r\n\r\nfunction isRegularFile(path: string): boolean {\r\n try {\r\n return existsSync(path)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function findGitRoot(startDir: string): string | null {\r\n let currentDir = resolve(startDir)\r\n const fsRoot = parse(currentDir).root\r\n\r\n while (true) {\r\n const dotGitPath = join(currentDir, '.git')\r\n if (existsSync(dotGitPath)) {\r\n return currentDir\r\n }\r\n if (currentDir === fsRoot) {\r\n return null\r\n }\r\n currentDir = dirname(currentDir)\r\n }\r\n}\r\n\r\nfunction getDirsFromGitRootToCwd(gitRoot: string, cwd: string): string[] {\r\n const absoluteGitRoot = resolve(gitRoot)\r\n const absoluteCwd = resolve(cwd)\r\n\r\n const rel = relative(absoluteGitRoot, absoluteCwd)\r\n if (!rel || rel === '.') {\r\n return [absoluteGitRoot]\r\n }\r\n\r\n const parts = rel.split(sep).filter(Boolean)\r\n const dirs: string[] = [absoluteGitRoot]\r\n for (let i = 0; i < parts.length; i++) {\r\n dirs.push(join(absoluteGitRoot, ...parts.slice(0, i + 1)))\r\n }\r\n return dirs\r\n}\r\n\r\nexport function getProjectInstructionFiles(\r\n cwd: string,\r\n): ProjectInstructionFile[] {\r\n const gitRoot = findGitRoot(cwd)\r\n const root = gitRoot ?? resolve(cwd)\r\n const dirs = getDirsFromGitRootToCwd(root, cwd)\r\n\r\n const results: ProjectInstructionFile[] = []\r\n for (const dir of dirs) {\r\n const overridePath = join(dir, 'AGENTS.override.md')\r\n const agentsPath = join(dir, 'AGENTS.md')\r\n\r\n if (isRegularFile(overridePath)) {\r\n results.push({\r\n absolutePath: overridePath,\r\n relativePathFromGitRoot:\r\n relative(root, overridePath) || 'AGENTS.override.md',\r\n filename: 'AGENTS.override.md',\r\n })\r\n continue\r\n }\r\n\r\n if (isRegularFile(agentsPath)) {\r\n results.push({\r\n absolutePath: agentsPath,\r\n relativePathFromGitRoot: relative(root, agentsPath) || 'AGENTS.md',\r\n filename: 'AGENTS.md',\r\n })\r\n }\r\n }\r\n\r\n return results\r\n}\r\n\r\nexport function getProjectDocMaxBytes(): number {\r\n const raw = process.env.NEWCRAW_PROJECT_DOC_MAX_BYTES\r\n if (!raw) return DEFAULT_PROJECT_DOC_MAX_BYTES\r\n const parsed = Number.parseInt(raw, 10)\r\n if (!Number.isFinite(parsed) || parsed <= 0)\r\n return DEFAULT_PROJECT_DOC_MAX_BYTES\r\n return parsed\r\n}\r\n\r\nexport function readAndConcatProjectInstructionFiles(\r\n files: ProjectInstructionFile[],\r\n {\r\n maxBytes = getProjectDocMaxBytes(),\r\n includeHeadings = true,\r\n }: { maxBytes?: number; includeHeadings?: boolean } = {},\r\n): { content: string; truncated: boolean } {\r\n let totalBytes = 0\r\n let truncated = false\r\n\r\n const parts: string[] = []\r\n\r\n const truncateUtf8ToBytes = (value: string, bytes: number): string => {\r\n const buf = Buffer.from(value, 'utf8')\r\n if (buf.length <= bytes) return value\r\n return buf.subarray(0, Math.max(0, bytes)).toString('utf8')\r\n }\r\n\r\n for (const file of files) {\r\n if (totalBytes >= maxBytes) {\r\n truncated = true\r\n break\r\n }\r\n\r\n let raw: string\r\n try {\r\n raw = readFileSync(file.absolutePath, 'utf-8')\r\n } catch {\r\n continue\r\n }\r\n\r\n if (!raw.trim()) continue\r\n\r\n const separator = parts.length > 0 ? '\\n\\n' : ''\r\n const separatorBytes = Buffer.byteLength(separator, 'utf8')\r\n const remainingAfterSeparator = maxBytes - totalBytes - separatorBytes\r\n if (remainingAfterSeparator <= 0) {\r\n truncated = true\r\n break\r\n }\r\n\r\n const heading = includeHeadings\r\n ? `# ${file.filename}\\n\\n_Path: ${file.relativePathFromGitRoot}_\\n\\n`\r\n : ''\r\n\r\n const block = `${heading}${raw}`.trimEnd()\r\n const blockBytes = Buffer.byteLength(block, 'utf8')\r\n\r\n if (blockBytes <= remainingAfterSeparator) {\r\n parts.push(`${separator}${block}`)\r\n totalBytes += separatorBytes + blockBytes\r\n continue\r\n }\r\n\r\n truncated = true\r\n const suffix = `\\n\\n... (truncated: project instruction files exceeded ${maxBytes} bytes)`\r\n const suffixBytes = Buffer.byteLength(suffix, 'utf8')\r\n\r\n let finalBlock = ''\r\n if (suffixBytes >= remainingAfterSeparator) {\r\n finalBlock = truncateUtf8ToBytes(suffix, remainingAfterSeparator)\r\n } else {\r\n const prefixBudget = remainingAfterSeparator - suffixBytes\r\n const prefix = truncateUtf8ToBytes(block, prefixBudget)\r\n finalBlock = `${prefix}${suffix}`\r\n }\r\n\r\n parts.push(`${separator}${finalBlock}`)\r\n totalBytes += separatorBytes + Buffer.byteLength(finalBlock, 'utf8')\r\n break\r\n }\r\n\r\n return { content: parts.join(''), truncated }\r\n}\r\n", "import { memoize } from 'lodash-es'\r\nimport { execFileNoThrow } from './execFileNoThrow'\r\n\r\nexport const getIsGit = memoize(async (): Promise<boolean> => {\r\n const { code } = await execFileNoThrow('git', [\r\n 'rev-parse',\r\n '--is-inside-work-tree',\r\n ])\r\n return code === 0\r\n})\r\n\r\nexport const getHead = async (): Promise<string> => {\r\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\r\n return stdout.trim()\r\n}\r\n\r\nexport const getBranch = async (): Promise<string> => {\r\n const { stdout } = await execFileNoThrow(\r\n 'git',\r\n ['rev-parse', '--abbrev-ref', 'HEAD'],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n return stdout.trim()\r\n}\r\n\r\nexport const getRemoteUrl = async (): Promise<string | null> => {\r\n const { stdout, code } = await execFileNoThrow(\r\n 'git',\r\n ['remote', 'get-url', 'origin'],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n return code === 0 ? stdout.trim() : null\r\n}\r\n\r\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\r\n const { code } = await execFileNoThrow(\r\n 'git',\r\n ['rev-parse', '@{u}'],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n return code === 0\r\n}\r\n\r\nexport const getIsClean = async (): Promise<boolean> => {\r\n const { stdout } = await execFileNoThrow(\r\n 'git',\r\n ['status', '--porcelain'],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n return stdout.trim().length === 0\r\n}\r\n\r\nexport interface GitRepoState {\r\n commitHash: string\r\n branchName: string\r\n remoteUrl: string | null\r\n isHeadOnRemote: boolean\r\n isClean: boolean\r\n}\r\n\r\nexport async function getGitState(): Promise<GitRepoState | null> {\r\n try {\r\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\r\n await Promise.all([\r\n getHead(),\r\n getBranch(),\r\n getRemoteUrl(),\r\n getIsHeadOnRemote(),\r\n getIsClean(),\r\n ])\r\n\r\n return {\r\n commitHash,\r\n branchName,\r\n remoteUrl,\r\n isHeadOnRemote,\r\n isClean,\r\n }\r\n } catch (_) {\r\n return null\r\n }\r\n}\r\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\r\nimport { memoize } from 'lodash-es'\r\nimport { env } from '@utils/config/env'\r\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\r\nimport { logError, SESSION_ID } from '@utils/log'\r\nimport { MACRO } from '@constants/macros'\r\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\r\n const result = await execFileNoThrow('git', ['config', 'user.email'])\r\n if (result.code !== 0) {\r\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\r\n return undefined\r\n }\r\n return result.stdout.trim() || undefined\r\n})\r\n\r\ntype SimpleUser = {\r\n customIDs?: Record<string, string>\r\n userID: string\r\n appVersion?: string\r\n userAgent?: string\r\n email?: string\r\n custom?: Record<string, unknown>\r\n}\r\n\r\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\r\n const userID = getOrCreateUserID()\r\n const config = getGlobalConfig()\r\n const email = undefined\r\n return {\r\n customIDs: {\r\n sessionId: SESSION_ID,\r\n },\r\n userID,\r\n appVersion: MACRO.VERSION,\r\n userAgent: env.platform,\r\n email,\r\n custom: {\r\n nodeVersion: env.nodeVersion,\r\n userType: process.env.USER_TYPE,\r\n organizationUuid: config.oauthAccount?.organizationUuid,\r\n accountUuid: config.oauthAccount?.accountUuid,\r\n },\r\n }\r\n})\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["readFileSync", "readFileSync", "memoize", "memoize", "join", "existsSync", "memoize", "join", "existsSync", "memoize"]
|
|
7
|
+
}
|