reasonix 0.36.2 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +47 -75
  2. package/README.zh-CN.md +47 -32
  3. package/dist/cli/{chat-QSM6JKUA.js → chat-7257YAPG.js} +11 -11
  4. package/dist/cli/{chunk-DFP4YSVM.js → chunk-6CXT5JRM.js} +17 -2
  5. package/dist/cli/{chunk-DFP4YSVM.js.map → chunk-6CXT5JRM.js.map} +1 -1
  6. package/dist/cli/{chunk-G3XNWSFN.js → chunk-6NMWJSES.js} +2 -2
  7. package/dist/cli/{chunk-MLXUGPJE.js → chunk-GKZJXYMY.js} +79 -1
  8. package/dist/cli/chunk-GKZJXYMY.js.map +1 -0
  9. package/dist/cli/{chunk-IPCPEZWQ.js → chunk-JGZKTAOH.js} +2 -2
  10. package/dist/cli/{chunk-BJ376EN3.js → chunk-JULZ7JTO.js} +3 -3
  11. package/dist/cli/{chunk-NHV5YGTB.js → chunk-MSKUP6PD.js} +1372 -1012
  12. package/dist/cli/chunk-MSKUP6PD.js.map +1 -0
  13. package/dist/cli/{chunk-RNSZYYGB.js → chunk-SEFXUF24.js} +13 -13
  14. package/dist/cli/chunk-SEFXUF24.js.map +1 -0
  15. package/dist/cli/{chunk-C5543CRX.js → chunk-VF57YX2M.js} +2 -2
  16. package/dist/cli/{chunk-K6W64QVE.js → chunk-XOIDSPMQ.js} +27 -7
  17. package/dist/cli/chunk-XOIDSPMQ.js.map +1 -0
  18. package/dist/cli/{chunk-4D6TT2IB.js → chunk-YER7WCHF.js} +13 -6
  19. package/dist/cli/chunk-YER7WCHF.js.map +1 -0
  20. package/dist/cli/{code-6C5A2CY3.js → code-64EG5IU2.js} +14 -13
  21. package/dist/cli/code-64EG5IU2.js.map +1 -0
  22. package/dist/cli/{doctor-DKD34EFD.js → doctor-BW5HSQDW.js} +5 -5
  23. package/dist/cli/{events-P27CX7LN.js → events-SQXPVV7B.js} +3 -3
  24. package/dist/cli/index.js +27 -25
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/prompt-KGIUONO3.js +13 -0
  27. package/dist/cli/{prune-sessions-ERL6B4G5.js → prune-sessions-FCFOYCBP.js} +2 -2
  28. package/dist/cli/{run-AG4Y45X7.js → run-RWCOA32G.js} +7 -7
  29. package/dist/cli/{server-GNHR5K3N.js → server-6ZW4TQUP.js} +94 -48
  30. package/dist/cli/{server-GNHR5K3N.js.map → server-6ZW4TQUP.js.map} +1 -1
  31. package/dist/cli/{sessions-MHRF3GU4.js → sessions-5ISNWFMU.js} +7 -7
  32. package/dist/cli/{setup-IIAJXHP4.js → setup-HJG23NKJ.js} +2 -2
  33. package/dist/cli/{version-7AL4JZ63.js → version-BXAN7Q4V.js} +7 -7
  34. package/dist/index.d.ts +6 -2
  35. package/dist/index.js +149 -17
  36. package/dist/index.js.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/cli/chunk-4D6TT2IB.js.map +0 -1
  39. package/dist/cli/chunk-K6W64QVE.js.map +0 -1
  40. package/dist/cli/chunk-MLXUGPJE.js.map +0 -1
  41. package/dist/cli/chunk-NHV5YGTB.js.map +0 -1
  42. package/dist/cli/chunk-RNSZYYGB.js.map +0 -1
  43. package/dist/cli/code-6C5A2CY3.js.map +0 -1
  44. package/dist/cli/prompt-QSEB7HNQ.js +0 -11
  45. /package/dist/cli/{chat-QSM6JKUA.js.map → chat-7257YAPG.js.map} +0 -0
  46. /package/dist/cli/{chunk-G3XNWSFN.js.map → chunk-6NMWJSES.js.map} +0 -0
  47. /package/dist/cli/{chunk-IPCPEZWQ.js.map → chunk-JGZKTAOH.js.map} +0 -0
  48. /package/dist/cli/{chunk-BJ376EN3.js.map → chunk-JULZ7JTO.js.map} +0 -0
  49. /package/dist/cli/{chunk-C5543CRX.js.map → chunk-VF57YX2M.js.map} +0 -0
  50. /package/dist/cli/{doctor-DKD34EFD.js.map → doctor-BW5HSQDW.js.map} +0 -0
  51. /package/dist/cli/{events-P27CX7LN.js.map → events-SQXPVV7B.js.map} +0 -0
  52. /package/dist/cli/{prompt-QSEB7HNQ.js.map → prompt-KGIUONO3.js.map} +0 -0
  53. /package/dist/cli/{prune-sessions-ERL6B4G5.js.map → prune-sessions-FCFOYCBP.js.map} +0 -0
  54. /package/dist/cli/{run-AG4Y45X7.js.map → run-RWCOA32G.js.map} +0 -0
  55. /package/dist/cli/{sessions-MHRF3GU4.js.map → sessions-5ISNWFMU.js.map} +0 -0
  56. /package/dist/cli/{setup-IIAJXHP4.js.map → setup-HJG23NKJ.js.map} +0 -0
  57. /package/dist/cli/{version-7AL4JZ63.js.map → version-BXAN7Q4V.js.map} +0 -0
