briefops 1.0.2 → 1.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/CHANGELOG.md +6 -0
- package/README.md +6 -1
- package/dist/commands/doctor.js +16 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/core/stabilityDoctor.d.ts +14 -0
- package/dist/core/stabilityDoctor.js +356 -0
- package/dist/core/stabilityDoctor.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/privacy-model.md +2 -0
- package/docs/quickstart.md +3 -0
- package/docs/release-checklist.md +2 -0
- package/package.json +1 -1
- package/plugins/briefops-codex/.codex-plugin/plugin.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
- No changes yet.
|
|
6
6
|
|
|
7
|
+
## 1.1.0 - 2026-06-10
|
|
8
|
+
|
|
9
|
+
- Add `briefops doctor --stability` for bounded read-only workspace integrity checks.
|
|
10
|
+
- Detect invalid workspace schemas, duplicate memory ids, broken references, managed-path symlinks, and orphaned review artifacts.
|
|
11
|
+
- Keep detailed stability diagnostics out of `prime`, handoff, resume, and pack context so local checks do not increase prompt volume.
|
|
12
|
+
|
|
7
13
|
## 1.0.2 - 2026-06-10
|
|
8
14
|
|
|
9
15
|
- Include work-log lessons in local handoff, Codex resume, and worker recent-work context before durable memory approval.
|
package/README.md
CHANGED
|
@@ -292,12 +292,15 @@ Run this before publishing a repository, sharing a pack, or attaching BriefOps c
|
|
|
292
292
|
```bash
|
|
293
293
|
briefops doctor --privacy
|
|
294
294
|
briefops doctor --privacy --fix-gitignore
|
|
295
|
+
briefops doctor --stability
|
|
295
296
|
```
|
|
296
297
|
|
|
297
298
|
BriefOps is local-first, but `.briefops/` may contain private logs and memory. Keep `.briefops/` out of source control unless you intentionally curated the contents.
|
|
298
299
|
|
|
299
300
|
`doctor --privacy` checks local memory sharing hazards, including `.briefops/` gitignore coverage, private/exportable memory, and secret-like memory strings.
|
|
300
301
|
|
|
302
|
+
`doctor --stability` checks local workspace integrity, schema validity, duplicate memory ids, broken references, managed-path symlinks, and orphaned review artifacts. It keeps diagnostics bounded and does not add detailed doctor output to `prime`, handoff, resume, or pack context.
|
|
303
|
+
|
|
301
304
|
## Pre-Publish Readiness
|
|
302
305
|
|
|
303
306
|
Before `npm publish`, run the local release checks and review the package contents:
|
|
@@ -596,6 +599,7 @@ briefops handoff inspect latest
|
|
|
596
599
|
|
|
597
600
|
```bash
|
|
598
601
|
briefops doctor
|
|
602
|
+
briefops doctor --stability
|
|
599
603
|
briefops doctor --privacy
|
|
600
604
|
briefops doctor --security
|
|
601
605
|
briefops doctor --security --fix-stale-locks
|
|
@@ -606,7 +610,7 @@ briefops inspect retrieval --project atlas-q --worker quant-reviewer --task "Con
|
|
|
606
610
|
briefops inspect continuity --project atlas-q --worker quant-reviewer
|
|
607
611
|
```
|
|
608
612
|
|
|
609
|
-
`doctor --security --fix-stale-locks` removes stale locks only; it does not remove fresh locks or other workspace files.
|
|
613
|
+
`doctor --stability` is read-only and bounded: it reports counts plus a small set of examples instead of dumping workspace contents. `doctor --security --fix-stale-locks` removes stale locks only; it does not remove fresh locks or other workspace files.
|
|
610
614
|
|
|
611
615
|
Evals are deterministic checklist checks. They do not call an LLM judge.
|
|
612
616
|
|
|
@@ -673,6 +677,7 @@ Because `.briefops/` is local/private, Codex does not automatically see it. Prov
|
|
|
673
677
|
```bash
|
|
674
678
|
briefops init
|
|
675
679
|
briefops doctor
|
|
680
|
+
briefops doctor --stability
|
|
676
681
|
briefops doctor --privacy
|
|
677
682
|
briefops doctor --security
|
|
678
683
|
briefops inbox
|
package/dist/commands/doctor.js
CHANGED
|
@@ -2,12 +2,15 @@ import { cleanStaleLocks } from "../core/lock.js";
|
|
|
2
2
|
import { memoryCategories, workspacePaths } from "../core/paths.js";
|
|
3
3
|
import { fixBriefOpsGitignore, runPrivacyDoctor } from "../core/privacyDoctor.js";
|
|
4
4
|
import { runSecurityDoctor } from "../core/securityDoctor.js";
|
|
5
|
+
import { runStabilityDoctor } from "../core/stabilityDoctor.js";
|
|
5
6
|
import { pathExists } from "../core/storage.js";
|
|
6
7
|
import { printTable } from "./shared.js";
|
|
7
8
|
export function registerDoctorCommand(program) {
|
|
8
9
|
program
|
|
9
10
|
.command("doctor")
|
|
10
11
|
.description("Check the local BriefOps workspace structure.")
|
|
12
|
+
.option("--stability", "Run bounded workspace integrity checks without changing prompt context.")
|
|
13
|
+
.option("--verbose", "Show more stability examples while keeping output bounded.")
|
|
11
14
|
.option("--security", "Run security, export, and local conflict checks.")
|
|
12
15
|
.option("--fix-stale-locks", "Remove stale BriefOps workspace locks before reporting security checks.")
|
|
13
16
|
.option("--privacy", "Run privacy checks for local memory and share safety.")
|
|
@@ -29,6 +32,19 @@ export function registerDoctorCommand(program) {
|
|
|
29
32
|
}
|
|
30
33
|
return;
|
|
31
34
|
}
|
|
35
|
+
if (options.stability) {
|
|
36
|
+
const result = await runStabilityDoctor({
|
|
37
|
+
maxExamples: options.verbose ? 25 : 5
|
|
38
|
+
});
|
|
39
|
+
printTable([
|
|
40
|
+
["Check", "Status", "Detail"],
|
|
41
|
+
...result.checks.map((check) => [check.name, check.status, check.detail])
|
|
42
|
+
]);
|
|
43
|
+
if (!result.ok) {
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
32
48
|
if (options.security) {
|
|
33
49
|
if (options.fixStaleLocks) {
|
|
34
50
|
const removed = await cleanStaleLocks();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type StabilityDoctorStatus = "ok" | "warn" | "fail";
|
|
2
|
+
export type StabilityDoctorCheck = {
|
|
3
|
+
name: string;
|
|
4
|
+
status: StabilityDoctorStatus;
|
|
5
|
+
detail: string;
|
|
6
|
+
};
|
|
7
|
+
export type StabilityDoctorResult = {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
checks: StabilityDoctorCheck[];
|
|
10
|
+
};
|
|
11
|
+
export declare function runStabilityDoctor(options?: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
maxExamples?: number;
|
|
14
|
+
}): Promise<StabilityDoctorResult>;
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { readBriefOpsConfig } from "./config.js";
|
|
5
|
+
import { BriefOpsError } from "./errors.js";
|
|
6
|
+
import { listFilesBySuffix, parseMarkdownWithFrontmatter, pathExists, readTextFile } from "./storage.js";
|
|
7
|
+
import { workspacePaths, memoryCategories, memoryFilePath } from "./paths.js";
|
|
8
|
+
import { memoryFileSchema } from "../schemas/memory.js";
|
|
9
|
+
import { memoryProposalSchema } from "../schemas/memoryProposal.js";
|
|
10
|
+
import { projectFrontmatterSchema } from "../schemas/project.js";
|
|
11
|
+
import { skillFrontmatterSchema } from "../schemas/skill.js";
|
|
12
|
+
import { workLogSchema } from "../schemas/log.js";
|
|
13
|
+
import { skillPatchSchema } from "../schemas/patch.js";
|
|
14
|
+
import { workerProfileSchema } from "../schemas/worker.js";
|
|
15
|
+
function check(name, status, detail) {
|
|
16
|
+
return { name, status, detail };
|
|
17
|
+
}
|
|
18
|
+
function relative(cwd, filePath) {
|
|
19
|
+
const rel = path.relative(cwd, filePath);
|
|
20
|
+
return rel.startsWith("..") ? filePath : rel || ".";
|
|
21
|
+
}
|
|
22
|
+
function summarize(items, empty, maxExamples) {
|
|
23
|
+
if (items.length === 0) {
|
|
24
|
+
return empty;
|
|
25
|
+
}
|
|
26
|
+
const shown = items.slice(0, maxExamples);
|
|
27
|
+
const suffix = items.length > shown.length ? `; ${items.length - shown.length} more` : "";
|
|
28
|
+
return `${items.length}: ${shown.join("; ")}${suffix}`;
|
|
29
|
+
}
|
|
30
|
+
async function safeReadYaml(filePath) {
|
|
31
|
+
return YAML.parse(await readTextFile(filePath)) ?? {};
|
|
32
|
+
}
|
|
33
|
+
async function validateRequiredPaths(cwd) {
|
|
34
|
+
const paths = workspacePaths(cwd);
|
|
35
|
+
const required = [
|
|
36
|
+
paths.root,
|
|
37
|
+
paths.config,
|
|
38
|
+
paths.skills,
|
|
39
|
+
paths.projects,
|
|
40
|
+
paths.memory,
|
|
41
|
+
paths.memoryProposals,
|
|
42
|
+
paths.workers,
|
|
43
|
+
paths.workerSummaries,
|
|
44
|
+
paths.logs,
|
|
45
|
+
paths.handoffs,
|
|
46
|
+
paths.briefs,
|
|
47
|
+
paths.codex,
|
|
48
|
+
paths.codexPrompts,
|
|
49
|
+
paths.evals,
|
|
50
|
+
paths.evalResults,
|
|
51
|
+
paths.patches,
|
|
52
|
+
paths.templates
|
|
53
|
+
];
|
|
54
|
+
const missing = [];
|
|
55
|
+
for (const filePath of required) {
|
|
56
|
+
if (!(await pathExists(filePath))) {
|
|
57
|
+
missing.push(relative(cwd, filePath));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return missing;
|
|
61
|
+
}
|
|
62
|
+
async function validateManagedSymlinks(cwd) {
|
|
63
|
+
const paths = workspacePaths(cwd);
|
|
64
|
+
const managed = [
|
|
65
|
+
paths.root,
|
|
66
|
+
paths.skills,
|
|
67
|
+
paths.projects,
|
|
68
|
+
paths.memory,
|
|
69
|
+
paths.memoryProposals,
|
|
70
|
+
paths.workers,
|
|
71
|
+
paths.workerSummaries,
|
|
72
|
+
paths.logs,
|
|
73
|
+
paths.handoffs,
|
|
74
|
+
paths.briefs,
|
|
75
|
+
paths.codex,
|
|
76
|
+
paths.codexPrompts,
|
|
77
|
+
paths.evals,
|
|
78
|
+
paths.evalResults,
|
|
79
|
+
paths.patches,
|
|
80
|
+
paths.templates
|
|
81
|
+
];
|
|
82
|
+
const symlinks = [];
|
|
83
|
+
for (const filePath of managed) {
|
|
84
|
+
try {
|
|
85
|
+
if ((await fs.lstat(filePath)).isSymbolicLink()) {
|
|
86
|
+
symlinks.push(relative(cwd, filePath));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error.code !== "ENOENT") {
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return symlinks;
|
|
96
|
+
}
|
|
97
|
+
async function validateProjectFiles(cwd, maxExamples) {
|
|
98
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).projects, ".project.md");
|
|
99
|
+
const invalid = [];
|
|
100
|
+
const projects = new Set();
|
|
101
|
+
for (const filePath of files) {
|
|
102
|
+
try {
|
|
103
|
+
const parsed = parseMarkdownWithFrontmatter(await readTextFile(filePath), projectFrontmatterSchema, filePath);
|
|
104
|
+
projects.add(parsed.data.name);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
check: invalid.length === 0
|
|
112
|
+
? check("Project files", "ok", `${files.length} project file(s) valid.`)
|
|
113
|
+
: check("Project files", "fail", summarize(invalid, "No invalid project files.", maxExamples)),
|
|
114
|
+
projects
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function validateSkillFiles(cwd, maxExamples) {
|
|
118
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).skills, ".skill.md");
|
|
119
|
+
const invalid = [];
|
|
120
|
+
const skills = new Set();
|
|
121
|
+
for (const filePath of files) {
|
|
122
|
+
try {
|
|
123
|
+
const parsed = parseMarkdownWithFrontmatter(await readTextFile(filePath), skillFrontmatterSchema, filePath);
|
|
124
|
+
skills.add(parsed.data.name);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
check: invalid.length === 0
|
|
132
|
+
? check("Skill files", "ok", `${files.length} skill file(s) valid.`)
|
|
133
|
+
: check("Skill files", "fail", summarize(invalid, "No invalid skill files.", maxExamples)),
|
|
134
|
+
skills
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function validateWorkerFiles(cwd, maxExamples) {
|
|
138
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).workers, ".worker.yaml");
|
|
139
|
+
const invalid = [];
|
|
140
|
+
const workers = new Map();
|
|
141
|
+
for (const filePath of files) {
|
|
142
|
+
try {
|
|
143
|
+
const result = workerProfileSchema.safeParse(await safeReadYaml(filePath));
|
|
144
|
+
if (!result.success) {
|
|
145
|
+
throw new BriefOpsError(result.error.message);
|
|
146
|
+
}
|
|
147
|
+
workers.set(result.data.name, result.data);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
check: invalid.length === 0
|
|
155
|
+
? check("Worker files", "ok", `${files.length} worker file(s) valid.`)
|
|
156
|
+
: check("Worker files", "fail", summarize(invalid, "No invalid worker files.", maxExamples)),
|
|
157
|
+
workers
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function validateLogFiles(cwd, maxExamples) {
|
|
161
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).logs, ".yaml");
|
|
162
|
+
const invalid = [];
|
|
163
|
+
const logs = new Set();
|
|
164
|
+
for (const filePath of files) {
|
|
165
|
+
try {
|
|
166
|
+
const result = workLogSchema.safeParse(await safeReadYaml(filePath));
|
|
167
|
+
if (!result.success) {
|
|
168
|
+
throw new BriefOpsError(result.error.message);
|
|
169
|
+
}
|
|
170
|
+
logs.add(result.data.id);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
check: invalid.length === 0
|
|
178
|
+
? check("Work logs", "ok", `${files.length} work log file(s) valid.`)
|
|
179
|
+
: check("Work logs", "fail", summarize(invalid, "No invalid work logs.", maxExamples)),
|
|
180
|
+
logs
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async function validateMemoryFiles(cwd, maxExamples) {
|
|
184
|
+
const invalid = [];
|
|
185
|
+
const memory = [];
|
|
186
|
+
for (const category of memoryCategories) {
|
|
187
|
+
const filePath = memoryFilePath(cwd, category);
|
|
188
|
+
try {
|
|
189
|
+
const result = memoryFileSchema.safeParse(await safeReadYaml(filePath));
|
|
190
|
+
if (!result.success) {
|
|
191
|
+
throw new BriefOpsError(result.error.message);
|
|
192
|
+
}
|
|
193
|
+
memory.push(...result.data.items);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
check: invalid.length === 0
|
|
201
|
+
? check("Memory files", "ok", `${memory.length} memory item(s) valid.`)
|
|
202
|
+
: check("Memory files", "fail", summarize(invalid, "No invalid memory files.", maxExamples)),
|
|
203
|
+
memory
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
async function validateProposalFiles(cwd, logs, maxExamples) {
|
|
207
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).memoryProposals, ".memory-proposal.yaml");
|
|
208
|
+
const invalid = [];
|
|
209
|
+
const orphaned = [];
|
|
210
|
+
for (const filePath of files) {
|
|
211
|
+
try {
|
|
212
|
+
const result = memoryProposalSchema.safeParse(await safeReadYaml(filePath));
|
|
213
|
+
if (!result.success) {
|
|
214
|
+
throw new BriefOpsError(result.error.message);
|
|
215
|
+
}
|
|
216
|
+
if (!logs.has(result.data.from_log)) {
|
|
217
|
+
orphaned.push(`${result.data.id} -> log ${result.data.from_log}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
check: invalid.length === 0
|
|
226
|
+
? check("Memory proposals", "ok", `${files.length} memory proposal file(s) valid.`)
|
|
227
|
+
: check("Memory proposals", "fail", summarize(invalid, "No invalid memory proposals.", maxExamples)),
|
|
228
|
+
orphaned
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function validatePatchFiles(cwd, logs, maxExamples) {
|
|
232
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).patches, ".patch.yaml");
|
|
233
|
+
const invalid = [];
|
|
234
|
+
const orphaned = [];
|
|
235
|
+
for (const filePath of files) {
|
|
236
|
+
try {
|
|
237
|
+
const result = skillPatchSchema.safeParse(await safeReadYaml(filePath));
|
|
238
|
+
if (!result.success) {
|
|
239
|
+
throw new BriefOpsError(result.error.message);
|
|
240
|
+
}
|
|
241
|
+
if (!logs.has(result.data.from_log)) {
|
|
242
|
+
orphaned.push(`${result.data.id} -> log ${result.data.from_log}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
invalid.push(`${relative(cwd, filePath)}: ${error instanceof Error ? error.message : String(error)}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
check: invalid.length === 0
|
|
251
|
+
? check("Skill patches", "ok", `${files.length} skill patch file(s) valid.`)
|
|
252
|
+
: check("Skill patches", "fail", summarize(invalid, "No invalid skill patches.", maxExamples)),
|
|
253
|
+
orphaned
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function duplicateMemoryIds(memory) {
|
|
257
|
+
const counts = new Map();
|
|
258
|
+
for (const item of memory) {
|
|
259
|
+
counts.set(item.id, (counts.get(item.id) ?? 0) + 1);
|
|
260
|
+
}
|
|
261
|
+
return [...counts.entries()]
|
|
262
|
+
.filter(([, count]) => count > 1)
|
|
263
|
+
.map(([id, count]) => `${id} (${count})`)
|
|
264
|
+
.sort();
|
|
265
|
+
}
|
|
266
|
+
function referenceCheck(options) {
|
|
267
|
+
const broken = [];
|
|
268
|
+
const { config, workspace } = options;
|
|
269
|
+
if (config?.defaults.project && !workspace.projects.has(config.defaults.project)) {
|
|
270
|
+
broken.push(`default project -> ${config.defaults.project}`);
|
|
271
|
+
}
|
|
272
|
+
if (config?.defaults.worker && !workspace.workers.has(config.defaults.worker)) {
|
|
273
|
+
broken.push(`default worker -> ${config.defaults.worker}`);
|
|
274
|
+
}
|
|
275
|
+
for (const worker of workspace.workers.values()) {
|
|
276
|
+
if (worker.project && !workspace.projects.has(worker.project)) {
|
|
277
|
+
broken.push(`worker ${worker.name} -> project ${worker.project}`);
|
|
278
|
+
}
|
|
279
|
+
for (const skill of worker.default_skills) {
|
|
280
|
+
if (!workspace.skills.has(skill)) {
|
|
281
|
+
broken.push(`worker ${worker.name} -> skill ${skill}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
for (const item of workspace.memory) {
|
|
286
|
+
if (item.project && !workspace.projects.has(item.project)) {
|
|
287
|
+
broken.push(`memory ${item.id} -> project ${item.project}`);
|
|
288
|
+
}
|
|
289
|
+
if (item.skill && !workspace.skills.has(item.skill)) {
|
|
290
|
+
broken.push(`memory ${item.id} -> skill ${item.skill}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return broken.length === 0
|
|
294
|
+
? check("References", "ok", "No broken project, skill, worker, or memory references.")
|
|
295
|
+
: check("References", "fail", summarize(broken, "No broken references.", options.maxExamples));
|
|
296
|
+
}
|
|
297
|
+
export async function runStabilityDoctor(options = {}) {
|
|
298
|
+
const cwd = options.cwd ?? process.cwd();
|
|
299
|
+
const maxExamples = options.maxExamples ?? 5;
|
|
300
|
+
const paths = workspacePaths(cwd);
|
|
301
|
+
if (!(await pathExists(paths.root))) {
|
|
302
|
+
return {
|
|
303
|
+
ok: false,
|
|
304
|
+
checks: [check("Workspace", "fail", ".briefops workspace not found.")]
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const checks = [
|
|
308
|
+
check("Workspace", "ok", relative(cwd, paths.root))
|
|
309
|
+
];
|
|
310
|
+
const missingPaths = await validateRequiredPaths(cwd);
|
|
311
|
+
checks.push(missingPaths.length === 0
|
|
312
|
+
? check("Required paths", "ok", "All required workspace paths exist.")
|
|
313
|
+
: check("Required paths", "fail", summarize(missingPaths, "No missing paths.", maxExamples)));
|
|
314
|
+
const symlinks = await validateManagedSymlinks(cwd);
|
|
315
|
+
checks.push(symlinks.length === 0
|
|
316
|
+
? check("Managed symlinks", "ok", "No managed workspace paths are symlinks.")
|
|
317
|
+
: check("Managed symlinks", "fail", summarize(symlinks, "No managed symlinks.", maxExamples)));
|
|
318
|
+
let config;
|
|
319
|
+
try {
|
|
320
|
+
config = await readBriefOpsConfig(cwd);
|
|
321
|
+
checks.push(check("Config", "ok", `Schema ${config.version}.`));
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
checks.push(check("Config", "fail", error instanceof Error ? error.message : String(error)));
|
|
325
|
+
}
|
|
326
|
+
const projects = await validateProjectFiles(cwd, maxExamples);
|
|
327
|
+
const skills = await validateSkillFiles(cwd, maxExamples);
|
|
328
|
+
const workers = await validateWorkerFiles(cwd, maxExamples);
|
|
329
|
+
const logs = await validateLogFiles(cwd, maxExamples);
|
|
330
|
+
const memory = await validateMemoryFiles(cwd, maxExamples);
|
|
331
|
+
checks.push(projects.check, skills.check, workers.check, logs.check, memory.check);
|
|
332
|
+
const workspace = {
|
|
333
|
+
projects: projects.projects,
|
|
334
|
+
skills: skills.skills,
|
|
335
|
+
workers: workers.workers,
|
|
336
|
+
logs: logs.logs,
|
|
337
|
+
memory: memory.memory
|
|
338
|
+
};
|
|
339
|
+
const duplicateIds = duplicateMemoryIds(memory.memory);
|
|
340
|
+
checks.push(duplicateIds.length === 0
|
|
341
|
+
? check("Memory ids", "ok", "No duplicate memory ids.")
|
|
342
|
+
: check("Memory ids", "fail", summarize(duplicateIds, "No duplicate memory ids.", maxExamples)));
|
|
343
|
+
checks.push(referenceCheck({ config, workspace, maxExamples }));
|
|
344
|
+
const proposals = await validateProposalFiles(cwd, workspace.logs, maxExamples);
|
|
345
|
+
const patches = await validatePatchFiles(cwd, workspace.logs, maxExamples);
|
|
346
|
+
checks.push(proposals.check, patches.check);
|
|
347
|
+
const orphaned = [...proposals.orphaned, ...patches.orphaned].sort();
|
|
348
|
+
checks.push(orphaned.length === 0
|
|
349
|
+
? check("Review artifacts", "ok", "No proposal or patch points at a missing work log.")
|
|
350
|
+
: check("Review artifacts", "warn", summarize(orphaned, "No orphaned review artifacts.", maxExamples)));
|
|
351
|
+
return {
|
|
352
|
+
ok: checks.every((item) => item.status !== "fail"),
|
|
353
|
+
checks
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=stabilityDoctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stabilityDoctor.js","sourceRoot":"","sources":["../../src/core/stabilityDoctor.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const briefopsVersion = "1.0
|
|
1
|
+
export declare const briefopsVersion = "1.1.0";
|
package/dist/version.js
CHANGED
package/docs/privacy-model.md
CHANGED
|
@@ -37,4 +37,6 @@ BriefOps never auto-approves memory proposals or skill patches. Approval is alwa
|
|
|
37
37
|
- private memory marked exportable,
|
|
38
38
|
- secret-like local memory strings.
|
|
39
39
|
|
|
40
|
+
`briefops doctor --stability` checks local workspace integrity, including schema validity, duplicate memory ids, broken references, managed-path symlinks, and orphaned review artifacts. It is read-only, reports bounded examples, and does not add detailed doctor output to generated prompt artifacts.
|
|
41
|
+
|
|
40
42
|
`briefops doctor --security --fix-stale-locks` removes stale lock files only. It does not remove fresh locks or other workspace files.
|
package/docs/quickstart.md
CHANGED
|
@@ -58,12 +58,15 @@ Before publishing a repository or sharing generated context, run:
|
|
|
58
58
|
```bash
|
|
59
59
|
briefops doctor --privacy
|
|
60
60
|
briefops doctor --privacy --fix-gitignore
|
|
61
|
+
briefops doctor --stability
|
|
61
62
|
```
|
|
62
63
|
|
|
63
64
|
`.briefops/` can contain private local work logs and memory. Keep it ignored unless you intentionally curated the contents for sharing.
|
|
64
65
|
|
|
65
66
|
`doctor --privacy` checks local memory sharing hazards, including `.briefops/` gitignore coverage, private/exportable memory, and secret-like memory strings.
|
|
66
67
|
|
|
68
|
+
`doctor --stability` is a read-only local integrity check for schema validity, duplicate memory ids, broken references, managed-path symlinks, and orphaned review artifacts. Its detailed output is bounded and is not added to `prime`, handoff, resume, or pack context.
|
|
69
|
+
|
|
67
70
|
## Context Budget Check
|
|
68
71
|
|
|
69
72
|
```bash
|
|
@@ -31,6 +31,7 @@ briefops export claude-md --force
|
|
|
31
31
|
briefops export cursor-rules --force
|
|
32
32
|
briefops prime --task "Start this task." --format codex --max-tokens 800
|
|
33
33
|
briefops compare context --worker quant-reviewer --task "Start this task."
|
|
34
|
+
briefops doctor --stability
|
|
34
35
|
briefops doctor --security
|
|
35
36
|
briefops doctor --security --fix-stale-locks
|
|
36
37
|
briefops doctor --privacy
|
|
@@ -51,6 +52,7 @@ Confirm:
|
|
|
51
52
|
- `finish --importance trivial` and `finish --no-memory-proposal` avoid durable memory proposals.
|
|
52
53
|
- `memory hygiene` and `memory prune --dry-run` do not mutate memory.
|
|
53
54
|
- Proposal generation and approval are local file-backed operations protected by workspace locks.
|
|
55
|
+
- `doctor --stability` is read-only, bounds detailed examples, and does not add diagnostics to generated prompt artifacts.
|
|
54
56
|
- `doctor --security --fix-stale-locks` removes stale locks only.
|
|
55
57
|
- Explicit output paths do not overwrite without `--force`.
|
|
56
58
|
- Generated Codex plugin files do not overwrite local changes without `--force`.
|
package/package.json
CHANGED