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,77 @@
1
+ import YAML from "yaml";
2
+ import { z } from "zod";
3
+ import { assertCompatibleWorkspaceVersion, workspaceSchemaVersion } from "./compatibility.js";
4
+ import { BriefOpsError } from "./errors.js";
5
+ import { memoryCategories, normalizeName, workspacePaths } from "./paths.js";
6
+ import { pathExists, readTextFile, writeYamlFile } from "./storage.js";
7
+ import { readWorker } from "./worker.js";
8
+ import { requireWorkspace } from "./workspace.js";
9
+ const defaultTokenBudgets = {
10
+ prime: 800,
11
+ resume: 3000
12
+ };
13
+ const rawConfigSchema = z.object({
14
+ version: z.string().optional(),
15
+ created_at: z.string().optional(),
16
+ defaults: z.object({
17
+ project: z.string().optional(),
18
+ worker: z.string().optional()
19
+ }).default({}),
20
+ token_budgets: z.object({
21
+ prime: z.number().int().positive().optional(),
22
+ resume: z.number().int().positive().optional()
23
+ }).default({}),
24
+ memory_categories: z.array(z.string()).default([...memoryCategories])
25
+ }).passthrough();
26
+ function normalizeConfig(raw) {
27
+ const version = raw.version ?? workspaceSchemaVersion;
28
+ assertCompatibleWorkspaceVersion(version);
29
+ return {
30
+ version,
31
+ created_at: raw.created_at,
32
+ defaults: {
33
+ project: raw.defaults.project ? normalizeName(raw.defaults.project) : undefined,
34
+ worker: raw.defaults.worker ? normalizeName(raw.defaults.worker) : undefined
35
+ },
36
+ token_budgets: {
37
+ prime: raw.token_budgets.prime ?? defaultTokenBudgets.prime,
38
+ resume: raw.token_budgets.resume ?? defaultTokenBudgets.resume
39
+ },
40
+ memory_categories: raw.memory_categories.length > 0 ? raw.memory_categories : [...memoryCategories]
41
+ };
42
+ }
43
+ export async function readBriefOpsConfig(cwd = process.cwd()) {
44
+ await requireWorkspace(cwd);
45
+ const configPath = workspacePaths(cwd).config;
46
+ if (!(await pathExists(configPath))) {
47
+ return normalizeConfig(rawConfigSchema.parse({}));
48
+ }
49
+ const raw = await readTextFile(configPath);
50
+ const parsed = YAML.parse(raw) ?? {};
51
+ const result = rawConfigSchema.safeParse(parsed);
52
+ if (!result.success) {
53
+ throw new BriefOpsError(`Invalid config ${configPath}: ${result.error.message}`);
54
+ }
55
+ return normalizeConfig(result.data);
56
+ }
57
+ export async function writeBriefOpsConfig(cwd, config) {
58
+ await requireWorkspace(cwd);
59
+ const normalized = normalizeConfig(rawConfigSchema.parse(config));
60
+ await writeYamlFile(workspacePaths(cwd).config, normalized);
61
+ return normalized;
62
+ }
63
+ export async function setDefaultWorker(options) {
64
+ const cwd = options.cwd ?? process.cwd();
65
+ const worker = await readWorker(cwd, options.worker);
66
+ const config = await readBriefOpsConfig(cwd);
67
+ return writeBriefOpsConfig(cwd, {
68
+ ...config,
69
+ version: workspaceSchemaVersion,
70
+ defaults: {
71
+ ...config.defaults,
72
+ project: worker.project,
73
+ worker: worker.name
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const defaultContextBudgets: {
2
+ readonly exportAgentsMd: 500;
3
+ readonly exportClaudeMd: 700;
4
+ readonly exportCursorRule: 350;
5
+ readonly exportCursorTotal: 1200;
6
+ readonly prime: 800;
7
+ readonly handoff: 2500;
8
+ readonly resumePack: 3000;
9
+ };
10
+ export type BudgetStatus = "ok" | "warn" | "over";
11
+ export declare function budgetStatus(used: number, budget: number): BudgetStatus;
12
+ export declare function formatBudgetLine(label: string, used: number, budget: number): string;
@@ -0,0 +1,22 @@
1
+ export const defaultContextBudgets = {
2
+ exportAgentsMd: 500,
3
+ exportClaudeMd: 700,
4
+ exportCursorRule: 350,
5
+ exportCursorTotal: 1200,
6
+ prime: 800,
7
+ handoff: 2500,
8
+ resumePack: 3000
9
+ };
10
+ export function budgetStatus(used, budget) {
11
+ if (used <= budget) {
12
+ return "ok";
13
+ }
14
+ if (used <= Math.ceil(budget * 1.6)) {
15
+ return "warn";
16
+ }
17
+ return "over";
18
+ }
19
+ export function formatBudgetLine(label, used, budget) {
20
+ return `${label}: ${used} / ${budget} tokens (${budgetStatus(used, budget)})`;
21
+ }
22
+ //# sourceMappingURL=contextBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextBudget.js","sourceRoot":"","sources":["../../src/core/contextBudget.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;IACnB,gBAAgB,EAAE,GAAG;IACrB,iBAAiB,EAAE,IAAI;IACvB,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;CACR,CAAC;AAIX,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY,EAAE,MAAc;IAC1E,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,YAAY,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;AAChF,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type ExportPolicy } from "./exportPolicy.js";
2
+ export type CompareContextOptions = {
3
+ cwd?: string;
4
+ worker?: string;
5
+ project?: string;
6
+ task: string;
7
+ maxTokens?: number;
8
+ exportPolicy?: ExportPolicy;
9
+ };
10
+ export type ContextComparison = {
11
+ raw: {
12
+ projectTokens: number;
13
+ workerSummaryTokens: number;
14
+ activeMemoryTokens: number;
15
+ recentLogTokens: number;
16
+ totalTokens: number;
17
+ };
18
+ prime: {
19
+ tokens: number;
20
+ maxTokens: number;
21
+ exportPolicy: ExportPolicy;
22
+ };
23
+ savedTokens: number;
24
+ compressionPercent: number;
25
+ warnings: string[];
26
+ };
27
+ export declare function compareContext(options: CompareContextOptions): Promise<ContextComparison>;
@@ -0,0 +1,97 @@
1
+ import { readBriefOpsConfig } from "./config.js";
2
+ import { BriefOpsError } from "./errors.js";
3
+ import { normalizeExportPolicy } from "./exportPolicy.js";
4
+ import { listWorkLogs } from "./log.js";
5
+ import { listMemory } from "./memory.js";
6
+ import { projectFilePath, workerSummaryFilePath, workspacePaths } from "./paths.js";
7
+ import { primeContext } from "./prime.js";
8
+ import { pathExists, readTextFile } from "./storage.js";
9
+ import { estimateTokens } from "./tokens.js";
10
+ import { readWorker } from "./worker.js";
11
+ async function readOptionalTokens(filePath) {
12
+ if (!(await pathExists(filePath))) {
13
+ return 0;
14
+ }
15
+ return estimateTokens(await readTextFile(filePath));
16
+ }
17
+ export async function compareContext(options) {
18
+ const cwd = options.cwd ?? process.cwd();
19
+ if (!(await pathExists(workspacePaths(cwd).root))) {
20
+ throw new BriefOpsError("No `.briefops` workspace found. Run `briefops init` first.");
21
+ }
22
+ const exportPolicy = normalizeExportPolicy(options.exportPolicy);
23
+ const config = await readBriefOpsConfig(cwd);
24
+ const workerName = options.worker ?? config.defaults.worker;
25
+ if (!workerName) {
26
+ throw new BriefOpsError("Compare context requires --worker or a default worker.");
27
+ }
28
+ const worker = await readWorker(cwd, workerName);
29
+ const project = options.project ?? worker.project ?? config.defaults.project;
30
+ if (!project) {
31
+ throw new BriefOpsError("Compare context requires --project when the worker has no default project.");
32
+ }
33
+ const projectTokens = await readOptionalTokens(projectFilePath(cwd, project));
34
+ const workerSummaryTokens = await readOptionalTokens(workerSummaryFilePath(cwd, worker.name));
35
+ const activeMemory = await listMemory({
36
+ cwd,
37
+ project,
38
+ status: "active"
39
+ });
40
+ const skillSet = new Set(worker.default_skills);
41
+ const activeMemoryText = activeMemory
42
+ .filter((item) => !item.skill || skillSet.size === 0 || skillSet.has(item.skill))
43
+ .map((item) => item.content)
44
+ .join("\n");
45
+ const activeMemoryTokens = estimateTokens(activeMemoryText);
46
+ const recentLogsText = (await listWorkLogs({
47
+ cwd,
48
+ project,
49
+ worker: worker.name,
50
+ limit: 8
51
+ })).map((log) => [
52
+ log.task,
53
+ log.result,
54
+ ...log.lessons,
55
+ ...log.decisions,
56
+ ...log.open_risks,
57
+ ...log.next_steps,
58
+ ...log.incidents,
59
+ log.notes
60
+ ].filter(Boolean).join("\n")).join("\n\n");
61
+ const recentLogTokens = estimateTokens(recentLogsText);
62
+ const rawTotal = projectTokens + workerSummaryTokens + activeMemoryTokens + recentLogTokens;
63
+ const prime = await primeContext({
64
+ cwd,
65
+ worker: worker.name,
66
+ project,
67
+ task: options.task,
68
+ maxTokens: options.maxTokens ?? 800,
69
+ exportPolicy
70
+ });
71
+ const savedTokens = Math.max(0, rawTotal - prime.tokens);
72
+ const compressionPercent = rawTotal > 0 ? Math.round((savedTokens / rawTotal) * 100) : 0;
73
+ const warnings = [
74
+ ...prime.warnings,
75
+ exportPolicy === "shared-only"
76
+ ? "Raw candidate context is a local-only estimate; shared-only prime output omits private memory and logs."
77
+ : undefined
78
+ ].filter((warning) => Boolean(warning));
79
+ return {
80
+ raw: {
81
+ projectTokens,
82
+ workerSummaryTokens,
83
+ activeMemoryTokens,
84
+ recentLogTokens,
85
+ totalTokens: rawTotal
86
+ },
87
+ prime: {
88
+ tokens: prime.tokens,
89
+ maxTokens: options.maxTokens ?? 800,
90
+ exportPolicy
91
+ },
92
+ savedTokens,
93
+ compressionPercent,
94
+ warnings
95
+ };
96
+ }
97
+ //# sourceMappingURL=contextCompare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextCompare.js","sourceRoot":"","sources":["../../src/core/contextCompare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type ContinuityReadiness = "PASS" | "WARN" | "FAIL";
2
+ export type ContinuityHealth = {
3
+ project: string;
4
+ worker: string;
5
+ workspace: {
6
+ project: boolean;
7
+ worker: boolean;
8
+ skills: boolean;
9
+ missingSkills: string[];
10
+ };
11
+ memory: Record<string, number>;
12
+ history: {
13
+ workLogs: number;
14
+ latestLog?: string;
15
+ openRisks: number;
16
+ nextSteps: number;
17
+ };
18
+ readiness: ContinuityReadiness;
19
+ recommendedNextCommand: string;
20
+ };
21
+ export declare function inspectContinuityHealth(options: {
22
+ cwd?: string;
23
+ project: string;
24
+ worker: string;
25
+ }): Promise<ContinuityHealth>;
@@ -0,0 +1,73 @@
1
+ import { listWorkLogs } from "./log.js";
2
+ import { listMemory } from "./memory.js";
3
+ import { memoryCategories, skillFilePath } from "./paths.js";
4
+ import { readProject } from "./project.js";
5
+ import { pathExists } from "./storage.js";
6
+ import { readWorker } from "./worker.js";
7
+ export async function inspectContinuityHealth(options) {
8
+ const cwd = options.cwd ?? process.cwd();
9
+ let projectOk = true;
10
+ let workerOk = true;
11
+ let workerProfile;
12
+ try {
13
+ await readProject(cwd, options.project);
14
+ }
15
+ catch {
16
+ projectOk = false;
17
+ }
18
+ try {
19
+ workerProfile = await readWorker(cwd, options.worker);
20
+ }
21
+ catch {
22
+ workerOk = false;
23
+ }
24
+ const skills = workerProfile?.default_skills ?? [];
25
+ const skillStatuses = await Promise.all(skills.map(async (skill) => [skill, await pathExists(skillFilePath(cwd, skill))]));
26
+ const missingSkills = skillStatuses.filter(([, ok]) => !ok).map(([skill]) => skill);
27
+ const memoryEntries = await Promise.all(memoryCategories.map(async (category) => {
28
+ const items = await listMemory({
29
+ cwd,
30
+ type: category,
31
+ project: options.project,
32
+ status: "active"
33
+ });
34
+ return [category, items.length];
35
+ }));
36
+ const memory = Object.fromEntries(memoryEntries);
37
+ const logs = await listWorkLogs({
38
+ cwd,
39
+ project: options.project,
40
+ worker: options.worker,
41
+ limit: Number.MAX_SAFE_INTEGER
42
+ });
43
+ const openRisks = logs.flatMap((log) => log.open_risks);
44
+ const nextSteps = logs.flatMap((log) => log.next_steps);
45
+ const fail = !projectOk || !workerOk || skills.length === 0;
46
+ const warn = !fail && (missingSkills.length > 0 ||
47
+ logs.length === 0 ||
48
+ openRisks.length === 0 ||
49
+ nextSteps.length === 0 ||
50
+ (memory.lessons ?? 0) === 0);
51
+ const readiness = fail ? "FAIL" : warn ? "WARN" : "PASS";
52
+ const nextTask = nextSteps[0] ?? "<next task>";
53
+ return {
54
+ project: options.project,
55
+ worker: options.worker,
56
+ workspace: {
57
+ project: projectOk,
58
+ worker: workerOk,
59
+ skills: skills.length > 0 && missingSkills.length === 0,
60
+ missingSkills
61
+ },
62
+ memory,
63
+ history: {
64
+ workLogs: logs.length,
65
+ latestLog: logs[0]?.created_at.slice(0, 10),
66
+ openRisks: openRisks.length,
67
+ nextSteps: nextSteps.length
68
+ },
69
+ readiness,
70
+ recommendedNextCommand: `briefops handoff generate --project ${options.project} --worker ${options.worker} --task "${nextTask}" --save`
71
+ };
72
+ }
73
+ //# sourceMappingURL=continuity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuity.js","sourceRoot":"","sources":["../../src/core/continuity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class BriefOpsError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function invariant(condition: unknown, message: string): asserts condition;
@@ -0,0 +1,12 @@
1
+ export class BriefOpsError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "BriefOpsError";
5
+ }
6
+ }
7
+ export function invariant(condition, message) {
8
+ if (!condition) {
9
+ throw new BriefOpsError(message);
10
+ }
11
+ }
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,SAAkB,EAAE,OAAe;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type EvalCase, type EvalResult } from "../schemas/eval.js";
2
+ export type CreateEvalCaseOptions = {
3
+ cwd?: string;
4
+ name: string;
5
+ skill?: string;
6
+ project?: string;
7
+ worker?: string;
8
+ description?: string;
9
+ input?: string;
10
+ expected?: string[];
11
+ passThreshold?: number;
12
+ force?: boolean;
13
+ };
14
+ export type RunEvalOptions = {
15
+ cwd?: string;
16
+ skill?: string;
17
+ project?: string;
18
+ worker?: string;
19
+ budget?: number;
20
+ adapter?: string;
21
+ };
22
+ export type EvalRunSummary = {
23
+ cases: Array<{
24
+ case: EvalCase;
25
+ result: EvalResult;
26
+ }>;
27
+ passed: number;
28
+ failed: number;
29
+ resultPath: string;
30
+ };
31
+ export declare function createEvalCase(options: CreateEvalCaseOptions): Promise<{
32
+ path: string;
33
+ evalCase: EvalCase;
34
+ }>;
35
+ export declare function readEvalCase(cwd: string, id: string): Promise<EvalCase>;
36
+ export declare function listEvalCases(cwd?: string): Promise<EvalCase[]>;
37
+ export declare function runEval(options?: RunEvalOptions): Promise<EvalRunSummary>;
38
+ export declare function showEval(cwd: string, id: string): Promise<string>;
@@ -0,0 +1,180 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import path from "node:path";
3
+ import { BriefOpsError } from "./errors.js";
4
+ import { generateBrief } from "./brief.js";
5
+ import { evalCaseFilePath, normalizeName, workspacePaths } from "./paths.js";
6
+ import { listFilesBySuffix, readTextFile, writeYamlFile } from "./storage.js";
7
+ import { requireWorkspace } from "./workspace.js";
8
+ import { evalCaseSchema, evalResultSchema } from "../schemas/eval.js";
9
+ import YAML from "yaml";
10
+ function resultId(date = new Date()) {
11
+ return `eval_${date.toISOString().replace(/[-:.TZ]/g, "").slice(0, 17)}_${randomBytes(3).toString("hex")}`;
12
+ }
13
+ async function writeEvalCase(cwd, evalCase, force = false) {
14
+ const filePath = evalCaseFilePath(cwd, evalCase.id);
15
+ if (!force) {
16
+ try {
17
+ await readTextFile(filePath);
18
+ throw new BriefOpsError(`File already exists: ${filePath}`);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
22
+ await writeYamlFile(filePath, evalCase);
23
+ return filePath;
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ await writeYamlFile(filePath, evalCase);
29
+ return filePath;
30
+ }
31
+ export async function createEvalCase(options) {
32
+ const cwd = options.cwd ?? process.cwd();
33
+ await requireWorkspace(cwd);
34
+ const expected = options.expected?.map((item) => item.trim()).filter(Boolean) ?? [];
35
+ const evalCase = evalCaseSchema.parse({
36
+ id: normalizeName(options.name),
37
+ skill: options.skill ? normalizeName(options.skill) : undefined,
38
+ project: options.project ? normalizeName(options.project) : undefined,
39
+ worker: options.worker ? normalizeName(options.worker) : undefined,
40
+ description: options.description ?? "",
41
+ input: options.input ?? options.description ?? "",
42
+ expected,
43
+ scoring: {
44
+ type: "checklist",
45
+ pass_threshold: options.passThreshold ?? Math.max(1, expected.length)
46
+ }
47
+ });
48
+ const filePath = await writeEvalCase(cwd, evalCase, Boolean(options.force));
49
+ return { path: filePath, evalCase };
50
+ }
51
+ export async function readEvalCase(cwd, id) {
52
+ await requireWorkspace(cwd);
53
+ const filePath = evalCaseFilePath(cwd, id);
54
+ try {
55
+ const raw = await readTextFile(filePath);
56
+ const parsed = YAML.parse(raw);
57
+ const result = evalCaseSchema.safeParse(parsed);
58
+ if (!result.success) {
59
+ throw new BriefOpsError(`Invalid eval case ${filePath}: ${result.error.message}`);
60
+ }
61
+ return result.data;
62
+ }
63
+ catch (error) {
64
+ if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
65
+ throw new BriefOpsError(`Eval case not found: ${id}`);
66
+ }
67
+ throw error;
68
+ }
69
+ }
70
+ export async function listEvalCases(cwd = process.cwd()) {
71
+ await requireWorkspace(cwd);
72
+ const files = await listFilesBySuffix(workspacePaths(cwd).evals, ".eval.yaml");
73
+ const cases = await Promise.all(files.map(async (filePath) => {
74
+ const raw = await readTextFile(filePath);
75
+ const parsed = YAML.parse(raw);
76
+ const result = evalCaseSchema.safeParse(parsed);
77
+ if (!result.success) {
78
+ throw new BriefOpsError(`Invalid eval case ${filePath}: ${result.error.message}`);
79
+ }
80
+ return result.data;
81
+ }));
82
+ return cases.sort((a, b) => a.id.localeCompare(b.id));
83
+ }
84
+ function matchesCase(evalCase, filters) {
85
+ const skill = filters.skill ? normalizeName(filters.skill) : undefined;
86
+ const project = filters.project ? normalizeName(filters.project) : undefined;
87
+ const worker = filters.worker ? normalizeName(filters.worker) : undefined;
88
+ return ((skill ? (evalCase.skill ?? skill) === skill : true) &&
89
+ (project ? (evalCase.project ?? project) === project : true) &&
90
+ (worker ? (evalCase.worker ?? worker) === worker : true));
91
+ }
92
+ function scoreChecklist(content, expected) {
93
+ const haystack = content.toLowerCase();
94
+ const matched = [];
95
+ const missing = [];
96
+ for (const item of expected) {
97
+ if (haystack.includes(item.toLowerCase())) {
98
+ matched.push(item);
99
+ }
100
+ else {
101
+ missing.push(item);
102
+ }
103
+ }
104
+ return { matched, missing };
105
+ }
106
+ export async function runEval(options = {}) {
107
+ const cwd = options.cwd ?? process.cwd();
108
+ await requireWorkspace(cwd);
109
+ const cases = (await listEvalCases(cwd)).filter((evalCase) => matchesCase(evalCase, options));
110
+ if (cases.length === 0) {
111
+ throw new BriefOpsError("No eval cases matched the requested filters.");
112
+ }
113
+ const results = [];
114
+ for (const evalCase of cases) {
115
+ const skill = options.skill ?? evalCase.skill;
116
+ const project = options.project ?? evalCase.project;
117
+ const worker = options.worker ?? evalCase.worker;
118
+ if (!worker && (!skill || !project)) {
119
+ throw new BriefOpsError(`Eval case ${evalCase.id} needs either a worker or both skill and project.`);
120
+ }
121
+ const generated = await generateBrief({
122
+ cwd,
123
+ skill,
124
+ project,
125
+ worker,
126
+ task: evalCase.input || evalCase.description,
127
+ budget: options.budget ?? 2000,
128
+ adapter: options.adapter
129
+ });
130
+ const scored = scoreChecklist(generated.content, evalCase.expected);
131
+ const passThreshold = evalCase.scoring.pass_threshold ?? Math.max(1, evalCase.expected.length);
132
+ const result = evalResultSchema.parse({
133
+ id: resultId(),
134
+ created_at: new Date().toISOString(),
135
+ case_id: evalCase.id,
136
+ skill,
137
+ project,
138
+ worker,
139
+ passed: scored.matched.length >= passThreshold,
140
+ score: scored.matched.length,
141
+ pass_threshold: passThreshold,
142
+ matched: scored.matched,
143
+ missing: scored.missing,
144
+ brief_tokens: generated.totalTokens
145
+ });
146
+ results.push({ case: evalCase, result });
147
+ }
148
+ const resultPath = path.join(workspacePaths(cwd).evalResults, `${resultId()}.yaml`);
149
+ await writeYamlFile(resultPath, results.map((item) => item.result));
150
+ const passed = results.filter((item) => item.result.passed).length;
151
+ return {
152
+ cases: results,
153
+ passed,
154
+ failed: results.length - passed,
155
+ resultPath
156
+ };
157
+ }
158
+ export async function showEval(cwd, id) {
159
+ await requireWorkspace(cwd);
160
+ const casePath = evalCaseFilePath(cwd, id);
161
+ try {
162
+ return await readTextFile(casePath);
163
+ }
164
+ catch (error) {
165
+ if (!(error instanceof BriefOpsError && error.message.startsWith("File not found"))) {
166
+ throw error;
167
+ }
168
+ }
169
+ const resultPath = path.join(workspacePaths(cwd).evalResults, `${normalizeName(id)}.yaml`);
170
+ try {
171
+ return await readTextFile(resultPath);
172
+ }
173
+ catch (error) {
174
+ if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
175
+ throw new BriefOpsError(`Eval case or result not found: ${id}`);
176
+ }
177
+ throw error;
178
+ }
179
+ }
180
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/core/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MemoryItem } from "../schemas/memory.js";
2
+ export type ExportPolicy = "local-private" | "shared-only";
3
+ export declare const defaultExportPolicy: ExportPolicy;
4
+ export declare const sharedOnlyOmissionNote = "Shared-only export policy is active. Private local memory, raw work logs, open risks, local next steps, and private worker history are omitted.";
5
+ export declare function normalizeExportPolicy(value?: string): ExportPolicy;
6
+ export declare function isSharedExportableMemory(item: MemoryItem): boolean;
7
+ export declare function filterMemoryForExport(items: MemoryItem[], exportPolicy: ExportPolicy): MemoryItem[];
@@ -0,0 +1,17 @@
1
+ import { BriefOpsError } from "./errors.js";
2
+ export const defaultExportPolicy = "local-private";
3
+ export const sharedOnlyOmissionNote = "Shared-only export policy is active. Private local memory, raw work logs, open risks, local next steps, and private worker history are omitted.";
4
+ export function normalizeExportPolicy(value) {
5
+ const policy = (value ?? defaultExportPolicy).trim().toLowerCase();
6
+ if (policy === "local-private" || policy === "shared-only") {
7
+ return policy;
8
+ }
9
+ throw new BriefOpsError(`Invalid export policy: ${value}`);
10
+ }
11
+ export function isSharedExportableMemory(item) {
12
+ return item.visibility === "shared" && item.exportable === true;
13
+ }
14
+ export function filterMemoryForExport(items, exportPolicy) {
15
+ return exportPolicy === "shared-only" ? items.filter(isSharedExportableMemory) : items;
16
+ }
17
+ //# sourceMappingURL=exportPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportPolicy.js","sourceRoot":"","sources":["../../src/core/exportPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,CAAC,MAAM,mBAAmB,GAAiB,eAAe,CAAC;AAEjE,MAAM,CAAC,MAAM,sBAAsB,GACjC,iJAAiJ,CAAC;AAEpJ,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnE,IAAI,MAAM,KAAK,eAAe,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,aAAa,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAgB;IACvD,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAmB,EACnB,YAA0B;IAE1B,OAAO,YAAY,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzF,CAAC"}