package/dist/cli/index.js CHANGED
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  markPhase
4
4
  } from "./chunk-CPOV2O73.js";
5
- import "./chunk-RNSZYYGB.js";
5
+ import "./chunk-SEFXUF24.js";
6
6
  import "./chunk-UNMYFZPZ.js";
7
7
  import "./chunk-XJLZ4HKU.js";
8
8
  import "./chunk-XHQIK7B6.js";
9
9
  import {
10
10
  applyMemoryStack
11
- } from "./chunk-4D6TT2IB.js";
11
+ } from "./chunk-YER7WCHF.js";
12
12
  import {
13
13
  resolvePreset
14
14
  } from "./chunk-MHDNZXJJ.js";
@@ -17,16 +17,16 @@ import "./chunk-KMWKGPFZ.js";
17
17
  import "./chunk-3Q3C4W66.js";
18
18
  import "./chunk-S4GF3HPO.js";
19
19
  import {
20
- ESCALATION_CONTRACT
21
- } from "./chunk-K6W64QVE.js";
22
- import "./chunk-IPCPEZWQ.js";
20
+ escalationContract
21
+ } from "./chunk-XOIDSPMQ.js";
22
+ import "./chunk-JGZKTAOH.js";
23
23
  import "./chunk-5X7LZJDE.js";
24
24
  import {
25
25
  listSessions
26
- } from "./chunk-DFP4YSVM.js";
26
+ } from "./chunk-6CXT5JRM.js";
27
27
  import {
28
28
  t
29
- } from "./chunk-MLXUGPJE.js";
29
+ } from "./chunk-GKZJXYMY.js";
30
30
  import {
31
31
  readConfig
32
32
  } from "./chunk-BHLHOS5Y.js";
