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.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +21 -0
- package/README.md +301 -311
- package/dist/agents/configured-role-prompt.d.ts +9 -0
- package/dist/agents/prompt-sections.d.ts +8 -4
- package/dist/agents/prompt-utils.d.ts +0 -4
- package/dist/{chunk-ASKXWU6E.js → chunk-2MZ5C2RN.js} +1078 -1725
- package/dist/chunk-XO74DXBZ.js +1781 -0
- package/dist/{chunk-6BNAV534.js → chunk-YUCGIJPP.js} +12 -30
- package/dist/cli/claude-code-install.d.ts +24 -26
- package/dist/cli/claude-code-paths.d.ts +0 -28
- package/dist/cli/codex-install.d.ts +2 -2
- package/dist/cli/codex-paths.d.ts +0 -2
- package/dist/cli/index.js +279 -119
- package/dist/cli/install.d.ts +5 -1
- package/dist/cli/model-catalog/cache.d.ts +1 -1
- package/dist/cli/operations/claude-code.d.ts +6 -3
- package/dist/cli/operations/codex.d.ts +2 -1
- package/dist/cli/operations/opencode.d.ts +2 -1
- package/dist/cli/operations/types.d.ts +9 -1
- package/dist/cli/package-root.d.ts +1 -0
- package/dist/cli/providers.d.ts +6 -116
- package/dist/cli/skills.d.ts +19 -32
- package/dist/cli/thoth-mem-install.d.ts +45 -0
- package/dist/cli/tui/components/StatusView.d.ts +12 -1
- package/dist/cli/tui/index.js +256 -142
- package/dist/cli/tui/operations.d.ts +4 -3
- package/dist/cli/types.d.ts +0 -10
- package/dist/config/constants.d.ts +20 -16
- package/dist/config/index.d.ts +0 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/schema.d.ts +2 -38
- package/dist/config/utils.d.ts +1 -2
- package/dist/harness/adapters/codex-surfaces.d.ts +3 -3
- package/dist/harness/core/agent-pack.d.ts +37 -29
- package/dist/harness/core/memory-governance.d.ts +24 -48
- package/dist/harness/core/sdd.d.ts +364 -131
- package/dist/harness/generate-integration-packages.d.ts +20 -0
- package/dist/harness/opencode-init-command.d.ts +11 -0
- package/dist/harness/types.d.ts +14 -1
- package/dist/harness/writers/claude-code-subagent.d.ts +3 -1
- package/dist/hooks/index.d.ts +0 -5
- package/dist/index.js +562 -1314
- package/dist/mcp/index.d.ts +1 -2
- package/package.json +17 -12
- package/plugin/.claude-plugin/.thoth-agents-plugin-assets.json +50 -0
- package/plugin/.claude-plugin/plugin.json +8 -0
- package/plugin/.codex-plugin/.thoth-agents-plugin-assets.json +16 -0
- package/plugin/.codex-plugin/plugin.json +7 -0
- package/plugin/.mcp.json +19 -0
- package/plugin/agents/deep.md +89 -0
- package/plugin/agents/designer.md +89 -0
- package/plugin/agents/explorer.md +90 -0
- package/plugin/agents/librarian.md +90 -0
- package/plugin/agents/oracle.md +92 -0
- package/plugin/agents/orchestrator.md +128 -0
- package/plugin/agents/quick.md +89 -0
- package/plugin/codex.mcp.json +17 -0
- package/plugin/settings.json +3 -0
- package/plugin/skills/thoth-archive/SKILL.md +40 -0
- package/plugin/skills/thoth-archive/scripts/archive.mjs +748 -0
- package/plugin/skills/thoth-constitution/SKILL.md +45 -0
- package/plugin/skills/thoth-constitution/scripts/validate.mjs +167 -0
- package/plugin/skills/thoth-constitution/templates/constitution.md +54 -0
- package/plugin/skills/thoth-init/SKILL.md +30 -0
- package/plugin/skills/thoth-init/scripts/init.mjs +141 -0
- package/plugin/skills/thoth-sdd/SKILL.md +83 -0
- package/plugin/skills/thoth-sdd/references/phases/analyze.md +21 -0
- package/plugin/skills/thoth-sdd/references/phases/checklist.md +20 -0
- package/plugin/skills/thoth-sdd/references/phases/clarify.md +15 -0
- package/plugin/skills/thoth-sdd/references/phases/converge.md +14 -0
- package/plugin/skills/thoth-sdd/references/phases/explore.md +10 -0
- package/plugin/skills/thoth-sdd/references/phases/implement.md +19 -0
- package/plugin/skills/thoth-sdd/references/phases/plan.md +15 -0
- package/plugin/skills/thoth-sdd/references/phases/specify.md +21 -0
- package/plugin/skills/thoth-sdd/references/phases/tasks.md +20 -0
- package/plugin/skills/thoth-sdd/references/phases/verify.md +22 -0
- package/plugin/skills/thoth-sdd/scripts/validate.mjs +1117 -0
- package/plugin/skills/thoth-sdd/templates/archive-report.md +25 -0
- package/plugin/skills/thoth-sdd/templates/checklist.md +27 -0
- package/plugin/skills/thoth-sdd/templates/plan.md +38 -0
- package/plugin/skills/thoth-sdd/templates/spec.md +54 -0
- package/plugin/skills/thoth-sdd/templates/tasks.md +29 -0
- package/plugin/skills/thoth-sdd/templates/verify-report.md +28 -0
- package/skills/README.md +12 -0
- package/skills/thoth-archive/SKILL.md +40 -0
- package/skills/thoth-archive/scripts/archive.mjs +748 -0
- package/skills/thoth-constitution/SKILL.md +45 -0
- package/skills/thoth-constitution/scripts/validate.mjs +167 -0
- package/skills/thoth-constitution/templates/constitution.md +54 -0
- package/skills/thoth-init/SKILL.md +30 -0
- package/skills/thoth-init/scripts/init.mjs +141 -0
- package/skills/thoth-sdd/SKILL.md +83 -0
- package/skills/thoth-sdd/references/phases/analyze.md +21 -0
- package/skills/thoth-sdd/references/phases/checklist.md +20 -0
- package/skills/thoth-sdd/references/phases/clarify.md +15 -0
- package/skills/thoth-sdd/references/phases/converge.md +14 -0
- package/skills/thoth-sdd/references/phases/explore.md +10 -0
- package/skills/thoth-sdd/references/phases/implement.md +19 -0
- package/skills/thoth-sdd/references/phases/plan.md +15 -0
- package/skills/thoth-sdd/references/phases/specify.md +21 -0
- package/skills/thoth-sdd/references/phases/tasks.md +20 -0
- package/skills/thoth-sdd/references/phases/verify.md +22 -0
- package/skills/thoth-sdd/scripts/validate.mjs +1117 -0
- package/skills/thoth-sdd/templates/archive-report.md +25 -0
- package/skills/thoth-sdd/templates/checklist.md +27 -0
- package/skills/thoth-sdd/templates/plan.md +38 -0
- package/skills/thoth-sdd/templates/spec.md +54 -0
- package/skills/thoth-sdd/templates/tasks.md +29 -0
- package/skills/thoth-sdd/templates/verify-report.md +28 -0
- package/thoth-agents.schema.json +0 -39
- package/dist/chunk-OZE7JVGS.js +0 -2344
- package/dist/cli/custom-skills.d.ts +0 -49
- package/dist/cli/skill-manifest.d.ts +0 -32
- package/dist/harness/core/skills.d.ts +0 -211
- package/dist/harness/generate-codex-plugin.d.ts +0 -9
- package/dist/harness/writers/claude-code-skill-layout.d.ts +0 -16
- package/dist/harness/writers/fs-skill-collect.d.ts +0 -7
- package/dist/harness/writers/skill-layout.d.ts +0 -16
- package/dist/hooks/chat-headers.d.ts +0 -16
- package/dist/hooks/phase-reminder/index.d.ts +0 -28
- package/dist/hooks/post-read-nudge/index.d.ts +0 -18
- package/dist/hooks/skill-sync.d.ts +0 -10
- package/dist/hooks/thoth-mem/index.d.ts +0 -46
- package/dist/hooks/thoth-mem/protocol.d.ts +0 -7
- package/dist/mcp/thoth.d.ts +0 -3
- package/dist/sdd/artifact-governance/artifact-loader.d.ts +0 -130
- package/dist/sdd/artifact-governance/index.d.ts +0 -6
- package/dist/sdd/artifact-governance/tasks-validator.d.ts +0 -17
- package/dist/sdd/artifact-governance/types.d.ts +0 -52
- package/dist/thoth/client.d.ts +0 -14
- package/dist/thoth/index.d.ts +0 -2
- package/src/skills/_shared/openspec-convention.md +0 -350
- package/src/skills/_shared/persistence-contract.md +0 -163
- package/src/skills/_shared/thoth-mem-convention.md +0 -123
- package/src/skills/executing-plans/SKILL.md +0 -288
- package/src/skills/plan-reviewer/SKILL.md +0 -219
- package/src/skills/requirements-interview/SKILL.md +0 -233
- package/src/skills/sdd-apply/SKILL.md +0 -89
- package/src/skills/sdd-archive/SKILL.md +0 -92
- package/src/skills/sdd-clarify/SKILL.md +0 -105
- package/src/skills/sdd-constitution/SKILL.md +0 -107
- package/src/skills/sdd-design/SKILL.md +0 -155
- package/src/skills/sdd-init/SKILL.md +0 -233
- package/src/skills/sdd-propose/SKILL.md +0 -101
- package/src/skills/sdd-spec/SKILL.md +0 -136
- package/src/skills/sdd-tasks/SKILL.md +0 -232
- package/src/skills/sdd-verify/SKILL.md +0 -131
- 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-
|
|
7
|
+
} from "../chunk-YUCGIJPP.js";
|
|
8
8
|
import {
|
|
9
9
|
CODEX_ROLE_NAMES,
|
|
10
|
-
|
|
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
|
-
|
|
41
|
+
getRequiredSkillInstallCommand,
|
|
42
|
+
installRequiredSkill,
|
|
42
43
|
listOperationHarnesses,
|
|
43
44
|
normalizeEffortSelection
|
|
44
|
-
} from "../chunk-
|
|
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-
|
|
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
|
|
110
|
-
|
|
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-
|
|
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}
|
|
157
|
-
lines.push(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
lines.push(
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
|
450
|
+
const modelsInfo = "Default configuration uses OpenAI models.";
|
|
294
451
|
console.log(`${BOLD}${modelsInfo}${RESET}`);
|
|
295
452
|
console.log(
|
|
296
|
-
` ${DIM}Includes the seven-
|
|
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@
|
|
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-
|
|
530
|
-
|
|
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
|
-
|
|
533
|
-
|
|
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
|
|
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
|
|
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:
|
|
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;
|
package/dist/cli/install.d.ts
CHANGED
|
@@ -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>;
|
|
@@ -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
|
|
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,
|
|
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;
|