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 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
@@ -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.2";
1
+ export declare const briefopsVersion = "1.1.0";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Keep this version in sync with package.json.
2
- export const briefopsVersion = "1.0.2";
2
+ export const briefopsVersion = "1.1.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "briefops",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Local-first CLI for AI coding agents with persistent memory, handoffs, and token-aware context.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "briefops",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Local-first, token-aware persistent work history for Codex workflows.",
5
5
  "author": {
6
6
  "name": "BriefOps contributors",