@@ -81,7 +81,8 @@ function resolveContinueFlag(flag, fallbackSession, getLatestSession, warn = ()
81
81
 
82
82
  // src/cli/index.ts
83
83
  markPhase("cli_module_loaded");
84
- var DEFAULT_SYSTEM = `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.
84
+ function defaultSystemPrompt(modelId) {
85
+ return `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.
85
86
 
86
87
  # Cite or shut up \u2014 non-negotiable
87
88
 
@@ -101,7 +102,8 @@ Your training data has a cutoff. When an answer's correctness depends on somethi
101
102
 
102
103
  The signal isn't a topic list \u2014 it's: "if I'm wrong about this, is it because reality moved on?". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.
103
104
 
104
- ${ESCALATION_CONTRACT}`;
105
+ ${escalationContract(modelId)}`;
106
+ }
105
107
  function parseBudgetFlag(raw) {
106
108
  if (raw === void 0) return void 0;
107
109
  if (!Number.isFinite(raw) || raw <= 0) {
@@ -118,7 +120,7 @@ program.name("reasonix").description(t("cli.description")).version(VERSION).opti
118
120
  program.action(async (opts) => {
119
121
  const cfg = readConfig();
120
122
  if (!cfg.setupCompleted) {
121
- const { setupCommand } = await import("./setup-IIAJXHP4.js");
123
+ const { setupCommand } = await import("./setup-HJG23NKJ.js");
122
124
  await setupCommand({});
123
125
  return;
124
126
  }
@@ -130,21 +132,21 @@ program.action(async (opts) => {
130
132
  (msg) => process.stderr.write(`${msg}
131
133
  `)
132
134
  );
133
- const { chatCommand } = await import("./chat-QSM6JKUA.js");
135
+ const { chatCommand } = await import("./chat-7257YAPG.js");
134
136
  await chatCommand({
135
137
  model: defaults.model,
136
- system: applyMemoryStack(DEFAULT_SYSTEM, process.cwd()),
138
+ system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),
137
139
  session: continueOpts.session,
138
140
  mcp: defaults.mcp,
139
141
  forceResume: continueOpts.forceResume
140
142
  });
141
143
  });
142
144
  program.command("setup").description(t("cli.setup")).action(async () => {
143
- const { setupCommand } = await import("./setup-IIAJXHP4.js");
145
+ const { setupCommand } = await import("./setup-HJG23NKJ.js");
144
146
  await setupCommand({});
145
147
  });
146
148
  program.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--no-session", t("ui.noSession")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--no-dashboard", t("ui.noDashboard")).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option("--system-append <prompt>", t("ui.systemAppendHint")).option("--system-append-file <path>", t("ui.systemAppendFileHint")).action(async (dir, opts) => {
147
- const { codeCommand } = await import("./code-6C5A2CY3.js");
149
+ const { codeCommand } = await import("./code-64EG5IU2.js");
148
150
  await codeCommand({
149
151
  dir,
150
152
  model: opts.model,
@@ -160,7 +162,7 @@ program.command("code [dir]").description(t("cli.code")).option("-m, --model <id
160
162
  mouse: opts.mouse !== false
161
163
  });
162
164
  });
163
- program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint"), DEFAULT_SYSTEM).option("--transcript <path>", t("ui.transcriptHint")).option("--preset <name>", t("ui.presetHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--session <name>", t("ui.sessionNameHint")).option("--no-session", t("ui.ephemeralHint")).option("-r, --resume", t("ui.resumeHint")).option("-c, --continue", t("cli.continue")).option("-n, --new", t("ui.newHint")).option(
165
+ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--preset <name>", t("ui.presetHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--session <name>", t("ui.sessionNameHint")).option("--no-session", t("ui.ephemeralHint")).option("-r, --resume", t("ui.resumeHint")).option("-c, --continue", t("cli.continue")).option("-n, --new", t("ui.newHint")).option(
164
166
  "--mcp <spec>",
165
167
  t("ui.mcpSpecHint"),
166
168
  (value, previous = []) => [...previous, value],
@@ -180,10 +182,10 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
180
182
  (msg) => process.stderr.write(`${msg}
181
183
  `)
182
184
  );
183
- const { chatCommand } = await import("./chat-QSM6JKUA.js");
185
+ const { chatCommand } = await import("./chat-7257YAPG.js");
184
186
  await chatCommand({
185
187
  model: defaults.model,
186
- system: applyMemoryStack(opts.system, process.cwd()),
188
+ system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),
187
189
  transcript: opts.transcript,
188
190
  budgetUsd: parseBudgetFlag(opts.budget),
189
191
  session: continueOpts.session,
@@ -196,7 +198,7 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
196
198
  mouse: opts.mouse !== false
197
199
  });
198
200
  });
