@os-eco/overstory-cli 0.6.1
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/LICENSE +21 -0
- package/README.md +381 -0
- package/agents/builder.md +137 -0
- package/agents/coordinator.md +263 -0
- package/agents/lead.md +301 -0
- package/agents/merger.md +160 -0
- package/agents/monitor.md +214 -0
- package/agents/reviewer.md +140 -0
- package/agents/scout.md +119 -0
- package/agents/supervisor.md +423 -0
- package/package.json +47 -0
- package/src/agents/checkpoint.test.ts +88 -0
- package/src/agents/checkpoint.ts +101 -0
- package/src/agents/hooks-deployer.test.ts +2040 -0
- package/src/agents/hooks-deployer.ts +607 -0
- package/src/agents/identity.test.ts +603 -0
- package/src/agents/identity.ts +384 -0
- package/src/agents/lifecycle.test.ts +196 -0
- package/src/agents/lifecycle.ts +183 -0
- package/src/agents/manifest.test.ts +746 -0
- package/src/agents/manifest.ts +354 -0
- package/src/agents/overlay.test.ts +676 -0
- package/src/agents/overlay.ts +308 -0
- package/src/beads/client.test.ts +217 -0
- package/src/beads/client.ts +202 -0
- package/src/beads/molecules.test.ts +338 -0
- package/src/beads/molecules.ts +198 -0
- package/src/commands/agents.test.ts +322 -0
- package/src/commands/agents.ts +287 -0
- package/src/commands/clean.test.ts +670 -0
- package/src/commands/clean.ts +618 -0
- package/src/commands/completions.test.ts +342 -0
- package/src/commands/completions.ts +887 -0
- package/src/commands/coordinator.test.ts +1530 -0
- package/src/commands/coordinator.ts +733 -0
- package/src/commands/costs.test.ts +1119 -0
- package/src/commands/costs.ts +564 -0
- package/src/commands/dashboard.test.ts +308 -0
- package/src/commands/dashboard.ts +838 -0
- package/src/commands/doctor.test.ts +294 -0
- package/src/commands/doctor.ts +213 -0
- package/src/commands/errors.test.ts +647 -0
- package/src/commands/errors.ts +248 -0
- package/src/commands/feed.test.ts +578 -0
- package/src/commands/feed.ts +361 -0
- package/src/commands/group.test.ts +262 -0
- package/src/commands/group.ts +511 -0
- package/src/commands/hooks.test.ts +458 -0
- package/src/commands/hooks.ts +253 -0
- package/src/commands/init.test.ts +347 -0
- package/src/commands/init.ts +650 -0
- package/src/commands/inspect.test.ts +670 -0
- package/src/commands/inspect.ts +431 -0
- package/src/commands/log.test.ts +1454 -0
- package/src/commands/log.ts +724 -0
- package/src/commands/logs.test.ts +379 -0
- package/src/commands/logs.ts +546 -0
- package/src/commands/mail.test.ts +1270 -0
- package/src/commands/mail.ts +771 -0
- package/src/commands/merge.test.ts +670 -0
- package/src/commands/merge.ts +355 -0
- package/src/commands/metrics.test.ts +444 -0
- package/src/commands/metrics.ts +143 -0
- package/src/commands/monitor.test.ts +191 -0
- package/src/commands/monitor.ts +390 -0
- package/src/commands/nudge.test.ts +230 -0
- package/src/commands/nudge.ts +372 -0
- package/src/commands/prime.test.ts +470 -0
- package/src/commands/prime.ts +381 -0
- package/src/commands/replay.test.ts +741 -0
- package/src/commands/replay.ts +360 -0
- package/src/commands/run.test.ts +431 -0
- package/src/commands/run.ts +351 -0
- package/src/commands/sling.test.ts +657 -0
- package/src/commands/sling.ts +661 -0
- package/src/commands/spec.test.ts +203 -0
- package/src/commands/spec.ts +168 -0
- package/src/commands/status.test.ts +430 -0
- package/src/commands/status.ts +398 -0
- package/src/commands/stop.test.ts +420 -0
- package/src/commands/stop.ts +151 -0
- package/src/commands/supervisor.test.ts +187 -0
- package/src/commands/supervisor.ts +535 -0
- package/src/commands/trace.test.ts +745 -0
- package/src/commands/trace.ts +325 -0
- package/src/commands/watch.test.ts +145 -0
- package/src/commands/watch.ts +247 -0
- package/src/commands/worktree.test.ts +786 -0
- package/src/commands/worktree.ts +311 -0
- package/src/config.test.ts +822 -0
- package/src/config.ts +829 -0
- package/src/doctor/agents.test.ts +454 -0
- package/src/doctor/agents.ts +396 -0
- package/src/doctor/config-check.test.ts +190 -0
- package/src/doctor/config-check.ts +183 -0
- package/src/doctor/consistency.test.ts +651 -0
- package/src/doctor/consistency.ts +294 -0
- package/src/doctor/databases.test.ts +290 -0
- package/src/doctor/databases.ts +218 -0
- package/src/doctor/dependencies.test.ts +184 -0
- package/src/doctor/dependencies.ts +175 -0
- package/src/doctor/logs.test.ts +251 -0
- package/src/doctor/logs.ts +295 -0
- package/src/doctor/merge-queue.test.ts +216 -0
- package/src/doctor/merge-queue.ts +144 -0
- package/src/doctor/structure.test.ts +291 -0
- package/src/doctor/structure.ts +198 -0
- package/src/doctor/types.ts +37 -0
- package/src/doctor/version.test.ts +136 -0
- package/src/doctor/version.ts +129 -0
- package/src/e2e/init-sling-lifecycle.test.ts +277 -0
- package/src/errors.ts +217 -0
- package/src/events/store.test.ts +660 -0
- package/src/events/store.ts +369 -0
- package/src/events/tool-filter.test.ts +330 -0
- package/src/events/tool-filter.ts +126 -0
- package/src/index.ts +316 -0
- package/src/insights/analyzer.test.ts +466 -0
- package/src/insights/analyzer.ts +203 -0
- package/src/logging/color.test.ts +142 -0
- package/src/logging/color.ts +71 -0
- package/src/logging/logger.test.ts +813 -0
- package/src/logging/logger.ts +266 -0
- package/src/logging/reporter.test.ts +259 -0
- package/src/logging/reporter.ts +109 -0
- package/src/logging/sanitizer.test.ts +190 -0
- package/src/logging/sanitizer.ts +57 -0
- package/src/mail/broadcast.test.ts +203 -0
- package/src/mail/broadcast.ts +92 -0
- package/src/mail/client.test.ts +773 -0
- package/src/mail/client.ts +223 -0
- package/src/mail/store.test.ts +705 -0
- package/src/mail/store.ts +387 -0
- package/src/merge/queue.test.ts +359 -0
- package/src/merge/queue.ts +231 -0
- package/src/merge/resolver.test.ts +1345 -0
- package/src/merge/resolver.ts +645 -0
- package/src/metrics/store.test.ts +667 -0
- package/src/metrics/store.ts +445 -0
- package/src/metrics/summary.test.ts +398 -0
- package/src/metrics/summary.ts +178 -0
- package/src/metrics/transcript.test.ts +356 -0
- package/src/metrics/transcript.ts +175 -0
- package/src/mulch/client.test.ts +671 -0
- package/src/mulch/client.ts +332 -0
- package/src/sessions/compat.test.ts +280 -0
- package/src/sessions/compat.ts +104 -0
- package/src/sessions/store.test.ts +873 -0
- package/src/sessions/store.ts +494 -0
- package/src/test-helpers.test.ts +124 -0
- package/src/test-helpers.ts +126 -0
- package/src/tracker/beads.ts +56 -0
- package/src/tracker/factory.test.ts +80 -0
- package/src/tracker/factory.ts +64 -0
- package/src/tracker/seeds.ts +182 -0
- package/src/tracker/types.ts +52 -0
- package/src/types.ts +724 -0
- package/src/watchdog/daemon.test.ts +1975 -0
- package/src/watchdog/daemon.ts +671 -0
- package/src/watchdog/health.test.ts +431 -0
- package/src/watchdog/health.ts +264 -0
- package/src/watchdog/triage.test.ts +164 -0
- package/src/watchdog/triage.ts +179 -0
- package/src/worktree/manager.test.ts +439 -0
- package/src/worktree/manager.ts +198 -0
- package/src/worktree/tmux.test.ts +1009 -0
- package/src/worktree/tmux.ts +509 -0
- package/templates/CLAUDE.md.tmpl +89 -0
- package/templates/hooks.json.tmpl +105 -0
- package/templates/overlay.md.tmpl +81 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { loadConfig } from "../config.ts";
|
|
3
|
+
import { ConfigError, ValidationError } from "../errors.ts";
|
|
4
|
+
import type { OverstoryConfig } from "../types.ts";
|
|
5
|
+
import type { DoctorCheck, DoctorCheckFn } from "./types.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Configuration validation checks.
|
|
9
|
+
* Validates config.yaml schema, required fields, and value constraints.
|
|
10
|
+
*/
|
|
11
|
+
export const checkConfig: DoctorCheckFn = async (config, overstoryDir): Promise<DoctorCheck[]> => {
|
|
12
|
+
const checks: DoctorCheck[] = [];
|
|
13
|
+
|
|
14
|
+
// Check 1: config-parseable
|
|
15
|
+
const parseableCheck = await checkConfigParseable(overstoryDir);
|
|
16
|
+
checks.push(parseableCheck);
|
|
17
|
+
|
|
18
|
+
// Check 2: config-valid
|
|
19
|
+
const validCheck = await checkConfigValid(overstoryDir);
|
|
20
|
+
checks.push(validCheck);
|
|
21
|
+
|
|
22
|
+
// Check 3: project-root-exists
|
|
23
|
+
const projectRootCheck = checkProjectRootExists(config);
|
|
24
|
+
checks.push(projectRootCheck);
|
|
25
|
+
|
|
26
|
+
// Check 4: canonical-branch-exists
|
|
27
|
+
const branchCheck = await checkCanonicalBranchExists(config);
|
|
28
|
+
checks.push(branchCheck);
|
|
29
|
+
|
|
30
|
+
return checks;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check that config.yaml can be parsed.
|
|
35
|
+
*/
|
|
36
|
+
async function checkConfigParseable(overstoryDir: string): Promise<DoctorCheck> {
|
|
37
|
+
try {
|
|
38
|
+
// Try to load config - if this succeeds, config is parseable
|
|
39
|
+
await loadConfig(overstoryDir);
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
name: "config-parseable",
|
|
43
|
+
category: "config",
|
|
44
|
+
status: "pass",
|
|
45
|
+
message: "Config loads without errors",
|
|
46
|
+
};
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (error instanceof ConfigError) {
|
|
49
|
+
return {
|
|
50
|
+
name: "config-parseable",
|
|
51
|
+
category: "config",
|
|
52
|
+
status: "fail",
|
|
53
|
+
message: "Config cannot be parsed",
|
|
54
|
+
details: [error.message],
|
|
55
|
+
fixable: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Other errors (including ValidationError) are not parsing errors
|
|
60
|
+
return {
|
|
61
|
+
name: "config-parseable",
|
|
62
|
+
category: "config",
|
|
63
|
+
status: "pass",
|
|
64
|
+
message: "Config loads without errors",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check that config passes validation.
|
|
71
|
+
*/
|
|
72
|
+
async function checkConfigValid(overstoryDir: string): Promise<DoctorCheck> {
|
|
73
|
+
try {
|
|
74
|
+
// Try to load config - loadConfig runs validateConfig internally
|
|
75
|
+
await loadConfig(overstoryDir);
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
name: "config-valid",
|
|
79
|
+
category: "config",
|
|
80
|
+
status: "pass",
|
|
81
|
+
message: "Validation passes",
|
|
82
|
+
};
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error instanceof ValidationError) {
|
|
85
|
+
return {
|
|
86
|
+
name: "config-valid",
|
|
87
|
+
category: "config",
|
|
88
|
+
status: "fail",
|
|
89
|
+
message: "Validation fails",
|
|
90
|
+
details: [error.message],
|
|
91
|
+
fixable: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ConfigError or other errors are not validation errors
|
|
96
|
+
if (error instanceof ConfigError) {
|
|
97
|
+
// Config parsing failed, so we can't validate
|
|
98
|
+
return {
|
|
99
|
+
name: "config-valid",
|
|
100
|
+
category: "config",
|
|
101
|
+
status: "fail",
|
|
102
|
+
message: "Cannot validate (config parsing failed)",
|
|
103
|
+
details: [error.message],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
name: "config-valid",
|
|
109
|
+
category: "config",
|
|
110
|
+
status: "pass",
|
|
111
|
+
message: "Validation passes",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Check that project root directory exists.
|
|
118
|
+
*/
|
|
119
|
+
function checkProjectRootExists(config: OverstoryConfig): DoctorCheck {
|
|
120
|
+
const projectRoot = config.project.root;
|
|
121
|
+
|
|
122
|
+
if (existsSync(projectRoot)) {
|
|
123
|
+
return {
|
|
124
|
+
name: "project-root-exists",
|
|
125
|
+
category: "config",
|
|
126
|
+
status: "pass",
|
|
127
|
+
message: "Project root directory exists",
|
|
128
|
+
details: [projectRoot],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
name: "project-root-exists",
|
|
134
|
+
category: "config",
|
|
135
|
+
status: "fail",
|
|
136
|
+
message: "Project root directory does not exist",
|
|
137
|
+
details: [projectRoot],
|
|
138
|
+
fixable: true,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Check that canonical branch exists in the repository.
|
|
144
|
+
*/
|
|
145
|
+
async function checkCanonicalBranchExists(config: OverstoryConfig): Promise<DoctorCheck> {
|
|
146
|
+
const branchName = config.project.canonicalBranch;
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
const proc = Bun.spawn(["git", "rev-parse", "--verify", `refs/heads/${branchName}`], {
|
|
150
|
+
cwd: config.project.root,
|
|
151
|
+
stdout: "pipe",
|
|
152
|
+
stderr: "pipe",
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const exitCode = await proc.exited;
|
|
156
|
+
|
|
157
|
+
if (exitCode === 0) {
|
|
158
|
+
return {
|
|
159
|
+
name: "canonical-branch-exists",
|
|
160
|
+
category: "config",
|
|
161
|
+
status: "pass",
|
|
162
|
+
message: `Canonical branch '${branchName}' exists`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
name: "canonical-branch-exists",
|
|
168
|
+
category: "config",
|
|
169
|
+
status: "warn",
|
|
170
|
+
message: `Canonical branch '${branchName}' does not exist`,
|
|
171
|
+
details: [`Branch ${branchName} does not exist in the repository`],
|
|
172
|
+
fixable: true,
|
|
173
|
+
};
|
|
174
|
+
} catch (error) {
|
|
175
|
+
return {
|
|
176
|
+
name: "canonical-branch-exists",
|
|
177
|
+
category: "config",
|
|
178
|
+
status: "warn",
|
|
179
|
+
message: `Cannot verify canonical branch '${branchName}'`,
|
|
180
|
+
details: [error instanceof Error ? error.message : String(error)],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|