@otto-assistant/otto 0.1.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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +257 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +264 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +202 -0
- package/dist/config.test.js.map +1 -0
- package/dist/detect.d.ts +9 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +40 -0
- package/dist/detect.js.map +1 -0
- package/dist/detect.test.d.ts +2 -0
- package/dist/detect.test.d.ts.map +1 -0
- package/dist/detect.test.js +25 -0
- package/dist/detect.test.js.map +1 -0
- package/dist/health.d.ts +27 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +78 -0
- package/dist/health.js.map +1 -0
- package/dist/health.test.d.ts +2 -0
- package/dist/health.test.d.ts.map +1 -0
- package/dist/health.test.js +33 -0
- package/dist/health.test.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +8 -0
- package/dist/index.test.js.map +1 -0
- package/dist/installer.d.ts +10 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +50 -0
- package/dist/installer.js.map +1 -0
- package/dist/installer.test.d.ts +2 -0
- package/dist/installer.test.d.ts.map +1 -0
- package/dist/installer.test.js +43 -0
- package/dist/installer.test.js.map +1 -0
- package/dist/lifecycle.d.ts +4 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +30 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/lifecycle.test.d.ts +2 -0
- package/dist/lifecycle.test.d.ts.map +1 -0
- package/dist/lifecycle.test.js +19 -0
- package/dist/lifecycle.test.js.map +1 -0
- package/dist/manifest.d.ts +18 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +30 -0
- package/dist/manifest.js.map +1 -0
- package/dist/sync.d.ts +10 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +39 -0
- package/dist/sync.js.map +1 -0
- package/package.json +41 -0
- package/src/cli.ts +291 -0
- package/src/config.test.ts +237 -0
- package/src/config.ts +362 -0
- package/src/detect.test.ts +28 -0
- package/src/detect.ts +52 -0
- package/src/health.test.ts +39 -0
- package/src/health.ts +114 -0
- package/src/index.test.ts +8 -0
- package/src/index.ts +28 -0
- package/src/installer.test.ts +52 -0
- package/src/installer.ts +62 -0
- package/src/lifecycle.test.ts +22 -0
- package/src/lifecycle.ts +30 -0
- package/src/manifest.ts +42 -0
- package/src/sync.ts +53 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { MANIFEST } from "./manifest.js";
|
|
3
|
+
import { getInstalledVersion } from "./detect.js";
|
|
4
|
+
import { readOpenCodeConfigState, writeOpenCodeConfig, ensureAgentMemoryConfig, ensureSubagentThreadSkill, mergePlugins, readOttoConfig, writeOttoConfig, buildSubagentThreadPolicy, mergeAgentPrompts, } from "./config.js";
|
|
5
|
+
import { installMissingPackages, upgradePackage, planStableUpgrades } from "./installer.js";
|
|
6
|
+
import { hasKimakiBinary, restartKimaki } from "./lifecycle.js";
|
|
7
|
+
import { checkPackagePresence, checkConfigHealth, checkDirectoryHealth } from "./health.js";
|
|
8
|
+
import { syncUpstreams } from "./sync.js";
|
|
9
|
+
const args = process.argv.slice(2);
|
|
10
|
+
const command = args[0] ?? "";
|
|
11
|
+
const subCommand = args[1] ?? "";
|
|
12
|
+
function mergeOttoManagedConfig(config) {
|
|
13
|
+
let merged = config;
|
|
14
|
+
for (const plugin of MANIFEST.plugins) {
|
|
15
|
+
merged = mergePlugins(merged, plugin);
|
|
16
|
+
}
|
|
17
|
+
// Read Otto's own config from otto.json (NOT from opencode.json)
|
|
18
|
+
const ottoConfig = readOttoConfig();
|
|
19
|
+
merged = mergeAgentPrompts(merged, buildSubagentThreadPolicy(ottoConfig));
|
|
20
|
+
return merged;
|
|
21
|
+
}
|
|
22
|
+
async function cmdInstall() {
|
|
23
|
+
console.log("Otto install — conservative mode\n");
|
|
24
|
+
// 1. Install missing global npm packages (CLI tools only)
|
|
25
|
+
const installed = installMissingPackages(getInstalledVersion);
|
|
26
|
+
if (installed.length > 0) {
|
|
27
|
+
console.log(`Installed: ${installed.join(", ")}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log("All packages already installed.");
|
|
31
|
+
}
|
|
32
|
+
// 2. Merge plugins + Otto policy into opencode.json
|
|
33
|
+
let configChanged = false;
|
|
34
|
+
const { config, status } = readOpenCodeConfigState();
|
|
35
|
+
if (status === "invalid") {
|
|
36
|
+
console.error("Error: opencode.json exists but is not valid JSON. Fix the file, then run otto again.");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// 2a. Ensure otto.json exists with defaults
|
|
40
|
+
const ottoConfig = readOttoConfig();
|
|
41
|
+
const ottoConfigChanged = writeOttoConfig(ottoConfig);
|
|
42
|
+
// 2b. Merge plugins + policy into opencode.json (NO otto key!)
|
|
43
|
+
const merged = mergeOttoManagedConfig(config);
|
|
44
|
+
configChanged = writeOpenCodeConfig(merged) || configChanged;
|
|
45
|
+
if (configChanged) {
|
|
46
|
+
console.log(`Updated opencode.json — added plugins: ${MANIFEST.plugins.join(", ")} + otto subagent policy`);
|
|
47
|
+
}
|
|
48
|
+
if (ottoConfigChanged) {
|
|
49
|
+
console.log("Created otto.json with defaults");
|
|
50
|
+
}
|
|
51
|
+
// 3. Ensure agent-memory.json exists
|
|
52
|
+
const created = ensureAgentMemoryConfig();
|
|
53
|
+
if (created) {
|
|
54
|
+
console.log("Created agent-memory.json with defaults");
|
|
55
|
+
}
|
|
56
|
+
// 4. Ensure otto-subagent-threads skill exists
|
|
57
|
+
const skillCreated = ensureSubagentThreadSkill();
|
|
58
|
+
if (skillCreated) {
|
|
59
|
+
console.log("Created otto-subagent-threads skill");
|
|
60
|
+
}
|
|
61
|
+
// 5. Restart kimaki if needed — but NOT if running inside kimaki
|
|
62
|
+
// (kimaki restart kills the current opencode session)
|
|
63
|
+
const runningInsideKimaki = !!process.env.KIMAKI;
|
|
64
|
+
if (configChanged || installed.length > 0) {
|
|
65
|
+
if (runningInsideKimaki) {
|
|
66
|
+
console.log("\n⚠ Changes require kimaki restart. Run `kimaki restart` manually when ready.");
|
|
67
|
+
}
|
|
68
|
+
else if (hasKimakiBinary()) {
|
|
69
|
+
console.log("Restarting kimaki...");
|
|
70
|
+
try {
|
|
71
|
+
restartKimaki();
|
|
72
|
+
console.log("Kimaki restarted.");
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
76
|
+
console.error(`Warning: could not restart kimaki: ${msg}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
console.log("\nDone!");
|
|
81
|
+
}
|
|
82
|
+
async function cmdUpgrade(mode) {
|
|
83
|
+
console.log(`Otto upgrade — mode: ${mode}\n`);
|
|
84
|
+
const packageNames = Object.keys(MANIFEST.packages);
|
|
85
|
+
let didUpgradePackages = false;
|
|
86
|
+
if (mode === "stable") {
|
|
87
|
+
const upgradePlan = planStableUpgrades(packageNames, getInstalledVersion, MANIFEST.pinned);
|
|
88
|
+
if (upgradePlan.length === 0) {
|
|
89
|
+
console.log("Nothing to upgrade — already at pinned stable versions.");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log("Will upgrade:");
|
|
93
|
+
for (const { name, current, target } of upgradePlan) {
|
|
94
|
+
console.log(` ${name}: ${current ?? "not installed"} → ${target}`);
|
|
95
|
+
}
|
|
96
|
+
for (const { name } of upgradePlan) {
|
|
97
|
+
console.log(`Upgrading ${name}...`);
|
|
98
|
+
upgradePackage(name, mode);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
didUpgradePackages = upgradePlan.length > 0;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log("Will upgrade:");
|
|
105
|
+
for (const name of packageNames) {
|
|
106
|
+
const current = getInstalledVersion(name);
|
|
107
|
+
console.log(` ${name}: ${current ?? "not installed"} → latest`);
|
|
108
|
+
}
|
|
109
|
+
for (const name of packageNames) {
|
|
110
|
+
console.log(`Upgrading ${name}...`);
|
|
111
|
+
upgradePackage(name, mode);
|
|
112
|
+
}
|
|
113
|
+
didUpgradePackages = packageNames.length > 0;
|
|
114
|
+
}
|
|
115
|
+
// Ensure plugins + Otto policy are in config
|
|
116
|
+
const { config, status } = readOpenCodeConfigState();
|
|
117
|
+
if (status === "invalid") {
|
|
118
|
+
console.error("Error: opencode.json exists but is not valid JSON. Fix the file, then run otto again.");
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// Ensure otto.json exists
|
|
122
|
+
const ottoConfig = readOttoConfig();
|
|
123
|
+
writeOttoConfig(ottoConfig);
|
|
124
|
+
const merged = mergeOttoManagedConfig(config);
|
|
125
|
+
const configChanged = writeOpenCodeConfig(merged);
|
|
126
|
+
// Ensure skill file is up to date
|
|
127
|
+
ensureSubagentThreadSkill();
|
|
128
|
+
// Restart — but NOT inside kimaki session
|
|
129
|
+
// Only restart if anything actually changed.
|
|
130
|
+
const runningInsideKimaki = !!process.env.KIMAKI;
|
|
131
|
+
if (didUpgradePackages || configChanged) {
|
|
132
|
+
if (runningInsideKimaki) {
|
|
133
|
+
console.log("\n⚠ Changes require kimaki restart. Run `kimaki restart` manually when ready.");
|
|
134
|
+
}
|
|
135
|
+
else if (hasKimakiBinary()) {
|
|
136
|
+
console.log("Restarting kimaki...");
|
|
137
|
+
try {
|
|
138
|
+
restartKimaki();
|
|
139
|
+
console.log("Kimaki restarted.");
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
143
|
+
console.error(`Warning: could not restart kimaki: ${msg}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
console.log("\nDone!");
|
|
148
|
+
}
|
|
149
|
+
async function cmdStatus() {
|
|
150
|
+
console.log("Otto status\n");
|
|
151
|
+
console.log(`Otto version: ${MANIFEST.version}\n`);
|
|
152
|
+
console.log("Packages:");
|
|
153
|
+
const packages = checkPackagePresence();
|
|
154
|
+
for (const pkg of packages) {
|
|
155
|
+
const icon = pkg.status === "ok" ? "✓" : "✗";
|
|
156
|
+
console.log(` ${icon} ${pkg.name}: ${pkg.installed ?? "not installed"} (requires ${pkg.required})`);
|
|
157
|
+
}
|
|
158
|
+
console.log("\nConfig:");
|
|
159
|
+
const configHealth = checkConfigHealth();
|
|
160
|
+
console.log(` opencode.json: ${configHealth.opencodeJson}`);
|
|
161
|
+
console.log(` agent-memory.json: ${configHealth.agentMemoryJson}`);
|
|
162
|
+
console.log(` otto.json: ${configHealth.ottoJson}`);
|
|
163
|
+
console.log(` plugins: ${configHealth.plugins.length > 0 ? configHealth.plugins.join(", ") : "(none)"}`);
|
|
164
|
+
console.log(` memory plugin: ${configHealth.memoryPluginEnabled ? "enabled" : "NOT enabled"}`);
|
|
165
|
+
console.log(` subagent threads: ${configHealth.subagentThreadsEnabled ? "enabled" : "disabled"}`);
|
|
166
|
+
console.log(` ask before thread delete: ${configHealth.subagentThreadsAskBeforeDelete ? "yes" : "no"}`);
|
|
167
|
+
console.log(` auto delete thread on complete: ${configHealth.subagentThreadsAutoDelete ? "yes" : "no"}`);
|
|
168
|
+
console.log(` kimaki process: ${configHealth.kimakiRunning ? "running" : "not running"}`);
|
|
169
|
+
}
|
|
170
|
+
async function cmdDoctor() {
|
|
171
|
+
console.log("Otto doctor\n");
|
|
172
|
+
let hasErrors = false;
|
|
173
|
+
console.log("Checking packages...");
|
|
174
|
+
const packages = checkPackagePresence();
|
|
175
|
+
for (const pkg of packages) {
|
|
176
|
+
if (pkg.status === "missing") {
|
|
177
|
+
console.log(` ✗ ${pkg.name} — not installed (requires ${pkg.required})`);
|
|
178
|
+
hasErrors = true;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(` ✓ ${pkg.name}: ${pkg.installed}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
console.log("\nChecking config...");
|
|
185
|
+
const configHealth = checkConfigHealth();
|
|
186
|
+
if (configHealth.opencodeJson === "error") {
|
|
187
|
+
console.log(" ✗ opencode.json is not valid JSON — fix syntax, then run `otto install`");
|
|
188
|
+
hasErrors = true;
|
|
189
|
+
}
|
|
190
|
+
if (configHealth.memoryPluginEnabled) {
|
|
191
|
+
console.log(" ✓ opencode-agent-memory plugin enabled");
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
console.log(" ✗ opencode-agent-memory plugin NOT enabled — run `otto install`");
|
|
195
|
+
hasErrors = true;
|
|
196
|
+
}
|
|
197
|
+
if (configHealth.subagentPolicyInjected) {
|
|
198
|
+
console.log(" ✓ otto subagent thread policy injected");
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.log(" ✗ otto subagent thread policy missing — run `otto install`");
|
|
202
|
+
hasErrors = true;
|
|
203
|
+
}
|
|
204
|
+
if (configHealth.kimakiRunning) {
|
|
205
|
+
console.log(" ✓ kimaki is running");
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
console.log(" ⚠ kimaki is not running");
|
|
209
|
+
}
|
|
210
|
+
console.log("\nChecking directories...");
|
|
211
|
+
const dirs = checkDirectoryHealth();
|
|
212
|
+
for (const d of dirs) {
|
|
213
|
+
const icon = d.status === "ok" ? "✓" : d.status === "warn" ? "⚠" : "✗";
|
|
214
|
+
console.log(` ${icon} ${d.name}: ${d.message}`);
|
|
215
|
+
if (d.status === "error")
|
|
216
|
+
hasErrors = true;
|
|
217
|
+
}
|
|
218
|
+
console.log(hasErrors ? "\n✗ Issues found. Run `otto install` to fix." : "\n✓ All checks passed!");
|
|
219
|
+
}
|
|
220
|
+
async function main() {
|
|
221
|
+
switch (command) {
|
|
222
|
+
case "install":
|
|
223
|
+
await cmdInstall();
|
|
224
|
+
break;
|
|
225
|
+
case "upgrade":
|
|
226
|
+
await cmdUpgrade(subCommand === "latest" ? "latest" : "stable");
|
|
227
|
+
break;
|
|
228
|
+
case "status":
|
|
229
|
+
await cmdStatus();
|
|
230
|
+
break;
|
|
231
|
+
case "doctor":
|
|
232
|
+
await cmdDoctor();
|
|
233
|
+
break;
|
|
234
|
+
case "sync":
|
|
235
|
+
await syncUpstreams();
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
console.log(`Otto — terminal UI distribution for opencode + kimaki + opencode-agent-memory
|
|
239
|
+
|
|
240
|
+
Usage:
|
|
241
|
+
otto install Install missing packages + configure
|
|
242
|
+
otto upgrade Upgrade to stable (manifest-pinned) versions
|
|
243
|
+
otto upgrade stable Upgrade to manifest-pinned versions
|
|
244
|
+
otto upgrade latest Upgrade to npm latest versions
|
|
245
|
+
otto status Show installed versions + config health
|
|
246
|
+
otto doctor Validate all integration points
|
|
247
|
+
otto sync Trigger upstream sync for all forked repos
|
|
248
|
+
`);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
main().catch((err) => {
|
|
253
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
254
|
+
console.error(`Error: ${msg}`);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface OttoSubagentThreads {
|
|
2
|
+
enabled?: boolean;
|
|
3
|
+
askBeforeDelete?: boolean;
|
|
4
|
+
autoDeleteOnComplete?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface OttoConfig {
|
|
7
|
+
subagentThreads: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
askBeforeDelete: boolean;
|
|
10
|
+
autoDeleteOnComplete: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Defaults used when otto.json is missing or partial. */
|
|
14
|
+
export declare const OTTO_DEFAULTS: OttoConfig;
|
|
15
|
+
export interface OpenCodeConfig {
|
|
16
|
+
$schema?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
plugin?: string[];
|
|
19
|
+
provider?: Record<string, unknown>;
|
|
20
|
+
agent?: Record<string, unknown>;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export declare function mergePlugins(config: OpenCodeConfig, pluginToAdd: string): OpenCodeConfig;
|
|
24
|
+
export type OttoConfigReadStatus = "missing" | "ok" | "invalid";
|
|
25
|
+
export declare function readOttoConfig(dir?: string): OttoConfig;
|
|
26
|
+
export declare function writeOttoConfig(config: OttoConfig, dir?: string): boolean;
|
|
27
|
+
export declare function buildSubagentThreadPolicy(ottoConfig: OttoConfig): string;
|
|
28
|
+
export declare function mergeAgentPrompts(config: OpenCodeConfig, policyText: string): OpenCodeConfig;
|
|
29
|
+
export type OpenCodeConfigReadStatus = "missing" | "ok" | "invalid";
|
|
30
|
+
/** Distinguishes a missing file from invalid JSON (both previously surfaced as `{}`). */
|
|
31
|
+
export declare function readOpenCodeConfigState(dir?: string): {
|
|
32
|
+
config: OpenCodeConfig;
|
|
33
|
+
status: OpenCodeConfigReadStatus;
|
|
34
|
+
};
|
|
35
|
+
export declare function readOpenCodeConfig(dir?: string): OpenCodeConfig;
|
|
36
|
+
export declare function writeOpenCodeConfig(config: OpenCodeConfig, dir?: string): boolean;
|
|
37
|
+
export declare function ensureAgentMemoryConfig(dir?: string): boolean;
|
|
38
|
+
export declare function ensureSubagentThreadSkill(dir?: string): boolean;
|
|
39
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE;QACf,OAAO,EAAE,OAAO,CAAA;QAChB,eAAe,EAAE,OAAO,CAAA;QACxB,oBAAoB,EAAE,OAAO,CAAA;KAC9B,CAAA;CACF;AAED,0DAA0D;AAC1D,eAAO,MAAM,aAAa,EAAE,UAM3B,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAMxF;AAOD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAA;AAE/D,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAgBvD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBzE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAsExE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAgC5F;AAED,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAA;AAEnE,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG;IACrD,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,wBAAwB,CAAA;CACjC,CAYA;AAED,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBjF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CA2B7D;AA4ED,wBAAgB,yBAAyB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAiB/D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { OPENCODE_CONFIG_DIR } from "./manifest.js";
|
|
4
|
+
/** Defaults used when otto.json is missing or partial. */
|
|
5
|
+
export const OTTO_DEFAULTS = {
|
|
6
|
+
subagentThreads: {
|
|
7
|
+
enabled: true,
|
|
8
|
+
askBeforeDelete: true,
|
|
9
|
+
autoDeleteOnComplete: false,
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
export function mergePlugins(config, pluginToAdd) {
|
|
13
|
+
const plugins = config.plugin ?? [];
|
|
14
|
+
if (plugins.includes(pluginToAdd)) {
|
|
15
|
+
return config;
|
|
16
|
+
}
|
|
17
|
+
return { ...config, plugin: [...plugins, pluginToAdd] };
|
|
18
|
+
}
|
|
19
|
+
export function readOttoConfig(dir) {
|
|
20
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
21
|
+
const configPath = path.join(configDir, "otto.json");
|
|
22
|
+
try {
|
|
23
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
return {
|
|
26
|
+
subagentThreads: {
|
|
27
|
+
enabled: parsed.subagentThreads?.enabled ?? OTTO_DEFAULTS.subagentThreads.enabled,
|
|
28
|
+
askBeforeDelete: parsed.subagentThreads?.askBeforeDelete ?? OTTO_DEFAULTS.subagentThreads.askBeforeDelete,
|
|
29
|
+
autoDeleteOnComplete: parsed.subagentThreads?.autoDeleteOnComplete ?? OTTO_DEFAULTS.subagentThreads.autoDeleteOnComplete,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return { ...OTTO_DEFAULTS };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function writeOttoConfig(config, dir) {
|
|
38
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
39
|
+
const configPath = path.join(configDir, "otto.json");
|
|
40
|
+
let existing = null;
|
|
41
|
+
try {
|
|
42
|
+
existing = fs.readFileSync(configPath, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// file doesn't exist
|
|
46
|
+
}
|
|
47
|
+
const newContent = JSON.stringify(config, null, 2) + "\n";
|
|
48
|
+
if (existing === newContent) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
52
|
+
fs.writeFileSync(configPath, newContent, "utf-8");
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
export function buildSubagentThreadPolicy(ottoConfig) {
|
|
56
|
+
const policy = ottoConfig.subagentThreads;
|
|
57
|
+
const enabled = policy.enabled;
|
|
58
|
+
const askBeforeDelete = policy.askBeforeDelete;
|
|
59
|
+
const autoDeleteOnComplete = policy.autoDeleteOnComplete;
|
|
60
|
+
const lines = [
|
|
61
|
+
"Otto subagent policy (must follow):",
|
|
62
|
+
`- subagent_threads_enabled: ${enabled}`,
|
|
63
|
+
`- subagent_threads_ask_before_delete: ${askBeforeDelete}`,
|
|
64
|
+
`- subagent_threads_auto_delete_on_complete: ${autoDeleteOnComplete}`,
|
|
65
|
+
];
|
|
66
|
+
if (!enabled) {
|
|
67
|
+
lines.push("- subagent_threads_enabled is false — you may spawn subagents normally (Task tool or otherwise) without creating Discord threads.");
|
|
68
|
+
return lines.join("\n");
|
|
69
|
+
}
|
|
70
|
+
lines.push("", "## Spawning subagents with Discord threads", "", "When you need to spawn a subagent (parallel task, background investigation, etc.), do NOT use the Task tool directly.", "Instead, create a visible Discord thread using `kimaki send` via Bash:", "", "```bash", 'kimaki send --channel <channel_id> --prompt "detailed task description" --user "<username>"', "```", "", "The channel_id and username are in your system prompt (\"Your current Discord channel ID\" / \"Discord\" user field).", "", "For sequential tasks where you need the result before continuing, use --wait (set Bash timeout to 1_500_000+):", "```bash", 'kimaki send --channel <channel_id> --prompt "task" --user "<username>" --wait', "```", "", "## After subagent completes", "");
|
|
71
|
+
if (autoDeleteOnComplete) {
|
|
72
|
+
lines.push("- subagent_threads_auto_delete_on_complete is true → automatically archive the thread after the subagent finishes:", " ```bash", ' kimaki session archive --session <session_id>', " ```");
|
|
73
|
+
}
|
|
74
|
+
else if (askBeforeDelete) {
|
|
75
|
+
lines.push("- subagent_threads_ask_before_delete is true → after the subagent finishes, ask the user:", ' "Subagent thread created. Should I archive it or keep it open?"', " If user says archive → `kimaki session archive --session <session_id>`");
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
lines.push("- Keep the subagent thread open after completion (no auto-archive, no prompt).");
|
|
79
|
+
}
|
|
80
|
+
lines.push("", "## Required: load skills before subagent execution", "", "Before dispatching any subagent, load the skill: `otto-subagent-threads`.", "This ensures the subagent follows the same thread creation rules if it spawns further subagents.");
|
|
81
|
+
return lines.join("\n");
|
|
82
|
+
}
|
|
83
|
+
export function mergeAgentPrompts(config, policyText) {
|
|
84
|
+
const marker = "Otto subagent policy (must follow):";
|
|
85
|
+
const agent = (config.agent ?? {});
|
|
86
|
+
const entries = Object.entries(agent);
|
|
87
|
+
if (entries.length === 0) {
|
|
88
|
+
return {
|
|
89
|
+
...config,
|
|
90
|
+
agent: {
|
|
91
|
+
build: { prompt: policyText },
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const nextAgent = {};
|
|
96
|
+
for (const [name, value] of entries) {
|
|
97
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
98
|
+
const typed = value;
|
|
99
|
+
const existingPrompt = typeof typed.prompt === "string" ? typed.prompt : "";
|
|
100
|
+
const hasPolicy = existingPrompt.includes(marker);
|
|
101
|
+
nextAgent[name] = {
|
|
102
|
+
...typed,
|
|
103
|
+
prompt: hasPolicy
|
|
104
|
+
? existingPrompt
|
|
105
|
+
: (existingPrompt.length > 0 ? `${existingPrompt}\n\n${policyText}` : policyText),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
nextAgent[name] = value;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { ...config, agent: nextAgent };
|
|
113
|
+
}
|
|
114
|
+
/** Distinguishes a missing file from invalid JSON (both previously surfaced as `{}`). */
|
|
115
|
+
export function readOpenCodeConfigState(dir) {
|
|
116
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
117
|
+
const configPath = path.join(configDir, "opencode.json");
|
|
118
|
+
if (!fs.existsSync(configPath)) {
|
|
119
|
+
return { config: {}, status: "missing" };
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
123
|
+
return { config: JSON.parse(raw), status: "ok" };
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return { config: {}, status: "invalid" };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function readOpenCodeConfig(dir) {
|
|
130
|
+
return readOpenCodeConfigState(dir).config;
|
|
131
|
+
}
|
|
132
|
+
export function writeOpenCodeConfig(config, dir) {
|
|
133
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
134
|
+
const configPath = path.join(configDir, "opencode.json");
|
|
135
|
+
let existing = null;
|
|
136
|
+
try {
|
|
137
|
+
existing = fs.readFileSync(configPath, "utf-8");
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// file doesn't exist
|
|
141
|
+
}
|
|
142
|
+
const newContent = JSON.stringify(config, null, 2) + "\n";
|
|
143
|
+
if (existing === newContent) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
147
|
+
fs.writeFileSync(configPath, newContent, "utf-8");
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
export function ensureAgentMemoryConfig(dir) {
|
|
151
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
152
|
+
const configPath = path.join(configDir, "agent-memory.json");
|
|
153
|
+
try {
|
|
154
|
+
fs.readFileSync(configPath, "utf-8");
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// create with defaults
|
|
159
|
+
}
|
|
160
|
+
const defaults = {
|
|
161
|
+
journal: {
|
|
162
|
+
enabled: true,
|
|
163
|
+
tags: [
|
|
164
|
+
{ name: "infra", description: "Infrastructure changes, host/service topology, runtime environment" },
|
|
165
|
+
{ name: "debugging", description: "Bug investigations, root-cause analysis, and troubleshooting" },
|
|
166
|
+
{ name: "decision", description: "Architecture and implementation decisions with rationale" },
|
|
167
|
+
{ name: "incident", description: "Service failures, outages, and recovery actions" },
|
|
168
|
+
{ name: "automation", description: "Agent workflows, scripts, and repeatable operational routines" },
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
173
|
+
fs.writeFileSync(configPath, JSON.stringify(defaults, null, 2) + "\n", "utf-8");
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// Skill file: otto-subagent-threads
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
const SKILL_NAME = "otto-subagent-threads";
|
|
180
|
+
const SKILL_MD = `---
|
|
181
|
+
name: otto-subagent-threads
|
|
182
|
+
description: Enforce visible Discord threads for every subagent spawn. Use before dispatching any subagent via kimaki send.
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
# Otto Subagent Threads
|
|
186
|
+
|
|
187
|
+
## When to Use
|
|
188
|
+
|
|
189
|
+
Use this skill EVERY TIME you are about to spawn a subagent (parallel task, background investigation, code review, etc.).
|
|
190
|
+
|
|
191
|
+
## Rules
|
|
192
|
+
|
|
193
|
+
### 1. NEVER use Task tool directly for subagents
|
|
194
|
+
|
|
195
|
+
The Task tool spawns a subagent in "shadow mode" — invisible to the user in Discord.
|
|
196
|
+
Instead, create a visible Discord thread.
|
|
197
|
+
|
|
198
|
+
### 2. Create a Discord thread with kimaki send
|
|
199
|
+
|
|
200
|
+
\`\`\`bash
|
|
201
|
+
kimaki send --channel <channel_id> --prompt "detailed task description" --user "<username>"
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
Get channel_id and username from your system prompt:
|
|
205
|
+
- "Your current Discord channel ID is: ..."
|
|
206
|
+
- Discord user info section
|
|
207
|
+
|
|
208
|
+
### 3. Wait for result if needed
|
|
209
|
+
|
|
210
|
+
If you need the subagent's output before continuing, add \`--wait\` and set Bash timeout to 1_500_000+:
|
|
211
|
+
|
|
212
|
+
\`\`\`bash
|
|
213
|
+
kimaki send --channel <channel_id> --prompt "task" --user "<username>" --wait
|
|
214
|
+
\`\`\`
|
|
215
|
+
|
|
216
|
+
### 4. After subagent completes
|
|
217
|
+
|
|
218
|
+
Check the otto.subagentThreads config:
|
|
219
|
+
- **autoDeleteOnComplete = true** → archive the thread:
|
|
220
|
+
\`\`\`bash
|
|
221
|
+
kimaki session archive --session <session_id>
|
|
222
|
+
\`\`\`
|
|
223
|
+
- **askBeforeDelete = true** → ask the user:
|
|
224
|
+
"Subagent finished. Should I archive the thread or keep it open?"
|
|
225
|
+
- **both false** → keep the thread open.
|
|
226
|
+
|
|
227
|
+
### 5. Nested subagents
|
|
228
|
+
|
|
229
|
+
If your subagent itself needs to spawn further subagents, include these same rules in its prompt so it also creates visible threads.
|
|
230
|
+
|
|
231
|
+
## Quick Reference
|
|
232
|
+
|
|
233
|
+
| Scenario | Command |
|
|
234
|
+
|----------|---------|
|
|
235
|
+
| Parallel task (fire & forget) | \`kimaki send -c <ch> -p "task" -u <user>\` |
|
|
236
|
+
| Sequential task (need result) | \`kimaki send -c <ch> -p "task" -u <user> --wait\` |
|
|
237
|
+
| Archive thread | \`kimaki session archive -s <session_id>\` |
|
|
238
|
+
| List sessions | \`kimaki session list\` |
|
|
239
|
+
| Read session output | \`kimaki session read <session_id> > ./tmp/session.md 2>/dev/null\` |
|
|
240
|
+
|
|
241
|
+
## Anti-patterns
|
|
242
|
+
|
|
243
|
+
- **DO NOT** use the Task tool to spawn subagents (creates invisible shadow sessions).
|
|
244
|
+
- **DO NOT** create worktrees (\`--worktree\`) unless the user explicitly asks.
|
|
245
|
+
- **DO NOT** forget to include your channel_id in the kimaki send command.
|
|
246
|
+
`;
|
|
247
|
+
export function ensureSubagentThreadSkill(dir) {
|
|
248
|
+
const configDir = dir ?? OPENCODE_CONFIG_DIR();
|
|
249
|
+
const skillDir = path.join(configDir, "skills", SKILL_NAME);
|
|
250
|
+
const skillPath = path.join(skillDir, "SKILL.md");
|
|
251
|
+
try {
|
|
252
|
+
const existing = fs.readFileSync(skillPath, "utf-8");
|
|
253
|
+
if (existing === SKILL_MD) {
|
|
254
|
+
return false; // already up to date
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// file doesn't exist — will create
|
|
259
|
+
}
|
|
260
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
261
|
+
fs.writeFileSync(skillPath, SKILL_MD, "utf-8");
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
|