199
- program.command("run <task>").description(t("cli.run")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint"), DEFAULT_SYSTEM).option("--preset <name>", t("ui.presetHintShort")).option("--budget <usd>", t("ui.budgetHintShort"), (v) => Number.parseFloat(v)).option("--transcript <path>", t("ui.transcriptHintShort")).option(
201
+ program.command("run <task>").description(t("cli.run")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")).option("--preset <name>", t("ui.presetHintShort")).option("--budget <usd>", t("ui.budgetHintShort"), (v) => Number.parseFloat(v)).option("--transcript <path>", t("ui.transcriptHintShort")).option(
200
202
  "--mcp <spec>",
201
203
  t("ui.mcpSpecHintShort"),
202
204
  (value, previous = []) => [...previous, value],
@@ -208,11 +210,11 @@ program.command("run <task>").description(t("cli.run")).option("-m, --model <id>
208
210
  preset: opts.preset,
209
211
  noConfig: opts.config === false
210
212
  });
211
- const { runCommand } = await import("./run-AG4Y45X7.js");
213
+ const { runCommand } = await import("./run-RWCOA32G.js");
212
214
  await runCommand({
213
215
  task,
214
216
  model: defaults.model,
215
- system: applyMemoryStack(opts.system, process.cwd()),
217
+ system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),
216
218
  budgetUsd: parseBudgetFlag(opts.budget),
217
219
  transcript: opts.transcript,
218
220
  mcp: defaults.mcp,
@@ -224,7 +226,7 @@ program.command("stats [transcript]").description(t("cli.stats")).action(async (
224
226
  statsCommand({ transcript });
225
227
  });
226
228
  program.command("doctor").description(t("cli.doctor")).action(async () => {
227
- const { doctorCommand } = await import("./doctor-DKD34EFD.js");
229
+ const { doctorCommand } = await import("./doctor-BW5HSQDW.js");
228
230
  await doctorCommand();
229
231
  });
230
232
  program.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
@@ -232,15 +234,15 @@ program.command("commit").description(t("cli.commit")).option("-m, --model <id>"
232
234
  await commitCommand({ model: opts.model, yes: !!opts.yes });
233
235
  });
234
236
  program.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
235
- const { sessionsCommand } = await import("./sessions-MHRF3GU4.js");
237
+ const { sessionsCommand } = await import("./sessions-5ISNWFMU.js");
236
238
  sessionsCommand({ name, verbose: !!opts.verbose });
237
239
  });
238
240
  program.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
239
- const { pruneSessionsCommand } = await import("./prune-sessions-ERL6B4G5.js");
241
+ const { pruneSessionsCommand } = await import("./prune-sessions-FCFOYCBP.js");
240
242
  pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });
241
243
  });
242
244
  program.command("events <name>").description(t("cli.events")).option("--type <type>", t("ui.eventTypeHint")).option("--since <id>", t("ui.eventSinceHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.eventTailHint"), (v) => Number.parseInt(v, 10)).option("--json", t("ui.jsonHint")).option("--projection", t("ui.projectionHint")).action(async (name, opts) => {
243
- const { eventsCommand } = await import("./events-P27CX7LN.js");
245
+ const { eventsCommand } = await import("./events-SQXPVV7B.js");
244
246
  eventsCommand({
245
247
  name,
246
248
  type: opts.type,
@@ -338,7 +340,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
338
340
  }
339
341
  });
340
342
  program.command("version").description(t("cli.version")).action(async () => {
341
- const { versionCommand } = await import("./version-7AL4JZ63.js");
343
+ const { versionCommand } = await import("./version-BXAN7Q4V.js");
342
344
  versionCommand();
343
345
  });
344
346
  program.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { ESCALATION_CONTRACT } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nconst DEFAULT_SYSTEM = `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${ESCALATION_CONTRACT}`;\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(DEFAULT_SYSTEM, process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"), DEFAULT_SYSTEM)\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system, process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\n head: Number.isFinite(opts.head) ? opts.head : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n });\n });\n\nprogram\n .command(\"diff <a> <b>\")\n .description(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { escalationContract } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nfunction defaultSystemPrompt(modelId: string): string {\n return `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${escalationContract(modelId)}`;\n}\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\n head: Number.isFinite(opts.head) ? opts.head : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n });\n });\n\nprogram\n .command(\"diff <a> <b>\")\n .description(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ CODE_SYSTEM_PROMPT,
4
+ codeSystemBase,
5
+ codeSystemPrompt
6
+ } from "./chunk-YER7WCHF.js";
7
+ import "./chunk-XOIDSPMQ.js";
8
+ export {
9
+ CODE_SYSTEM_PROMPT,
10
+ codeSystemBase,
11
+ codeSystemPrompt
12
+ };
13
+ //# sourceMappingURL=prompt-KGIUONO3.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  listSessions,
4
4
  pruneStaleSessions
5
- } from "./chunk-DFP4YSVM.js";
5
+ } from "./chunk-6CXT5JRM.js";
6
6
 
