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,42 @@
1
+ import path from "node:path";
2
+ import { normalizeExportPolicy } from "../core/exportPolicy.js";
3
+ import { packResume } from "../core/workflow.js";
4
+ import { parsePositiveInt } from "./shared.js";
5
+ export function registerPackCommands(program) {
6
+ const pack = program
7
+ .command("pack")
8
+ .description("Create portable context packs for fresh AI coding threads.");
9
+ pack
10
+ .command("resume")
11
+ .description("Create a self-contained resume pack markdown file.")
12
+ .requiredOption("--worker <worker>", "Worker profile name.")
13
+ .option("--project <project>", "Project name.")
14
+ .requiredOption("--task <task>", "Next task.")
15
+ .option("--budget <tokens>", "Resume token budget.", parsePositiveInt, 3000)
16
+ .option("--export-policy <policy>", "local-private|shared-only", "local-private")
17
+ .option("--output <path>", "Write the pack to a specific path.")
18
+ .option("--force", "Overwrite an existing explicit output file.")
19
+ .action(async (options) => {
20
+ const result = await packResume({
21
+ worker: options.worker,
22
+ project: options.project,
23
+ task: options.task,
24
+ budget: options.budget,
25
+ exportPolicy: normalizeExportPolicy(options.exportPolicy),
26
+ outputPath: options.output
27
+ ? path.resolve(process.cwd(), options.output)
28
+ : undefined,
29
+ force: Boolean(options.force)
30
+ });
31
+ console.log(`Saved portable resume pack: ${result.path}`);
32
+ console.log(`Estimated tokens: ${result.tokens}`);
33
+ if (result.warnings.length > 0) {
34
+ console.log("");
35
+ console.log("Warnings:");
36
+ for (const warning of result.warnings) {
37
+ console.log(`- ${warning}`);
38
+ }
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4DAA4D,CAAC,CAAC;IAE7E,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,cAAc,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;SAC9C,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,IAAI,CAAC;SAC3E,MAAM,CAAC,0BAA0B,EAAE,2BAA2B,EAAE,eAAe,CAAC;SAChF,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,SAAS,EAAE,6CAA6C,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,OAAO,EAAE,OAAO,CAAC,OAA6B;YAC9C,IAAI,EAAE,OAAO,CAAC,IAAc;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,YAAY,EAAE,qBAAqB,CAAC,OAAO,CAAC,YAAkC,CAAC;YAC/E,UAAU,EAAE,OAAO,CAAC,MAAM;gBACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAgB,CAAC;gBACvD,CAAC,CAAC,SAAS;YACb,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import { type PrimeContextOptions } from "../core/prime.js";
3
+ export declare function runPrimeCommand(options: Record<string, unknown>, overrides?: Partial<PrimeContextOptions>): Promise<void>;
4
+ export declare function registerPrimeCommand(program: Command): void;
@@ -0,0 +1,44 @@
1
+ import { normalizeExportPolicy } from "../core/exportPolicy.js";
2
+ import { primeContext } from "../core/prime.js";
3
+ import { parsePositiveInt } from "./shared.js";
4
+ function normalizeFormat(value) {
5
+ const format = (value ?? "markdown").trim().toLowerCase();
6
+ if (format === "markdown" || format === "codex") {
7
+ return format;
8
+ }
9
+ throw new Error(`Invalid prime format: ${value}`);
10
+ }
11
+ export async function runPrimeCommand(options, overrides = {}) {
12
+ const result = await primeContext({
13
+ worker: options.worker,
14
+ project: options.project,
15
+ task: options.task,
16
+ maxTokens: options.maxTokens,
17
+ format: overrides.format ?? normalizeFormat(options.format),
18
+ exportPolicy: overrides.exportPolicy ??
19
+ normalizeExportPolicy(options.exportPolicy)
20
+ });
21
+ console.log(result.content);
22
+ console.error(`Estimated tokens: ${result.tokens}`);
23
+ if (result.warnings.length > 0) {
24
+ console.error("Warnings:");
25
+ for (const warning of result.warnings) {
26
+ console.error(`- ${warning}`);
27
+ }
28
+ }
29
+ }
30
+ export function registerPrimeCommand(program) {
31
+ program
32
+ .command("prime")
33
+ .description("Print compact BriefOps context for starting a fresh AI coding thread.")
34
+ .option("--worker <worker>", "Worker profile name.")
35
+ .option("--project <project>", "Project name.")
36
+ .option("--task <task>", "Current task.")
37
+ .option("--max-tokens <tokens>", "Prime context token budget.", parsePositiveInt, 800)
38
+ .option("--format <format>", "markdown|codex", "markdown")
39
+ .option("--export-policy <policy>", "local-private|shared-only", "local-private")
40
+ .action(async (options) => {
41
+ await runPrimeCommand(options);
42
+ });
43
+ }
44
+ //# sourceMappingURL=prime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime.js","sourceRoot":"","sources":["../../src/commands/prime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgC,EAChC,YAA0C,EAAE;IAE5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAA4B;QAC5C,OAAO,EAAE,OAAO,CAAC,OAA6B;QAC9C,IAAI,EAAE,OAAO,CAAC,IAA0B;QACxC,SAAS,EAAE,OAAO,CAAC,SAA+B;QAClD,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,MAA4B,CAAC;QACjF,YAAY,EACV,SAAS,CAAC,YAAY;YACtB,qBAAqB,CAAC,OAAO,CAAC,YAAkC,CAAC;KACpE,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;SAC9C,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC;SACxC,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,GAAG,CAAC;SACrF,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,UAAU,CAAC;SACzD,MAAM,CAAC,0BAA0B,EAAE,2BAA2B,EAAE,eAAe,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;QACjD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerProjectCommands(program: Command): void;
@@ -0,0 +1,50 @@
1
+ import { createProject, listProjects, showProject } from "../core/project.js";
2
+ import { parseCommaList } from "../core/storage.js";
3
+ import { parsePositiveInt, printTable } from "./shared.js";
4
+ export function registerProjectCommands(program) {
5
+ const project = program.command("project").description("Manage project context files.");
6
+ project
7
+ .command("create <name>")
8
+ .description("Create a project markdown file.")
9
+ .option("--description <description>", "Project description.")
10
+ .option("--tags <tags>", "Comma-separated tags.")
11
+ .option("--max-tokens <tokens>", "Component token budget.", parsePositiveInt)
12
+ .option("--force", "Overwrite an existing project file.")
13
+ .action(async (name, options) => {
14
+ const result = await createProject({
15
+ name,
16
+ description: options.description,
17
+ tags: parseCommaList(options.tags),
18
+ maxTokens: options.maxTokens,
19
+ force: Boolean(options.force)
20
+ });
21
+ console.log(`Created project: ${result.name}`);
22
+ console.log(result.path);
23
+ });
24
+ project
25
+ .command("list")
26
+ .description("List projects.")
27
+ .action(async () => {
28
+ const projects = await listProjects(process.cwd());
29
+ if (projects.length === 0) {
30
+ console.log("No projects found.");
31
+ return;
32
+ }
33
+ printTable([
34
+ ["Name", "Max Tokens", "Tags", "Description"],
35
+ ...projects.map((item) => [
36
+ item.data.name,
37
+ String(item.data.max_tokens),
38
+ item.data.tags.join(","),
39
+ item.data.description
40
+ ])
41
+ ]);
42
+ });
43
+ project
44
+ .command("show <name>")
45
+ .description("Print a project file.")
46
+ .action(async (name) => {
47
+ console.log(await showProject(process.cwd(), name));
48
+ });
49
+ }
50
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAExF,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,6BAA6B,EAAE,sBAAsB,CAAC;SAC7D,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;SAChD,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,gBAAgB,CAAC;SAC5E,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAgC,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,IAAI;YACJ,WAAW,EAAE,OAAO,CAAC,WAAiC;YACtD,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,IAA0B,CAAC;YACxD,SAAS,EAAE,OAAO,CAAC,SAA+B;YAClD,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,UAAU,CAAC;YACT,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC;YAC7C,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,IAAI;gBACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,WAAW;aACtB,CAAC;SACH,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function parsePositiveInt(value: string): number;
2
+ export declare function collectRepeated(value: string, previous?: string[]): string[];
3
+ export declare function printTable(rows: string[][]): void;
@@ -0,0 +1,24 @@
1
+ import { InvalidArgumentError } from "commander";
2
+ export function parsePositiveInt(value) {
3
+ const parsed = Number.parseInt(value, 10);
4
+ if (!Number.isFinite(parsed) || parsed <= 0) {
5
+ throw new InvalidArgumentError("Expected a positive integer.");
6
+ }
7
+ return parsed;
8
+ }
9
+ export function collectRepeated(value, previous = []) {
10
+ return [...previous, value];
11
+ }
12
+ export function printTable(rows) {
13
+ if (rows.length === 0) {
14
+ return;
15
+ }
16
+ const widths = rows[0].map((_, column) => Math.max(...rows.map((row) => row[column]?.length ?? 0)));
17
+ for (const row of rows) {
18
+ console.log(row
19
+ .map((cell, index) => cell.padEnd(widths[index]))
20
+ .join(" ")
21
+ .trimEnd());
22
+ }
23
+ }
24
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAAC,8BAA8B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,WAAqB,EAAE;IACpE,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACvC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CACzD,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,GAAG;aACA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAChD,IAAI,CAAC,IAAI,CAAC;aACV,OAAO,EAAE,CACb,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerSkillCommands(program: Command): void;
@@ -0,0 +1,146 @@
1
+ import { applySkillPatch, listSkillPatches, proposeSkillPatch, readSkillPatch, rejectSkillPatch, renderSkillPatchDiff } from "../core/patch.js";
2
+ import { normalizeName } from "../core/paths.js";
3
+ import { createSkill, listSkills, readSkill, showSkill } from "../core/skill.js";
4
+ import { parseCommaList } from "../core/storage.js";
5
+ import { parsePositiveInt, printTable } from "./shared.js";
6
+ function extractChangelog(body) {
7
+ const lines = body.split(/\r?\n/);
8
+ const start = lines.findIndex((line) => /^##\s+changelog\s*$/i.test(line.trim()));
9
+ if (start === -1) {
10
+ return "No changelog entries found.";
11
+ }
12
+ const section = [];
13
+ for (const line of lines.slice(start)) {
14
+ if (section.length > 0 && /^##\s+/.test(line.trim())) {
15
+ break;
16
+ }
17
+ section.push(line);
18
+ }
19
+ return section.join("\n").trim();
20
+ }
21
+ export function registerSkillCommands(program) {
22
+ const skill = program.command("skill").description("Manage reusable task skills.");
23
+ skill
24
+ .command("create <name>")
25
+ .description("Create a skill markdown file.")
26
+ .option("--description <description>", "Skill description.")
27
+ .option("--tags <tags>", "Comma-separated tags.")
28
+ .option("--max-tokens <tokens>", "Component token budget.", parsePositiveInt)
29
+ .option("--force", "Overwrite an existing skill file.")
30
+ .action(async (name, options) => {
31
+ const result = await createSkill({
32
+ name,
33
+ description: options.description,
34
+ tags: parseCommaList(options.tags),
35
+ maxTokens: options.maxTokens,
36
+ force: Boolean(options.force)
37
+ });
38
+ console.log(`Created skill: ${result.name}`);
39
+ console.log(result.path);
40
+ });
41
+ skill
42
+ .command("list")
43
+ .description("List available skills.")
44
+ .action(async () => {
45
+ const skills = await listSkills(process.cwd());
46
+ if (skills.length === 0) {
47
+ console.log("No skills found.");
48
+ return;
49
+ }
50
+ printTable([
51
+ ["Name", "Version", "Max Tokens", "Tags", "Description"],
52
+ ...skills.map((item) => [
53
+ item.data.name,
54
+ item.data.version,
55
+ String(item.data.max_tokens),
56
+ item.data.tags.join(","),
57
+ item.data.description
58
+ ])
59
+ ]);
60
+ });
61
+ skill
62
+ .command("show <name>")
63
+ .description("Print a skill file.")
64
+ .action(async (name) => {
65
+ console.log(await showSkill(process.cwd(), name));
66
+ });
67
+ skill
68
+ .command("history <name>")
69
+ .description("Print the skill changelog section.")
70
+ .action(async (name) => {
71
+ const skillDocument = await readSkill(process.cwd(), name);
72
+ console.log(extractChangelog(skillDocument.body));
73
+ });
74
+ skill
75
+ .command("diff <name>")
76
+ .description("Show patch proposals for a skill.")
77
+ .action(async (name) => {
78
+ const skillName = normalizeName(name);
79
+ const patches = (await listSkillPatches(process.cwd())).filter((patch) => patch.skill === skillName);
80
+ if (patches.length === 0) {
81
+ console.log("No patch proposals found for this skill.");
82
+ return;
83
+ }
84
+ console.log(patches.map(renderSkillPatchDiff).join("\n"));
85
+ });
86
+ skill
87
+ .command("propose-patch")
88
+ .description("Create a human-approved skill patch proposal from a work log lesson.")
89
+ .requiredOption("--skill <skill>", "Skill name.")
90
+ .option("--from-log <id>", "Work log id or latest.", "latest")
91
+ .action(async (options) => {
92
+ const result = await proposeSkillPatch({
93
+ skill: options.skill,
94
+ fromLog: options.fromLog
95
+ });
96
+ console.log(result.diff);
97
+ console.error(`Saved patch: ${result.path}`);
98
+ });
99
+ skill
100
+ .command("apply-patch <name>")
101
+ .description("Apply a proposed skill patch and bump the skill patch version.")
102
+ .requiredOption("--patch <patch>", "Patch id.")
103
+ .action(async (name, options) => {
104
+ const result = await applySkillPatch({
105
+ skill: name,
106
+ patch: options.patch
107
+ });
108
+ console.log(`Applied patch: ${result.patch.id}`);
109
+ console.log(result.skillPath);
110
+ });
111
+ skill
112
+ .command("reject-patch <patch>")
113
+ .description("Reject a proposed skill patch.")
114
+ .action(async (patch) => {
115
+ const result = await rejectSkillPatch({ patch });
116
+ console.log(`Rejected patch: ${result.id}`);
117
+ });
118
+ skill
119
+ .command("patch-list")
120
+ .description("List skill patch proposals.")
121
+ .action(async () => {
122
+ const patches = await listSkillPatches(process.cwd());
123
+ if (patches.length === 0) {
124
+ console.log("No skill patches found.");
125
+ return;
126
+ }
127
+ printTable([
128
+ ["ID", "Status", "Skill", "From Log", "Created"],
129
+ ...patches.map((patch) => [
130
+ patch.id,
131
+ patch.status,
132
+ patch.skill,
133
+ patch.from_log,
134
+ patch.created_at
135
+ ])
136
+ ]);
137
+ });
138
+ skill
139
+ .command("patch-show <patch>")
140
+ .description("Show a skill patch proposal.")
141
+ .action(async (patch) => {
142
+ const result = await readSkillPatch(process.cwd(), patch);
143
+ console.log(renderSkillPatchDiff(result));
144
+ });
145
+ }
146
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerWorkerCommands(program: Command): void;
@@ -0,0 +1,128 @@
1
+ import { readBriefOpsConfig, setDefaultWorker } from "../core/config.js";
2
+ import { createWorker, generateWorkerIntelligence, listWorkers, readWorkerSummary, refreshWorkerSummary, showWorker, summarizeWorker } from "../core/worker.js";
3
+ import { parseCommaList } from "../core/storage.js";
4
+ import { parsePositiveInt, printTable } from "./shared.js";
5
+ export function registerWorkerCommands(program) {
6
+ const worker = program.command("worker").description("Manage worker profiles as skill bundles.");
7
+ worker
8
+ .command("use <name>")
9
+ .description("Select a default worker for future BriefOps thread starts.")
10
+ .action(async (name) => {
11
+ const config = await setDefaultWorker({
12
+ worker: name
13
+ });
14
+ console.log(`Default worker: ${config.defaults.worker ?? ""}`);
15
+ console.log(`Default project: ${config.defaults.project ?? ""}`);
16
+ });
17
+ worker
18
+ .command("current")
19
+ .description("Print the default worker used for future BriefOps thread starts.")
20
+ .action(async () => {
21
+ const config = await readBriefOpsConfig(process.cwd());
22
+ if (!config.defaults.worker) {
23
+ console.log("No default worker selected.");
24
+ return;
25
+ }
26
+ console.log(`Default worker: ${config.defaults.worker}`);
27
+ console.log(`Default project: ${config.defaults.project ?? ""}`);
28
+ });
29
+ worker
30
+ .command("intelligence <name>")
31
+ .description("Print deterministic worker intelligence for continuity handoffs.")
32
+ .option("--budget <tokens>", "Maximum tokens.", parsePositiveInt, 800)
33
+ .action(async (name, options) => {
34
+ const result = await generateWorkerIntelligence({
35
+ name,
36
+ budget: options.budget
37
+ });
38
+ console.log(result.content);
39
+ console.error(`Estimated tokens: ${result.tokens}`);
40
+ });
41
+ worker
42
+ .command("refresh-summary <name>")
43
+ .description("Refresh a persistent worker intelligence summary.")
44
+ .option("--limit <limit>", "Maximum logs to summarize.", parsePositiveInt, 20)
45
+ .action(async (name, options) => {
46
+ const result = await refreshWorkerSummary({
47
+ name,
48
+ limit: options.limit
49
+ });
50
+ console.log(`Refreshed worker summary: ${name}`);
51
+ console.log(result.path);
52
+ console.log(`Estimated tokens: ${result.tokens}`);
53
+ });
54
+ worker
55
+ .command("create <name>")
56
+ .description("Create a worker profile.")
57
+ .option("--description <description>", "Worker description.")
58
+ .option("--project <project>", "Default project.")
59
+ .option("--skills <skills>", "Comma-separated default skills.")
60
+ .option("--style <style>", "Comma-separated style notes.")
61
+ .option("--max-tokens <tokens>", "Worker profile token budget.", parsePositiveInt)
62
+ .option("--force", "Overwrite an existing worker profile.")
63
+ .action(async (name, options) => {
64
+ const result = await createWorker({
65
+ name,
66
+ description: options.description,
67
+ project: options.project,
68
+ skills: parseCommaList(options.skills),
69
+ style: parseCommaList(options.style),
70
+ maxTokens: options.maxTokens,
71
+ force: Boolean(options.force)
72
+ });
73
+ console.log(`Created worker: ${result.worker.name}`);
74
+ console.log(result.path);
75
+ });
76
+ worker
77
+ .command("list")
78
+ .description("List worker profiles.")
79
+ .option("--status <status>", "Filter by status.")
80
+ .action(async (options) => {
81
+ const workers = await listWorkers({
82
+ status: options.status
83
+ });
84
+ if (workers.length === 0) {
85
+ console.log("No workers found.");
86
+ return;
87
+ }
88
+ printTable([
89
+ ["Name", "Status", "Project", "Skills", "Description"],
90
+ ...workers.map((item) => [
91
+ item.name,
92
+ item.status,
93
+ item.project ?? "",
94
+ item.default_skills.join(","),
95
+ item.description
96
+ ])
97
+ ]);
98
+ });
99
+ worker
100
+ .command("show <name>")
101
+ .description("Print a worker profile.")
102
+ .action(async (name) => {
103
+ console.log(await showWorker(process.cwd(), name));
104
+ });
105
+ worker
106
+ .command("summary <name>")
107
+ .description("Print a persistent worker summary, falling back to log history.")
108
+ .option("--limit <limit>", "Maximum logs to summarize.", parsePositiveInt, 5)
109
+ .action(async (name, options) => {
110
+ const summary = await readWorkerSummary(process.cwd(), name);
111
+ console.log(summary ?? (await summarizeWorker(process.cwd(), name, options.limit)));
112
+ });
113
+ worker
114
+ .command("inspect <name>")
115
+ .description("Inspect worker profile and summary state.")
116
+ .action(async (name) => {
117
+ const profile = await showWorker(process.cwd(), name);
118
+ const summary = await readWorkerSummary(process.cwd(), name);
119
+ console.log("## Worker Profile");
120
+ console.log("");
121
+ console.log(profile.trim());
122
+ console.log("");
123
+ console.log("## Summary");
124
+ console.log("");
125
+ console.log(summary ? "present" : "missing; run `briefops worker refresh-summary <worker>`");
126
+ });
127
+ }
128
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/commands/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { TokenReportLine } from "../schemas/brief.js";
2
+ export declare const briefAdapters: readonly ["generic", "codex", "claude-code"];
3
+ export type BriefAdapter = (typeof briefAdapters)[number];
4
+ export type BriefTemplateParts = {
5
+ warnings: string[];
6
+ workerText: string;
7
+ skillText: string;
8
+ projectText: string;
9
+ memoryText: string;
10
+ taskText: string;
11
+ outputContract: string;
12
+ readIfNeeded: string;
13
+ report: TokenReportLine[];
14
+ totalTokens: number;
15
+ budget: number;
16
+ };
17
+ export declare function normalizeBriefAdapter(value?: string): BriefAdapter;
18
+ export declare function renderBriefWithAdapter(options: {
19
+ cwd: string;
20
+ adapter: BriefAdapter;
21
+ parts: BriefTemplateParts;
22
+ }): Promise<string>;