thoth-agents 0.2.11 → 0.3.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 (149) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +21 -0
  3. package/README.md +301 -311
  4. package/dist/agents/configured-role-prompt.d.ts +9 -0
  5. package/dist/agents/prompt-sections.d.ts +8 -4
  6. package/dist/agents/prompt-utils.d.ts +0 -4
  7. package/dist/{chunk-ASKXWU6E.js → chunk-2MZ5C2RN.js} +1078 -1725
  8. package/dist/chunk-XO74DXBZ.js +1781 -0
  9. package/dist/{chunk-6BNAV534.js → chunk-YUCGIJPP.js} +12 -30
  10. package/dist/cli/claude-code-install.d.ts +24 -26
  11. package/dist/cli/claude-code-paths.d.ts +0 -28
  12. package/dist/cli/codex-install.d.ts +2 -2
  13. package/dist/cli/codex-paths.d.ts +0 -2
  14. package/dist/cli/index.js +279 -119
  15. package/dist/cli/install.d.ts +5 -1
  16. package/dist/cli/model-catalog/cache.d.ts +1 -1
  17. package/dist/cli/operations/claude-code.d.ts +6 -3
  18. package/dist/cli/operations/codex.d.ts +2 -1
  19. package/dist/cli/operations/opencode.d.ts +2 -1
  20. package/dist/cli/operations/types.d.ts +9 -1
  21. package/dist/cli/package-root.d.ts +1 -0
  22. package/dist/cli/providers.d.ts +6 -116
  23. package/dist/cli/skills.d.ts +19 -32
  24. package/dist/cli/thoth-mem-install.d.ts +45 -0
  25. package/dist/cli/tui/components/StatusView.d.ts +12 -1
  26. package/dist/cli/tui/index.js +256 -142
  27. package/dist/cli/tui/operations.d.ts +4 -3
  28. package/dist/cli/types.d.ts +0 -10
  29. package/dist/config/constants.d.ts +20 -16
  30. package/dist/config/index.d.ts +0 -1
  31. package/dist/config/loader.d.ts +1 -1
  32. package/dist/config/schema.d.ts +2 -38
  33. package/dist/config/utils.d.ts +1 -2
  34. package/dist/harness/adapters/codex-surfaces.d.ts +3 -3
  35. package/dist/harness/core/agent-pack.d.ts +37 -29
  36. package/dist/harness/core/memory-governance.d.ts +24 -48
  37. package/dist/harness/core/sdd.d.ts +364 -131
  38. package/dist/harness/generate-integration-packages.d.ts +20 -0
  39. package/dist/harness/opencode-init-command.d.ts +11 -0
  40. package/dist/harness/types.d.ts +14 -1
  41. package/dist/harness/writers/claude-code-subagent.d.ts +3 -1
  42. package/dist/hooks/index.d.ts +0 -5
  43. package/dist/index.js +562 -1314
  44. package/dist/mcp/index.d.ts +1 -2
  45. package/package.json +17 -12
  46. package/plugin/.claude-plugin/.thoth-agents-plugin-assets.json +50 -0
  47. package/plugin/.claude-plugin/plugin.json +8 -0
  48. package/plugin/.codex-plugin/.thoth-agents-plugin-assets.json +16 -0
  49. package/plugin/.codex-plugin/plugin.json +7 -0
  50. package/plugin/.mcp.json +19 -0
  51. package/plugin/agents/deep.md +89 -0
  52. package/plugin/agents/designer.md +89 -0
  53. package/plugin/agents/explorer.md +90 -0
  54. package/plugin/agents/librarian.md +90 -0
  55. package/plugin/agents/oracle.md +92 -0
  56. package/plugin/agents/orchestrator.md +128 -0
  57. package/plugin/agents/quick.md +89 -0
  58. package/plugin/codex.mcp.json +17 -0
  59. package/plugin/settings.json +3 -0
  60. package/plugin/skills/thoth-archive/SKILL.md +40 -0
  61. package/plugin/skills/thoth-archive/scripts/archive.mjs +748 -0
  62. package/plugin/skills/thoth-constitution/SKILL.md +45 -0
  63. package/plugin/skills/thoth-constitution/scripts/validate.mjs +167 -0
  64. package/plugin/skills/thoth-constitution/templates/constitution.md +54 -0
  65. package/plugin/skills/thoth-init/SKILL.md +30 -0
  66. package/plugin/skills/thoth-init/scripts/init.mjs +141 -0
  67. package/plugin/skills/thoth-sdd/SKILL.md +83 -0
  68. package/plugin/skills/thoth-sdd/references/phases/analyze.md +21 -0
  69. package/plugin/skills/thoth-sdd/references/phases/checklist.md +20 -0
  70. package/plugin/skills/thoth-sdd/references/phases/clarify.md +15 -0
  71. package/plugin/skills/thoth-sdd/references/phases/converge.md +14 -0
  72. package/plugin/skills/thoth-sdd/references/phases/explore.md +10 -0
  73. package/plugin/skills/thoth-sdd/references/phases/implement.md +19 -0
  74. package/plugin/skills/thoth-sdd/references/phases/plan.md +15 -0
  75. package/plugin/skills/thoth-sdd/references/phases/specify.md +21 -0
  76. package/plugin/skills/thoth-sdd/references/phases/tasks.md +20 -0
  77. package/plugin/skills/thoth-sdd/references/phases/verify.md +22 -0
  78. package/plugin/skills/thoth-sdd/scripts/validate.mjs +1117 -0
  79. package/plugin/skills/thoth-sdd/templates/archive-report.md +25 -0
  80. package/plugin/skills/thoth-sdd/templates/checklist.md +27 -0
  81. package/plugin/skills/thoth-sdd/templates/plan.md +38 -0
  82. package/plugin/skills/thoth-sdd/templates/spec.md +54 -0
  83. package/plugin/skills/thoth-sdd/templates/tasks.md +29 -0
  84. package/plugin/skills/thoth-sdd/templates/verify-report.md +28 -0
  85. package/skills/README.md +12 -0
  86. package/skills/thoth-archive/SKILL.md +40 -0
  87. package/skills/thoth-archive/scripts/archive.mjs +748 -0
  88. package/skills/thoth-constitution/SKILL.md +45 -0
  89. package/skills/thoth-constitution/scripts/validate.mjs +167 -0
  90. package/skills/thoth-constitution/templates/constitution.md +54 -0
  91. package/skills/thoth-init/SKILL.md +30 -0
  92. package/skills/thoth-init/scripts/init.mjs +141 -0
  93. package/skills/thoth-sdd/SKILL.md +83 -0
  94. package/skills/thoth-sdd/references/phases/analyze.md +21 -0
  95. package/skills/thoth-sdd/references/phases/checklist.md +20 -0
  96. package/skills/thoth-sdd/references/phases/clarify.md +15 -0
  97. package/skills/thoth-sdd/references/phases/converge.md +14 -0
  98. package/skills/thoth-sdd/references/phases/explore.md +10 -0
  99. package/skills/thoth-sdd/references/phases/implement.md +19 -0
  100. package/skills/thoth-sdd/references/phases/plan.md +15 -0
  101. package/skills/thoth-sdd/references/phases/specify.md +21 -0
  102. package/skills/thoth-sdd/references/phases/tasks.md +20 -0
  103. package/skills/thoth-sdd/references/phases/verify.md +22 -0
  104. package/skills/thoth-sdd/scripts/validate.mjs +1117 -0
  105. package/skills/thoth-sdd/templates/archive-report.md +25 -0
  106. package/skills/thoth-sdd/templates/checklist.md +27 -0
  107. package/skills/thoth-sdd/templates/plan.md +38 -0
  108. package/skills/thoth-sdd/templates/spec.md +54 -0
  109. package/skills/thoth-sdd/templates/tasks.md +29 -0
  110. package/skills/thoth-sdd/templates/verify-report.md +28 -0
  111. package/thoth-agents.schema.json +0 -39
  112. package/dist/chunk-OZE7JVGS.js +0 -2344
  113. package/dist/cli/custom-skills.d.ts +0 -49
  114. package/dist/cli/skill-manifest.d.ts +0 -32
  115. package/dist/harness/core/skills.d.ts +0 -211
  116. package/dist/harness/generate-codex-plugin.d.ts +0 -9
  117. package/dist/harness/writers/claude-code-skill-layout.d.ts +0 -16
  118. package/dist/harness/writers/fs-skill-collect.d.ts +0 -7
  119. package/dist/harness/writers/skill-layout.d.ts +0 -16
  120. package/dist/hooks/chat-headers.d.ts +0 -16
  121. package/dist/hooks/phase-reminder/index.d.ts +0 -28
  122. package/dist/hooks/post-read-nudge/index.d.ts +0 -18
  123. package/dist/hooks/skill-sync.d.ts +0 -10
  124. package/dist/hooks/thoth-mem/index.d.ts +0 -46
  125. package/dist/hooks/thoth-mem/protocol.d.ts +0 -7
  126. package/dist/mcp/thoth.d.ts +0 -3
  127. package/dist/sdd/artifact-governance/artifact-loader.d.ts +0 -130
  128. package/dist/sdd/artifact-governance/index.d.ts +0 -6
  129. package/dist/sdd/artifact-governance/tasks-validator.d.ts +0 -17
  130. package/dist/sdd/artifact-governance/types.d.ts +0 -52
  131. package/dist/thoth/client.d.ts +0 -14
  132. package/dist/thoth/index.d.ts +0 -2
  133. package/src/skills/_shared/openspec-convention.md +0 -350
  134. package/src/skills/_shared/persistence-contract.md +0 -163
  135. package/src/skills/_shared/thoth-mem-convention.md +0 -123
  136. package/src/skills/executing-plans/SKILL.md +0 -288
  137. package/src/skills/plan-reviewer/SKILL.md +0 -219
  138. package/src/skills/requirements-interview/SKILL.md +0 -233
  139. package/src/skills/sdd-apply/SKILL.md +0 -89
  140. package/src/skills/sdd-archive/SKILL.md +0 -92
  141. package/src/skills/sdd-clarify/SKILL.md +0 -105
  142. package/src/skills/sdd-constitution/SKILL.md +0 -107
  143. package/src/skills/sdd-design/SKILL.md +0 -155
  144. package/src/skills/sdd-init/SKILL.md +0 -233
  145. package/src/skills/sdd-propose/SKILL.md +0 -101
  146. package/src/skills/sdd-spec/SKILL.md +0 -136
  147. package/src/skills/sdd-tasks/SKILL.md +0 -232
  148. package/src/skills/sdd-verify/SKILL.md +0 -131
  149. package/src/skills/thoth-mem-agents/SKILL.md +0 -210