7
7
  // src/cli/commands/prune-sessions.ts
8
8
  function pruneSessionsCommand(opts) {
@@ -39,4 +39,4 @@ function pruneSessionsCommand(opts) {
39
39
  export {
40
40
  pruneSessionsCommand
41
41
  };
42
- //# sourceMappingURL=prune-sessions-ERL6B4G5.js.map
42
+ //# sourceMappingURL=prune-sessions-FCFOYCBP.js.map
@@ -11,7 +11,7 @@ import {
11
11
  ImmutablePrefix,
12
12
  ToolRegistry,
13
13
  bridgeMcpTools
14
- } from "./chunk-RNSZYYGB.js";
14
+ } from "./chunk-SEFXUF24.js";
15
15
  import {
16
16
  McpClient,
17
17
  SseTransport,
@@ -25,7 +25,7 @@ import {
25
25
  recordFromLoopEvent,
26
26
  writeRecord
27
27
  } from "./chunk-XHQIK7B6.js";
28
- import "./chunk-4D6TT2IB.js";
28
+ import "./chunk-YER7WCHF.js";
29
29
  import "./chunk-DAEAAVDF.js";
30
30
  import {
31
31
  DeepSeekClient
@@ -34,11 +34,11 @@ import {
34
34
  loadDotenv
35
35
  } from "./chunk-3Q3C4W66.js";
36
36
  import "./chunk-S4GF3HPO.js";
37
- import "./chunk-K6W64QVE.js";
38
- import "./chunk-IPCPEZWQ.js";
37
+ import "./chunk-XOIDSPMQ.js";
38
+ import "./chunk-JGZKTAOH.js";
39
39
  import "./chunk-5X7LZJDE.js";
40
- import "./chunk-DFP4YSVM.js";
41
- import "./chunk-MLXUGPJE.js";
40
+ import "./chunk-6CXT5JRM.js";
41
+ import "./chunk-GKZJXYMY.js";
42
42
  import {
43
43
  defaultConfigPath,
44
44
  isPlausibleKey,
@@ -215,4 +215,4 @@ transcript: ${opts.transcript}
215
215
  export {
216
216
  runCommand
217
217
  };
218
- //# sourceMappingURL=run-AG4Y45X7.js.map
218
+ //# sourceMappingURL=run-RWCOA32G.js.map
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  SLASH_COMMANDS,
11
11
  listPlanArchives
12
- } from "./chunk-C5543CRX.js";
12
+ } from "./chunk-VF57YX2M.js";
13
13
  import {
14
14
  fetchSmitheryDetail,
15
15
  handleToFetchResult,
@@ -17,15 +17,16 @@ import {
17
17
  openRegistry,
18
18
  specStringFor
19
19
  } from "./chunk-SOZE7V7V.js";
20
- import "./chunk-G3XNWSFN.js";
20
+ import "./chunk-6NMWJSES.js";
21
21
  import {
22
22
  BUILTIN_ALLOWLIST
23
23
  } from "./chunk-S4GF3HPO.js";
24
24
  import {
25
25
  PROJECT_MEMORY_FILE,
26
26
  SKILLS_DIRNAME,
27
- SKILL_FILE
28
- } from "./chunk-K6W64QVE.js";
27
+ SKILL_FILE,
28
+ validateSkillFrontmatter
29
+ } from "./chunk-XOIDSPMQ.js";
29
30
  import "./chunk-FM57FNPJ.js";
30
31
  import {
31
32
  INDEX_DIR_NAME,
@@ -44,18 +45,18 @@ import {
44
45
  globalSettingsPath,
45
46
  loadHooks,
46
47
  projectSettingsPath
47
- } from "./chunk-IPCPEZWQ.js";
48
+ } from "./chunk-JGZKTAOH.js";
48
49
  import "./chunk-5X7LZJDE.js";
49
50
  import {
50
51
  listSessions,
51
52
  sessionPath,
52
53
  sessionsDir
53
- } from "./chunk-DFP4YSVM.js";
54
+ } from "./chunk-6CXT5JRM.js";
54
55
  import {
55
56
  getLanguage,
56
57
  getSupportedLanguages,
57
58
  setLanguage
58
- } from "./chunk-MLXUGPJE.js";
59
+ } from "./chunk-GKZJXYMY.js";
59
60
  import {
60
61
  DEFAULT_INDEX_EXCLUDES,
61
62
  DEFAULT_MAX_FILE_BYTES,
@@ -2427,6 +2428,7 @@ import {
2427
2428
  readSync as readSync3,
2428
2429
  readdirSync as readdirSync4,
2429
2430
  rmSync,
2431
+ statSync as statSync4,
2430
2432
  writeFileSync as writeFileSync3
2431
2433
  } from "fs";
2432
2434
  import { homedir as homedir3 } from "os";
@@ -2457,42 +2459,75 @@ function parseFrontmatterDescription(raw) {
2457
2459
  }
2458
2460
  return void 0;
2459
2461
  }
