briefops 1.0.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.
Files changed (255) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/CODE_OF_CONDUCT.md +13 -0
  3. package/CONTRIBUTING.md +53 -0
  4. package/LICENSE +21 -0
  5. package/README.md +801 -0
  6. package/SECURITY.md +59 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.js +54 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/approve.d.ts +2 -0
  11. package/dist/commands/approve.js +38 -0
  12. package/dist/commands/approve.js.map +1 -0
  13. package/dist/commands/brief.d.ts +2 -0
  14. package/dist/commands/brief.js +81 -0
  15. package/dist/commands/brief.js.map +1 -0
  16. package/dist/commands/codex.d.ts +2 -0
  17. package/dist/commands/codex.js +163 -0
  18. package/dist/commands/codex.js.map +1 -0
  19. package/dist/commands/compare.d.ts +2 -0
  20. package/dist/commands/compare.js +48 -0
  21. package/dist/commands/compare.js.map +1 -0
  22. package/dist/commands/continue.d.ts +2 -0
  23. package/dist/commands/continue.js +66 -0
  24. package/dist/commands/continue.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +2 -0
  26. package/dist/commands/doctor.js +90 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/eval.d.ts +2 -0
  29. package/dist/commands/eval.js +89 -0
  30. package/dist/commands/eval.js.map +1 -0
  31. package/dist/commands/export.d.ts +2 -0
  32. package/dist/commands/export.js +105 -0
  33. package/dist/commands/export.js.map +1 -0
  34. package/dist/commands/finish.d.ts +2 -0
  35. package/dist/commands/finish.js +71 -0
  36. package/dist/commands/finish.js.map +1 -0
  37. package/dist/commands/handoff.d.ts +2 -0
  38. package/dist/commands/handoff.js +77 -0
  39. package/dist/commands/handoff.js.map +1 -0
  40. package/dist/commands/inbox.d.ts +2 -0
  41. package/dist/commands/inbox.js +36 -0
  42. package/dist/commands/inbox.js.map +1 -0
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.js +13 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/inspect.d.ts +2 -0
  47. package/dist/commands/inspect.js +226 -0
  48. package/dist/commands/inspect.js.map +1 -0
  49. package/dist/commands/log.d.ts +2 -0
  50. package/dist/commands/log.js +96 -0
  51. package/dist/commands/log.js.map +1 -0
  52. package/dist/commands/memory.d.ts +2 -0
  53. package/dist/commands/memory.js +236 -0
  54. package/dist/commands/memory.js.map +1 -0
  55. package/dist/commands/pack.d.ts +2 -0
  56. package/dist/commands/pack.js +42 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/prime.d.ts +4 -0
  59. package/dist/commands/prime.js +44 -0
  60. package/dist/commands/prime.js.map +1 -0
  61. package/dist/commands/project.d.ts +2 -0
  62. package/dist/commands/project.js +50 -0
  63. package/dist/commands/project.js.map +1 -0
  64. package/dist/commands/shared.d.ts +3 -0
  65. package/dist/commands/shared.js +24 -0
  66. package/dist/commands/shared.js.map +1 -0
  67. package/dist/commands/skill.d.ts +2 -0
  68. package/dist/commands/skill.js +146 -0
  69. package/dist/commands/skill.js.map +1 -0
  70. package/dist/commands/worker.d.ts +2 -0
  71. package/dist/commands/worker.js +128 -0
  72. package/dist/commands/worker.js.map +1 -0
  73. package/dist/core/adapter.d.ts +22 -0
  74. package/dist/core/adapter.js +167 -0
  75. package/dist/core/adapter.js.map +1 -0
  76. package/dist/core/approval.d.ts +26 -0
  77. package/dist/core/approval.js +86 -0
  78. package/dist/core/approval.js.map +1 -0
  79. package/dist/core/brief.d.ts +47 -0
  80. package/dist/core/brief.js +411 -0
  81. package/dist/core/brief.js.map +1 -0
  82. package/dist/core/codex.d.ts +53 -0
  83. package/dist/core/codex.js +286 -0
  84. package/dist/core/codex.js.map +1 -0
  85. package/dist/core/codexPlugin.d.ts +51 -0
  86. package/dist/core/codexPlugin.js +228 -0
  87. package/dist/core/codexPlugin.js.map +1 -0
  88. package/dist/core/compatibility.d.ts +2 -0
  89. package/dist/core/compatibility.js +16 -0
  90. package/dist/core/compatibility.js.map +1 -0
  91. package/dist/core/config.d.ts +19 -0
  92. package/dist/core/config.js +77 -0
  93. package/dist/core/config.js.map +1 -0
  94. package/dist/core/contextBudget.d.ts +12 -0
  95. package/dist/core/contextBudget.js +22 -0
  96. package/dist/core/contextBudget.js.map +1 -0
  97. package/dist/core/contextCompare.d.ts +27 -0
  98. package/dist/core/contextCompare.js +97 -0
  99. package/dist/core/contextCompare.js.map +1 -0
  100. package/dist/core/continuity.d.ts +25 -0
  101. package/dist/core/continuity.js +73 -0
  102. package/dist/core/continuity.js.map +1 -0
  103. package/dist/core/errors.d.ts +4 -0
  104. package/dist/core/errors.js +12 -0
  105. package/dist/core/errors.js.map +1 -0
  106. package/dist/core/eval.d.ts +38 -0
  107. package/dist/core/eval.js +180 -0
  108. package/dist/core/eval.js.map +1 -0
  109. package/dist/core/exportPolicy.d.ts +7 -0
  110. package/dist/core/exportPolicy.js +17 -0
  111. package/dist/core/exportPolicy.js.map +1 -0
  112. package/dist/core/exportTargets.d.ts +25 -0
  113. package/dist/core/exportTargets.js +292 -0
  114. package/dist/core/exportTargets.js.map +1 -0
  115. package/dist/core/handoff.d.ts +48 -0
  116. package/dist/core/handoff.js +611 -0
  117. package/dist/core/handoff.js.map +1 -0
  118. package/dist/core/inbox.d.ts +15 -0
  119. package/dist/core/inbox.js +56 -0
  120. package/dist/core/inbox.js.map +1 -0
  121. package/dist/core/lock.d.ts +11 -0
  122. package/dist/core/lock.js +99 -0
  123. package/dist/core/lock.js.map +1 -0
  124. package/dist/core/log.d.ts +38 -0
  125. package/dist/core/log.js +93 -0
  126. package/dist/core/log.js.map +1 -0
  127. package/dist/core/memory.d.ts +86 -0
  128. package/dist/core/memory.js +353 -0
  129. package/dist/core/memory.js.map +1 -0
  130. package/dist/core/memoryHygiene.d.ts +25 -0
  131. package/dist/core/memoryHygiene.js +95 -0
  132. package/dist/core/memoryHygiene.js.map +1 -0
  133. package/dist/core/memoryProposal.d.ts +40 -0
  134. package/dist/core/memoryProposal.js +279 -0
  135. package/dist/core/memoryProposal.js.map +1 -0
  136. package/dist/core/output.d.ts +7 -0
  137. package/dist/core/output.js +18 -0
  138. package/dist/core/output.js.map +1 -0
  139. package/dist/core/patch.d.ts +37 -0
  140. package/dist/core/patch.js +220 -0
  141. package/dist/core/patch.js.map +1 -0
  142. package/dist/core/paths.d.ts +33 -0
  143. package/dist/core/paths.js +84 -0
  144. package/dist/core/paths.js.map +1 -0
  145. package/dist/core/prime.d.ts +17 -0
  146. package/dist/core/prime.js +298 -0
  147. package/dist/core/prime.js.map +1 -0
  148. package/dist/core/privacyDoctor.d.ts +14 -0
  149. package/dist/core/privacyDoctor.js +59 -0
  150. package/dist/core/privacyDoctor.js.map +1 -0
  151. package/dist/core/project.d.ts +16 -0
  152. package/dist/core/project.js +73 -0
  153. package/dist/core/project.js.map +1 -0
  154. package/dist/core/securityDoctor.d.ts +14 -0
  155. package/dist/core/securityDoctor.js +96 -0
  156. package/dist/core/securityDoctor.js.map +1 -0
  157. package/dist/core/skill.d.ts +16 -0
  158. package/dist/core/skill.js +81 -0
  159. package/dist/core/skill.js.map +1 -0
  160. package/dist/core/storage.d.ts +20 -0
  161. package/dist/core/storage.js +112 -0
  162. package/dist/core/storage.js.map +1 -0
  163. package/dist/core/tokens.d.ts +5 -0
  164. package/dist/core/tokens.js +24 -0
  165. package/dist/core/tokens.js.map +1 -0
  166. package/dist/core/worker.d.ts +51 -0
  167. package/dist/core/worker.js +312 -0
  168. package/dist/core/worker.js.map +1 -0
  169. package/dist/core/workflow.d.ts +61 -0
  170. package/dist/core/workflow.js +308 -0
  171. package/dist/core/workflow.js.map +1 -0
  172. package/dist/core/workspace.d.ts +7 -0
  173. package/dist/core/workspace.js +214 -0
  174. package/dist/core/workspace.js.map +1 -0
  175. package/dist/index.d.ts +2 -0
  176. package/dist/index.js +16 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/schemas/brief.d.ts +12 -0
  179. package/dist/schemas/brief.js +2 -0
  180. package/dist/schemas/brief.js.map +1 -0
  181. package/dist/schemas/eval.d.ts +96 -0
  182. package/dist/schemas/eval.js +30 -0
  183. package/dist/schemas/eval.js.map +1 -0
  184. package/dist/schemas/handoff.d.ts +33 -0
  185. package/dist/schemas/handoff.js +13 -0
  186. package/dist/schemas/handoff.js.map +1 -0
  187. package/dist/schemas/log.d.ts +51 -0
  188. package/dist/schemas/log.js +19 -0
  189. package/dist/schemas/log.js.map +1 -0
  190. package/dist/schemas/memory.d.ts +112 -0
  191. package/dist/schemas/memory.js +21 -0
  192. package/dist/schemas/memory.js.map +1 -0
  193. package/dist/schemas/memoryProposal.d.ts +181 -0
  194. package/dist/schemas/memoryProposal.js +46 -0
  195. package/dist/schemas/memoryProposal.js.map +1 -0
  196. package/dist/schemas/patch.d.ts +38 -0
  197. package/dist/schemas/patch.js +15 -0
  198. package/dist/schemas/patch.js.map +1 -0
  199. package/dist/schemas/project.d.ts +23 -0
  200. package/dist/schemas/project.js +8 -0
  201. package/dist/schemas/project.js.map +1 -0
  202. package/dist/schemas/skill.d.ts +26 -0
  203. package/dist/schemas/skill.js +9 -0
  204. package/dist/schemas/skill.js.map +1 -0
  205. package/dist/schemas/worker.d.ts +29 -0
  206. package/dist/schemas/worker.js +12 -0
  207. package/dist/schemas/worker.js.map +1 -0
  208. package/dist/version.d.ts +1 -0
  209. package/dist/version.js +3 -0
  210. package/dist/version.js.map +1 -0
  211. package/docs/codex-resume.md +13 -0
  212. package/docs/compatibility.md +49 -0
  213. package/docs/concept.md +13 -0
  214. package/docs/evals.md +18 -0
  215. package/docs/file-format.md +67 -0
  216. package/docs/handoff-briefs.md +9 -0
  217. package/docs/integrations/harnesses.md +74 -0
  218. package/docs/memory-lifecycle.md +23 -0
  219. package/docs/persistent-worker.md +15 -0
  220. package/docs/privacy-model.md +40 -0
  221. package/docs/quickstart.md +74 -0
  222. package/docs/release-checklist.md +68 -0
  223. package/docs/roadmap.md +33 -0
  224. package/docs/superpowers/plans/2026-06-08-briefops-oss-readiness.md +1272 -0
  225. package/docs/superpowers/plans/2026-06-08-codex-first-context-optimization.md +1176 -0
  226. package/docs/token-budget.md +63 -0
  227. package/examples/atlas-q/README.md +15 -0
  228. package/examples/codex-first-context/README.md +48 -0
  229. package/examples/codex-first-context/after-briefops-prime.md +40 -0
  230. package/examples/codex-first-context/before-manual-history-dump.md +18 -0
  231. package/examples/persistent-worker-demo/README.md +15 -0
  232. package/examples/persistent-worker-demo/after-codex-resume.md +17 -0
  233. package/examples/persistent-worker-demo/before-context-dump.md +5 -0
  234. package/examples/persistent-worker-demo/briefops-workspace/codex/prompts/resume_demo.md +29 -0
  235. package/examples/persistent-worker-demo/briefops-workspace/handoffs/handoff_demo.md +50 -0
  236. package/examples/persistent-worker-demo/briefops-workspace/logs/log_20260604_001.yaml +14 -0
  237. package/examples/persistent-worker-demo/briefops-workspace/logs/log_20260604_002.yaml +12 -0
  238. package/examples/persistent-worker-demo/briefops-workspace/memory/decisions.yaml +12 -0
  239. package/examples/persistent-worker-demo/briefops-workspace/memory/deprecated.yaml +1 -0
  240. package/examples/persistent-worker-demo/briefops-workspace/memory/facts.yaml +12 -0
  241. package/examples/persistent-worker-demo/briefops-workspace/memory/incidents.yaml +12 -0
  242. package/examples/persistent-worker-demo/briefops-workspace/memory/lessons.yaml +12 -0
  243. package/examples/persistent-worker-demo/briefops-workspace/memory-proposals/memprop_demo_001.memory-proposal.yaml +23 -0
  244. package/examples/persistent-worker-demo/briefops-workspace/projects/atlas-q.project.md +18 -0
  245. package/examples/persistent-worker-demo/briefops-workspace/skills/backtest-validation.skill.md +13 -0
  246. package/examples/persistent-worker-demo/briefops-workspace/skills/risk-review.skill.md +15 -0
  247. package/examples/persistent-worker-demo/briefops-workspace/workers/quant-reviewer.worker.yaml +12 -0
  248. package/examples/persistent-worker-demo/briefops-workspace/workers/summaries/quant-reviewer.summary.md +44 -0
  249. package/package.json +59 -0
  250. package/plugins/briefops-codex/.codex-plugin/plugin.json +39 -0
  251. package/plugins/briefops-codex/README.md +44 -0
  252. package/plugins/briefops-codex/skills/briefops-continue-worker/SKILL.md +22 -0
  253. package/plugins/briefops-codex/skills/briefops-finish-task/SKILL.md +22 -0
  254. package/plugins/briefops-codex/skills/briefops-prime-context/SKILL.md +24 -0
  255. package/plugins/briefops-codex/skills/briefops-review-memory/SKILL.md +27 -0