package/dist/cli/index.js CHANGED
@@ -4,10 +4,10 @@ import {
4
4
  getOpenCodeVersion,
5
5
  isOpenCodeInstalled,
6
6
  opencodeAdapter
7
- } from "../chunk-6BNAV534.js";
7
+ } from "../chunk-YUCGIJPP.js";
8
8
  import {
9
9
  CODEX_ROLE_NAMES,
10
- RECOMMENDED_SKILLS,
10
+ REQUIRED_SKILLS,
11
11
  SUPPORTED_OPERATION_HARNESSES,
12
12
  applyClaudeCodePlan,
13
13
  applyClaudeCodeSetup,
@@ -38,21 +38,21 @@ import {
38
38
  getOpenCodeModelRoles,
39
39
  getOpenCodeStatus,
40
40
  getOperationHarness,
41
- installRecommendedSkill,
41
+ getRequiredSkillInstallCommand,
42
+ installRequiredSkill,
42
43
  listOperationHarnesses,
43
44
  normalizeEffortSelection
44
- } from "../chunk-ASKXWU6E.js";
45
+ } from "../chunk-2MZ5C2RN.js";
45
46
  import {
46
47
  ALL_AGENT_NAMES,
47
- CUSTOM_SKILLS,
48
- DEFAULT_MODELS,
49
48
  detectCurrentConfig,
50
49
  generateLiteConfig,
50
+ getDefaultOpenCodeModel,
51
+ getDefaultOpenCodeVariant,
51
52
  getExistingLiteConfigPath,
52
- installCustomSkills,
53
53
  updateOpenCodeMainConfig,
54
54
  writeLiteConfig
55
- } from "../chunk-OZE7JVGS.js";
55
+ } from "../chunk-XO74DXBZ.js";
56
56
 