2462
+ function readSkillListEntry(skillPath, name, scope) {
2463
+ try {
2464
+ const fd = openSync3(skillPath, "r");
2465
+ let stat;
2466
+ let raw;
2467
+ try {
2468
+ stat = fstatSync3(fd);
2469
+ if (!stat.isFile()) return null;
2470
+ const buf = Buffer.alloc(stat.size);
2471
+ let read = 0;
2472
+ while (read < stat.size) {
2473
+ const n = readSync3(fd, buf, read, stat.size - read, read);
2474
+ if (n <= 0) break;
2475
+ read += n;
2476
+ }
2477
+ raw = buf.toString("utf8", 0, read);
2478
+ } finally {
2479
+ closeSync3(fd);
2480
+ }
2481
+ const item = {
2482
+ name,
2483
+ scope,
2484
+ path: skillPath,
2485
+ size: stat.size,
2486
+ mtime: stat.mtime.getTime()
2487
+ };
2488
+ const desc = parseFrontmatterDescription(raw);
2489
+ if (desc) item.description = desc;
2490
+ return item;
2491
+ } catch {
2492
+ return null;
2493
+ }
2494
+ }
2495
+ function resolveSkillPath(dir, name) {
2496
+ const folderPath = join6(dir, name, SKILL_FILE);
2497
+ try {
2498
+ if (statSync4(folderPath).isFile()) return { path: folderPath, layout: "folder" };
2499
+ } catch {
2500
+ }
2501
+ const flatPath = join6(dir, `${name}.md`);
2502
+ try {
2503
+ if (statSync4(flatPath).isFile()) return { path: flatPath, layout: "flat" };
2504
+ } catch {
2505
+ }
2506
+ return null;
2507
+ }
2508
+ function defaultSkillPath(dir, name) {
2509
+ return { path: join6(dir, name, SKILL_FILE), layout: "folder" };
2510
+ }
2460
2511
  function listSkills(dir, scope) {
2461
2512
  if (!existsSync8(dir)) return [];
2462
2513
  const out = [];
2463
2514
  try {
2464
- for (const entry of readdirSync4(dir)) {
2465
- if (!SAFE_NAME2.test(entry)) continue;
2466
- const skillPath = join6(dir, entry, SKILL_FILE);
2467
- try {
2468
- const fd = openSync3(skillPath, "r");
2469
- let stat;
2470
- let raw;
2471
- try {
2472
- stat = fstatSync3(fd);
2473
- const buf = Buffer.alloc(stat.size);
2474
- let read = 0;
2475
- while (read < stat.size) {
2476
- const n = readSync3(fd, buf, read, stat.size - read, read);
2477
- if (n <= 0) break;
2478
- read += n;
2479
- }
2480
- raw = buf.toString("utf8", 0, read);
2481
- } finally {
2482
- closeSync3(fd);
2483
- }
2484
- const item = {
2485
- name: entry,
2486
- scope,
2487
- path: skillPath,
2488
- size: stat.size,
2489
- mtime: stat.mtime.getTime()
2490
- };
2491
- const desc = parseFrontmatterDescription(raw);
2492
- if (desc) item.description = desc;
2493
- out.push(item);
2494
- } catch {
2515
+ for (const entry of readdirSync4(dir, { withFileTypes: true })) {
2516
+ let name;
2517
+ let skillPath;
2518
+ if (entry.isDirectory()) {
2519
+ name = entry.name;
2520
+ if (!SAFE_NAME2.test(name)) continue;
2521
+ skillPath = join6(dir, name, SKILL_FILE);
2522
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
2523
+ name = entry.name.slice(0, -3);
2524
+ if (!SAFE_NAME2.test(name)) continue;
2525
+ skillPath = join6(dir, entry.name);
2526
+ } else {
2527
+ continue;
2495
2528
  }
2529
+ const item = readSkillListEntry(skillPath, name, scope);
2530
+ if (item) out.push(item);
2496
2531
  }
2497
2532
  } catch {
2498
2533
  }
@@ -2563,28 +2598,39 @@ async function handleSkills(method, rest, body, ctx) {
2563
2598
  } else {
2564
2599
  dir = globalSkillsDir();
2565
2600
  }
2566
- const skillPath = join6(dir, name, SKILL_FILE);
2601
+ const resolved = resolveSkillPath(dir, name);
2567
2602
  if (method === "GET") {
2568
- if (!existsSync8(skillPath)) return { status: 404, body: { error: "skill not found" } };
2569
- return { status: 200, body: { path: skillPath, body: readFileSync5(skillPath, "utf8") } };
2603
+ if (!resolved) return { status: 404, body: { error: "skill not found" } };
2604
+ return {
2605
+ status: 200,
2606
+ body: { path: resolved.path, body: readFileSync5(resolved.path, "utf8") }
2607
+ };
2570
2608
  }
2571
2609
  if (method === "POST") {
2572
2610
  const { body: contents } = parseBody10(body);
2573
2611
  if (typeof contents !== "string") {
2574
2612
  return { status: 400, body: { error: "body (string) required" } };
2575
2613
  }
2576
- mkdirSync3(dirname4(skillPath), { recursive: true });
2577
- writeFileSync3(skillPath, contents, "utf8");
2614
+ const fm = validateSkillFrontmatter(contents);
2615
+ if ("error" in fm) {
2616
+ return { status: 400, body: { error: fm.error } };
2617
+ }
2618
+ const target = resolved ?? defaultSkillPath(dir, name);
2619
+ mkdirSync3(dirname4(target.path), { recursive: true });
2620
+ writeFileSync3(target.path, contents, "utf8");
2578
2621
  ctx.audit?.({
2579
2622
  ts: Date.now(),
2580
2623
  action: "save-skill",
2581
- payload: { scope, name, path: skillPath }
2624
+ payload: { scope, name, path: target.path }
2582
2625
  });
2583
- return { status: 200, body: { saved: true, path: skillPath } };
2626
+ return { status: 200, body: { saved: true, path: target.path } };
2584
2627
  }
2585
2628
  if (method === "DELETE") {
2586
- if (!existsSync8(skillPath)) return { status: 404, body: { error: "skill not found" } };
2587
- rmSync(dirname4(skillPath), { recursive: true, force: true });
2629
+ if (!resolved) return { status: 404, body: { error: "skill not found" } };
2630
+ rmSync(resolved.layout === "folder" ? dirname4(resolved.path) : resolved.path, {
2631
+ recursive: true,
2632
+ force: true
2633
+ });
2588
2634
  ctx.audit?.({ ts: Date.now(), action: "delete-skill", payload: { scope, name } });
2589
2635
  return { status: 200, body: { deleted: true } };
2590
2636
  }
@@ -2965,4 +3011,4 @@ export {
2965
3011
  readBody,
2966
3012
  startDashboardServer
2967
3013
  };
2968
- //# sourceMappingURL=server-GNHR5K3N.js.map
3014
+ //# sourceMappingURL=server-6ZW4TQUP.js.map