@ksm0709/context 0.0.22 → 0.0.23

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/README.md CHANGED
@@ -8,6 +8,10 @@ Context plugin for Bun
8
8
 
9
9
  <!-- Example usage code goes here -->
10
10
 
11
+ ## MCP Server
12
+
13
+ This plugin automatically registers an MCP (Model Context Protocol) server named `context-mcp` with OpenCode. The server provides tools for searching knowledge base files (`.md` files in `docs/` and `.context/` directories).
14
+
11
15
  ## OMX Support
12
16
 
13
17
  This plugin supports OMX (OpenCode Managed eXtension). See [[docs/omx-setup.md]] for setup instructions.
package/dist/cli/index.js CHANGED
@@ -10,29 +10,6 @@ import { homedir } from "os";
10
10
  import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync } from "fs";
11
11
  import { join as join2 } from "path";
12
12
 
13
- // src/constants.ts
14
- var DEFAULTS = {
15
- configPath: ".context/config.jsonc",
16
- promptDir: ".context/prompts",
17
- turnStartFile: "turn-start.md",
18
- turnEndFile: "turn-end.md",
19
- knowledgeSources: ["AGENTS.md"],
20
- templateDir: ".context/templates",
21
- indexFilename: "INDEX.md",
22
- maxDomainDepth: 2,
23
- knowledgeDir: "docs",
24
- guidesDir: ".context/guides",
25
- workCompleteFile: ".context/.work-complete"
26
- };
27
- var LIMITS = {
28
- maxPromptFileSize: 64 * 1024,
29
- maxIndexEntries: 100,
30
- maxTotalInjectionSize: 128 * 1024,
31
- maxScanDepth: 3,
32
- maxSummaryLength: 100,
33
- maxIndexFileSize: 32 * 1024
34
- };
35
-
36
13
  // src/lib/context-dir.ts
37
14
  import { existsSync } from "fs";
38
15
  import { join } from "path";
