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,286 @@
1
+ import path from "node:path";
2
+ import { generateBrief } from "./brief.js";
3
+ import { generateCodexResumeFromHandoff } from "./handoff.js";
4
+ import { BriefOpsError } from "./errors.js";
5
+ import { withWorkspaceLock } from "./lock.js";
6
+ import { writeGeneratedOutput } from "./output.js";
7
+ import { readProject } from "./project.js";
8
+ import { readWorker } from "./worker.js";
9
+ import { formatDateStamp, normalizeName, slugForFilename, workspacePaths } from "./paths.js";
10
+ import { ensureDirectory, pathExists, readTextFile, writeTextFile } from "./storage.js";
11
+ import { estimateTokens } from "./tokens.js";
12
+ import { requireWorkspace } from "./workspace.js";
13
+ const AGENTS_BEGIN = "<!-- BRIEFOPS_CODEX_BEGIN -->";
14
+ const AGENTS_END = "<!-- BRIEFOPS_CODEX_END -->";
15
+ function normalizeCodexMode(value) {
16
+ const mode = (value ?? "loop").trim().toLowerCase();
17
+ if (mode === "loop" || mode === "execute" || mode === "plan") {
18
+ return mode;
19
+ }
20
+ throw new BriefOpsError(`Invalid Codex mode: ${value}`);
21
+ }
22
+ function codexGuidanceSection() {
23
+ return [
24
+ AGENTS_BEGIN,
25
+ "## BriefOps Codex Guidance",
26
+ "",
27
+ "This repository can use BriefOps to prepare token-aware Codex task briefs.",
28
+ "",
29
+ "Useful commands:",
30
+ "",
31
+ "```bash",
32
+ "briefops brief generate --worker <worker> --task \"<task>\" --adapter codex",
33
+ "briefops codex mission --worker <worker> --task \"<task>\" --save",
34
+ "briefops codex plan --project <project> --idea \"<what to build>\" --save",
35
+ "briefops log add --task \"<task>\" --result \"<result>\" --lesson \"<lesson>\"",
36
+ "briefops skill propose-patch --skill <skill> --from-log latest",
37
+ "```",
38
+ "",
39
+ "When using a BriefOps mission, follow its evidence gates before claiming completion.",
40
+ AGENTS_END,
41
+ ""
42
+ ].join("\n");
43
+ }
44
+ async function upsertAgentsGuidance(cwd, force = false) {
45
+ const agentsPath = path.join(cwd, "AGENTS.md");
46
+ const section = codexGuidanceSection();
47
+ if (!(await pathExists(agentsPath))) {
48
+ await writeTextFile(agentsPath, `# AGENTS.md\n\n${section}`);
49
+ return agentsPath;
50
+ }
51
+ const existing = await readTextFile(agentsPath);
52
+ const start = existing.indexOf(AGENTS_BEGIN);
53
+ const end = existing.indexOf(AGENTS_END);
54
+ if (start !== -1 && end !== -1 && end > start) {
55
+ const updated = `${existing.slice(0, start)}${section}${existing.slice(end + AGENTS_END.length).trimStart()}`;
56
+ await writeTextFile(agentsPath, updated, { force: true });
57
+ return agentsPath;
58
+ }
59
+ if (!force) {
60
+ throw new BriefOpsError("AGENTS.md already exists. Re-run with --force to append BriefOps Codex guidance.");
61
+ }
62
+ await writeTextFile(agentsPath, `${existing.trimEnd()}\n\n${section}`, { force: true });
63
+ return agentsPath;
64
+ }
65
+ export async function installCodexPack(options = {}) {
66
+ const cwd = options.cwd ?? process.cwd();
67
+ await requireWorkspace(cwd);
68
+ const paths = workspacePaths(cwd);
69
+ await ensureDirectory(paths.codexPrompts);
70
+ await writeTextFile(path.join(paths.codexPrompts, "mission.md"), [
71
+ "# BriefOps Codex Mission Prompt",
72
+ "",
73
+ "Generate a Codex mission with:",
74
+ "",
75
+ "```bash",
76
+ "briefops codex mission --worker <worker> --task \"<task>\" --save",
77
+ "```",
78
+ ""
79
+ ].join("\n"), { force: true });
80
+ await writeTextFile(path.join(paths.codexPrompts, "plan.md"), [
81
+ "# BriefOps Codex Plan Prompt",
82
+ "",
83
+ "Generate a Codex planning prompt with:",
84
+ "",
85
+ "```bash",
86
+ "briefops codex plan --project <project> --idea \"<what to build>\" --save",
87
+ "```",
88
+ ""
89
+ ].join("\n"), { force: true });
90
+ return {
91
+ agentsPath: await upsertAgentsGuidance(cwd, options.force),
92
+ promptDir: paths.codexPrompts
93
+ };
94
+ }
95
+ function renderMissionShell(options) {
96
+ const modeLine = options.mode === "loop"
97
+ ? "Work in a bounded loop: inspect, plan, act, verify, and continue if verification fails."
98
+ : options.mode === "execute"
99
+ ? "Execute the task directly, keeping a concise plan and verification evidence attached."
100
+ : "Produce a plan first. Do not modify product code unless the user explicitly approves the plan.";
101
+ return [
102
+ "# BriefOps Codex Mission",
103
+ "",
104
+ "## Mission",
105
+ "",
106
+ options.task,
107
+ "",
108
+ "## Completion Promise",
109
+ "",
110
+ options.completionPromise,
111
+ "",
112
+ "Only claim completion after the evidence gates below are satisfied.",
113
+ "",
114
+ "## Codex Operating Contract",
115
+ "",
116
+ modeLine,
117
+ "",
118
+ "1. Restate the objective in one short paragraph.",
119
+ "2. Inspect the relevant files before editing.",
120
+ "3. Keep changes scoped to the mission.",
121
+ "4. Run the strongest available verification for the changed surface.",
122
+ "5. If verification fails, diagnose and continue instead of ending with a hopeful status.",
123
+ "6. Finish with evidence: files changed, commands run, results, and remaining risk.",
124
+ "",
125
+ "## Evidence Gates",
126
+ "",
127
+ "- Context gate: name the files or docs inspected.",
128
+ "- Change gate: summarize the smallest useful change set.",
129
+ "- Verification gate: include command output or manual QA evidence.",
130
+ "- Risk gate: call out anything unverified or intentionally deferred.",
131
+ "",
132
+ "## Completion Signal",
133
+ "",
134
+ "When all gates pass, end with:",
135
+ "",
136
+ "```text",
137
+ "<briefops-complete>DONE</briefops-complete>",
138
+ "```",
139
+ "",
140
+ "## BriefOps Brief",
141
+ "",
142
+ options.brief.trim(),
143
+ ""
144
+ ].join("\n");
145
+ }
146
+ async function saveCodexPrompt(options) {
147
+ return withWorkspaceLock({ cwd: options.cwd, name: "codex-prompt" }, async () => {
148
+ return writeGeneratedOutput({
149
+ defaultPath: path.join(workspacePaths(options.cwd).codexPrompts, `${formatDateStamp()}-${options.kind}-${slugForFilename(options.name)}.md`),
150
+ outputPath: options.outputPath,
151
+ content: options.content,
152
+ force: options.force
153
+ });
154
+ });
155
+ }
156
+ export async function generateCodexMission(options) {
157
+ const cwd = options.cwd ?? process.cwd();
158
+ await requireWorkspace(cwd);
159
+ const mode = normalizeCodexMode(options.mode);
160
+ const generated = await generateBrief({
161
+ cwd,
162
+ skill: options.skill,
163
+ project: options.project,
164
+ worker: options.worker,
165
+ task: options.task,
166
+ budget: options.budget ?? 2500,
167
+ adapter: "codex"
168
+ });
169
+ const content = renderMissionShell({
170
+ mode,
171
+ task: options.task.trim(),
172
+ completionPromise: options.completionPromise ??
173
+ "Deliver the requested change with verification evidence and no unresolved blocking risk.",
174
+ brief: generated.content
175
+ });
176
+ const savedPath = options.save
177
+ ? await saveCodexPrompt({
178
+ cwd,
179
+ kind: "mission",
180
+ name: options.worker ?? options.skill ?? "codex",
181
+ content,
182
+ outputPath: options.outputPath,
183
+ force: options.force
184
+ })
185
+ : undefined;
186
+ return {
187
+ content,
188
+ tokens: estimateTokens(content),
189
+ savedPath
190
+ };
191
+ }
192
+ export async function generateCodexPlan(options) {
193
+ const cwd = options.cwd ?? process.cwd();
194
+ await requireWorkspace(cwd);
195
+ const projectName = options.project ? normalizeName(options.project) : undefined;
196
+ const workerName = options.worker ? normalizeName(options.worker) : undefined;
197
+ const project = projectName ? await readProject(cwd, projectName) : undefined;
198
+ const worker = workerName ? await readWorker(cwd, workerName) : undefined;
199
+ const content = [
200
+ "# BriefOps Codex Plan Prompt",
201
+ "",
202
+ "## Planning Mission",
203
+ "",
204
+ options.idea.trim(),
205
+ "",
206
+ "## Codex Planning Contract",
207
+ "",
208
+ "You are planning only. Do not edit product code in this response.",
209
+ "",
210
+ "Produce a decision-complete plan that another Codex run can execute without re-asking foundational questions.",
211
+ "",
212
+ "Return:",
213
+ "",
214
+ "1. Objective",
215
+ "2. Assumptions and open questions",
216
+ "3. Codebase areas to inspect",
217
+ "4. Implementation checklist",
218
+ "5. Verification checklist",
219
+ "6. Risks and rollback notes",
220
+ "",
221
+ worker
222
+ ? [
223
+ "## Worker Profile",
224
+ "",
225
+ `Name: ${worker.name}`,
226
+ worker.description ? `Description: ${worker.description}` : undefined,
227
+ worker.default_skills.length > 0
228
+ ? `Default skills: ${worker.default_skills.join(", ")}`
229
+ : undefined,
230
+ worker.style.length > 0 ? `Style: ${worker.style.join("; ")}` : undefined,
231
+ ""
232
+ ]
233
+ .filter((line) => Boolean(line))
234
+ .join("\n")
235
+ : "",
236
+ project
237
+ ? [
238
+ "## Project Context",
239
+ "",
240
+ project.body,
241
+ ""
242
+ ].join("\n")
243
+ : "## Project Context\n\nNo project context selected.\n",
244
+ "## Completion Signal",
245
+ "",
246
+ "End with a concise `PLAN READY` line and the recommended BriefOps command for execution.",
247
+ ""
248
+ ].join("\n");
249
+ const savedPath = options.save
250
+ ? await saveCodexPrompt({
251
+ cwd,
252
+ kind: "plan",
253
+ name: workerName ?? projectName ?? "codex",
254
+ content,
255
+ outputPath: options.outputPath,
256
+ force: options.force
257
+ })
258
+ : undefined;
259
+ return {
260
+ content,
261
+ tokens: estimateTokens(content),
262
+ savedPath
263
+ };
264
+ }
265
+ export async function generateCodexResume(options) {
266
+ const result = await generateCodexResumeFromHandoff({
267
+ cwd: options.cwd,
268
+ worker: options.worker,
269
+ project: options.project,
270
+ task: options.task,
271
+ fromHandoff: options.fromHandoff,
272
+ budget: options.budget ?? 3000,
273
+ mode: options.mode,
274
+ completionPromise: options.completionPromise,
275
+ exportPolicy: options.exportPolicy,
276
+ save: options.save,
277
+ outputPath: options.outputPath,
278
+ force: options.force
279
+ });
280
+ return {
281
+ content: result.content,
282
+ tokens: result.tokens,
283
+ savedPath: result.savedPath
284
+ };
285
+ }
286
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/core/codex.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,YAAY,GAAG,+BAA+B,CAAC;AACrD,MAAM,UAAU,GAAG,6BAA6B,CAAC;AAoDjD,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,aAAa,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;QACL,YAAY;QACZ,4BAA4B;QAC5B,EAAE;QACF,4EAA4E;QAC5E,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,SAAS;QACT,6EAA6E;QAC7E,mEAAmE;QACnE,2EAA2E;QAC3E,gFAAgF;QAChF,gEAAgE;QAChE,KAAK;QACL,EAAE;QACF,sFAAsF;QACtF,UAAU;QACV,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAK,GAAG,KAAK;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,aAAa,CAAC,UAAU,EAAE,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAC9G,MAAM,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,aAAa,CACrB,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAA+B,EAAE;IAItE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAElC,MAAM,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,EAC3C;QACE,iCAAiC;QACjC,EAAE;QACF,gCAAgC;QAChC,EAAE;QACF,SAAS;QACT,mEAAmE;QACnE,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;IACF,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,EACxC;QACE,8BAA8B;QAC9B,EAAE;QACF,wCAAwC;QACxC,EAAE;QACF,SAAS;QACT,2EAA2E;QAC3E,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;QAC1D,SAAS,EAAE,KAAK,CAAC,YAAY;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAK3B;IACC,MAAM,QAAQ,GACZ,OAAO,CAAC,IAAI,KAAK,MAAM;QACrB,CAAC,CAAC,yFAAyF;QAC3F,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,CAAC,CAAC,uFAAuF;YACzF,CAAC,CAAC,gGAAgG,CAAC;IAEzG,OAAO;QACL,0BAA0B;QAC1B,EAAE;QACF,YAAY;QACZ,EAAE;QACF,OAAO,CAAC,IAAI;QACZ,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,OAAO,CAAC,iBAAiB;QACzB,EAAE;QACF,qEAAqE;QACrE,EAAE;QACF,6BAA6B;QAC7B,EAAE;QACF,QAAQ;QACR,EAAE;QACF,kDAAkD;QAClD,+CAA+C;QAC/C,wCAAwC;QACxC,sEAAsE;QACtE,0FAA0F;QAC1F,oFAAoF;QACpF,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,mDAAmD;QACnD,0DAA0D;QAC1D,oEAAoE;QACpE,sEAAsE;QACtE,EAAE;QACF,sBAAsB;QACtB,EAAE;QACF,gCAAgC;QAChC,EAAE;QACF,SAAS;QACT,6CAA6C;QAC7C,KAAK;QACL,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QACpB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAO9B;IACC,OAAO,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,IAAI,EAAE;QAC9E,OAAO,oBAAoB,CAAC;YAC1B,WAAW,EAAE,IAAI,CAAC,IAAI,CACpB,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EACxC,GAAG,eAAe,EAAE,IAAI,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAC3E;YACD,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA4B;IAE5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;QACpC,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,kBAAkB,CAAC;QACjC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;QACzB,iBAAiB,EACf,OAAO,CAAC,iBAAiB;YACzB,0FAA0F;QAC5F,KAAK,EAAE,SAAS,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI;QAC5B,CAAC,CAAC,MAAM,eAAe,CAAC;YACpB,GAAG;YACH,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;YAChD,OAAO;YACP,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,OAAO;QACP,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC;QAC/B,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAyB;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,OAAO,GAAG;QACd,8BAA8B;QAC9B,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;QACnB,EAAE;QACF,4BAA4B;QAC5B,EAAE;QACF,mEAAmE;QACnE,EAAE;QACF,+GAA+G;QAC/G,EAAE;QACF,SAAS;QACT,EAAE;QACF,cAAc;QACd,mCAAmC;QACnC,8BAA8B;QAC9B,6BAA6B;QAC7B,2BAA2B;QAC3B,6BAA6B;QAC7B,EAAE;QACF,MAAM;YACJ,CAAC,CAAC;gBACE,mBAAmB;gBACnB,EAAE;gBACF,SAAS,MAAM,CAAC,IAAI,EAAE;gBACtB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;gBACrE,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,mBAAmB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACvD,CAAC,CAAC,SAAS;gBACb,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;gBACzE,EAAE;aACH;iBACE,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBAC/C,IAAI,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,EAAE;QACN,OAAO;YACL,CAAC,CAAC;gBACE,oBAAoB;gBACpB,EAAE;gBACF,OAAO,CAAC,IAAI;gBACZ,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,sDAAsD;QAC1D,sBAAsB;QACtB,EAAE;QACF,0FAA0F;QAC1F,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI;QAC5B,CAAC,CAAC,MAAM,eAAe,CAAC;YACpB,GAAG;YACH,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU,IAAI,WAAW,IAAI,OAAO;YAC1C,OAAO;YACP,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,OAAO;QACP,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC;QAC/B,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA2B;IACnE,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC;QAClD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ export type CodexPluginManifest = {
2
+ name: string;
3
+ version: string;
4
+ description: string;
5
+ author: {
6
+ name: string;
7
+ url: string;
8
+ };
9
+ homepage: string;
10
+ repository: string;
11
+ license: string;
12
+ keywords: string[];
13
+ skills: string;
14
+ interface: {
15
+ displayName: string;
16
+ shortDescription: string;
17
+ longDescription: string;
18
+ developerName: string;
19
+ category: string;
20
+ capabilities: string[];
21
+ defaultPrompt: string[];
22
+ websiteURL: string;
23
+ brandColor: string;
24
+ screenshots: string[];
25
+ };
26
+ };
27
+ export type CodexPluginFile = {
28
+ relativePath: string;
29
+ content: string;
30
+ };
31
+ export type CodexPluginFileStatus = "ok" | "missing" | "changed";
32
+ export type CodexPluginInspection = {
33
+ root: string;
34
+ ok: boolean;
35
+ files: Array<{
36
+ relativePath: string;
37
+ status: CodexPluginFileStatus;
38
+ }>;
39
+ };
40
+ export declare function buildCodexPluginManifest(): CodexPluginManifest;
41
+ export declare function codexPluginFiles(): CodexPluginFile[];
42
+ export declare function installCodexPlugin(options?: {
43
+ cwd?: string;
44
+ force?: boolean;
45
+ }): Promise<{
46
+ root: string;
47
+ files: string[];
48
+ }>;
49
+ export declare function inspectCodexPlugin(options?: {
50
+ cwd?: string;
51
+ }): Promise<CodexPluginInspection>;
@@ -0,0 +1,228 @@
1
+ import path from "node:path";
2
+ import { briefopsVersion } from "../version.js";
3
+ import { BriefOpsError } from "./errors.js";
4
+ import { workspacePaths } from "./paths.js";
5
+ import { pathExists, readTextFile, writeTextFile } from "./storage.js";
6
+ import { requireWorkspace } from "./workspace.js";
7
+ export function buildCodexPluginManifest() {
8
+ return {
9
+ name: "briefops",
10
+ version: briefopsVersion,
11
+ description: "Local-first, token-aware persistent work history for Codex workflows.",
12
+ author: {
13
+ name: "BriefOps contributors",
14
+ url: "https://github.com/simony-816/briefops"
15
+ },
16
+ homepage: "https://github.com/simony-816/briefops",
17
+ repository: "https://github.com/simony-816/briefops",
18
+ license: "MIT",
19
+ keywords: ["codex", "local-first", "context", "memory", "handoff", "workflow"],
20
+ skills: "./skills/",
21
+ interface: {
22
+ displayName: "BriefOps",
23
+ shortDescription: "local-first context priming and continuity for Codex",
24
+ longDescription: "Use BriefOps to prime Codex with compact local context, record task outcomes, review durable memory proposals, and resume persistent workers without hosted services.",
25
+ developerName: "BriefOps contributors",
26
+ category: "Developer Tools",
27
+ capabilities: ["Read", "Write"],
28
+ defaultPrompt: [
29
+ "Start this task with the smallest useful BriefOps context.",
30
+ "Finish this task and prepare memory for the next thread."
31
+ ],
32
+ websiteURL: "https://github.com/simony-816/briefops",
33
+ brandColor: "#2563EB",
34
+ screenshots: []
35
+ }
36
+ };
37
+ }
38
+ function pluginManifestContent() {
39
+ return `${JSON.stringify(buildCodexPluginManifest(), null, 2)}\n`;
40
+ }
41
+ function trustBoundaryLines() {
42
+ return [
43
+ "The BriefOps plugin is a local CLI helper. It does not require network access, does not publish to a marketplace, and should not auto-approve memory or skill patches.",
44
+ "",
45
+ "Use `--export-policy shared-only` before copying context outside the local workspace.",
46
+ ""
47
+ ];
48
+ }
49
+ function briefopsPrimeContextSkill() {
50
+ return [
51
+ "---",
52
+ "name: briefops-prime-context",
53
+ "description: Use when starting work in any Codex project or fresh thread to load the smallest useful BriefOps context before reading large history files",
54
+ "---",
55
+ "",
56
+ "# BriefOps Prime Context",
57
+ "",
58
+ ...trustBoundaryLines(),
59
+ "Use BriefOps before broad repo/history inspection when a `.briefops` workspace exists or may exist.",
60
+ "",
61
+ "Run:",
62
+ "",
63
+ "```bash",
64
+ "briefops prime --format codex --task \"<current user task>\" --max-tokens 800",
65
+ "```",
66
+ "",
67
+ "If the command reports that no workspace exists, keep the response short and suggest `briefops init`.",
68
+ "",
69
+ "Never apply memory automatically. If pending proposals exist, show the review command.",
70
+ "",
71
+ "Treat the prime output as a compact routing brief, not as permission to skip relevant code inspection.",
72
+ ""
73
+ ].join("\n");
74
+ }
75
+ function briefopsFinishTaskSkill() {
76
+ return [
77
+ "---",
78
+ "name: briefops-finish-task",
79
+ "description: Use when finishing a Codex task to record the outcome, propose durable memory, and prepare the next thread without auto-approving memory",
80
+ "---",
81
+ "",
82
+ "# BriefOps Finish Task",
83
+ "",
84
+ ...trustBoundaryLines(),
85
+ "Use BriefOps at the end of meaningful work so future Codex threads do not spend tokens rediscovering the same decisions, risks, and lessons.",
86
+ "",
87
+ "Run a scoped finish command with the actual result and any durable candidates:",
88
+ "",
89
+ "```bash",
90
+ "briefops finish --worker <worker> --task \"<task>\" --result \"<result>\" --lesson \"<lesson>\" --next-step \"<next step>\"",
91
+ "```",
92
+ "",
93
+ "Only include lessons, decisions, incidents, open risks, and next steps that will help future work. Do not store secrets or personal data.",
94
+ "",
95
+ "If a memory proposal is created, ask the user to review it. Never run `briefops approve` without explicit user confirmation.",
96
+ ""
97
+ ].join("\n");
98
+ }
99
+ function briefopsReviewMemorySkill() {
100
+ return [
101
+ "---",
102
+ "name: briefops-review-memory",
103
+ "description: Use when BriefOps reports pending memory proposals or skill patches that need human review before becoming durable local memory",
104
+ "---",
105
+ "",
106
+ "# BriefOps Review Memory",
107
+ "",
108
+ ...trustBoundaryLines(),
109
+ "BriefOps memory is human-approved. Pending proposals are local drafts until the user accepts or rejects them.",
110
+ "",
111
+ "Inspect proposals before applying:",
112
+ "",
113
+ "```bash",
114
+ "briefops memory proposal-show latest",
115
+ "briefops inbox",
116
+ "```",
117
+ "",
118
+ "Apply only after explicit user confirmation:",
119
+ "",
120
+ "```bash",
121
+ "briefops approve latest",
122
+ "```",
123
+ "",
124
+ "Reject inaccurate, duplicate, sensitive, or overly broad proposals instead of carrying noisy context into future threads.",
125
+ ""
126
+ ].join("\n");
127
+ }
128
+ function briefopsContinueWorkerSkill() {
129
+ return [
130
+ "---",
131
+ "name: briefops-continue-worker",
132
+ "description: Use when continuing a persistent BriefOps worker in a fresh Codex thread with a handoff, resume prompt, or portable pack",
133
+ "---",
134
+ "",
135
+ "# BriefOps Continue Worker",
136
+ "",
137
+ ...trustBoundaryLines(),
138
+ "Use this workflow when the user wants a fresh Codex thread to continue prior work with the same worker identity, project constraints, memory, and risks.",
139
+ "",
140
+ "Prepare a resume prompt and optional portable pack:",
141
+ "",
142
+ "```bash",
143
+ "briefops continue --worker <worker> --task \"<next task>\" --pack",
144
+ "```",
145
+ "",
146
+ "If BriefOps reports pending memory proposals, surface the review command before continuing. Do not apply memory automatically.",
147
+ "",
148
+ "Use portable packs only as explicit local user artifacts. They may include private local memory and should be reviewed before sharing.",
149
+ ""
150
+ ].join("\n");
151
+ }
152
+ export function codexPluginFiles() {
153
+ return [
154
+ {
155
+ relativePath: ".codex-plugin/plugin.json",
156
+ content: pluginManifestContent()
157
+ },
158
+ {
159
+ relativePath: "skills/briefops-prime-context/SKILL.md",
160
+ content: briefopsPrimeContextSkill()
161
+ },
162
+ {
163
+ relativePath: "skills/briefops-finish-task/SKILL.md",
164
+ content: briefopsFinishTaskSkill()
165
+ },
166
+ {
167
+ relativePath: "skills/briefops-review-memory/SKILL.md",
168
+ content: briefopsReviewMemorySkill()
169
+ },
170
+ {
171
+ relativePath: "skills/briefops-continue-worker/SKILL.md",
172
+ content: briefopsContinueWorkerSkill()
173
+ }
174
+ ];
175
+ }
176
+ async function writeGeneratedPluginFile(options) {
177
+ if (await pathExists(options.target)) {
178
+ const existing = await readTextFile(options.target);
179
+ if (existing === options.content) {
180
+ return;
181
+ }
182
+ if (!options.force) {
183
+ throw new BriefOpsError(`Generated plugin file has local changes: ${options.target}. Re-run with --force to overwrite.`);
184
+ }
185
+ }
186
+ await writeTextFile(options.target, options.content, { force: true });
187
+ }
188
+ export async function installCodexPlugin(options = {}) {
189
+ const cwd = options.cwd ?? process.cwd();
190
+ await requireWorkspace(cwd);
191
+ const root = path.join(workspacePaths(cwd).codex, "plugin", "briefops");
192
+ const files = [];
193
+ for (const file of codexPluginFiles()) {
194
+ const target = path.join(root, file.relativePath);
195
+ await writeGeneratedPluginFile({
196
+ target,
197
+ content: file.content,
198
+ force: Boolean(options.force)
199
+ });
200
+ files.push(file.relativePath);
201
+ }
202
+ return { root, files };
203
+ }
204
+ export async function inspectCodexPlugin(options = {}) {
205
+ const cwd = options.cwd ?? process.cwd();
206
+ await requireWorkspace(cwd);
207
+ const root = path.join(workspacePaths(cwd).codex, "plugin", "briefops");
208
+ const files = await Promise.all(codexPluginFiles().map(async (file) => {
209
+ const target = path.join(root, file.relativePath);
210
+ if (!(await pathExists(target))) {
211
+ return {
212
+ relativePath: file.relativePath,
213
+ status: "missing"
214
+ };
215
+ }
216
+ const status = (await readTextFile(target)) === file.content ? "ok" : "changed";
217
+ return {
218
+ relativePath: file.relativePath,
219
+ status
220
+ };
221
+ }));
222
+ return {
223
+ root,
224
+ ok: files.every((file) => file.status === "ok"),
225
+ files
226
+ };
227
+ }
228
+ //# sourceMappingURL=codexPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexPlugin.js","sourceRoot":"","sources":["../../src/core/codexPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const workspaceSchemaVersion = "1.0.0";
2
+ export declare function assertCompatibleWorkspaceVersion(version: string): void;
@@ -0,0 +1,16 @@
1
+ import { BriefOpsError } from "./errors.js";
2
+ export const workspaceSchemaVersion = "1.0.0";
3
+ function parseMajorVersion(version) {
4
+ const match = version.trim().match(/^(\d+)(?:\.|$)/);
5
+ return match ? Number(match[1]) : undefined;
6
+ }
7
+ export function assertCompatibleWorkspaceVersion(version) {
8
+ const major = parseMajorVersion(version);
9
+ if (major === undefined) {
10
+ throw new BriefOpsError(`Invalid BriefOps workspace version: ${version}`);
11
+ }
12
+ if (major > 1) {
13
+ throw new BriefOpsError(`Unsupported BriefOps workspace version: ${version}. Upgrade BriefOps before using this workspace.`);
14
+ }
15
+ }
16
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../src/core/compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAE9C,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAe;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,aAAa,CACrB,2CAA2C,OAAO,iDAAiD,CACpG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type BriefOpsConfig = {
2
+ version: string;
3
+ created_at?: string;
4
+ defaults: {
5
+ project?: string;
6
+ worker?: string;
7
+ };
8
+ token_budgets: {
9
+ prime: number;
10
+ resume: number;
11
+ };
12
+ memory_categories: string[];
13
+ };
14
+ export declare function readBriefOpsConfig(cwd?: string): Promise<BriefOpsConfig>;
15
+ export declare function writeBriefOpsConfig(cwd: string, config: BriefOpsConfig): Promise<BriefOpsConfig>;
16
+ export declare function setDefaultWorker(options: {
17
+ cwd?: string;
18
+ worker: string;
19
+ }): Promise<BriefOpsConfig>;