@@ -0,0 +1,90 @@
1
+ import { cleanStaleLocks } from "../core/lock.js";
2
+ import { memoryCategories, workspacePaths } from "../core/paths.js";
3
+ import { fixBriefOpsGitignore, runPrivacyDoctor } from "../core/privacyDoctor.js";
4
+ import { runSecurityDoctor } from "../core/securityDoctor.js";
5
+ import { pathExists } from "../core/storage.js";
6
+ import { printTable } from "./shared.js";
7
+ export function registerDoctorCommand(program) {
8
+ program
9
+ .command("doctor")
10
+ .description("Check the local BriefOps workspace structure.")
11
+ .option("--security", "Run security, export, and local conflict checks.")
12
+ .option("--fix-stale-locks", "Remove stale BriefOps workspace locks before reporting security checks.")
13
+ .option("--privacy", "Run privacy checks for local memory and share safety.")
14
+ .option("--fix-gitignore", "Add `.briefops/` to .gitignore when running --privacy.")
15
+ .action(async (options) => {
16
+ if (options.privacy) {
17
+ if (options.fixGitignore) {
18
+ const path = await fixBriefOpsGitignore();
19
+ console.log(`Updated gitignore: ${path}`);
20
+ console.log("");
21
+ }
22
+ const result = await runPrivacyDoctor();
23
+ printTable([
24
+ ["Check", "Status", "Detail"],
25
+ ...result.checks.map((check) => [check.name, check.status, check.detail])
26
+ ]);
27
+ if (!result.ok) {
28
+ process.exitCode = 1;
29
+ }
30
+ return;
31
+ }
32
+ if (options.security) {
33
+ if (options.fixStaleLocks) {
34
+ const removed = await cleanStaleLocks();
35
+ if (removed.length > 0) {
36
+ console.log("Removed stale lock files:");
37
+ for (const filePath of removed) {
38
+ console.log(`- ${filePath}`);
39
+ }
40
+ console.log("");
41
+ }
42
+ else {
43
+ console.log("No stale lock files removed.");
44
+ console.log("");
45
+ }
46
+ }
47
+ const result = await runSecurityDoctor();
48
+ printTable([
49
+ ["Check", "Status", "Detail"],
50
+ ...result.checks.map((check) => [check.name, check.status, check.detail])
51
+ ]);
52
+ if (!result.ok) {
53
+ process.exitCode = 1;
54
+ }
55
+ return;
56
+ }
57
+ const paths = workspacePaths(process.cwd());
58
+ const checks = [
59
+ ["Workspace", paths.root],
60
+ ["Config", paths.config],
61
+ ["Skills", paths.skills],
62
+ ["Projects", paths.projects],
63
+ ["Memory", paths.memory],
64
+ ...memoryCategories.map((category) => [
65
+ `Memory/${category}`,
66
+ `${paths.memory}/${category}.yaml`
67
+ ]),
68
+ ["Workers", paths.workers],
69
+ ["Logs", paths.logs],
70
+ ["Briefs", paths.briefs],
71
+ ["Codex", paths.codex],
72
+ ["Codex Prompts", paths.codexPrompts],
73
+ ["Evals", paths.evals],
74
+ ["Eval Results", paths.evalResults],
75
+ ["Patches", paths.patches],
76
+ ["Templates", paths.templates]
77
+ ];
78
+ const rows = await Promise.all(checks.map(async ([label, filePath]) => [
79
+ label,
80
+ (await pathExists(filePath)) ? "ok" : "missing",
81
+ filePath
82
+ ]));
83
+ const missing = rows.filter((row) => row[1] === "missing");
84
+ printTable([["Check", "Status", "Path"], ...rows]);
85
+ if (missing.length > 0) {
86
+ process.exitCode = 1;
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerEvalCommands(program: Command): void;
@@ -0,0 +1,89 @@
1
+ import { createEvalCase, listEvalCases, runEval, showEval } from "../core/eval.js";
2
+ import { collectRepeated, parsePositiveInt, printTable } from "./shared.js";
3
+ export function registerEvalCommands(program) {
4
+ const evalCommand = program.command("eval").description("Manage checklist-based eval cases.");
5
+ evalCommand
6
+ .command("create <name>")
7
+ .description("Create a checklist eval case.")
8
+ .option("--skill <skill>", "Skill name.")
9
+ .option("--project <project>", "Project name.")
10
+ .option("--worker <worker>", "Worker profile name.")
11
+ .option("--description <description>", "Case description.")
12
+ .option("--input <input>", "Task input for brief generation.")
13
+ .option("--expected <text>", "Expected phrase/check. Can be repeated.", collectRepeated, [])
14
+ .option("--pass-threshold <count>", "Minimum expected checks required to pass.", parsePositiveInt)
15
+ .option("--force", "Overwrite an existing eval case.")
16
+ .action(async (name, options) => {
17
+ const result = await createEvalCase({
18
+ name,
19
+ skill: options.skill,
20
+ project: options.project,
21
+ worker: options.worker,
22
+ description: options.description,
23
+ input: options.input,
24
+ expected: options.expected,
25
+ passThreshold: options.passThreshold,
26
+ force: Boolean(options.force)
27
+ });
28
+ console.log(`Created eval case: ${result.evalCase.id}`);
29
+ console.log(result.path);
30
+ });
31
+ evalCommand
32
+ .command("list")
33
+ .description("List eval cases.")
34
+ .action(async () => {
35
+ const cases = await listEvalCases(process.cwd());
36
+ if (cases.length === 0) {
37
+ console.log("No eval cases found.");
38
+ return;
39
+ }
40
+ printTable([
41
+ ["ID", "Skill", "Project", "Worker", "Expected"],
42
+ ...cases.map((item) => [
43
+ item.id,
44
+ item.skill ?? "",
45
+ item.project ?? "",
46
+ item.worker ?? "",
47
+ String(item.expected.length)
48
+ ])
49
+ ]);
50
+ });
51
+ evalCommand
52
+ .command("run")
53
+ .description("Run matching checklist eval cases.")
54
+ .option("--skill <skill>", "Filter/run with skill.")
55
+ .option("--project <project>", "Filter/run with project.")
56
+ .option("--worker <worker>", "Filter/run with worker.")
57
+ .option("--budget <tokens>", "Brief token budget.", parsePositiveInt, 2000)
58
+ .option("--adapter <adapter>", "generic|codex|claude-code", "generic")
59
+ .action(async (options) => {
60
+ const summary = await runEval({
61
+ skill: options.skill,
62
+ project: options.project,
63
+ worker: options.worker,
64
+ budget: options.budget,
65
+ adapter: options.adapter
66
+ });
67
+ console.log(`${summary.cases.length} cases run`);
68
+ console.log(`${summary.passed} passed`);
69
+ console.log(`${summary.failed} failed`);
70
+ console.log("");
71
+ printTable([
72
+ ["Case", "Result", "Score", "Missing"],
73
+ ...summary.cases.map((item) => [
74
+ item.case.id,
75
+ item.result.passed ? "pass" : "fail",
76
+ `${item.result.score}/${item.case.expected.length}`,
77
+ item.result.missing.join(",")
78
+ ])
79
+ ]);
80
+ console.error(`Saved eval result: ${summary.resultPath}`);
81
+ });
82
+ evalCommand
83
+ .command("show <id>")
84
+ .description("Show an eval case or saved result.")
85
+ .action(async (id) => {
86
+ console.log(await showEval(process.cwd(), id));
87
+ });
88
+ }
89
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerExportCommands(program: Command): void;
@@ -0,0 +1,105 @@
1
+ import path from "node:path";
2
+ import { renderHarnessExport } from "../core/exportTargets.js";
3
+ import { normalizeExportPolicy } from "../core/exportPolicy.js";
4
+ import { BriefOpsError } from "../core/errors.js";
5
+ import { pathExists, writeTextFile } from "../core/storage.js";
6
+ function renderTarget(target, options) {
7
+ return renderHarnessExport({
8
+ target,
9
+ worker: options.worker,
10
+ project: options.project,
11
+ exportPolicy: normalizeExportPolicy(options.exportPolicy ?? "shared-only"),
12
+ outputPath: options.output
13
+ ? path.resolve(process.cwd(), options.output)
14
+ : undefined,
15
+ force: Boolean(options.force),
16
+ dryRun: Boolean(options.dryRun),
17
+ stdout: Boolean(options.stdout)
18
+ });
19
+ }
20
+ async function writeResult(result, options) {
21
+ if (options.stdout) {
22
+ for (const file of result.files) {
23
+ console.log(`--- ${path.relative(process.cwd(), file.path)} ---`);
24
+ console.log(file.content.trimEnd());
25
+ console.log("");
26
+ }
27
+ return;
28
+ }
29
+ if (options.dryRun) {
30
+ for (const file of result.files) {
31
+ console.log(`Would write: ${file.path} (${file.tokens} tokens)`);
32
+ }
33
+ return;
34
+ }
35
+ const existing = [];
36
+ for (const file of result.files) {
37
+ if (!options.force && await pathExists(file.path)) {
38
+ existing.push(file.path);
39
+ }
40
+ }
41
+ if (existing.length > 0) {
42
+ throw new BriefOpsError(`Output file already exists: ${existing.join(", ")}. Use --force to overwrite.`);
43
+ }
44
+ for (const file of result.files) {
45
+ await writeTextFile(file.path, file.content, { force: Boolean(options.force) });
46
+ file.written = true;
47
+ console.log(`Wrote: ${file.path} (${file.tokens} tokens)`);
48
+ }
49
+ }
50
+ async function runExport(target, options) {
51
+ if (options.output && target === "cursor-rules") {
52
+ throw new BriefOpsError("--output is only supported for single-file exports.");
53
+ }
54
+ const result = renderTarget(target, options);
55
+ await writeResult(result, options);
56
+ if (result.warnings.length > 0) {
57
+ console.error("Warnings:");
58
+ for (const warning of result.warnings) {
59
+ console.error(`- ${warning}`);
60
+ }
61
+ }
62
+ }
63
+ function addCommonOptions(command, includeOutput = true) {
64
+ command
65
+ .option("--worker <worker>", "Worker profile name.")
66
+ .option("--project <project>", "Project name.")
67
+ .option("--export-policy <policy>", "local-private|shared-only", "shared-only")
68
+ .option("--force", "Overwrite existing generated files.")
69
+ .option("--dry-run", "Print target paths without writing files.")
70
+ .option("--stdout", "Print generated content instead of writing files.");
71
+ if (includeOutput) {
72
+ command.option("--output <path>", "Write the export to a specific path.");
73
+ }
74
+ return command;
75
+ }
76
+ export function registerExportCommands(program) {
77
+ const exportCommand = program
78
+ .command("export")
79
+ .description("Generate local AI harness router files without dumping BriefOps memory.");
80
+ addCommonOptions(exportCommand.command("agents-md").description("Generate AGENTS.md."))
81
+ .action(async (options) => runExport("agents-md", options));
82
+ addCommonOptions(exportCommand.command("claude-md").description("Generate CLAUDE.md."))
83
+ .action(async (options) => runExport("claude-md", options));
84
+ addCommonOptions(exportCommand.command("cursor-rules").description("Generate Cursor .mdc rule routers."), false).action(async (options) => runExport("cursor-rules", options));
85
+ addCommonOptions(exportCommand.command("all").description("Generate AGENTS.md, CLAUDE.md, and Cursor rules."), false)
86
+ .action(async (options) => {
87
+ const results = [
88
+ renderTarget("agents-md", options),
89
+ renderTarget("claude-md", options),
90
+ renderTarget("cursor-rules", options)
91
+ ];
92
+ const merged = {
93
+ files: results.flatMap((result) => result.files),
94
+ warnings: results.flatMap((result) => result.warnings)
95
+ };
96
+ await writeResult(merged, options);
97
+ if (merged.warnings.length > 0) {
98
+ console.error("Warnings:");
99
+ for (const warning of merged.warnings) {
100
+ console.error(`- ${warning}`);
101
+ }
102
+ }
103
+ });
104
+ }
105
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerFinishCommand(program: Command): void;
@@ -0,0 +1,71 @@
1
+ import { finishWork } from "../core/workflow.js";
2
+ import { collectRepeated } from "./shared.js";
3
+ export function registerFinishCommand(program) {
4
+ program
5
+ .command("finish")
6
+ .description("Finish a task: log work, propose memory, and print the next continue command.")
7
+ .option("--project <project>", "Project name.")
8
+ .option("--skill <skill>", "Skill name.")
9
+ .option("--worker <worker>", "Worker profile name.")
10
+ .requiredOption("--task <task>", "Completed task description.")
11
+ .requiredOption("--result <result>", "Work result.")
12
+ .option("--lesson <lesson>", "Lesson learned. Can be repeated.", collectRepeated, [])
13
+ .option("--open-risk <text>", "Unresolved risk. Can be repeated.", collectRepeated, [])
14
+ .option("--next-step <text>", "Suggested next step. Can be repeated.", collectRepeated, [])
15
+ .option("--decision <text>", "Decision made. Can be repeated.", collectRepeated, [])
16
+ .option("--incident <text>", "Incident or failure pattern. Can be repeated.", collectRepeated, [])
17
+ .option("--files <files>", "Comma-separated files changed.")
18
+ .option("--commands <commands>", "Comma-separated commands run.")
19
+ .option("--notes <notes>", "Additional notes.")
20
+ .option("--importance <importance>", "trivial|normal|durable|incident", "normal")
21
+ .option("--no-memory-proposal", "Skip memory proposal generation.")
22
+ .option("--propose-skill-patch", "Also propose a skill patch from log lessons.")
23
+ .option("--refresh-worker", "Refresh the worker summary after logging.")
24
+ .option("--continue-task <task>", "Task text to use in the printed continue command.")
25
+ .action(async (options) => {
26
+ const result = await finishWork({
27
+ project: options.project,
28
+ skill: options.skill,
29
+ worker: options.worker,
30
+ task: options.task,
31
+ result: options.result,
32
+ lessons: options.lesson,
33
+ openRisks: options.openRisk,
34
+ nextSteps: options.nextStep,
35
+ decisions: options.decision,
36
+ incidents: options.incident,
37
+ files: options.files,
38
+ commands: options.commands,
39
+ notes: options.notes,
40
+ importance: options.importance,
41
+ noMemoryProposal: Boolean(options.noMemoryProposal),
42
+ proposeSkillPatch: Boolean(options.proposeSkillPatch),
43
+ refreshWorker: Boolean(options.refreshWorker),
44
+ continueTask: options.continueTask
45
+ });
46
+ console.log(`Added work log: ${result.logId}`);
47
+ console.log(result.logPath);
48
+ if (result.memoryProposalId && result.memoryProposalPath) {
49
+ console.log(`Created memory proposal: ${result.memoryProposalId}`);
50
+ console.log(result.memoryProposalPath);
51
+ }
52
+ if (result.skillPatchId && result.skillPatchPath) {
53
+ console.log(`Created skill patch: ${result.skillPatchId}`);
54
+ console.log(result.skillPatchPath);
55
+ }
56
+ if (result.workerSummaryPath) {
57
+ console.log(`Refreshed worker summary: ${result.workerSummaryPath}`);
58
+ }
59
+ if (result.warnings.length > 0) {
60
+ console.log("");
61
+ console.log("Warnings:");
62
+ for (const warning of result.warnings) {
63
+ console.log(`- ${warning}`);
64
+ }
65
+ }
66
+ console.log("");
67
+ console.log("Next command:");
68
+ console.log(result.nextCommand);
69
+ });
70
+ }
71
+ //# sourceMappingURL=finish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish.js","sourceRoot":"","sources":["../../src/commands/finish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerHandoffCommands(program: Command): void;
@@ -0,0 +1,77 @@
1
+ import path from "node:path";
2
+ import { generateHandoff, inspectSavedHandoff, listSavedHandoffs, showSavedHandoff } from "../core/handoff.js";
3
+ import { normalizeExportPolicy } from "../core/exportPolicy.js";
4
+ import { parsePositiveInt, printTable } from "./shared.js";
5
+ export function registerHandoffCommands(program) {
6
+ const handoff = program
7
+ .command("handoff")
8
+ .description("Generate continuity handoff briefs for fresh AI coding threads.");
9
+ handoff
10
+ .command("generate")
11
+ .description("Compile project, worker, memory, and recent work into a handoff.")
12
+ .option("--project <project>", "Project name.")
13
+ .option("--worker <worker>", "Worker profile name.")
14
+ .option("--task <task>", "Optional next task.")
15
+ .option("--budget <tokens>", "Overall token budget.", parsePositiveInt, 2500)
16
+ .option("--export-policy <policy>", "local-private|shared-only", "local-private")
17
+ .option("--save", "Save to .briefops/handoffs.")
18
+ .option("--output <path>", "Write the handoff to a specific path.")
19
+ .option("--force", "Overwrite an existing explicit output file.")
20
+ .action(async (options) => {
21
+ const result = await generateHandoff({
22
+ project: options.project,
23
+ worker: options.worker,
24
+ task: options.task,
25
+ budget: options.budget,
26
+ exportPolicy: normalizeExportPolicy(options.exportPolicy),
27
+ save: Boolean(options.save) || Boolean(options.output),
28
+ outputPath: options.output
29
+ ? path.resolve(process.cwd(), options.output)
30
+ : undefined,
31
+ force: Boolean(options.force)
32
+ });
33
+ console.log(result.content);
34
+ if (result.savedPath) {
35
+ console.error(`Saved handoff: ${result.savedPath}`);
36
+ }
37
+ console.error(`Estimated tokens: ${result.tokens}`);
38
+ });
39
+ handoff
40
+ .command("list")
41
+ .description("List saved handoffs.")
42
+ .action(async () => {
43
+ const handoffs = await listSavedHandoffs(process.cwd());
44
+ if (handoffs.length === 0) {
45
+ console.log("No saved handoffs found.");
46
+ return;
47
+ }
48
+ printTable([
49
+ ["ID", "Tokens", "Path"],
50
+ ...handoffs.map((item) => [item.id, String(item.tokens), item.path])
51
+ ]);
52
+ });
53
+ handoff
54
+ .command("show <id>")
55
+ .description("Show a saved handoff by id or latest.")
56
+ .action(async (id) => {
57
+ console.log(await showSavedHandoff(process.cwd(), id));
58
+ });
59
+ handoff
60
+ .command("inspect <id>")
61
+ .description("Inspect a saved handoff by id or latest.")
62
+ .action(async (id) => {
63
+ const result = await inspectSavedHandoff(process.cwd(), id);
64
+ printTable([
65
+ ["Field", "Value"],
66
+ ["ID", result.metadata.id],
67
+ ["Path", result.path],
68
+ ["Project", result.metadata.project ?? ""],
69
+ ["Worker", result.metadata.worker ?? ""],
70
+ ["Characters", String(result.characters)],
71
+ ["Estimated Tokens", String(result.metadata.total_tokens)],
72
+ ["Budget", String(result.metadata.budget)],
73
+ ["Warnings", result.metadata.warnings.join("; ")]
74
+ ]);
75
+ });
76
+ }
77
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerInboxCommand(program: Command): void;
@@ -0,0 +1,36 @@
1
+ import { getInboxSummary } from "../core/inbox.js";
2
+ export function registerInboxCommand(program) {
3
+ program
4
+ .command("inbox")
5
+ .description("Summarize the local BriefOps operational queue.")
6
+ .option("--project <project>", "Filter by project.")
7
+ .option("--worker <worker>", "Filter by worker.")
8
+ .option("--skill <skill>", "Filter by skill.")
9
+ .action(async (options) => {
10
+ const summary = await getInboxSummary({
11
+ project: options.project,
12
+ worker: options.worker,
13
+ skill: options.skill
14
+ });
15
+ console.log("BriefOps Inbox");
16
+ console.log("");
17
+ console.log("Pending:");
18
+ console.log(`- memory proposals: ${summary.pendingMemoryProposals}`);
19
+ console.log(`- skill patches: ${summary.pendingSkillPatches}`);
20
+ console.log("");
21
+ console.log("Open Risks:");
22
+ console.log(`- ${summary.openRisks} unresolved risk item(s) found in recent logs`);
23
+ if (summary.staleMemory > 0 || summary.deprecatedMemory > 0) {
24
+ console.log("");
25
+ console.log("Memory Maintenance:");
26
+ console.log(`- stale memory: ${summary.staleMemory}`);
27
+ console.log(`- deprecated memory: ${summary.deprecatedMemory}`);
28
+ }
29
+ console.log("");
30
+ console.log("Recommended:");
31
+ for (const command of summary.recommendedCommands) {
32
+ console.log(`- ${command}`);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAA6B;YAC9C,MAAM,EAAE,OAAO,CAAC,MAA4B;YAC5C,KAAK,EAAE,OAAO,CAAC,KAA2B;SAC3C,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,+CAA+C,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,13 @@
1
+ import { initWorkspace } from "../core/workspace.js";
2
+ export function registerInitCommand(program) {
3
+ program
4
+ .command("init")
5
+ .description("Create a local .briefops workspace.")
6
+ .action(async () => {
7
+ const result = await initWorkspace(process.cwd());
8
+ console.log(`BriefOps workspace ready: ${result.root}`);
9
+ console.log(`Created: ${result.created.length}`);
10
+ console.log(`Existing: ${result.existing.length}`);
11
+ });
12
+ }
13
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerInspectCommands(program: Command): void;