@@ -50,7 +27,7 @@ function resolveContextDir(projectDir) {
50
27
  // package.json
51
28
  var package_default = {
52
29
  name: "@ksm0709/context",
53
- version: "0.0.22",
30
+ version: "0.0.23",
54
31
  author: {
55
32
  name: "TaehoKang",
56
33
  email: "ksm07091@gmail.com"
@@ -80,10 +57,10 @@ var package_default = {
80
57
  access: "public"
81
58
  },
82
59
  scripts: {
83
- build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs",
60
+ build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/mcp.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs",
84
61
  test: "vitest run",
85
62
  lint: "eslint src --ext .ts",
86
- prepublishOnly: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs"
63
+ prepublishOnly: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/mcp.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs"
87
64
  },
88
65
  files: [
89
66
  "dist"
@@ -92,7 +69,8 @@ var package_default = {
92
69
  "@opencode-ai/plugin": ">=1.0.0"
93
70
  },
94
71
  dependencies: {
95
- "@ksm0709/context": "^0.0.21",
72
+ "@ksm0709/context": "^0.0.22",
73
+ "@modelcontextprotocol/sdk": "^1.27.1",
96
74
  "jsonc-parser": "^3.0.0"
97
75
  },
98
76
  devDependencies: {
@@ -117,10 +95,6 @@ var PLUGIN_VERSION = package_default.version;
117
95
  var DEFAULT_CONFIG = `{
118
96
  // Context Plugin Configuration
119
97
  // See: https://github.com/ksm0709/context
120
- "prompts": {
121
- "turnStart": "prompts/turn-start.md",
122
- "turnEnd": "prompts/turn-end.md"
123
- },
124
98
  "knowledge": {
125
99
  "dir": ".context/memory",
126
100
  "sources": ["AGENTS.md"]
@@ -132,53 +106,6 @@ var DEFAULT_CONFIG = `{
132
106
  }
133
107
  }
134
108
  }`;
135
- var DEFAULT_TURN_START = `## Knowledge Context
136
-
137
- \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 **\uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten)** \uBC29\uC2DD\uC73C\uB85C \uC9C0\uC2DD\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
138
- \uC138\uC158 \uAC04 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uBCF4\uC874\uD558\uC5EC, \uC774\uC804 \uC138\uC158\uC758 \uACB0\uC815/\uD328\uD134/\uC2E4\uC218\uAC00 \uB2E4\uC74C \uC138\uC158\uC5D0\uC11C \uC7AC\uD65C\uC6A9\uB429\uB2C8\uB2E4.
139
-
140
- ### \uC81C\uD154\uCE74\uC2A4\uD150 \uD575\uC2EC \uC6D0\uCE59
141
-
142
- 1. **\uC6D0\uC790\uC131** -- \uD558\uB098\uC758 \uB178\uD2B8 = \uD558\uB098\uC758 \uC8FC\uC81C. \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694.
143
- 2. **\uC5F0\uACB0** -- \uBAA8\uB4E0 \uB178\uD2B8\uB294 [[wikilink]]\uB85C \uAD00\uB828 \uB178\uD2B8\uC5D0 \uC5F0\uACB0. \uACE0\uB9BD\uB41C \uB178\uD2B8\uB294 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
144
- 3. **\uC790\uAE30 \uC5B8\uC5B4** -- \uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30\uAC00 \uC544\uB2CC, \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220\uD558\uC138\uC694.
145
-
146
- ### \uC791\uC5C5 \uC804 \uD544\uC218
147
-
148
- - **\uB370\uC77C\uB9AC \uB178\uD2B8 \uD655\uC778**: \uAC00\uC7A5 \uCD5C\uADFC\uC758 \uB370\uC77C\uB9AC \uB178\uD2B8(\`{{knowledgeDir}}/daily/YYYY-MM-DD.md\`)\uB97C \uC77D\uACE0 \uC774\uC804 \uC138\uC158\uC758 \uCEE8\uD14D\uC2A4\uD2B8\uC640 \uBBF8\uD574\uACB0 \uC774\uC288\uB97C \uD30C\uC545\uD558\uC138\uC694
149
- - **\uC791\uC5C5 \uC758\uB3C4 \uC120\uC5B8**: \uC791\uC5C5 \uC2DC\uC791 \uC804, \uD604\uC7AC \uC138\uC158\uC758 \uBAA9\uD45C\uC640 \uC791\uC5C5 \uC758\uB3C4\uB97C \uBA85\uD655\uD788 \uD30C\uC545\uD558\uACE0 \uC120\uC5B8\uD558\uC138\uC694 (\uCD94\uD6C4 \uC791\uC5C5 \uACBD\uB85C \uAC80\uC99D \uC2DC \uAE30\uC900\uC774 \uB429\uB2C8\uB2E4)
150
- - \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uC9C1\uC811 \uBA3C\uC800** \uC77D\uC73C\uC138\uC694
151
- - \uB3C4\uBA54\uC778 \uD3F4\uB354 \uAD6C\uC870\uAC00 \uC788\uB2E4\uBA74 INDEX.md\uC758 \uC694\uC57D\uC744 \uCC38\uACE0\uD558\uC5EC \uD544\uC694\uD55C \uB178\uD2B8\uB9CC \uC120\uD0DD\uC801\uC73C\uB85C \uC77D\uC73C\uC138\uC694
152
- - \uBB38\uC11C \uB0B4 [[\uB9C1\uD06C]]\uB97C \uB530\uB77C\uAC00\uBA70 \uAD00\uB828 \uB178\uD2B8\uB97C \uD0D0\uC0C9\uD558\uC138\uC694 -- \uB9C1\uD06C\uB97C \uB193\uCE58\uBA74 \uC911\uC694\uD55C \uB9E5\uB77D\uC744 \uC783\uC2B5\uB2C8\uB2E4
153
- - \uC9C0\uC2DD \uD30C\uC77C\uC5D0 \uAE30\uB85D\uB41C \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uD328\uD134, \uC81C\uC57D\uC0AC\uD56D\uC744 \uBC18\uB4DC\uC2DC \uB530\uB974\uC138\uC694
154
- - \uC77D\uC740 \uC9C0\uC2DD\uC744 \uD604\uC7AC \uC791\uC5C5\uC758 \uC124\uACC4, \uAD6C\uD604, \uAC80\uC99D\uC5D0 \uC9C1\uC811 \uBC18\uC601\uD558\uC138\uC694
155
-
156
- ### \uAC1C\uBC1C \uC6D0\uCE59
157
-
158
- - **TDD** (Test-Driven Development): \uD14C\uC2A4\uD2B8\uB97C \uBA3C\uC800 \uC791\uC131\uD558\uACE0(RED), \uAD6C\uD604\uD558\uC5EC \uD1B5\uACFC\uC2DC\uD0A8 \uB4A4(GREEN), \uB9AC\uD329\uD1A0\uB9C1\uD558\uC138\uC694
159
- - **DDD** (Domain-Driven Design): \uB3C4\uBA54\uC778 \uAC1C\uB150\uC744 \uCF54\uB4DC \uAD6C\uC870\uC5D0 \uBC18\uC601\uD558\uC138\uC694. \uD0C0\uC785\uACFC \uBAA8\uB4C8\uC740 \uBE44\uC988\uB2C8\uC2A4 \uB3C4\uBA54\uC778\uC744 \uAE30\uC900\uC73C\uB85C \uBD84\uB9AC\uD558\uC138\uC694
160
- - **\uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0**: \uC0C8\uB85C \uC791\uC131\uD558\uAC70\uB098 \uBCC0\uACBD\uD55C \uCF54\uB4DC\uB294 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1\uC744 \uBAA9\uD45C\uB85C \uD558\uC138\uC694. \uAD6C\uD604 \uC804\uC5D0 \uD14C\uC2A4\uD2B8\uBD80\uD130 \uC791\uC131\uD558\uBA74 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uB2EC\uC131\uB429\uB2C8\uB2E4
161
-
162
- ### \uC6B0\uC120\uC21C\uC704
163
-
164
- - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
165
- - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
166
- - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC774\uB098 \uBC18\uBCF5 \uAC00\uCE58\uAC00 \uC788\uB294 \uBC1C\uACAC\uC740 \uC791\uC5C5 \uBA54\uBAA8\uB098 \uC9C0\uC2DD \uB178\uD2B8 \uD6C4\uBCF4\uB85C \uAE30\uB85D\uD558\uC138\uC694
167
- `;
168
- var DEFAULT_TURN_END = `## TURN END \uC791\uC5C5 \uC9C0\uCE68
169
- \uC774 \uC9C0\uCE68\uC740 \uC5D0\uC774\uC804\uD2B8\uB97C \uC704\uD55C \uAC83\uC774\uBA70, \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C1\uC811\uC801\uC73C\uB85C \uB178\uCD9C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
170
- \uC544\uB798 \uBA54\uB274 \uC911 \uD558\uB098\uB97C \uC120\uD0DD\uD574 \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uB9DE\uAC8C \uC218\uD589\uD558\uC138\uC694.
171
- **\uBC18\uB4DC\uC2DC \uB9C1\uD06C\uB41C \uAC00\uC774\uB4DC\uB97C \uCC38\uACE0\uD558\uC5EC \uC815\uD655\uD788 \uC218\uD589\uD574\uC57C \uD569\uB2C8\uB2E4.**
172
-
173
- 1. **\uACC4\uC18D \uC791\uC5C5**: \uAE30\uC874 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC558\uACE0 \uC544\uC9C1 \uC544\uB798 \uC561\uC158\uC744 \uCDE8\uD560 \uB2E8\uACC4\uAC00 \uC544\uB2C8\uB77C\uBA74 \uC791\uC5C5 \uC18D\uAC1C.
174
- 2. **\uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D**: [.context/guides/daily-note-guide.md] \uB370\uC77C\uB9AC \uB178\uD2B8\uC5D0 \uC911\uC694\uD55C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uB85D\uD558\uC5EC \uB2E4\uC74C \uC138\uC158\uC774\uB098 \uC5D0\uC774\uC804\uD2B8 \uD300\uC774 \uCC38\uACE0\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694. \uAE30\uC874 \uB0B4\uC6A9 \uC218\uC815\uC740 \uBD88\uAC00\uD558\uBA70, \uC0C8\uB85C\uC6B4 \uBA54\uBAA8\uB97C \uCD94\uAC00 \uD558\uB294\uAC83\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uAC04\uB7B5\uD55C \uD55C \uB450 \uBB38\uC7A5\uC73C\uB85C \uC791\uC131\uD558\uC5EC \uD575\uC2EC \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uBA85\uD655\uD788 \uC804\uB2EC\uB418\uB3C4\uB85D \uD558\uC138\uC694.
175
- 3. **\uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131**: [.context/guides/note-guide.md] \uC791\uC5C5\uAE30\uC5B5(\uB370\uC77C\uB9AC\uB178\uD2B8, \uC138\uC158 \uCEE8\uD14D\uC2A4\uD2B8)\uBCF4\uB2E4 \uC624\uB798 \uAE30\uC5B5\uB418\uC5B4\uC57C \uD558\uB294 \uC911\uC694\uD55C \uACB0\uC815, \uD328\uD134, \uC2E4\uC218, \uBC1C\uACAC\uC740 \uC9C0\uC2DD \uB178\uD2B8\uB85C \uAE30\uB85D\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8\uC758 \uC9D1\uB2E8 \uC9C0\uC2DD\uC73C\uB85C \uB0A8\uAE30\uC138\uC694.
176
- 4. **\uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30**: [.context/guides/search-guide.md] \uC5B4\uB824\uC6C0\uC5D0 \uCC98\uD588\uB2E4\uBA74 \uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uD544\uC694\uD55C \uC9C0\uC2DD\uC774\uB098 \uC2A4\uD0AC\uC774 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB97C \uC77D\uC5B4\uBCF4\uC138\uC694. \uC0C8\uB85C\uC6B4 \uC544\uC774\uB514\uC5B4\uB098 \uD574\uACB0\uCC45\uC774 \uB5A0\uC624\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.
177
- 5. **\uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0**: [.context/guides/scope-review.md] \uC0AC\uC6A9\uC790\uAC00 \uC758\uB3C4\uD55C \uC791\uC5C5 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uC9C0 \uC54A\uC558\uB294\uC9C0, \uC791\uC5C5\uC774 \uB108\uBB34 \uD06C\uAC70\uB098 \uBCF5\uC7A1\uD574\uC9C0\uC9C0\uB294 \uC54A\uC558\uB294\uC9C0 \uAC80\uD1A0\uD558\uC138\uC694.
178
- 6. **\uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B**: [.context/guides/commit-guide.md] \uC791\uC5C5\uC774 \uAE38\uC5B4\uC9C8 \uACBD\uC6B0, \uC911\uC694\uD55C \uB2E8\uACC4\uB9C8\uB2E4 \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B\uC744 \uD558\uC5EC \uC791\uC5C5 \uB0B4\uC6A9\uC744 \uC548\uC804\uD558\uAC8C \uC800\uC7A5\uD558\uACE0, \uD544\uC694 \uC2DC \uC774\uC804 \uC0C1\uD0DC\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694.
179
- 7. **\uD004\uB9AC\uD2F0 \uAC80\uC99D**: [.context/guides/quality-check.md] **\uC791\uC5C5 \uC644\uB8CC \uC804\uC5D0 \uBC18\uB4DC\uC2DC \uC218\uD589\uD558\uC138\uC694**. \uCF54\uB4DC \uB9B0\uD2B8, \uD3EC\uB9F7\uD130, \uD14C\uC2A4\uD2B8, \uBE4C\uB4DC, \uCF54\uB4DC\uB9AC\uBDF0\uB97C \uC2E4\uD589\uD558\uC5EC \uC791\uC5C5 \uACB0\uACFC\uBB3C\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uD488\uC9C8 \uAE30\uC900\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.
180
- 8. **\uC791\uC5C5 \uC644\uB8CC**: [.context/guides/complete-guide.md] \uBAA8\uB4E0 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC5C8\uB2E4\uBA74, \uC774 \uAC00\uC774\uB4DC\uB97C \uB530\uB974\uC138\uC694. \uC774 \uC791\uC5C5 \uC9C0\uCE68\uC774 \uB354\uC774\uC0C1 \uD2B8\uB9AC\uAC70\uB418\uC9C0 \uC54A\uC744 \uAC83\uC785\uB2C8\uB2E4.
181
- `;
182
109
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
183
110
 
184
111
  ## \uC0C1\uD0DC
@@ -471,15 +398,12 @@ var TEMPLATE_FILES = {
471
398
  };
472
399
  function updateScaffold(projectDir) {
473
400
  const contextDir = join2(projectDir, resolveContextDir(projectDir));
474
- mkdirSync(join2(contextDir, "prompts"), { recursive: true });
475
401
  mkdirSync(join2(contextDir, "templates"), { recursive: true });
476
402
  mkdirSync(join2(contextDir, "guides"), { recursive: true });
477
403
  const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
478
404
  const guideEntries = Object.fromEntries(Object.entries(GUIDE_FILES).map(([filename, content]) => [`guides/${filename}`, content]));
479
405
  const templates = {
480
406
  "config.jsonc": DEFAULT_CONFIG,
481
- [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
482
- [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
483
407
  ...templateEntries,
484
408
  ...guideEntries
485
409
  };
@@ -500,26 +424,6 @@ function updateScaffold(projectDir) {
500
424
  function writeVersion(contextDir, version) {
501
425
  writeFileSync(join2(contextDir, ".version"), version, "utf-8");
502
426
  }
503
- function updatePrompts(projectDir) {
504
- const contextDir = join2(projectDir, resolveContextDir(projectDir));
505
- mkdirSync(join2(contextDir, "prompts"), { recursive: true });
506
- const prompts = {
507
- [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
508
- [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END
509
- };
510
- const updated = [];
511
- for (const [path, content] of Object.entries(prompts)) {
512
- const filePath = join2(contextDir, path);
513
- try {
514
- const existing = readFileSync(filePath, "utf-8");
515
- if (existing === content)
516
- continue;
517
- } catch {}
518
- writeFileSync(filePath, content, "utf-8");
519
- updated.push(path);
520
- }
521
- return updated;
522
- }
523
427
 
524
428
  // src/cli/commands/update.ts
525
429
  var KNOWN_SUBCOMMANDS = ["all", "prompt", "plugin"];
@@ -531,7 +435,8 @@ function runUpdate(args) {
531
435
  runUpdateAll(resolve(rest[0] ?? process.cwd()));
532
436
  break;
533
437
  case "prompt":
534
- runUpdatePrompt(resolve(rest[0] ?? process.cwd()));
438
+ process.stdout.write(`Prompt update is no longer supported.
439
+ `);
535
440
  break;
536
441
  case "plugin":
537
442
  runUpdatePlugin(rest[0] ?? "latest");
@@ -561,20 +466,6 @@ function runUpdateAll(projectDir) {
561
466
  }
562
467
  }
563
468
  }
564
- function runUpdatePrompt(projectDir) {
565
- const updated = updatePrompts(projectDir);
566
- if (updated.length === 0) {
567
- process.stdout.write(`All prompt files are already up to date.
568
- `);
569
- } else {
570
- process.stdout.write(`Updated ${updated.length} prompt file(s):
571
- `);
572
- for (const f of updated) {
573
- process.stdout.write(` - ${f}
574
- `);
575
- }
576
- }
577
- }
578
469
  function detectPackageManager() {
579
470
  if (existsSync3("bun.lock") || existsSync3("bun.lockb"))
580
471
  return "bun";