pybao-cli 1.3.93 → 1.3.95
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-7WPVB4IF.js +47 -0
- package/dist/{acp-EVHOGBLR.js → acp-IP2EUY3O.js} +29 -29
- package/dist/{agentsValidate-SX5WCTHD.js → agentsValidate-YGYIFZ2Q.js} +7 -7
- package/dist/{ask-5256RCJR.js → ask-RXRDLJ2Q.js} +28 -28
- package/dist/{autoUpdater-62OEX27S.js → autoUpdater-WXXGD5CW.js} +3 -3
- package/dist/{chunk-ARHVL4GY.js → chunk-2CQ6B2EF.js} +4 -4
- package/dist/{chunk-D5GRAD3G.js → chunk-2OZWUTJN.js} +3 -3
- package/dist/{chunk-B55DFBEO.js → chunk-3ZXF2UHD.js} +2 -2
- package/dist/{chunk-PBKTN6PS.js → chunk-7VDXI7AR.js} +1 -1
- package/dist/{chunk-RCEEY77V.js → chunk-BKPUVKNL.js} +1 -1
- package/dist/{chunk-OUXWQ5VS.js → chunk-CH6GH2PY.js} +2 -2
- package/dist/{chunk-P5OMB2NR.js → chunk-DNDIMOXI.js} +1 -1
- package/dist/{chunk-TATJD3PS.js → chunk-EYQDSK5K.js} +1 -1
- package/dist/{chunk-HQU5FX5A.js → chunk-G75MDYMO.js} +2 -2
- package/dist/{chunk-BKLDKPLL.js → chunk-GQTOTLSY.js} +6 -3
- package/dist/chunk-GQTOTLSY.js.map +7 -0
- package/dist/{chunk-NQNSJDW7.js → chunk-GZJWX5KE.js} +3 -3
- package/dist/{chunk-DKLWXWL2.js → chunk-KOFUHO7S.js} +28 -11
- package/dist/{chunk-DKLWXWL2.js.map → chunk-KOFUHO7S.js.map} +2 -2
- package/dist/{chunk-JDY2JDD3.js → chunk-L66UZNNO.js} +125 -45
- package/dist/chunk-L66UZNNO.js.map +7 -0
- package/dist/{chunk-ZJIMLKMQ.js → chunk-NH77UCWT.js} +3 -3
- package/dist/{chunk-APVX3GSP.js → chunk-NPBMF2YV.js} +136 -62
- package/dist/chunk-NPBMF2YV.js.map +7 -0
- package/dist/{chunk-NCHRQKJP.js → chunk-O6BHLPRE.js} +1 -1
- package/dist/{chunk-NCHRQKJP.js.map → chunk-O6BHLPRE.js.map} +1 -1
- package/dist/{chunk-GGBJ6RZQ.js → chunk-OM6GCBT3.js} +3 -3
- package/dist/{chunk-UKADBDTZ.js → chunk-QSZWYMPZ.js} +7 -4
- package/dist/chunk-QSZWYMPZ.js.map +7 -0
- package/dist/{chunk-PWRCPRYF.js → chunk-R4AG75VT.js} +2 -2
- package/dist/{chunk-53LR6LMF.js → chunk-RIHUVOTZ.js} +2 -2
- package/dist/{chunk-JDEWLQHH.js → chunk-RQBIHTZO.js} +1 -1
- package/dist/{chunk-TNMW3LIC.js → chunk-RYCR3HAC.js} +4 -4
- package/dist/{chunk-2SDOBAYI.js → chunk-TC56HMSX.js} +2 -2
- package/dist/{chunk-A6332THM.js → chunk-UBJFL3ZW.js} +3 -3
- package/dist/{chunk-AI356RID.js → chunk-UQL55KPP.js} +3 -3
- package/dist/{chunk-SR3SWOX7.js → chunk-V77NDZPE.js} +1 -1
- package/dist/{chunk-ZZX3RSJM.js → chunk-VQ6RVQVH.js} +1 -1
- package/dist/{chunk-AKK6NTGD.js → chunk-XF3KOCXY.js} +1 -1
- package/dist/{chunk-A4LZLJ4E.js → chunk-ZC2N4I37.js} +2 -2
- package/dist/{chunk-Y5WRSDBM.js → chunk-ZPCPWVPN.js} +3 -3
- package/dist/{cli-LOINYVA4.js → cli-4G4Z26BL.js} +87 -87
- package/dist/commands-JPUDJKNX.js +51 -0
- package/dist/{config-ESCUISGA.js → config-YZNZQLXL.js} +4 -4
- package/dist/{context-A6RYVYH3.js → context-EZ47E5Q5.js} +7 -5
- package/dist/{customCommands-NP3YOHBP.js → customCommands-G527FNNJ.js} +4 -4
- package/dist/{env-QM2GQKSL.js → env-MZGL75G3.js} +2 -2
- package/dist/{file-COGPZQB2.js → file-MUZCEO7B.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-DZMLOCDR.js → llm-NC2ZA7BQ.js} +29 -29
- package/dist/{llmLazy-L4VAGXRS.js → llmLazy-XNMS7UPG.js} +1 -1
- package/dist/{loader-J7FDM25W.js → loader-W35B3CAM.js} +4 -4
- package/dist/{lsp-ZJDBSAGL.js → lsp-VUBIB4E2.js} +6 -6
- package/dist/{lspAnchor-QUM3YKRZ.js → lspAnchor-4WXOLJUM.js} +6 -6
- package/dist/{mcp-TYRRTRZO.js → mcp-5P3ONWR7.js} +7 -7
- package/dist/{mentionProcessor-VBRYWNJ6.js → mentionProcessor-GCQ5NHV3.js} +5 -5
- package/dist/{messages-TI35HRUJ.js → messages-YTLYB5DI.js} +1 -1
- package/dist/{model-CYQGPU6S.js → model-HBR6OZOT.js} +5 -5
- package/dist/{openai-YJXPABCZ.js → openai-MS35XWNU.js} +5 -5
- package/dist/{outputStyles-54CH4AXQ.js → outputStyles-OWR2UZBL.js} +4 -4
- package/dist/{pluginRuntime-HUH43L3E.js → pluginRuntime-SN4Y5PIT.js} +6 -6
- package/dist/{pluginValidation-YZQAIFOB.js → pluginValidation-6DFK5G6T.js} +6 -6
- package/dist/prompts-ILVJ75E2.js +53 -0
- package/dist/{pybAgentSessionLoad-IDX6CZ7W.js → pybAgentSessionLoad-OLPYFTYS.js} +4 -4
- package/dist/{pybAgentSessionResume-G7CNXIM2.js → pybAgentSessionResume-VJ6G5ZUT.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-4DK6ZF6D.js → pybAgentStreamJsonSession-GGISSUF3.js} +1 -1
- package/dist/{pybHooks-6NZEXF2Y.js → pybHooks-TFWZEUMM.js} +4 -4
- package/dist/query-DEBIJVZX.js +61 -0
- package/dist/{registry-MYSH5C4A.js → registry-U3FUZUBO.js} +5 -5
- package/dist/{ripgrep-UDJTJUDM.js → ripgrep-EMJZZFWK.js} +3 -3
- package/dist/{skillMarketplace-QUB6SCI3.js → skillMarketplace-FXCBEE6R.js} +3 -3
- package/dist/{state-H3ASL5UP.js → state-BMWIIFPG.js} +2 -2
- package/dist/{theme-N2PDKHSA.js → theme-J6RWKV4W.js} +5 -5
- package/dist/{toolPermissionSettings-H3A4FEPL.js → toolPermissionSettings-DSH46ML7.js} +6 -6
- package/dist/tools-LFQ5NCA7.js +52 -0
- package/dist/{userInput-2C2HUFUT.js → userInput-JGJXNAKY.js} +30 -30
- package/package.json +1 -1
- package/dist/REPL-YIK4SNUK.js +0 -47
- package/dist/chunk-APVX3GSP.js.map +0 -7
- package/dist/chunk-BKLDKPLL.js.map +0 -7
- package/dist/chunk-JDY2JDD3.js.map +0 -7
- package/dist/chunk-UKADBDTZ.js.map +0 -7
- package/dist/commands-5MM7DHYR.js +0 -51
- package/dist/prompts-MKDGNXMZ.js +0 -53
- package/dist/query-3JMCOSE3.js +0 -59
- package/dist/tools-JKFSGTP2.js +0 -52
- /package/dist/{REPL-YIK4SNUK.js.map → REPL-7WPVB4IF.js.map} +0 -0
- /package/dist/{acp-EVHOGBLR.js.map → acp-IP2EUY3O.js.map} +0 -0
- /package/dist/{agentsValidate-SX5WCTHD.js.map → agentsValidate-YGYIFZ2Q.js.map} +0 -0
- /package/dist/{ask-5256RCJR.js.map → ask-RXRDLJ2Q.js.map} +0 -0
- /package/dist/{autoUpdater-62OEX27S.js.map → autoUpdater-WXXGD5CW.js.map} +0 -0
- /package/dist/{chunk-ARHVL4GY.js.map → chunk-2CQ6B2EF.js.map} +0 -0
- /package/dist/{chunk-D5GRAD3G.js.map → chunk-2OZWUTJN.js.map} +0 -0
- /package/dist/{chunk-B55DFBEO.js.map → chunk-3ZXF2UHD.js.map} +0 -0
- /package/dist/{chunk-PBKTN6PS.js.map → chunk-7VDXI7AR.js.map} +0 -0
- /package/dist/{chunk-RCEEY77V.js.map → chunk-BKPUVKNL.js.map} +0 -0
- /package/dist/{chunk-OUXWQ5VS.js.map → chunk-CH6GH2PY.js.map} +0 -0
- /package/dist/{chunk-P5OMB2NR.js.map → chunk-DNDIMOXI.js.map} +0 -0
- /package/dist/{chunk-TATJD3PS.js.map → chunk-EYQDSK5K.js.map} +0 -0
- /package/dist/{chunk-HQU5FX5A.js.map → chunk-G75MDYMO.js.map} +0 -0
- /package/dist/{chunk-NQNSJDW7.js.map → chunk-GZJWX5KE.js.map} +0 -0
- /package/dist/{chunk-ZJIMLKMQ.js.map → chunk-NH77UCWT.js.map} +0 -0
- /package/dist/{chunk-GGBJ6RZQ.js.map → chunk-OM6GCBT3.js.map} +0 -0
- /package/dist/{chunk-PWRCPRYF.js.map → chunk-R4AG75VT.js.map} +0 -0
- /package/dist/{chunk-53LR6LMF.js.map → chunk-RIHUVOTZ.js.map} +0 -0
- /package/dist/{chunk-JDEWLQHH.js.map → chunk-RQBIHTZO.js.map} +0 -0
- /package/dist/{chunk-TNMW3LIC.js.map → chunk-RYCR3HAC.js.map} +0 -0
- /package/dist/{chunk-2SDOBAYI.js.map → chunk-TC56HMSX.js.map} +0 -0
- /package/dist/{chunk-A6332THM.js.map → chunk-UBJFL3ZW.js.map} +0 -0
- /package/dist/{chunk-AI356RID.js.map → chunk-UQL55KPP.js.map} +0 -0
- /package/dist/{chunk-SR3SWOX7.js.map → chunk-V77NDZPE.js.map} +0 -0
- /package/dist/{chunk-ZZX3RSJM.js.map → chunk-VQ6RVQVH.js.map} +0 -0
- /package/dist/{chunk-AKK6NTGD.js.map → chunk-XF3KOCXY.js.map} +0 -0
- /package/dist/{chunk-A4LZLJ4E.js.map → chunk-ZC2N4I37.js.map} +0 -0
- /package/dist/{chunk-Y5WRSDBM.js.map → chunk-ZPCPWVPN.js.map} +0 -0
- /package/dist/{cli-LOINYVA4.js.map → cli-4G4Z26BL.js.map} +0 -0
- /package/dist/{commands-5MM7DHYR.js.map → commands-JPUDJKNX.js.map} +0 -0
- /package/dist/{config-ESCUISGA.js.map → config-YZNZQLXL.js.map} +0 -0
- /package/dist/{context-A6RYVYH3.js.map → context-EZ47E5Q5.js.map} +0 -0
- /package/dist/{customCommands-NP3YOHBP.js.map → customCommands-G527FNNJ.js.map} +0 -0
- /package/dist/{env-QM2GQKSL.js.map → env-MZGL75G3.js.map} +0 -0
- /package/dist/{file-COGPZQB2.js.map → file-MUZCEO7B.js.map} +0 -0
- /package/dist/{llm-DZMLOCDR.js.map → llm-NC2ZA7BQ.js.map} +0 -0
- /package/dist/{llmLazy-L4VAGXRS.js.map → llmLazy-XNMS7UPG.js.map} +0 -0
- /package/dist/{loader-J7FDM25W.js.map → loader-W35B3CAM.js.map} +0 -0
- /package/dist/{lsp-ZJDBSAGL.js.map → lsp-VUBIB4E2.js.map} +0 -0
- /package/dist/{lspAnchor-QUM3YKRZ.js.map → lspAnchor-4WXOLJUM.js.map} +0 -0
- /package/dist/{mcp-TYRRTRZO.js.map → mcp-5P3ONWR7.js.map} +0 -0
- /package/dist/{mentionProcessor-VBRYWNJ6.js.map → mentionProcessor-GCQ5NHV3.js.map} +0 -0
- /package/dist/{messages-TI35HRUJ.js.map → messages-YTLYB5DI.js.map} +0 -0
- /package/dist/{model-CYQGPU6S.js.map → model-HBR6OZOT.js.map} +0 -0
- /package/dist/{openai-YJXPABCZ.js.map → openai-MS35XWNU.js.map} +0 -0
- /package/dist/{outputStyles-54CH4AXQ.js.map → outputStyles-OWR2UZBL.js.map} +0 -0
- /package/dist/{pluginRuntime-HUH43L3E.js.map → pluginRuntime-SN4Y5PIT.js.map} +0 -0
- /package/dist/{pluginValidation-YZQAIFOB.js.map → pluginValidation-6DFK5G6T.js.map} +0 -0
- /package/dist/{prompts-MKDGNXMZ.js.map → prompts-ILVJ75E2.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-IDX6CZ7W.js.map → pybAgentSessionLoad-OLPYFTYS.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-G7CNXIM2.js.map → pybAgentSessionResume-VJ6G5ZUT.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-4DK6ZF6D.js.map → pybAgentStreamJsonSession-GGISSUF3.js.map} +0 -0
- /package/dist/{pybHooks-6NZEXF2Y.js.map → pybHooks-TFWZEUMM.js.map} +0 -0
- /package/dist/{query-3JMCOSE3.js.map → query-DEBIJVZX.js.map} +0 -0
- /package/dist/{registry-MYSH5C4A.js.map → registry-U3FUZUBO.js.map} +0 -0
- /package/dist/{ripgrep-UDJTJUDM.js.map → ripgrep-EMJZZFWK.js.map} +0 -0
- /package/dist/{skillMarketplace-QUB6SCI3.js.map → skillMarketplace-FXCBEE6R.js.map} +0 -0
- /package/dist/{state-H3ASL5UP.js.map → state-BMWIIFPG.js.map} +0 -0
- /package/dist/{theme-N2PDKHSA.js.map → theme-J6RWKV4W.js.map} +0 -0
- /package/dist/{toolPermissionSettings-H3A4FEPL.js.map → toolPermissionSettings-DSH46ML7.js.map} +0 -0
- /package/dist/{tools-JKFSGTP2.js.map → tools-LFQ5NCA7.js.map} +0 -0
- /package/dist/{userInput-2C2HUFUT.js.map → userInput-JGJXNAKY.js.map} +0 -0
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
getGlobalConfig,
|
|
6
6
|
getOrCreateUserID,
|
|
7
7
|
saveCurrentProjectConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GQTOTLSY.js";
|
|
9
9
|
import {
|
|
10
10
|
SESSION_ID,
|
|
11
11
|
env,
|
|
12
12
|
execFileNoThrow,
|
|
13
13
|
getCwd,
|
|
14
14
|
logError
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-VQ6RVQVH.js";
|
|
16
16
|
import {
|
|
17
17
|
MACRO
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-O6BHLPRE.js";
|
|
19
19
|
import {
|
|
20
20
|
__require
|
|
21
21
|
} from "./chunk-I3J4JYES.js";
|
|
@@ -564,8 +564,22 @@ async function getContext() {
|
|
|
564
564
|
}
|
|
565
565
|
function clearContextCache() {
|
|
566
566
|
getStaticContext.cache.clear?.();
|
|
567
|
+
getDirectoryStructure.cache.clear?.();
|
|
567
568
|
}
|
|
568
|
-
|
|
569
|
+
function renderTopLevelTree(rootLabel, directories, files) {
|
|
570
|
+
const items = [
|
|
571
|
+
...directories.map((n) => ({ name: `${n}${sep2}`, isDir: true })),
|
|
572
|
+
...files.map((n) => ({ name: n, isDir: false }))
|
|
573
|
+
];
|
|
574
|
+
const lines = [];
|
|
575
|
+
lines.push(rootLabel);
|
|
576
|
+
for (let i = 0; i < items.length; i++) {
|
|
577
|
+
const connector = i === items.length - 1 ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
578
|
+
lines.push(`${connector}${items[i].name}`);
|
|
579
|
+
}
|
|
580
|
+
return lines.join("\n");
|
|
581
|
+
}
|
|
582
|
+
async function buildDirectoryStructure() {
|
|
569
583
|
let lines;
|
|
570
584
|
let cwdWithSeparator = "";
|
|
571
585
|
let directories = [];
|
|
@@ -576,19 +590,21 @@ async function getDirectoryStructure() {
|
|
|
576
590
|
const entries = readdirSync2(cwd, { withFileTypes: true });
|
|
577
591
|
directories = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort((a, b) => a.localeCompare(b));
|
|
578
592
|
files = entries.filter((entry) => !entry.isDirectory()).map((entry) => entry.name).sort((a, b) => a.localeCompare(b));
|
|
579
|
-
lines =
|
|
580
|
-
...directories.map((name) => `- ${name}${sep2}`),
|
|
581
|
-
...files.map((name) => `- ${name}`)
|
|
582
|
-
].join("\n");
|
|
593
|
+
lines = renderTopLevelTree(cwdWithSeparator, directories, files);
|
|
583
594
|
} catch (error) {
|
|
584
595
|
logError(error);
|
|
585
596
|
return "";
|
|
586
597
|
}
|
|
587
|
-
return `
|
|
588
|
-
Workspace Root Directory: ${cwdWithSeparator}
|
|
589
|
-
Workspace Root Directory Structure: '${cwdWithSeparator}' contains ${directories.length} directories and ${files.length} files, as follows:
|
|
598
|
+
return `One-time static snapshot of the workspace root directory structure (top-level files and directories); not guaranteed to match the real-time directory,as follows:
|
|
590
599
|
${lines}`;
|
|
591
600
|
}
|
|
601
|
+
var getDirectoryStructure = memoize4(
|
|
602
|
+
async () => {
|
|
603
|
+
const projectConfig = getCurrentProjectConfig();
|
|
604
|
+
if (projectConfig.dontCrawlDirectory) return "";
|
|
605
|
+
return buildDirectoryStructure();
|
|
606
|
+
}
|
|
607
|
+
);
|
|
592
608
|
|
|
593
609
|
export {
|
|
594
610
|
getCodeStyle,
|
|
@@ -603,5 +619,6 @@ export {
|
|
|
603
619
|
getGitStatus,
|
|
604
620
|
getContext,
|
|
605
621
|
clearContextCache,
|
|
622
|
+
renderTopLevelTree,
|
|
606
623
|
getDirectoryStructure
|
|
607
624
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/utils/config/style.ts", "../src/utils/config/projectInstructions.ts", "../src/context/index.ts", "../src/utils/system/git.ts", "../src/utils/identity/user.ts", "../src/utils/config/rules.ts"],
|
|
4
|
-
"sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname, join, parse, relative, resolve, sep } from 'path'\n\nexport type ProjectInstructionFile = {\n absolutePath: string\n relativePathFromGitRoot: string\n filename: 'AGENTS.override.md' | 'AGENTS.md'\n}\n\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024\n\nfunction isRegularFile(path: string): boolean {\n try {\n return existsSync(path)\n } catch {\n return false\n }\n}\n\nexport function findGitRoot(startDir: string): string | null {\n let currentDir = resolve(startDir)\n const fsRoot = parse(currentDir).root\n\n while (true) {\n const dotGitPath = join(currentDir, '.git')\n if (existsSync(dotGitPath)) {\n return currentDir\n }\n if (currentDir === fsRoot) {\n return null\n }\n currentDir = dirname(currentDir)\n }\n}\n\nexport function getDirsFromGitRootToCwd(gitRoot: string, cwd: string): string[] {\n const absoluteGitRoot = resolve(gitRoot)\n const absoluteCwd = resolve(cwd)\n\n const rel = relative(absoluteGitRoot, absoluteCwd)\n if (!rel || rel === '.') {\n return [absoluteGitRoot]\n }\n\n const parts = rel.split(sep).filter(Boolean)\n const dirs: string[] = [absoluteGitRoot]\n for (let i = 0; i < parts.length; i++) {\n dirs.push(join(absoluteGitRoot, ...parts.slice(0, i + 1)))\n }\n return dirs\n}\n\nexport function getProjectInstructionFiles(\n cwd: string,\n): ProjectInstructionFile[] {\n const gitRoot = findGitRoot(cwd)\n const root = gitRoot ?? resolve(cwd)\n const dirs = getDirsFromGitRootToCwd(root, cwd)\n\n const results: ProjectInstructionFile[] = []\n for (const dir of dirs) {\n const overridePath = join(dir, 'AGENTS.override.md')\n const agentsPath = join(dir, 'AGENTS.md')\n\n if (isRegularFile(overridePath)) {\n results.push({\n absolutePath: overridePath,\n relativePathFromGitRoot:\n relative(root, overridePath) || 'AGENTS.override.md',\n filename: 'AGENTS.override.md',\n })\n continue\n }\n\n if (isRegularFile(agentsPath)) {\n results.push({\n absolutePath: agentsPath,\n relativePathFromGitRoot: relative(root, agentsPath) || 'AGENTS.md',\n filename: 'AGENTS.md',\n })\n }\n }\n\n return results\n}\n\nexport function getProjectDocMaxBytes(): number {\n const raw = process.env.PYB_PROJECT_DOC_MAX_BYTES\n if (!raw) return DEFAULT_PROJECT_DOC_MAX_BYTES\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0)\n return DEFAULT_PROJECT_DOC_MAX_BYTES\n return parsed\n}\n\nexport function readAndConcatProjectInstructionFiles(\n files: ProjectInstructionFile[],\n {\n maxBytes = getProjectDocMaxBytes(),\n includeHeadings = true,\n }: { maxBytes?: number; includeHeadings?: boolean } = {},\n): { content: string; truncated: boolean } {\n let totalBytes = 0\n let truncated = false\n\n const parts: string[] = []\n\n const truncateUtf8ToBytes = (value: string, bytes: number): string => {\n const buf = Buffer.from(value, 'utf8')\n if (buf.length <= bytes) return value\n return buf.subarray(0, Math.max(0, bytes)).toString('utf8')\n }\n\n for (const file of files) {\n if (totalBytes >= maxBytes) {\n truncated = true\n break\n }\n\n let raw: string\n try {\n raw = readFileSync(file.absolutePath, 'utf-8')\n } catch {\n continue\n }\n\n if (!raw.trim()) continue\n\n const separator = parts.length > 0 ? '\\n\\n' : ''\n const separatorBytes = Buffer.byteLength(separator, 'utf8')\n const remainingAfterSeparator = maxBytes - totalBytes - separatorBytes\n if (remainingAfterSeparator <= 0) {\n truncated = true\n break\n }\n\n const heading = includeHeadings\n ? `# ${file.filename}\\n\\n_Path: ${file.relativePathFromGitRoot}_\\n\\n`\n : ''\n\n const block = `${heading}${raw}`.trimEnd()\n const blockBytes = Buffer.byteLength(block, 'utf8')\n\n if (blockBytes <= remainingAfterSeparator) {\n parts.push(`${separator}${block}`)\n totalBytes += separatorBytes + blockBytes\n continue\n }\n\n truncated = true\n const suffix = `\\n\\n... (truncated: project instruction files exceeded ${maxBytes} bytes)`\n const suffixBytes = Buffer.byteLength(suffix, 'utf8')\n\n let finalBlock = ''\n if (suffixBytes >= remainingAfterSeparator) {\n finalBlock = truncateUtf8ToBytes(suffix, remainingAfterSeparator)\n } else {\n const prefixBudget = remainingAfterSeparator - suffixBytes\n const prefix = truncateUtf8ToBytes(block, prefixBudget)\n finalBlock = `${prefix}${suffix}`\n }\n\n parts.push(`${separator}${finalBlock}`)\n totalBytes += separatorBytes + Buffer.byteLength(finalBlock, 'utf8')\n break\n }\n\n return { content: parts.join(''), truncated }\n}\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { join, sep } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nimport { getProjectRules } from '@utils/config/rules'\n\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\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\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n const rules = getProjectRules(cwd)\n if (rules.length > 0) {\n const formattedRules = `\n# Project Rules (MANDATORY)\nThe following content represents the immutable rules for this project.\n<project_rules>\n${rules.join('\\n\\n')}\n</project_rules>\n`.trim()\n docs.unshift(formattedRules)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\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)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nconst getStaticContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [gitStatus, instructionFilesNote, readme, projectDocs] =\n await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport async function getContext(): Promise<{\n [k: string]: string\n}> {\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [staticContext, directoryStructure] = await Promise.all([\n getStaticContext(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n ])\n return {\n ...staticContext,\n ...(directoryStructure ? { directoryStructure } : {}),\n }\n}\n\nexport function clearContextCache(): void {\n getStaticContext.cache.clear?.()\n}\n\nexport async function getDirectoryStructure(): Promise<string> {\n let lines: string\n let cwdWithSeparator = ''\n let directories: string[] = []\n let files: string[] = []\n try {\n const cwd = getCwd()\n cwdWithSeparator = cwd.endsWith(sep) ? cwd : `${cwd}${sep}`\n const entries = readdirSync(cwd, { withFileTypes: true })\n directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n lines = [\n ...directories.map(name => `- ${name}${sep}`),\n ...files.map(name => `- ${name}`),\n ].join('\\n')\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Current workspace root directory structure (top-level files and directories).\nWorkspace Root Directory: ${cwdWithSeparator}\nWorkspace Root Directory Structure: '${cwdWithSeparator}' contains ${directories.length} directories and ${files.length} files, as follows:\n${lines}`\n}\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n", "import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { join, relative, resolve } from 'path'\r\nimport matter from 'gray-matter'\r\nimport { minimatch } from 'minimatch'\r\nimport { findGitRoot, getDirsFromGitRootToCwd } from './projectInstructions'\r\nimport { logError } from '@utils/log'\r\n\r\nexport interface RuleFile {\r\n filename: string\r\n content: string\r\n paths?: string[]\r\n}\r\n\r\nfunction getRulesFromDir(dir: string, root: string, cwd: string): string[] {\r\n if (!existsSync(dir)) return []\r\n\r\n const rules: string[] = []\r\n const files = readdirSync(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n if (!statSync(filePath).isFile()) continue\r\n\r\n try {\r\n const fileContent = readFileSync(filePath, 'utf-8')\r\n // gray-matter by default uses js-yaml.safeLoad which is removed in js-yaml v4.\r\n // We need to provide a custom parser if we want to be safe, or rely on gray-matter's auto-detection if updated.\r\n // However, looking at the error \"Function yaml.safeLoad is removed\", it seems gray-matter 4.0.3 (in package.json)\r\n // might not be fully compatible with js-yaml 4.x out of the box without options?\r\n // Actually, checking gray-matter docs/issues, v4.0.3 should work.\r\n // But the error comes from gray-matter calling yaml.safeLoad.\r\n \r\n // Solution: Pass a custom parser engine to gray-matter\r\n const yaml = require('js-yaml')\r\n const matterOptions = {\r\n engines: {\r\n yaml: {\r\n parse: yaml.load.bind(yaml),\r\n stringify: yaml.dump.bind(yaml)\r\n }\r\n }\r\n }\r\n \r\n const { content, data } = matter(fileContent, matterOptions)\r\n \r\n // User rule: If no paths (YAML frontmatter), it applies globally.\r\n if (!data.paths || !Array.isArray(data.paths) || data.paths.length === 0) {\r\n rules.push(content.trim())\r\n continue\r\n }\r\n\r\n // If paths are specified, check if current context (cwd) matches\r\n // This is a simplification. Ideally we'd check active files, but cwd is a good proxy.\r\n const relCwd = relative(root, cwd)\r\n // On Windows, relative paths might use backslashes, but glob patterns usually expect forward slashes.\r\n // Also ensure we don't have a leading slash unless absolute, but relative returns without leading slash usually.\r\n // However, if relCwd is empty (cwd == root), we want it to match \"**\" but maybe not \"src/**\".\r\n // If relCwd is \"src\", it matches \"src/**\".\r\n \r\n const normalizedRelCwd = relCwd.split('\\\\').join('/')\r\n\r\n // Let's iterate over paths patterns\r\n const hasMatch = data.paths.some((pattern: string) => {\r\n // minimatch(path, pattern)\r\n // If pattern is \"src/**\", and path is \"src\", minimatch(\"src\", \"src/**\") is FALSE.\r\n // We need to check if the path is INSIDE the pattern.\r\n // But the rules say: \"Rules are included when the file being edited matches the path\".\r\n // Since we are approximating by CWD, we should check:\r\n // 1. Is CWD inside the pattern? (e.g. pattern=\"src/**\", cwd=\"src/utils\" -> YES)\r\n // 2. Is CWD the pattern itself? (e.g. pattern=\"src\", cwd=\"src\" -> YES)\r\n // 3. Is the pattern inside CWD? (e.g. pattern=\"src/utils/**\", cwd=\"src\" -> Maybe? If I edit src/index.ts, no. If I edit src/utils/foo.ts, yes.)\r\n \r\n // Let's stick to: CWD must match the pattern OR be a child of the pattern.\r\n // minimatch(\"src/utils\", \"src/**\") -> true\r\n \r\n // Debugging logs in test might help, but let's try to be more robust.\r\n // Maybe \"src\" does NOT match \"src/**\" in minimatch?\r\n // \"src/\" matches \"src/**\"?\r\n \r\n if (minimatch(normalizedRelCwd, pattern)) return true\r\n \r\n // Try appending slash if not empty\r\n if (normalizedRelCwd && minimatch(normalizedRelCwd + '/', pattern)) return true\r\n \r\n return false\r\n })\r\n\r\n if (hasMatch) {\r\n rules.push(content.trim())\r\n }\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n\r\n return rules\r\n}\r\n\r\nexport function getProjectRules(cwd: string): string[] {\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 rules: string[] = []\r\n\r\n // Iterate from root down to cwd to collect rules from .claude/rules, .cursor/rules and .pyb/rules\r\n for (const dir of dirs) {\r\n // .claude/rules\r\n const claudeRulesDir = join(dir, '.claude', 'rules')\r\n rules.push(...getRulesFromDir(claudeRulesDir, root, cwd))\r\n\r\n // .cursor/rules\r\n const cursorRulesDir = join(dir, '.cursor', 'rules')\r\n rules.push(...getRulesFromDir(cursorRulesDir, root, cwd))\r\n\r\n // .pyb/rules\r\n const pybRulesDir = join(dir, '.pyb', 'rules')\r\n rules.push(...getRulesFromDir(pybRulesDir, root, cwd))\r\n }\r\n\r\n return rules\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,eAAe;;;ACDxB,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,MAAM,OAAO,UAAU,SAAS,WAAW;AAQ7D,IAAM,gCAAgC,KAAK;AAE3C,SAAS,cAAc,MAAuB;AAC5C,MAAI;AACF,WAAO,WAAW,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,UAAiC;AAC3D,MAAI,aAAa,QAAQ,QAAQ;AACjC,QAAM,SAAS,MAAM,UAAU,EAAE;AAEjC,SAAO,MAAM;AACX,UAAM,aAAa,KAAK,YAAY,MAAM;AAC1C,QAAI,WAAW,UAAU,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,eAAe,QAAQ;AACzB,aAAO;AAAA,IACT;AACA,iBAAa,QAAQ,UAAU;AAAA,EACjC;AACF;AAEO,SAAS,wBAAwB,SAAiB,KAAuB;AAC9E,QAAM,kBAAkB,QAAQ,OAAO;AACvC,QAAM,cAAc,QAAQ,GAAG;AAE/B,QAAM,MAAM,SAAS,iBAAiB,WAAW;AACjD,MAAI,CAAC,OAAO,QAAQ,KAAK;AACvB,WAAO,CAAC,eAAe;AAAA,EACzB;AAEA,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3C,QAAM,OAAiB,CAAC,eAAe;AACvC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,SAAK,KAAK,KAAK,iBAAiB,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEO,SAAS,2BACd,KAC0B;AAC1B,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,OAAO,WAAW,QAAQ,GAAG;AACnC,QAAM,OAAO,wBAAwB,MAAM,GAAG;AAE9C,QAAM,UAAoC,CAAC;AAC3C,aAAW,OAAO,MAAM;AACtB,UAAM,eAAe,KAAK,KAAK,oBAAoB;AACnD,UAAM,aAAa,KAAK,KAAK,WAAW;AAExC,QAAI,cAAc,YAAY,GAAG;AAC/B,cAAQ,KAAK;AAAA,QACX,cAAc;AAAA,QACd,yBACE,SAAS,MAAM,YAAY,KAAK;AAAA,QAClC,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,UAAU,GAAG;AAC7B,cAAQ,KAAK;AAAA,QACX,cAAc;AAAA,QACd,yBAAyB,SAAS,MAAM,UAAU,KAAK;AAAA,QACvD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,wBAAgC;AAC9C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,SAAS,KAAK,EAAE;AACtC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU;AACxC,WAAO;AACT,SAAO;AACT;AAEO,SAAS,qCACd,OACA;AAAA,EACE,WAAW,sBAAsB;AAAA,EACjC,kBAAkB;AACpB,IAAsD,CAAC,GACd;AACzC,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,QAAM,QAAkB,CAAC;AAEzB,QAAM,sBAAsB,CAAC,OAAe,UAA0B;AACpE,UAAM,MAAM,OAAO,KAAK,OAAO,MAAM;AACrC,QAAI,IAAI,UAAU,MAAO,QAAO;AAChC,WAAO,IAAI,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,SAAS,MAAM;AAAA,EAC5D;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,cAAc,UAAU;AAC1B,kBAAY;AACZ;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,KAAK,cAAc,OAAO;AAAA,IAC/C,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,KAAK,EAAG;AAEjB,UAAM,YAAY,MAAM,SAAS,IAAI,SAAS;AAC9C,UAAM,iBAAiB,OAAO,WAAW,WAAW,MAAM;AAC1D,UAAM,0BAA0B,WAAW,aAAa;AACxD,QAAI,2BAA2B,GAAG;AAChC,kBAAY;AACZ;AAAA,IACF;AAEA,UAAM,UAAU,kBACZ,KAAK,KAAK,QAAQ;AAAA;AAAA,SAAc,KAAK,uBAAuB;AAAA;AAAA,IAC5D;AAEJ,UAAM,QAAQ,GAAG,OAAO,GAAG,GAAG,GAAG,QAAQ;AACzC,UAAM,aAAa,OAAO,WAAW,OAAO,MAAM;AAElD,QAAI,cAAc,yBAAyB;AACzC,YAAM,KAAK,GAAG,SAAS,GAAG,KAAK,EAAE;AACjC,oBAAc,iBAAiB;AAC/B;AAAA,IACF;AAEA,gBAAY;AACZ,UAAM,SAAS;AAAA;AAAA,qDAA0D,QAAQ;AACjF,UAAM,cAAc,OAAO,WAAW,QAAQ,MAAM;AAEpD,QAAI,aAAa;AACjB,QAAI,eAAe,yBAAyB;AAC1C,mBAAa,oBAAoB,QAAQ,uBAAuB;AAAA,IAClE,OAAO;AACL,YAAM,eAAe,0BAA0B;AAC/C,YAAM,SAAS,oBAAoB,OAAO,YAAY;AACtD,mBAAa,GAAG,MAAM,GAAG,MAAM;AAAA,IACjC;AAEA,UAAM,KAAK,GAAG,SAAS,GAAG,UAAU,EAAE;AACtC,kBAAc,iBAAiB,OAAO,WAAW,YAAY,MAAM;AACnE;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,EAAE,GAAG,UAAU;AAC9C;;;ADnKA,IAAM,eACJ;AAEK,IAAM,eAAe,QAAQ,MAAc;AAChD,QAAM,SAAmB,CAAC;AAE1B,QAAM,mBAAmB,2BAA2B,OAAO,CAAC;AAC5D,aAAW,QAAQ,kBAAkB;AACnC,QAAI;AACF,aAAO;AAAA,QACL,eAAe,KAAK,YAAY;AAAA;AAAA,EAAQC,cAAa,KAAK,cAAc,OAAO,CAAC;AAAA,MAClF;AAAA,IACF,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,YAAY;AAAA;AAAA,EAAO,OAAO,KAAK,MAAM,CAAC;AAClD,CAAC;;;AEnBD,SAAS,WAAAC,UAAS,YAAY;;;ACP9B,SAAS,WAAAC,gBAAe;AAGjB,IAAM,WAAWC,SAAQ,YAA8B;AAC5D,QAAM,EAAE,KAAK,IAAI,MAAM,gBAAgB,OAAO;AAAA,IAC5C;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,SAAS;AAClB,CAAC;AAEM,IAAM,UAAU,YAA6B;AAClD,QAAM,EAAE,OAAO,IAAI,MAAM,gBAAgB,OAAO,CAAC,aAAa,MAAM,CAAC;AACrE,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,YAAY,YAA6B;AACpD,QAAM,EAAE,OAAO,IAAI,MAAM;AAAA,IACvB;AAAA,IACA,CAAC,aAAa,gBAAgB,MAAM;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,eAAe,YAAoC;AAC9D,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,IAC7B;AAAA,IACA,CAAC,UAAU,WAAW,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,SAAS,IAAI,OAAO,KAAK,IAAI;AACtC;AAEO,IAAM,oBAAoB,YAA8B;AAC7D,QAAM,EAAE,KAAK,IAAI,MAAM;AAAA,IACrB;AAAA,IACA,CAAC,aAAa,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAEO,IAAM,aAAa,YAA8B;AACtD,QAAM,EAAE,OAAO,IAAI,MAAM;AAAA,IACvB;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,OAAO,KAAK,EAAE,WAAW;AAClC;AAUA,eAAsB,cAA4C;AAChE,MAAI;AACF,UAAM,CAAC,YAAY,YAAY,WAAW,gBAAgB,OAAO,IAC/D,MAAM,QAAQ,IAAI;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,WAAW;AAAA,IACb,CAAC;AAEH,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;;;AD/EA,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAC1B,SAAS,gBAAgB;AACzB,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;;;AEXxC,SAAS,WAAAC,gBAAe;AAKjB,IAAM,cAAcC,SAAQ,YAAyC;AAC1E,QAAM,SAAS,MAAM,gBAAgB,OAAO,CAAC,UAAU,YAAY,CAAC;AACpE,MAAI,OAAO,SAAS,GAAG;AACrB,aAAS,4BAA4B,OAAO,MAAM,IAAI,OAAO,MAAM,EAAE;AACrE,WAAO;AAAA,EACT;AACA,SAAO,OAAO,OAAO,KAAK,KAAK;AACjC,CAAC;AAWM,IAAM,UAAUA,SAAQ,YAAiC;AAC9D,QAAM,SAAS,kBAAkB;AACjC,QAAM,SAAS,gBAAgB;AAC/B,QAAM,QAAQ;AACd,SAAO;AAAA,IACL,WAAW;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,WAAW,IAAI;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,aAAa,IAAI;AAAA,MACjB,UAAU,QAAQ,IAAI;AAAA,MACtB,kBAAkB,OAAO,cAAc;AAAA,MACvC,aAAa,OAAO,cAAc;AAAA,IACpC;AAAA,EACF;AACF,CAAC;;;AC3CD,SAAS,cAAAC,aAAY,aAAa,gBAAAC,eAAc,gBAAgB;AAChE,SAAS,QAAAC,OAAM,YAAAC,WAAU,WAAAC,gBAAe;AACxC,OAAO,YAAY;AACnB,SAAS,iBAAiB;AAU1B,SAAS,gBAAgB,KAAa,MAAc,KAAuB;AACzE,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO,CAAC;AAE9B,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,YAAY,GAAG;AAE7B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,UAAM,WAAWC,MAAK,KAAK,IAAI;AAC/B,QAAI,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAG;AAElC,QAAI;AACF,YAAM,cAAcC,cAAa,UAAU,OAAO;AASlD,YAAM,OAAO,UAAQ,SAAS;AAC9B,YAAM,gBAAgB;AAAA,QACpB,SAAS;AAAA,UACP,MAAM;AAAA,YACJ,OAAO,KAAK,KAAK,KAAK,IAAI;AAAA,YAC1B,WAAW,KAAK,KAAK,KAAK,IAAI;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,EAAE,SAAS,KAAK,IAAI,OAAO,aAAa,aAAa;AAG3D,UAAI,CAAC,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW,GAAG;AACxE,cAAM,KAAK,QAAQ,KAAK,CAAC;AACzB;AAAA,MACF;AAIA,YAAM,SAASC,UAAS,MAAM,GAAG;AAMjC,YAAM,mBAAmB,OAAO,MAAM,IAAI,EAAE,KAAK,GAAG;AAGpD,YAAM,WAAW,KAAK,MAAM,KAAK,CAAC,YAAoB;AAiBpD,YAAI,UAAU,kBAAkB,OAAO,EAAG,QAAO;AAGjD,YAAI,oBAAoB,UAAU,mBAAmB,KAAK,OAAO,EAAG,QAAO;AAE3E,eAAO;AAAA,MACT,CAAC;AAED,UAAI,UAAU;AACZ,cAAM,KAAK,QAAQ,KAAK,CAAC;AAAA,MAC3B;AAAA,IACF,SAAS,GAAG;AACV,eAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,KAAuB;AACrD,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,OAAO,WAAWC,SAAQ,GAAG;AACnC,QAAM,OAAO,wBAAwB,MAAM,GAAG;AAE9C,QAAM,QAAkB,CAAC;AAGzB,aAAW,OAAO,MAAM;AAEtB,UAAM,iBAAiBH,MAAK,KAAK,WAAW,OAAO;AACnD,UAAM,KAAK,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,CAAC;AAGxD,UAAM,iBAAiBA,MAAK,KAAK,WAAW,OAAO;AACnD,UAAM,KAAK,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,CAAC;AAGxD,UAAM,cAAcA,MAAK,KAAK,QAAQ,OAAO;AAC7C,UAAM,KAAK,GAAG,gBAAgB,aAAa,MAAM,GAAG,CAAC;AAAA,EACvD;AAEA,SAAO;AACT;;;AHrGA,eAAsB,0BAAkD;AACtE,MAAI;AACF,UAAM,MAAM,OAAO;AACnB,UAAM,mBAAmB,2BAA2B,GAAG;AACvD,UAAM,aAAaI,MAAK,KAAK,WAAW;AACxC,UAAM,YAAYC,YAAW,UAAU;AAEvC,QAAI,iBAAiB,WAAW,KAAK,CAAC,WAAW;AAC/C,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,oBAAI,IAAY;AAClC,eAAW,KAAK,iBAAkB,WAAU,IAAI,EAAE,QAAQ;AAC1D,QAAI,UAAW,WAAU,IAAI,oBAAoB;AAEjD,UAAM,WAAW;AAAA,MACf,GAAG,iBAAiB,IAAI,OAAK,EAAE,YAAY;AAAA,MAC3C,GAAI,YAAY,CAAC,UAAU,IAAI,CAAC;AAAA,IAClC;AAEA,WAAO,+CAA+C,MAAM,KAAK,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EAA+H,SAClN,IAAI,OAAK,KAAK,CAAC,EAAE,EACjB,KAAK,IAAI,CAAC;AAAA,EACf,SAAS,OAAO;AACd,aAAS,KAAK;AACd,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,KAAa,OAAqB;AAC3D,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,UAAU;AAAA,IACd,EAAE,GAAG,cAAc,SAAS,CAAC,GAAG,GAAG,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AACA,2BAAyB,EAAE,GAAG,eAAe,QAAQ,CAAC;AACxD;AAEO,SAAS,cAAc,KAAmB;AAC/C,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,UAAU;AAAA,IACd,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,2BAAyB,EAAE,GAAG,eAAe,QAAQ,CAAC;AACxD;AAEO,IAAM,YAAYC,SAAQ,YAAoC;AACnE,MAAI;AACF,UAAM,aAAaF,MAAK,OAAO,GAAG,WAAW;AAC7C,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAClD,WAAO;AAAA,EACT,SAAS,GAAG;AACV,aAAS,CAAC;AACV,WAAO;AAAA,EACT;AACF,CAAC;AAED,eAAsB,qBACpB,KACwB;AACxB,MAAI;AACF,UAAM,mBAAmB,2BAA2B,GAAG;AACvD,UAAM,aAAaD,MAAK,KAAK,WAAW;AAExC,UAAM,OAAO,CAAC;AAEd,QAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAM,EAAE,QAAQ,IAAI;AAAA,QAClB;AAAA,QACA,EAAE,iBAAiB,KAAK;AAAA,MAC1B;AACA,UAAI,QAAQ,KAAK,EAAE,SAAS,EAAG,MAAK,KAAK,OAAO;AAAA,IAClD;AAEA,UAAM,QAAQ,gBAAgB,GAAG;AACjC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI3B,MAAM,KAAK,MAAM,CAAC;AAAA;AAAA,EAElB,KAAK;AACD,WAAK,QAAQ,cAAc;AAAA,IAC7B;AAEA,QAAIC,YAAW,UAAU,GAAG;AAC1B,UAAI;AACF,cAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAClD,aAAK;AAAA,UACH;AAAA;AAAA,EAAwC,OAAO;AAAA,QACjD;AAAA,MACF,SAAS,GAAG;AACV,iBAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,IAAI,KAAK,KAAK,aAAa,IAAI;AAAA,EACtD,SAAS,GAAG;AACV,aAAS,CAAC;AACV,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiBC,SAAQ,YAAoC;AACxE,SAAO,qBAAqB,OAAO,CAAC;AACtC,CAAC;AAEM,IAAM,eAAeA,SAAQ,YAAoC;AACtE,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,WAAO;AAAA,EACT;AACA,MAAI,CAAE,MAAM,SAAS,GAAI;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,CAAC,QAAQ,YAAY,QAAQ,KAAK,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrE;AAAA,QACE;AAAA,QACA,CAAC,UAAU,gBAAgB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,MACpC;AAAA,QACE;AAAA,QACA,CAAC,aAAa,gBAAgB,aAAa;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK,CAAC;AAAA,MAC3D;AAAA,QACE;AAAA,QACA,CAAC,UAAU,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,MACpC;AAAA,QACE;AAAA,QACA,CAAC,OAAO,aAAa,MAAM,GAAG;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACC,MAAM,YAAY,KAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,IACtC,CAAC;AACD,UAAM,cAAc,OAAO,MAAM,IAAI,EAAE;AACvC,UAAM,kBACJ,cAAc,MACV,OAAO,MAAM,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI,IAC1C,2HACA;AAEN,WAAO;AAAA,kBAAuK,MAAM;AAAA;AAAA,mDAAwD,UAAU;AAAA;AAAA;AAAA,EAAgB,mBAAmB,SAAS;AAAA;AAAA;AAAA,EAAwB,GAAG;AAAA;AAAA;AAAA,EAA6B,aAAa,qBAAqB;AAAA,EAC9X,SAAS,OAAO;AACd,aAAS,KAAK;AACd,WAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,mBAAmBA;AAAA,EACvB,YAEM;AACJ,UAAM,YAAY,aAAa;AAC/B,UAAM,gBAAgB,wBAAwB;AAC9C,UAAM,YAAY,cAAc;AAChC,UAAM,CAAC,WAAW,sBAAsB,QAAQ,WAAW,IACzD,MAAM,QAAQ,IAAI;AAAA,MAChB,aAAa;AAAA,MACb,YAAY,QAAQ,QAAQ,EAAE,IAAI,wBAAwB;AAAA,MAC1D,UAAU;AAAA,MACV,eAAe;AAAA,IACjB,CAAC;AACH,WAAO;AAAA,MACL,GAAG,cAAc;AAAA,MACjB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,uBAAuB,EAAE,qBAAqB,IAAI,CAAC;AAAA,MACvD,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEA,eAAsB,aAEnB;AACD,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,YAAY,cAAc;AAChC,QAAM,CAAC,eAAe,kBAAkB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC5D,iBAAiB;AAAA,IACjB,YAAY,QAAQ,QAAQ,EAAE,IAAI,sBAAsB;AAAA,EAC1D,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC;AAAA,EACrD;AACF;AAEO,SAAS,oBAA0B;AACxC,mBAAiB,MAAM,QAAQ;AACjC;AAEA,eAAsB,wBAAyC;AAC7D,MAAI;AACJ,MAAI,mBAAmB;AACvB,MAAI,cAAwB,CAAC;AAC7B,MAAI,QAAkB,CAAC;AACvB,MAAI;AACF,UAAM,MAAM,OAAO;AACnB,uBAAmB,IAAI,SAASC,IAAG,IAAI,MAAM,GAAG,GAAG,GAAGA,IAAG;AACzD,UAAM,UAAUC,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AACxD,kBAAc,QACX,OAAO,WAAS,MAAM,YAAY,CAAC,EACnC,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACpC,YAAQ,QACL,OAAO,WAAS,CAAC,MAAM,YAAY,CAAC,EACpC,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACpC,YAAQ;AAAA,MACN,GAAG,YAAY,IAAI,UAAQ,KAAK,IAAI,GAAGD,IAAG,EAAE;AAAA,MAC5C,GAAG,MAAM,IAAI,UAAQ,KAAK,IAAI,EAAE;AAAA,IAClC,EAAE,KAAK,IAAI;AAAA,EACb,SAAS,OAAO;AACd,aAAS,KAAK;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,4BACmB,gBAAgB;AAAA,uCACL,gBAAgB,cAAc,YAAY,MAAM,oBAAoB,MAAM,MAAM;AAAA,EACrH,KAAK;AACP;",
|
|
4
|
+
"sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname, join, parse, relative, resolve, sep } from 'path'\n\nexport type ProjectInstructionFile = {\n absolutePath: string\n relativePathFromGitRoot: string\n filename: 'AGENTS.override.md' | 'AGENTS.md'\n}\n\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024\n\nfunction isRegularFile(path: string): boolean {\n try {\n return existsSync(path)\n } catch {\n return false\n }\n}\n\nexport function findGitRoot(startDir: string): string | null {\n let currentDir = resolve(startDir)\n const fsRoot = parse(currentDir).root\n\n while (true) {\n const dotGitPath = join(currentDir, '.git')\n if (existsSync(dotGitPath)) {\n return currentDir\n }\n if (currentDir === fsRoot) {\n return null\n }\n currentDir = dirname(currentDir)\n }\n}\n\nexport function getDirsFromGitRootToCwd(gitRoot: string, cwd: string): string[] {\n const absoluteGitRoot = resolve(gitRoot)\n const absoluteCwd = resolve(cwd)\n\n const rel = relative(absoluteGitRoot, absoluteCwd)\n if (!rel || rel === '.') {\n return [absoluteGitRoot]\n }\n\n const parts = rel.split(sep).filter(Boolean)\n const dirs: string[] = [absoluteGitRoot]\n for (let i = 0; i < parts.length; i++) {\n dirs.push(join(absoluteGitRoot, ...parts.slice(0, i + 1)))\n }\n return dirs\n}\n\nexport function getProjectInstructionFiles(\n cwd: string,\n): ProjectInstructionFile[] {\n const gitRoot = findGitRoot(cwd)\n const root = gitRoot ?? resolve(cwd)\n const dirs = getDirsFromGitRootToCwd(root, cwd)\n\n const results: ProjectInstructionFile[] = []\n for (const dir of dirs) {\n const overridePath = join(dir, 'AGENTS.override.md')\n const agentsPath = join(dir, 'AGENTS.md')\n\n if (isRegularFile(overridePath)) {\n results.push({\n absolutePath: overridePath,\n relativePathFromGitRoot:\n relative(root, overridePath) || 'AGENTS.override.md',\n filename: 'AGENTS.override.md',\n })\n continue\n }\n\n if (isRegularFile(agentsPath)) {\n results.push({\n absolutePath: agentsPath,\n relativePathFromGitRoot: relative(root, agentsPath) || 'AGENTS.md',\n filename: 'AGENTS.md',\n })\n }\n }\n\n return results\n}\n\nexport function getProjectDocMaxBytes(): number {\n const raw = process.env.PYB_PROJECT_DOC_MAX_BYTES\n if (!raw) return DEFAULT_PROJECT_DOC_MAX_BYTES\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0)\n return DEFAULT_PROJECT_DOC_MAX_BYTES\n return parsed\n}\n\nexport function readAndConcatProjectInstructionFiles(\n files: ProjectInstructionFile[],\n {\n maxBytes = getProjectDocMaxBytes(),\n includeHeadings = true,\n }: { maxBytes?: number; includeHeadings?: boolean } = {},\n): { content: string; truncated: boolean } {\n let totalBytes = 0\n let truncated = false\n\n const parts: string[] = []\n\n const truncateUtf8ToBytes = (value: string, bytes: number): string => {\n const buf = Buffer.from(value, 'utf8')\n if (buf.length <= bytes) return value\n return buf.subarray(0, Math.max(0, bytes)).toString('utf8')\n }\n\n for (const file of files) {\n if (totalBytes >= maxBytes) {\n truncated = true\n break\n }\n\n let raw: string\n try {\n raw = readFileSync(file.absolutePath, 'utf-8')\n } catch {\n continue\n }\n\n if (!raw.trim()) continue\n\n const separator = parts.length > 0 ? '\\n\\n' : ''\n const separatorBytes = Buffer.byteLength(separator, 'utf8')\n const remainingAfterSeparator = maxBytes - totalBytes - separatorBytes\n if (remainingAfterSeparator <= 0) {\n truncated = true\n break\n }\n\n const heading = includeHeadings\n ? `# ${file.filename}\\n\\n_Path: ${file.relativePathFromGitRoot}_\\n\\n`\n : ''\n\n const block = `${heading}${raw}`.trimEnd()\n const blockBytes = Buffer.byteLength(block, 'utf8')\n\n if (blockBytes <= remainingAfterSeparator) {\n parts.push(`${separator}${block}`)\n totalBytes += separatorBytes + blockBytes\n continue\n }\n\n truncated = true\n const suffix = `\\n\\n... (truncated: project instruction files exceeded ${maxBytes} bytes)`\n const suffixBytes = Buffer.byteLength(suffix, 'utf8')\n\n let finalBlock = ''\n if (suffixBytes >= remainingAfterSeparator) {\n finalBlock = truncateUtf8ToBytes(suffix, remainingAfterSeparator)\n } else {\n const prefixBudget = remainingAfterSeparator - suffixBytes\n const prefix = truncateUtf8ToBytes(block, prefixBudget)\n finalBlock = `${prefix}${suffix}`\n }\n\n parts.push(`${separator}${finalBlock}`)\n totalBytes += separatorBytes + Buffer.byteLength(finalBlock, 'utf8')\n break\n }\n\n return { content: parts.join(''), truncated }\n}\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { join, sep } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nimport { getProjectRules } from '@utils/config/rules'\n\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\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\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n const rules = getProjectRules(cwd)\n if (rules.length > 0) {\n const formattedRules = `\n# Project Rules (MANDATORY)\nThe following content represents the immutable rules for this project.\n<project_rules>\n${rules.join('\\n\\n')}\n</project_rules>\n`.trim()\n docs.unshift(formattedRules)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\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)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nconst getStaticContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [gitStatus, instructionFilesNote, readme, projectDocs] =\n await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport async function getContext(): Promise<{\n [k: string]: string\n}> {\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [staticContext, directoryStructure] = await Promise.all([\n getStaticContext(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n ])\n return {\n ...staticContext,\n ...(directoryStructure ? { directoryStructure } : {}),\n }\n}\n\nexport function clearContextCache(): void {\n getStaticContext.cache.clear?.()\n getDirectoryStructure.cache.clear?.()\n}\n\nexport function renderTopLevelTree(\n rootLabel: string,\n directories: string[],\n files: string[],\n): string {\n const items = [\n ...directories.map(n => ({ name: `${n}${sep}`, isDir: true })),\n ...files.map(n => ({ name: n, isDir: false })),\n ]\n const lines: string[] = []\n lines.push(rootLabel)\n for (let i = 0; i < items.length; i++) {\n const connector = i === items.length - 1 ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n lines.push(`${connector}${items[i].name}`)\n }\n return lines.join('\\n')\n}\n\nasync function buildDirectoryStructure(): Promise<string> {\n let lines: string\n let cwdWithSeparator = ''\n let directories: string[] = []\n let files: string[] = []\n try {\n const cwd = getCwd()\n cwdWithSeparator = cwd.endsWith(sep) ? cwd : `${cwd}${sep}`\n const entries = readdirSync(cwd, { withFileTypes: true })\n directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n lines = renderTopLevelTree(cwdWithSeparator, directories, files)\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `One-time static snapshot of the workspace root directory structure (top-level files and directories); not guaranteed to match the real-time directory,as follows:\n${lines}`\n}\n\nexport const getDirectoryStructure = memoize(\n async (): Promise<string> => {\n const projectConfig = getCurrentProjectConfig()\n if (projectConfig.dontCrawlDirectory) return ''\n return buildDirectoryStructure()\n },\n)\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n", "import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { join, relative, resolve } from 'path'\r\nimport matter from 'gray-matter'\r\nimport { minimatch } from 'minimatch'\r\nimport { findGitRoot, getDirsFromGitRootToCwd } from './projectInstructions'\r\nimport { logError } from '@utils/log'\r\n\r\nexport interface RuleFile {\r\n filename: string\r\n content: string\r\n paths?: string[]\r\n}\r\n\r\nfunction getRulesFromDir(dir: string, root: string, cwd: string): string[] {\r\n if (!existsSync(dir)) return []\r\n\r\n const rules: string[] = []\r\n const files = readdirSync(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n if (!statSync(filePath).isFile()) continue\r\n\r\n try {\r\n const fileContent = readFileSync(filePath, 'utf-8')\r\n // gray-matter by default uses js-yaml.safeLoad which is removed in js-yaml v4.\r\n // We need to provide a custom parser if we want to be safe, or rely on gray-matter's auto-detection if updated.\r\n // However, looking at the error \"Function yaml.safeLoad is removed\", it seems gray-matter 4.0.3 (in package.json)\r\n // might not be fully compatible with js-yaml 4.x out of the box without options?\r\n // Actually, checking gray-matter docs/issues, v4.0.3 should work.\r\n // But the error comes from gray-matter calling yaml.safeLoad.\r\n \r\n // Solution: Pass a custom parser engine to gray-matter\r\n const yaml = require('js-yaml')\r\n const matterOptions = {\r\n engines: {\r\n yaml: {\r\n parse: yaml.load.bind(yaml),\r\n stringify: yaml.dump.bind(yaml)\r\n }\r\n }\r\n }\r\n \r\n const { content, data } = matter(fileContent, matterOptions)\r\n \r\n // User rule: If no paths (YAML frontmatter), it applies globally.\r\n if (!data.paths || !Array.isArray(data.paths) || data.paths.length === 0) {\r\n rules.push(content.trim())\r\n continue\r\n }\r\n\r\n // If paths are specified, check if current context (cwd) matches\r\n // This is a simplification. Ideally we'd check active files, but cwd is a good proxy.\r\n const relCwd = relative(root, cwd)\r\n // On Windows, relative paths might use backslashes, but glob patterns usually expect forward slashes.\r\n // Also ensure we don't have a leading slash unless absolute, but relative returns without leading slash usually.\r\n // However, if relCwd is empty (cwd == root), we want it to match \"**\" but maybe not \"src/**\".\r\n // If relCwd is \"src\", it matches \"src/**\".\r\n \r\n const normalizedRelCwd = relCwd.split('\\\\').join('/')\r\n\r\n // Let's iterate over paths patterns\r\n const hasMatch = data.paths.some((pattern: string) => {\r\n // minimatch(path, pattern)\r\n // If pattern is \"src/**\", and path is \"src\", minimatch(\"src\", \"src/**\") is FALSE.\r\n // We need to check if the path is INSIDE the pattern.\r\n // But the rules say: \"Rules are included when the file being edited matches the path\".\r\n // Since we are approximating by CWD, we should check:\r\n // 1. Is CWD inside the pattern? (e.g. pattern=\"src/**\", cwd=\"src/utils\" -> YES)\r\n // 2. Is CWD the pattern itself? (e.g. pattern=\"src\", cwd=\"src\" -> YES)\r\n // 3. Is the pattern inside CWD? (e.g. pattern=\"src/utils/**\", cwd=\"src\" -> Maybe? If I edit src/index.ts, no. If I edit src/utils/foo.ts, yes.)\r\n \r\n // Let's stick to: CWD must match the pattern OR be a child of the pattern.\r\n // minimatch(\"src/utils\", \"src/**\") -> true\r\n \r\n // Debugging logs in test might help, but let's try to be more robust.\r\n // Maybe \"src\" does NOT match \"src/**\" in minimatch?\r\n // \"src/\" matches \"src/**\"?\r\n \r\n if (minimatch(normalizedRelCwd, pattern)) return true\r\n \r\n // Try appending slash if not empty\r\n if (normalizedRelCwd && minimatch(normalizedRelCwd + '/', pattern)) return true\r\n \r\n return false\r\n })\r\n\r\n if (hasMatch) {\r\n rules.push(content.trim())\r\n }\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n\r\n return rules\r\n}\r\n\r\nexport function getProjectRules(cwd: string): string[] {\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 rules: string[] = []\r\n\r\n // Iterate from root down to cwd to collect rules from .claude/rules, .cursor/rules and .pyb/rules\r\n for (const dir of dirs) {\r\n // .claude/rules\r\n const claudeRulesDir = join(dir, '.claude', 'rules')\r\n rules.push(...getRulesFromDir(claudeRulesDir, root, cwd))\r\n\r\n // .cursor/rules\r\n const cursorRulesDir = join(dir, '.cursor', 'rules')\r\n rules.push(...getRulesFromDir(cursorRulesDir, root, cwd))\r\n\r\n // .pyb/rules\r\n const pybRulesDir = join(dir, '.pyb', 'rules')\r\n rules.push(...getRulesFromDir(pybRulesDir, root, cwd))\r\n }\r\n\r\n return rules\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["readFileSync", "readFileSync", "memoize", "memoize", "memoize", "join", "sep", "existsSync", "readdirSync", "memoize", "memoize", "existsSync", "readFileSync", "join", "relative", "resolve", "existsSync", "join", "readFileSync", "relative", "resolve", "join", "existsSync", "memoize", "sep", "readdirSync"]
|
|
7
7
|
}
|
|
@@ -25,61 +25,62 @@ import {
|
|
|
25
25
|
hasReadPermission,
|
|
26
26
|
hasWritePermission,
|
|
27
27
|
query
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-NPBMF2YV.js";
|
|
29
29
|
import {
|
|
30
30
|
getHookTranscriptPath,
|
|
31
31
|
queueHookAdditionalContexts,
|
|
32
32
|
queueHookSystemMessages,
|
|
33
33
|
runPostToolUseHooks,
|
|
34
34
|
runPreToolUseHooks
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-OM6GCBT3.js";
|
|
36
36
|
import {
|
|
37
37
|
queryLLM
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-2CQ6B2EF.js";
|
|
39
39
|
import {
|
|
40
40
|
FallbackToolUseRejectedMessage,
|
|
41
41
|
MCPTool,
|
|
42
42
|
getClients,
|
|
43
43
|
getMCPTools
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-RYCR3HAC.js";
|
|
45
45
|
import {
|
|
46
46
|
generateAgentId
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-3ZXF2UHD.js";
|
|
48
48
|
import {
|
|
49
49
|
getActiveAgents,
|
|
50
50
|
getAgentByType,
|
|
51
51
|
getAvailableAgentTypes
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-R4AG75VT.js";
|
|
53
53
|
import {
|
|
54
54
|
INTERRUPT_MESSAGE,
|
|
55
55
|
createAssistantMessage,
|
|
56
56
|
createUserMessage,
|
|
57
57
|
getLastAssistantMessageId
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-DNDIMOXI.js";
|
|
59
59
|
import {
|
|
60
60
|
getAbsolutePath
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-ZC2N4I37.js";
|
|
62
62
|
import {
|
|
63
63
|
filesToTree,
|
|
64
64
|
ripGrepWithStatus
|
|
65
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-QSZWYMPZ.js";
|
|
66
66
|
import {
|
|
67
67
|
LspAPI,
|
|
68
68
|
LspFacade,
|
|
69
69
|
formatDiagnosticsPretty
|
|
70
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-ZPCPWVPN.js";
|
|
71
71
|
import {
|
|
72
72
|
getModelManager
|
|
73
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-UBJFL3ZW.js";
|
|
74
74
|
import {
|
|
75
|
-
getContext
|
|
76
|
-
|
|
75
|
+
getContext,
|
|
76
|
+
renderTopLevelTree
|
|
77
|
+
} from "./chunk-KOFUHO7S.js";
|
|
77
78
|
import {
|
|
78
79
|
getTheme
|
|
79
|
-
} from "./chunk-
|
|
80
|
+
} from "./chunk-V77NDZPE.js";
|
|
80
81
|
import {
|
|
81
82
|
debug
|
|
82
|
-
} from "./chunk-
|
|
83
|
+
} from "./chunk-RQBIHTZO.js";
|
|
83
84
|
import {
|
|
84
85
|
BunShell,
|
|
85
86
|
getCwd,
|
|
@@ -89,7 +90,7 @@ import {
|
|
|
89
90
|
overwriteLog,
|
|
90
91
|
readTaskOutput,
|
|
91
92
|
resolveXdgDataPath
|
|
92
|
-
} from "./chunk-
|
|
93
|
+
} from "./chunk-VQ6RVQVH.js";
|
|
93
94
|
import {
|
|
94
95
|
formatDuration,
|
|
95
96
|
formatNumber
|
|
@@ -588,6 +589,7 @@ Rules:
|
|
|
588
589
|
Input format:
|
|
589
590
|
{
|
|
590
591
|
"tool_calls": [
|
|
592
|
+
{ "tool": "LS", "parameters": { "path": "D:/repo/docs" } },
|
|
591
593
|
{ "tool": "Read", "parameters": { "file_path": "/abs/path.txt" } },
|
|
592
594
|
{ "tool": "Grep", "parameters": { "pattern": "foo" } }
|
|
593
595
|
]
|
|
@@ -1221,7 +1223,7 @@ async function analyzeOutputWithLsp(output, exitCode) {
|
|
|
1221
1223
|
if (exitCode !== 0) {
|
|
1222
1224
|
try {
|
|
1223
1225
|
const { isAbsolute: isAbsolute3, resolve: resolve4 } = await import("path");
|
|
1224
|
-
const { getCwd: getCwd2 } = await import("./state-
|
|
1226
|
+
const { getCwd: getCwd2 } = await import("./state-BMWIIFPG.js");
|
|
1225
1227
|
const lines = output.split("\n");
|
|
1226
1228
|
const uniqueFiles = /* @__PURE__ */ new Set();
|
|
1227
1229
|
const lspSuggestions = [];
|
|
@@ -1579,7 +1581,7 @@ var DeleteTool = {
|
|
|
1579
1581
|
}
|
|
1580
1582
|
if (!force) {
|
|
1581
1583
|
try {
|
|
1582
|
-
const { LspFacade: LspFacade2 } = await import("./lsp-
|
|
1584
|
+
const { LspFacade: LspFacade2 } = await import("./lsp-VUBIB4E2.js");
|
|
1583
1585
|
const referenceDetail = await LspFacade2.checkFileReferences(fullPath);
|
|
1584
1586
|
if (referenceDetail) {
|
|
1585
1587
|
failedItems.push(
|
|
@@ -1745,34 +1747,87 @@ var ListMcpResourcesTool = {
|
|
|
1745
1747
|
// src/tools/search/lsTool/lsTool.tsx
|
|
1746
1748
|
import { Box as Box6, Text as Text6 } from "ink";
|
|
1747
1749
|
import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve2, sep as sep2 } from "path";
|
|
1750
|
+
import { readdirSync } from "fs";
|
|
1748
1751
|
import * as React6 from "react";
|
|
1749
1752
|
import { z as z6 } from "zod";
|
|
1750
|
-
import { minimatch } from "minimatch";
|
|
1751
1753
|
|
|
1752
1754
|
// src/tools/search/lsTool/prompt.ts
|
|
1753
|
-
var DESCRIPTION4 = `Lists files and directories
|
|
1755
|
+
var DESCRIPTION4 = `Lists files and directories as a breadth-first tree with minimal metadata.`;
|
|
1754
1756
|
var PROMPT5 = `
|
|
1755
1757
|
Usage:
|
|
1756
|
-
1. **
|
|
1757
|
-
2. **
|
|
1758
|
-
3. **
|
|
1759
|
-
4. **
|
|
1758
|
+
1. **Structure First**: Use LS to understand the repository layout quickly.
|
|
1759
|
+
2. **Scope**: Use LS to build a verifiable index tree before any matching or searching.
|
|
1760
|
+
3. **Ignore Rules**: Use \`ignore\` to exclude noisy paths and reduce output size.
|
|
1761
|
+
4. **Metadata Lines**: \`[LS META]\` includes \`count\` and \`truncated\`.
|
|
1762
|
+
5. **Truncation**: If \`truncated=true\`, treat the output as partial and only use it as a navigation hint.
|
|
1763
|
+
6. **Layered Confirmation**: When truncated, use the top-level supplement + Glob to confirm paths before Grep/Read.
|
|
1760
1764
|
|
|
1761
1765
|
Notes:
|
|
1762
|
-
-
|
|
1763
|
-
-
|
|
1764
|
-
-
|
|
1766
|
+
- First step when exploring a new project.
|
|
1767
|
+
- When you need a reliable view of the structure.
|
|
1768
|
+
- When you feel lost in the file system.
|
|
1769
|
+
- The path parameter must be absolute.
|
|
1770
|
+
- When truncated, prefer layered confirmation (top-level supplement + Glob) before Grep/Read.
|
|
1765
1771
|
`.trim();
|
|
1766
1772
|
|
|
1767
1773
|
// src/tools/search/lsTool/lsTool.tsx
|
|
1768
|
-
var MAX_FILES_LIMIT =
|
|
1774
|
+
var MAX_FILES_LIMIT = 1500;
|
|
1775
|
+
var TOP_LEVEL_LIMIT = 2e3;
|
|
1776
|
+
var TOP_LEVEL_HEADER = "TOP-LEVEL DIRECTORY STRUCTURE (non-recursive, for navigation):";
|
|
1769
1777
|
var DISPLAY_LINE_LIMIT = 10;
|
|
1778
|
+
var DEFAULT_IGNORE_PATTERNS = [
|
|
1779
|
+
"node_modules/",
|
|
1780
|
+
"__pycache__/",
|
|
1781
|
+
".git/",
|
|
1782
|
+
"dist/",
|
|
1783
|
+
"build/",
|
|
1784
|
+
"target/",
|
|
1785
|
+
"vendor/",
|
|
1786
|
+
"bin/",
|
|
1787
|
+
"obj/",
|
|
1788
|
+
".idea/",
|
|
1789
|
+
".vscode/",
|
|
1790
|
+
".zig-cache/",
|
|
1791
|
+
"zig-out",
|
|
1792
|
+
".coverage",
|
|
1793
|
+
"coverage/",
|
|
1794
|
+
"vendor/",
|
|
1795
|
+
"tmp/",
|
|
1796
|
+
"temp/",
|
|
1797
|
+
".cache/",
|
|
1798
|
+
"cache/",
|
|
1799
|
+
"logs/",
|
|
1800
|
+
".venv/",
|
|
1801
|
+
"venv/",
|
|
1802
|
+
"env/"
|
|
1803
|
+
];
|
|
1770
1804
|
var inputSchema6 = z6.object({
|
|
1771
1805
|
path: z6.string().describe(
|
|
1772
1806
|
"The absolute path to the directory to list (must be absolute, not relative)"
|
|
1773
1807
|
),
|
|
1774
1808
|
ignore: z6.array(z6.string()).optional().describe("List of glob patterns to ignore.")
|
|
1775
1809
|
}).passthrough();
|
|
1810
|
+
var buildTopLevelTree = (fullFilePath) => {
|
|
1811
|
+
const entries = readdirSync(fullFilePath, { withFileTypes: true });
|
|
1812
|
+
const directories = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort((a, b) => a.localeCompare(b));
|
|
1813
|
+
const files = entries.filter((entry) => !entry.isDirectory()).map((entry) => entry.name).sort((a, b) => a.localeCompare(b));
|
|
1814
|
+
const items = [
|
|
1815
|
+
...directories.map((name) => ({ name, isDir: true })),
|
|
1816
|
+
...files.map((name) => ({ name, isDir: false }))
|
|
1817
|
+
];
|
|
1818
|
+
const totalCount = items.length;
|
|
1819
|
+
const truncated = totalCount > TOP_LEVEL_LIMIT;
|
|
1820
|
+
const limitedItems = truncated ? items.slice(0, TOP_LEVEL_LIMIT) : items;
|
|
1821
|
+
const limitedDirectories = limitedItems.filter((item) => item.isDir).map((item) => item.name);
|
|
1822
|
+
const limitedFiles = limitedItems.filter((item) => !item.isDir).map((item) => item.name);
|
|
1823
|
+
const rootLabel = fullFilePath.endsWith(sep2) ? fullFilePath : `${fullFilePath}${sep2}`;
|
|
1824
|
+
const treeOutput = renderTopLevelTree(
|
|
1825
|
+
rootLabel,
|
|
1826
|
+
limitedDirectories,
|
|
1827
|
+
limitedFiles
|
|
1828
|
+
);
|
|
1829
|
+
return { treeOutput, totalCount, truncated };
|
|
1830
|
+
};
|
|
1776
1831
|
var LSTool = {
|
|
1777
1832
|
name: "LS",
|
|
1778
1833
|
async description() {
|
|
@@ -1797,14 +1852,27 @@ var LSTool = {
|
|
|
1797
1852
|
async prompt() {
|
|
1798
1853
|
return DESCRIPTION4;
|
|
1799
1854
|
},
|
|
1800
|
-
async validateInput({
|
|
1855
|
+
async validateInput({
|
|
1856
|
+
limit,
|
|
1857
|
+
offset,
|
|
1858
|
+
partition,
|
|
1859
|
+
topLevelOnly,
|
|
1860
|
+
forceTopLevel
|
|
1861
|
+
}) {
|
|
1801
1862
|
if (typeof limit === "number" || typeof offset === "number" || typeof partition === "string") {
|
|
1802
1863
|
return {
|
|
1803
1864
|
result: false,
|
|
1804
|
-
message: "LS \u5F53\u524D\u4E0D\u652F\u6301 limit/offset/partition \u53C2\u6570\u3002",
|
|
1865
|
+
message: "LS \u5F53\u524D\u4E0D\u652F\u6301 limit/offset/partition \u8DEF\u5F84\u5206\u7247\u53C2\u6570\u3002",
|
|
1805
1866
|
errorCode: 1
|
|
1806
1867
|
};
|
|
1807
1868
|
}
|
|
1869
|
+
if (topLevelOnly === true || forceTopLevel === true) {
|
|
1870
|
+
return {
|
|
1871
|
+
result: false,
|
|
1872
|
+
message: "LS \u4E0D\u518D\u652F\u6301 topLevelOnly/forceTopLevel \u53C2\u6570\u3002\u8BF7\u6539\u7528\u9012\u5F52\u91C7\u96C6 + \u622A\u65AD\u8865\u507F\uFF0C\u5E76\u7ED3\u5408 Glob \u5206\u5C42\u786E\u8BA4\u8DEF\u5F84\u3002",
|
|
1873
|
+
errorCode: 2
|
|
1874
|
+
};
|
|
1875
|
+
}
|
|
1808
1876
|
return { result: true };
|
|
1809
1877
|
},
|
|
1810
1878
|
renderResultForAssistant(data) {
|
|
@@ -1830,12 +1898,13 @@ var LSTool = {
|
|
|
1830
1898
|
},
|
|
1831
1899
|
async *call({ path, ignore }, { abortController }) {
|
|
1832
1900
|
const fullFilePath = isAbsolute2(path) ? path : resolve2(getCwd(), path);
|
|
1833
|
-
const ignoreGlobs = (ignore ?? []).filter(Boolean);
|
|
1834
|
-
const rgArgs = ["--files", ...ignoreGlobs.flatMap((pattern) => ["--glob",
|
|
1901
|
+
const ignoreGlobs = DEFAULT_IGNORE_PATTERNS.map((pattern) => `!${pattern}*`).concat((ignore ?? []).map((pattern) => `!${pattern}`)).filter(Boolean);
|
|
1902
|
+
const rgArgs = ["--files", ...ignoreGlobs.flatMap((pattern) => ["--glob", pattern])];
|
|
1835
1903
|
const initialResult = await ripGrepWithStatus(
|
|
1836
1904
|
rgArgs,
|
|
1837
|
-
|
|
1838
|
-
abortController.signal
|
|
1905
|
+
".",
|
|
1906
|
+
abortController.signal,
|
|
1907
|
+
{ cwd: fullFilePath }
|
|
1839
1908
|
);
|
|
1840
1909
|
const files = initialResult.files;
|
|
1841
1910
|
const allEntries = files.map((file) => {
|
|
@@ -1844,12 +1913,7 @@ var LSTool = {
|
|
|
1844
1913
|
const normalized = relativePath.split(sep2).join("/");
|
|
1845
1914
|
return { absolutePath, relativePath, normalized };
|
|
1846
1915
|
});
|
|
1847
|
-
const fileEntries = allEntries.
|
|
1848
|
-
if (ignoreGlobs.length === 0) return true;
|
|
1849
|
-
return !ignoreGlobs.some(
|
|
1850
|
-
(pattern) => minimatch(entry.normalized, pattern, { dot: true, nocase: false })
|
|
1851
|
-
);
|
|
1852
|
-
}).sort((a, b) => a.normalized.localeCompare(b.normalized));
|
|
1916
|
+
const fileEntries = allEntries.sort((a, b) => a.normalized.localeCompare(b.normalized));
|
|
1853
1917
|
const totalCount = fileEntries.length;
|
|
1854
1918
|
const truncated = totalCount > MAX_FILES_LIMIT;
|
|
1855
1919
|
const selectedEntries = truncated ? fileEntries.slice(0, MAX_FILES_LIMIT) : fileEntries;
|
|
@@ -1868,23 +1932,39 @@ ${treeOutput}`.trim();
|
|
|
1868
1932
|
warnings.push(
|
|
1869
1933
|
`TRUNCATED: \u672A\u5C55\u793A\u6587\u4EF6\u6570=${totalCount}; \u672A\u663E\u793A\u884C\u6570=${omittedLines} lines\u3002\u8BE5\u8F93\u51FA\u4E3A\u90E8\u5206\u89C6\u56FE\uFF0C\u672A\u51FA\u73B0\u8DEF\u5F84\u4E0D\u5F97\u7528\u4E8E\u5B9A\u4F4D\u3002`
|
|
1870
1934
|
);
|
|
1871
|
-
warnings.push(
|
|
1872
|
-
|
|
1873
|
-
);
|
|
1935
|
+
warnings.push("\u5EFA\u8BAE\u7684\u5206\u6B65\u52A8\u4F5C\uFF08\u5927\u578B\u4EE3\u7801\u5E93\uFF09\uFF1A");
|
|
1936
|
+
warnings.push("1) \u4EC5\u5C06\u5F53\u524D\u6811\u4F5C\u4E3A\u7EBF\u7D22\uFF0C\u4E0D\u7528\u4E8E\u7CBE\u786E\u5B9A\u4F4D\u8DEF\u5F84\u3002");
|
|
1937
|
+
warnings.push("2) \u7ED3\u5408\u9876\u5C42\u8865\u507F\uFF0C\u5148\u5BF9\u5019\u9009\u76EE\u5F55\u6267\u884C Glob */\u3002");
|
|
1938
|
+
warnings.push("3) \u5BF9\u5019\u9009\u76EE\u5F55\u6267\u884C Glob dir/* \u4E0E dir/*/\uFF0C\u786E\u8BA4\u8DEF\u5F84\u5B58\u5728\u3002");
|
|
1939
|
+
warnings.push("4) \u5728\u5DF2\u786E\u8BA4\u76EE\u5F55\u5185\u4F7F\u7528 Grep/\u8BED\u4E49\u641C\u7D22\u5B9A\u4F4D\u6587\u4EF6\u6216\u7B26\u53F7\u3002");
|
|
1874
1940
|
if (totalCount >= 1e4 || omittedLines >= 200) {
|
|
1875
1941
|
warnings.push(
|
|
1876
1942
|
`\u9AD8\u590D\u6742\u5EA6\uFF1Acount>=10000 \u6216 \u672A\u663E\u793A\u884C\u6570>=200\u3002\u7ED3\u6784\u6811\u5177\u6709\u8BEF\u5BFC\u6027\uFF0C\u5FC5\u987B\u9010\u5C42\u786E\u8BA4\u8DEF\u5F84\u4E0E\u6587\u4EF6\u540D\u3002`
|
|
1877
1943
|
);
|
|
1878
1944
|
}
|
|
1879
1945
|
}
|
|
1946
|
+
let topLevelSupplement = "";
|
|
1947
|
+
if (truncated) {
|
|
1948
|
+
const topLevelResult = buildTopLevelTree(fullFilePath);
|
|
1949
|
+
topLevelSupplement = `
|
|
1950
|
+
|
|
1951
|
+
${TOP_LEVEL_HEADER}
|
|
1952
|
+
${topLevelResult.treeOutput}`;
|
|
1953
|
+
if (topLevelResult.truncated) {
|
|
1954
|
+
warnings.push(
|
|
1955
|
+
`TOP-LEVEL TRUNCATED: \u9876\u5C42\u6761\u76EE=${topLevelResult.totalCount}; \u4E0A\u9650=${TOP_LEVEL_LIMIT}\u3002\u5982\u9700\u5B8C\u6574\u7ED3\u679C\uFF0C\u9010\u5C42\u7F29\u5C0F\u8303\u56F4\u5E76\u5206\u6B65\u786E\u8BA4\u3002`
|
|
1956
|
+
);
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
const outputForData = `${outputWithMeta}${topLevelSupplement}`.trim();
|
|
1880
1960
|
const warningsText = warnings.length > 0 ? `
|
|
1881
1961
|
${warnings.join("\n")}` : "";
|
|
1882
1962
|
const safetyWarning = `
|
|
1883
1963
|
NOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`;
|
|
1884
|
-
const assistantData = `${
|
|
1964
|
+
const assistantData = `${outputForData}${warningsText}${safetyWarning}`;
|
|
1885
1965
|
yield {
|
|
1886
1966
|
type: "result",
|
|
1887
|
-
data:
|
|
1967
|
+
data: outputForData,
|
|
1888
1968
|
resultForAssistant: this.renderResultForAssistant(assistantData)
|
|
1889
1969
|
// Send warning only to assistant
|
|
1890
1970
|
};
|