57
57
  // src/cli/index.ts
58
58
  import { pathToFileURL } from "url";
@@ -72,6 +72,167 @@ function getHarnessAdapter(harness) {
72
72
  import { existsSync } from "fs";
73
73
  import { homedir } from "os";
74
74
  import { cwd } from "process";
75
+
76
+ // src/cli/thoth-mem-install.ts
77
+ import { spawnSync } from "child_process";
78
+ var THOTH_MEM_SETUP_TIMEOUT_MS = 12e4;
79
+ var STATUS_EXIT_CODE = {
80
+ complete: 0,
81
+ failed: 1,
82
+ partial: 2,
83
+ requires_user_action: 3
84
+ };
85
+ var SETUP_STATUSES = new Set(
86
+ Object.keys(STATUS_EXIT_CODE)
87
+ );
88
+ var STEP_OUTCOMES = /* @__PURE__ */ new Set([
89
+ "planned",
90
+ "skipped",
91
+ "confirmed",
92
+ "failed",
93
+ "unavailable"
94
+ ]);
95
+ function isRecord(value) {
96
+ return typeof value === "object" && value !== null && !Array.isArray(value);
97
+ }
98
+ function isStringArray(value) {
99
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
100
+ }
101
+ function isSetupStep(value) {
102
+ return isRecord(value) && typeof value.name === "string" && value.name.length > 0 && typeof value.outcome === "string" && STEP_OUTCOMES.has(value.outcome);
103
+ }
104
+ function isProviderSetupResult(value, expectedHarness) {
105
+ return isRecord(value) && typeof value.status === "string" && SETUP_STATUSES.has(value.status) && typeof value.changed === "boolean" && value.harness === expectedHarness && value.scope === "global" && typeof value.target === "string" && value.target.length > 0 && Array.isArray(value.steps) && value.steps.every(isSetupStep) && isStringArray(value.diagnostics) && isStringArray(value.manual_actions) && (value.receipt === null || typeof value.receipt === "string");
106
+ }
107
+ function parseProviderSetupResult(stdout, expectedHarness) {
108
+ let value;
109
+ try {
110
+ value = JSON.parse(stdout.trim());
111
+ } catch {
112
+ return void 0;
113
+ }
114
+ return isProviderSetupResult(value, expectedHarness) ? value : void 0;
115
+ }
116
+ function defaultCommandExecutor(command, args, options) {
117
+ const result = spawnSync(command, [...args], {
118
+ cwd: options.cwd,
119
+ encoding: "utf8",
120
+ stdio: ["ignore", "pipe", "pipe"],
121
+ timeout: options.timeoutMs
122
+ });
123
+ return {
124
+ exitCode: result.status,
125
+ stdout: result.stdout ?? "",
126
+ stderr: result.stderr ?? "",
127
+ error: result.error
128
+ };
129
+ }
130
+ function describeError(error) {
131
+ return error instanceof Error ? error.message : String(error);
132
+ }
133
+ function isTimeoutError(error) {
134
+ return isRecord(error) && error.code === "ETIMEDOUT";
135
+ }
136
+ function invalidResult(harness, command, args, exitCode, error) {
137
+ return {
138
+ success: false,
139
+ evidenceValid: false,
140
+ status: "invalid",
141
+ changed: false,
142
+ harness,
143
+ steps: [],
144
+ diagnostics: [],
145
+ manualActions: [],
146
+ receipt: null,
147
+ command,
148
+ args,
149
+ exitCode,
150
+ error
151
+ };
152
+ }
153
+ function getThothMemSetupCommand(harness, dryRun) {
154
+ return {
155
+ command: "npx",
156
+ args: [
157
+ "-y",
158
+ "thoth-mem@latest",
159
+ "setup",
160
+ harness,
161
+ "--scope",
162
+ "global",
163
+ ...dryRun ? ["--plan"] : [],
164
+ "--json"
165
+ ]
166
+ };
167
+ }
168
+ function runThothMemSetup(options) {
169
+ const { command, args } = getThothMemSetupCommand(
170
+ options.harness,
171
+ options.dryRun ?? false
172
+ );
173
+ const executor = options.commandExecutor ?? defaultCommandExecutor;
174
+ let commandResult;
175
+ try {
176
+ commandResult = executor(command, args, {
177
+ cwd: options.cwd,
178
+ timeoutMs: THOTH_MEM_SETUP_TIMEOUT_MS
179
+ });
180
+ } catch (error) {
181
+ return invalidResult(
182
+ options.harness,
183
+ command,
184
+ args,
185
+ null,
186
+ `Unable to launch thoth-mem setup: ${describeError(error)}`
187
+ );
188
+ }
189
+ if (commandResult.error) {
190
+ const stderr = commandResult.stderr.trim().slice(0, 2e3);
191
+ return invalidResult(
192
+ options.harness,
193
+ command,
194
+ args,
195
+ commandResult.exitCode,
196
+ isTimeoutError(commandResult.error) ? `thoth-mem setup timed out after ${THOTH_MEM_SETUP_TIMEOUT_MS} ms${stderr ? `: ${stderr}` : "."}` : `Unable to launch thoth-mem setup: ${describeError(commandResult.error)}`
197
+ );
198
+ }
199
+ const provider = parseProviderSetupResult(
200
+ commandResult.stdout,
201
+ options.harness
202
+ );
203
+ if (!provider) {
204
+ const stderr = commandResult.stderr.trim();
205
+ return invalidResult(
206
+ options.harness,
207
+ command,
208
+ args,
209
+ commandResult.exitCode,
210
+ stderr ? `thoth-mem returned invalid JSON evidence: ${stderr.slice(0, 2e3)}` : "thoth-mem returned invalid JSON evidence."
211
+ );
212
+ }
213
+ const expectedExitCode = STATUS_EXIT_CODE[provider.status];
214
+ const evidenceValid = commandResult.exitCode === expectedExitCode;
215
+ return {
216
+ success: evidenceValid && provider.status === "complete",
217
+ evidenceValid,
218
+ status: provider.status,
219
+ changed: provider.changed,
220
+ harness: provider.harness,
221
+ target: provider.target,
222
+ steps: provider.steps,
223
+ diagnostics: provider.diagnostics,
224
+ manualActions: provider.manual_actions,
225
+ receipt: provider.receipt,
226
+ command,
227
+ args,
228
+ exitCode: commandResult.exitCode,
229
+ ...!evidenceValid ? {
230
+ error: `thoth-mem exit code ${String(commandResult.exitCode)} contradicts reported status ${provider.status} (expected ${expectedExitCode}).`
231
+ } : {}
232
+ };
233
+ }
234
+
235
+ // src/cli/install.ts
75
236
  var GREEN = "\x1B[32m";
76
237
  var BLUE = "\x1B[34m";
77
238
  var YELLOW = "\x1B[33m";
@@ -106,14 +267,8 @@ function printError(message) {
106
267
  function printInfo(message) {
107
268
  console.log(`${SYMBOLS.info} ${message}`);
108
269
  }
109
- function formatCustomSkillReasons(report) {
110
- if (report.updatedSkills.length === 0 && report.removedSkills.length === 0) {
111
- return "all bundled skills already up to date";
112
- }
113
- return `${report.updatedSkills.length} updated, ${report.removedSkills.length} removed, ${report.skippedSkills.length} unchanged`;
114
- }
115
- function formatSkillReasons(reasons) {
116
- return reasons.join(", ");
270
+ function printWarning(message) {
271
+ console.log(`${SYMBOLS.warn} ${message}`);
117
272
  }
118
273
  async function checkOpenCodeInstalled() {
119
274
  const installed = await isOpenCodeInstalled();
@@ -146,29 +301,87 @@ function handleStepResult(result, successMsg) {
146
301
  );
147
302
  return true;
148
303
  }
149
- function formatConfigSummary() {
304
+ function formatConfigSummary(dryRun) {
150
305
  const lines = [];
151
306
  lines.push(`${BOLD}Configuration Summary${RESET}`);
152
307
  lines.push("");
153
308
  lines.push(` ${BOLD}Preset:${RESET} ${BLUE}openai${RESET}`);
154
- lines.push(` ${SYMBOLS.check} Seven-agent thoth-agents roster`);
309
+ lines.push(` ${SYMBOLS.check} Seven-role adaptive thoth-agents roster`);
155
310
  lines.push(` ${SYMBOLS.check} OpenAI models by default`);
156
- lines.push(` ${SYMBOLS.check} thoth-mem enabled for orchestrator memory`);
157
- lines.push(` ${SYMBOLS.check} Delegation results persisted to disk`);
158
- lines.push(` ${SYMBOLS.check} Bundled SDD skills ready for install`);
159
- const seeDocs = "see docs/provider-configurations.md";
160
- lines.push(` ${DIM}\u25CB Kimi \u2014 ${seeDocs}${RESET}`);
161
- lines.push(` ${DIM}\u25CB GitHub Copilot \u2014 ${seeDocs}${RESET}`);
162
- lines.push(` ${DIM}\u25CB ZAI Coding Plan \u2014 ${seeDocs}${RESET}`);
311
+ lines.push(` ${SYMBOLS.check} Direct, Accelerated, and Full SDD routing`);
312
+ lines.push(
313
+ ` ${SYMBOLS.check} ${dryRun ? "thoth-mem setup plan confirmed" : "thoth-mem setup completed through its provider-owned installer"}`
314
+ );
315
+ lines.push(
316
+ ` ${DIM}\u25CB thoth-mem remains the owner of hooks, MCP, skill, lifecycle, persistence, receipts, and recovery.${RESET}`
317
+ );
318
+ lines.push(` ${SYMBOLS.check} Required external skills for this harness`);
163
319
  return lines.join("\n");
164
320
  }
165
- async function runInstall(config) {
321
+ function installRequiredSkillsForHarness(harness, dryRun, homeDir = homedir()) {
322
+ if (dryRun) {
323
+ printInfo(`Dry run mode - required ${harness} skills:`);
324
+ for (const skill of REQUIRED_SKILLS) {
325
+ const { command, args } = getRequiredSkillInstallCommand(skill, harness);
326
+ printInfo(` - ${skill.name}: ${command} ${args.join(" ")}`);
327
+ }
328
+ printSuccess(`Required external skills planned for ${harness}`);
329
+ return true;
330
+ }
331
+ let installed = 0;
332
+ let alreadyInstalled = 0;
333
+ for (const skill of REQUIRED_SKILLS) {
334
+ printInfo(`Installing required skill ${skill.name} for ${harness}...`);
335
+ const result = installRequiredSkill(skill, harness, { homeDir });
336
+ if (result.status === "failed") {
337
+ printError(`Failed to install required skill: ${skill.name}`);
338
+ return false;
339
+ }
340
+ if (result.status === "installed") {
341
+ installed += 1;
342
+ printSuccess(`Installed: ${skill.name}`);
343
+ } else {
344
+ alreadyInstalled += 1;
345
+ printInfo(`Skipped: ${skill.name} (already installed)`);
346
+ }
347
+ }
348
+ printSuccess(
349
+ `${installed} required skills installed, ${alreadyInstalled} already installed`
350
+ );
351
+ return true;
352
+ }
353
+ function printThothMemSetupResult(result, dryRun) {
354
+ printInfo(`Provider command: ${result.command} ${result.args.join(" ")}`);
355
+ for (const step of result.steps) {
356
+ printInfo(`thoth-mem: ${step.name} [${step.outcome}]`);
357
+ }
358
+ for (const diagnostic of result.diagnostics) printInfo(diagnostic);
359
+ if (result.receipt) printInfo(`thoth-mem receipt: ${result.receipt}`);
360
+ for (const action of result.manualActions) {
361
+ printWarning(`thoth-mem manual action: ${action}`);
362
+ }
363
+ if (!result.success) {
364
+ printError(`thoth-mem setup is incomplete: ${result.status}`);
365
+ if (result.error) printError(result.error);
366
+ return false;
367
+ }
368
+ printSuccess(
369
+ dryRun ? "thoth-mem setup plan confirmed" : "thoth-mem setup complete through its provider-owned installer"
370
+ );
371
+ return true;
372
+ }
373
+ function installThothMemForHarness(harness, dryRun, dependencies) {
374
+ const setup = dependencies.runThothMemSetup ?? runThothMemSetup;
375
+ return printThothMemSetupResult(
376
+ setup({ harness, dryRun, cwd: cwd() }),
377
+ dryRun
378
+ );
379
+ }
380
+ async function runInstall(config, dependencies) {
166
381
  const detected = detectCurrentConfig();
167
382
  const isUpdate = detected.isInstalled;
168
383
  printHeader(isUpdate);
169
- let totalSteps = 3;
170
- if (config.installSkills) totalSteps += 1;
171
- if (config.installCustomSkills) totalSteps += 1;
384
+ const totalSteps = 5;
172
385
  let step = 1;
173
386
  printStep(step++, totalSteps, "Checking OpenCode installation...");
174
387
  if (config.dryRun) {
@@ -217,70 +430,14 @@ ${JSON.stringify(liteConfig, null, 2)}
217
430
  return 1;
218
431
  }
219
432
  }
220
- if (config.installSkills) {
221
- printStep(step++, totalSteps, "Installing recommended external skills...");
222
- if (config.dryRun) {
223
- printInfo("Dry run mode - would install skills:");
224
- for (const skill of RECOMMENDED_SKILLS) {
225
- printInfo(` - ${skill.name}`);
226
- }
227
- } else {
228
- let skillsInstalled = 0;
229
- let skillsAlreadyInstalled = 0;
230
- for (const skill of RECOMMENDED_SKILLS) {
231
- printInfo(`Installing ${skill.name}...`);
232
- const result = installRecommendedSkill(skill);
233
- if (result.status === "installed") {
234
- printSuccess(`Installed: ${skill.name}`);
235
- skillsInstalled++;
236
- } else if (result.status === "already-installed") {
237
- printInfo(`Skipped: ${skill.name} (already installed)`);
238
- skillsAlreadyInstalled++;
239
- } else {
240
- printError(`Failed to install recommended skill: ${skill.name}`);
241
- return 1;
242
- }
243
- }
244
- printSuccess(
245
- `${skillsInstalled} installed, ${skillsAlreadyInstalled} already installed`
246
- );
247
- }
248
- }
249
- if (config.installCustomSkills) {
250
- printStep(step++, totalSteps, "Installing bundled thoth-agents skills...");
251
- if (config.dryRun) {
252
- printInfo("Dry run mode - would install bundled skills:");
253
- for (const skill of CUSTOM_SKILLS) {
254
- printInfo(` - ${skill.name}`);
255
- }
256
- } else {
257
- const report = installCustomSkills();
258
- for (const updatedSkill of report.updatedSkills) {
259
- printSuccess(
260
- `Installed: ${updatedSkill.skill.name} (${formatSkillReasons(updatedSkill.reasons)})`
261
- );
262
- }
263
- for (const skippedSkill of report.skippedSkills) {
264
- printInfo(`Up to date: ${skippedSkill.name}`);
265
- }
266
- for (const removedSkill of report.removedSkills) {
267
- printInfo(`Removed obsolete skill: ${removedSkill}`);
268
- }
269
- for (const failedSkill of report.failedSkills) {
270
- printError(
271
- `Failed: ${failedSkill.skill.name} (${formatSkillReasons(failedSkill.reasons)})`
272
- );
273
- }
274
- if (!report.success) {
275
- return 1;
276
- }
277
- printSuccess(
278
- `Bundled skills processed: ${formatCustomSkillReasons(report)}`
279
- );
280
- }
433
+ printStep(step++, totalSteps, "Installing required external skills...");
434
+ if (!installRequiredSkillsForHarness("opencode", config.dryRun)) return 1;
435
+ printStep(step++, totalSteps, "Configuring provider-owned thoth-mem...");
436
+ if (!installThothMemForHarness("opencode", config.dryRun, dependencies)) {
437
+ return 1;
281
438
  }
282
439
  console.log();
283
- console.log(formatConfigSummary());
440
+ console.log(formatConfigSummary(config.dryRun));
284
441
  console.log();
285
442
  const statusMsg = isUpdate ? "thoth-agents updated!" : "thoth-agents installation complete!";
286
443
  console.log(`${SYMBOLS.star} ${BOLD}${GREEN}${statusMsg}${RESET}`);
@@ -290,32 +447,22 @@ ${JSON.stringify(liteConfig, null, 2)}
290
447
  console.log(` 1. Start OpenCode:`);
291
448
  console.log(` ${BLUE}$ opencode${RESET}`);
292
449
  console.log();
293
- const modelsInfo = "Default configuration uses OpenAI models (gpt-5.4 / gpt-5.4-mini).";
450
+ const modelsInfo = "Default configuration uses OpenAI models.";
294
451
  console.log(`${BOLD}${modelsInfo}${RESET}`);
295
452
  console.log(
296
- ` ${DIM}Includes the seven-agent roster, thoth-mem memory defaults,${RESET}`
297
- );
298
- console.log(
299
- ` ${DIM}native task delegation, and bundled SDD skills.${RESET}`
453
+ ` ${DIM}Includes the seven-role adaptive roster, native delegation, and Direct / Accelerated / Full SDD routing.${RESET}`
300
454
  );
301
- const altProviders = "For alternative providers (Kimi, GitHub Copilot, ZAI Coding Plan)";
302
- console.log(`${BOLD}${altProviders}, see:${RESET}`);
303
- const docsUrl = "https://github.com/EremesNG/thoth-agents/blob/master/docs/provider-configurations.md";
304
- console.log(` ${BLUE}${docsUrl}${RESET}`);
305
- console.log();
306
455
  return 0;
307
456
  }
308
457
  function createInstallConfig(args) {
309
458
  return {
310
459
  agent: args.agent ?? "opencode",
311
460
  hasTmux: args.tmux === "yes",
312
- installSkills: args.skills === "yes",
313
- installCustomSkills: true,
314
461
  dryRun: args.dryRun,
315
462
  reset: args.reset ?? false
316
463
  };
317
464
  }
318
- async function install(args) {
465
+ async function install(args, dependencies = {}) {
319
466
  const config = createInstallConfig(args);
320
467
  if (config.agent === "codex") {
321
468
  const plan = buildCodexSetupPlan({
@@ -332,6 +479,10 @@ async function install(args) {
332
479
  printError(`Codex install failed: ${result.error}`);
333
480
  return 1;
334
481
  }
482
+ if (!installRequiredSkillsForHarness("codex", config.dryRun)) return 1;
483
+ if (!installThothMemForHarness("codex", config.dryRun, dependencies)) {
484
+ return 1;
485
+ }
335
486
  printSuccess(
336
487
  config.dryRun ? "Codex dry-run complete; no files written" : "Codex agent-pack setup complete"
337
488
  );
@@ -342,8 +493,7 @@ async function install(args) {
342
493
  dryRun: config.dryRun,
343
494
  reset: config.reset,
344
495
  scope: "user",
345
- projectRoot: cwd(),
346
- homeDir: homedir()
496
+ projectRoot: cwd()
347
497
  });
348
498
  console.log(formatClaudeCodeSetupPlan(plan));
349
499
  const result = applyClaudeCodeSetup(plan);
@@ -352,12 +502,16 @@ async function install(args) {
352
502
  printError(`Claude Code install failed: ${result.error}`);
353
503
  return 1;
354
504
  }
505
+ if (!installRequiredSkillsForHarness("claude", config.dryRun)) return 1;
506
+ if (!installThothMemForHarness("claude", config.dryRun, dependencies)) {
507
+ return 1;
508
+ }
355
509
  printSuccess(
356
- config.dryRun ? "Claude Code dry-run complete; no files written" : "Claude Code plugin installed as thoth-agents@skills-dir (restart Claude Code or run /reload-plugins to activate)"
510
+ config.dryRun ? "Claude Code dry-run complete; no files written" : "Claude Code plugin installed as thoth-agents@thoth-agents through the native manager (restart Claude Code or run /reload-plugins to activate)"
357
511
  );
358
512
  return 0;
359
513
  }
360
- return runInstall(config);
514
+ return runInstall(config, dependencies);
361
515
  }
362
516
 
363
517
  // src/cli/commands.ts
@@ -408,6 +562,12 @@ function formatHarnessStatusReport(reports) {
408
562
  `${report.displayName ?? getOperationHarness(report.harness).displayName} (${report.harness})`,
409
563
  `State: ${report.state}`,
410
564
  `Summary: ${report.summary}`,
565
+ ...report.providerCapability ? [
566
+ "Provider evidence:",
567
+ `Provider capability: ${report.providerCapability.state}`,
568
+ `Evidence source: ${report.providerCapability.source}`,
569
+ `Evidence basis: ${report.providerCapability.basis.length > 0 ? report.providerCapability.basis.join("; ") : "none supplied"}`
570
+ ] : [],
411
571
  ...report.targets.length > 0 ? ["Targets:", ...report.targets.map(formatTarget)] : [],
412
572
  ...report.diagnostics.length > 0 ? ["Warnings:", ...formatWarnings(report.diagnostics)] : [],
413
573
  ...report.disclaimers && report.disclaimers.length > 0 ? ["Disclaimers:", ...formatDisclaimers(report.disclaimers)] : [],
@@ -504,7 +664,6 @@ Commands:
504
664
 
505
665
  Options:
506
666
  --tmux=yes|no Enable tmux integration (yes/no)
507
- --skills=yes|no Install recommended external skills
508
667
  --no-tui Non-interactive mode
509
668
  --dry-run Simulate install without writing files
510
669
  --reset Repair managed installer-owned targets
@@ -526,14 +685,14 @@ OpenCode loads the plugin with config such as:
526
685
  That plugin entry does not create a global thoth-agents command.
527
686
  Run this CLI through a global install, npx, or pnpm dlx.
528
687
 
529
- OpenCode install configures the seven-agent roster, thoth-mem defaults,
530
- native task delegation, and bundled SDD skills for OpenCode.
688
+ OpenCode install configures the adaptive seven-role roster and native task delegation.
689
+ Provider capability is external and reported only from caller-supplied evidence.
531
690
 
532
- Bundled thoth-agents skills are always installed.
533
- Use --skills=no to skip only recommended external skills.
691
+ External required skills are installed for every harness:
692
+ simplify, tdd, progressive-context-router, and architectural-grilling.
693
+ Their installation is mandatory and cannot be skipped.
534
694
 
535
- The generated config uses OpenAI by default.
536
- For alternative providers, see docs/provider-configurations.md.
695
+ The generated OpenCode config supports the built-in OpenAI preset only.
537
696
 
538
697
  Examples:
539
698
  thoth-agents
@@ -544,7 +703,7 @@ Examples:
544
703
  pnpm dlx thoth-agents@latest install --agent=codex --dry-run
545
704
  pnpm dlx thoth-agents@latest install --agent=claude
546
705
  pnpm dlx thoth-agents@latest install --agent=claude --dry-run
547
- pnpm dlx thoth-agents install --no-tui --tmux=no --skills=yes
706
+ pnpm dlx thoth-agents install --no-tui --tmux=no
548
707
  pnpm dlx thoth-agents install --dry-run
549
708
  pnpm dlx thoth-agents install --reset
550
709
  pnpm dlx thoth-agents generate --harness=codex --dry-run
@@ -589,7 +748,8 @@ function defaultModelRoles(harness) {
589
748
  }
590
749
  return ALL_AGENT_NAMES.map((role) => ({
591
750
  role,
592
- model: DEFAULT_MODELS[role] ?? "openai/gpt-5.4"
751
+ model: getDefaultOpenCodeModel(role),
752
+ effort: { kind: "effort", value: getDefaultOpenCodeVariant(role) }
593
753
  }));
594
754
  }
595
755
  function resolveCliModelRoles(harness, roles, resolution) {
@@ -891,8 +1051,6 @@ function parseInstallArgs(args) {
891
1051
  result.tui = false;
892
1052
  } else if (arg.startsWith("--tmux=")) {
893
1053
  result.tmux = parseBooleanArg("--tmux", arg.split("=")[1] ?? "");
894
- } else if (arg.startsWith("--skills=")) {
895
- result.skills = parseBooleanArg("--skills", arg.split("=")[1] ?? "");
896
1054
  } else if (arg === "--dry-run") {
897
1055
  result.dryRun = true;
898
1056
  } else if (arg === "--reset") {
@@ -907,6 +1065,8 @@ function parseInstallArgs(args) {
907
1065
  result.agent = agent;
908
1066
  } else if (arg === "-h" || arg === "--help") {
909
1067
  throw new Error("help");
1068
+ } else {
1069
+ throw new Error(`Unsupported install option: ${arg}`);
910
1070
  }
911
1071
  }
912
1072
  return result;
@@ -1,3 +1,7 @@
1
+ import { type ThothMemSetupOptions, type ThothMemSetupResult } from './thoth-mem-install';
1
2
  import type { InstallArgs, InstallConfig } from './types';
3
+ export interface InstallDependencies {
4
+ runThothMemSetup?: (options: ThothMemSetupOptions) => ThothMemSetupResult;
5
+ }
2
6
  export declare function createInstallConfig(args: InstallArgs): InstallConfig;
3
- export declare function install(args: InstallArgs): Promise<number>;
7
+ export declare function install(args: InstallArgs, dependencies?: InstallDependencies): Promise<number>;
@@ -11,8 +11,8 @@ export declare const modelsDevCacheSchema: z.ZodObject<{
11
11
  provider: z.ZodString;
12
12
  efforts: z.ZodArray<z.ZodString>;
13
13
  source: z.ZodEnum<{
14
- manual: "manual";
15
14
  remote: "remote";
15
+ manual: "manual";
16
16
  lkg: "lkg";
17
17
  }>;
18
18
  }, z.core.$loose>>;
@@ -1,9 +1,12 @@
1
+ import type { ProviderEvidenceInput } from '../../harness/types';
2
+ import { type ClaudeCommandExecutor } from '../claude-code-install';
1
3
  import type { ClaudeCodeInstallScope } from '../claude-code-paths';
2
4
  import type { HarnessAction, HarnessStatusReport, ModelConfigInput, ModelRoleInput, OperationApplyResult, OperationContext, OperationPlan } from './types';
3
5
  export interface ClaudeCodeOperationContext extends OperationContext {
4
6
  scope?: ClaudeCodeInstallScope;
5
7
  homeDir?: string;
6
8
  packageRoot?: string;
9
+ commandExecutor?: ClaudeCommandExecutor;
7
10
  }
8
11
  export type ClaudeCodeEffortResolution = {
9
12
  ok: true;
@@ -18,13 +21,13 @@ export declare const claudeCodeOperationAdapter: {
18
21
  readonly id: "claude";
19
22
  readonly displayName: "Claude Code";
20
23
  readonly available: true;
21
- readonly description: "Claude Code plugin package and managed subagent surfaces.";
24
+ readonly description: "Native Claude Code marketplace plugin and required skills.";
22
25
  readonly actions: HarnessAction[];
23
26
  };
24
- export declare function getClaudeCodeStatus(context?: ClaudeCodeOperationContext): HarnessStatusReport;
27
+ export declare function getClaudeCodeStatus(context?: ClaudeCodeOperationContext, evidence?: ProviderEvidenceInput): HarnessStatusReport;
25
28
  export declare function buildClaudeCodeInstallPlan(context?: ClaudeCodeOperationContext): OperationPlan;
26
29
  export declare function buildClaudeCodeUpdatePlan(context?: ClaudeCodeOperationContext): OperationPlan;
27
30
  export declare function buildClaudeCodeSyncPlan(context?: ClaudeCodeOperationContext): OperationPlan;
28
- export declare function buildClaudeCodeModelPlan(input: ModelConfigInput, context?: ClaudeCodeOperationContext): OperationPlan;
31
+ export declare function buildClaudeCodeModelPlan(input: ModelConfigInput, _context?: ClaudeCodeOperationContext): OperationPlan;
29
32
  export declare function applyClaudeCodePlan(plan: OperationPlan): OperationApplyResult;
30
33
  export declare function defaultClaudeCodeModelRoles(): ModelRoleInput[];
@@ -1,3 +1,4 @@
1
+ import type { ProviderEvidenceInput } from '../../harness/types';
1
2
  import type { CodexInstallScope } from '../codex-paths';
2
3
  import type { HarnessAction, HarnessStatusReport, ModelConfigInput, ModelRoleInput, OperationApplyResult, OperationContext, OperationPlan } from './types';
3
4
  export interface CodexOperationContext extends OperationContext {
@@ -14,7 +15,7 @@ export declare const codexOperationAdapter: {
14
15
  readonly description: "Codex agent-pack and managed subagent surfaces.";
15
16
  readonly actions: HarnessAction[];
16
17
  };
17
- export declare function getCodexStatus(context?: CodexOperationContext): HarnessStatusReport;
18
+ export declare function getCodexStatus(context?: CodexOperationContext, evidence?: ProviderEvidenceInput): HarnessStatusReport;
18
19
  export declare function buildCodexUpdatePlan(context?: CodexOperationContext): OperationPlan;
19
20
  export declare function buildCodexSyncPlan(context?: CodexOperationContext): OperationPlan;
20
21
  export declare function buildCodexInstallPlan(context?: CodexOperationContext): OperationPlan;
@@ -1,3 +1,4 @@
1
+ import type { ProviderEvidenceInput } from '../../harness/types';
1
2
  import type { HarnessAction, HarnessStatusReport, ModelConfigInput, OperationApplyResult, OperationContext, OperationPlan } from './types';
2
3
  export declare const opencodeOperationAdapter: {
3
4
  readonly id: "opencode";
@@ -6,7 +7,7 @@ export declare const opencodeOperationAdapter: {
6
7
  readonly description: "OpenCode plugin and configuration surfaces.";
7
8
  readonly actions: HarnessAction[];
8
9
  };
9
- export declare function getOpenCodeStatus(context?: OperationContext): HarnessStatusReport;
10
+ export declare function getOpenCodeStatus(context?: OperationContext, evidence?: ProviderEvidenceInput): HarnessStatusReport;
10
11
  export declare function buildOpenCodeUpdatePlan(_context?: OperationContext): OperationPlan;
11
12
  export declare function buildOpenCodeSyncPlan(_context?: OperationContext): OperationPlan;
12
13
  export declare function buildOpenCodeInstallPlan(_context?: OperationContext): OperationPlan;
@@ -1,4 +1,4 @@
1
- import type { HarnessId } from '../../harness/types';
1
+ import type { HarnessId, ProviderCapabilityEvidence, ProviderEvidenceInput } from '../../harness/types';
2
2
  import type { EffortSelection } from '../model-effort';
3
3
  export type ManagedState = 'installed' | 'missing' | 'drift' | 'outdated' | 'unknown';
4
4
  export type OperationActionKind = 'status' | 'list' | 'install' | 'update' | 'sync' | 'repair' | 'model-config';
@@ -53,8 +53,16 @@ export interface HarnessStatusReport {
53
53
  targets: ManagedTarget[];
54
54
  diagnostics: OperationWarning[];
55
55
  actions: HarnessAction[];
56
+ /** Ephemeral provider evidence, kept separate from consumer-managed state. */
57
+ providerCapability?: ProviderCapabilityEvidence;
56
58
  disclaimers?: OperationDisclaimer[];
57
59
  }
60
+ /**
61
+ * Classifies only evidence explicitly supplied by the caller. This function is
62
+ * intentionally pure: it performs no discovery, probing, persistence, setup,
63
+ * health checking, acquisition, migration, or fallback.
64
+ */
65
+ export declare function classifyProviderCapabilityEvidence(input?: ProviderEvidenceInput): ProviderCapabilityEvidence;
58
66
  export type BackupStrategy = 'none' | 'managed-backup-file' | 'existing-helper' | 'external';
59
67
  export interface BackupExpectation {
60
68
  required: boolean;
@@ -0,0 +1 @@
1
+ export declare function findPackageRoot(startDir: string): string | null;