agent-bober 0.8.1 → 0.10.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 (54) hide show
  1. package/README.md +33 -9
  2. package/agents/bober-architect.md +495 -0
  3. package/agents/bober-planner.md +107 -12
  4. package/agents/bober-researcher.md +164 -0
  5. package/dist/cli/commands/init.js +3 -1
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/config/defaults.d.ts.map +1 -1
  8. package/dist/config/defaults.js +6 -0
  9. package/dist/config/defaults.js.map +1 -1
  10. package/dist/config/loader.d.ts.map +1 -1
  11. package/dist/config/loader.js +2 -0
  12. package/dist/config/loader.js.map +1 -1
  13. package/dist/config/schema.d.ts +26 -0
  14. package/dist/config/schema.d.ts.map +1 -1
  15. package/dist/config/schema.js +4 -0
  16. package/dist/config/schema.js.map +1 -1
  17. package/dist/orchestrator/architect-agent.d.ts +34 -0
  18. package/dist/orchestrator/architect-agent.d.ts.map +1 -0
  19. package/dist/orchestrator/architect-agent.js +243 -0
  20. package/dist/orchestrator/architect-agent.js.map +1 -0
  21. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  22. package/dist/orchestrator/pipeline.js +92 -2
  23. package/dist/orchestrator/pipeline.js.map +1 -1
  24. package/dist/orchestrator/planner-agent.d.ts +2 -1
  25. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  26. package/dist/orchestrator/planner-agent.js +33 -2
  27. package/dist/orchestrator/planner-agent.js.map +1 -1
  28. package/dist/orchestrator/research-agent.d.ts +58 -0
  29. package/dist/orchestrator/research-agent.d.ts.map +1 -0
  30. package/dist/orchestrator/research-agent.js +376 -0
  31. package/dist/orchestrator/research-agent.js.map +1 -0
  32. package/dist/state/architect-state.d.ts +25 -0
  33. package/dist/state/architect-state.d.ts.map +1 -0
  34. package/dist/state/architect-state.js +96 -0
  35. package/dist/state/architect-state.js.map +1 -0
  36. package/dist/state/design-state.d.ts +19 -0
  37. package/dist/state/design-state.d.ts.map +1 -0
  38. package/dist/state/design-state.js +42 -0
  39. package/dist/state/design-state.js.map +1 -0
  40. package/dist/state/index.d.ts +6 -1
  41. package/dist/state/index.d.ts.map +1 -1
  42. package/dist/state/index.js +7 -2
  43. package/dist/state/index.js.map +1 -1
  44. package/dist/state/outline-state.d.ts +19 -0
  45. package/dist/state/outline-state.d.ts.map +1 -0
  46. package/dist/state/outline-state.js +42 -0
  47. package/dist/state/outline-state.js.map +1 -0
  48. package/dist/state/research-state.d.ts +16 -0
  49. package/dist/state/research-state.d.ts.map +1 -0
  50. package/dist/state/research-state.js +161 -0
  51. package/dist/state/research-state.js.map +1 -0
  52. package/package.json +1 -1
  53. package/skills/bober.architect/SKILL.md +418 -0
  54. package/skills/bober.research/SKILL.md +219 -0
@@ -0,0 +1,96 @@
1
+ import { readFile, writeFile, readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ensureDir } from "./helpers.js";
4
+ const ARCHITECTURE_DIR = ".bober/architecture";
5
+ function architectureDir(projectRoot) {
6
+ return join(projectRoot, ARCHITECTURE_DIR);
7
+ }
8
+ function architecturePath(projectRoot, id) {
9
+ const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ return join(architectureDir(projectRoot), `${safeId}-architecture.md`);
11
+ }
12
+ function adrPath(projectRoot, id, adrNumber) {
13
+ const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
14
+ return join(architectureDir(projectRoot), `${safeId}-adr-${adrNumber}.md`);
15
+ }
16
+ /**
17
+ * Save an architecture document to disk.
18
+ * Overwrites any existing document with the same id.
19
+ */
20
+ export async function saveArchitecture(projectRoot, id, content) {
21
+ await ensureDir(architectureDir(projectRoot));
22
+ const filePath = architecturePath(projectRoot, id);
23
+ await writeFile(filePath, content, "utf-8");
24
+ }
25
+ /**
26
+ * Read an architecture document by id.
27
+ * Throws if not found.
28
+ */
29
+ export async function readArchitecture(projectRoot, id) {
30
+ const filePath = architecturePath(projectRoot, id);
31
+ try {
32
+ return await readFile(filePath, "utf-8");
33
+ }
34
+ catch (err) {
35
+ throw new Error(`Architecture document "${id}" not found: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
36
+ }
37
+ }
38
+ /**
39
+ * Save an individual ADR file for an architecture.
40
+ * ADRs are saved as separate files: <id>-adr-<N>.md
41
+ */
42
+ export async function saveADR(projectRoot, id, adrNumber, content) {
43
+ await ensureDir(architectureDir(projectRoot));
44
+ const filePath = adrPath(projectRoot, id, adrNumber);
45
+ await writeFile(filePath, content, "utf-8");
46
+ }
47
+ /**
48
+ * Read all ADR files for an architecture, sorted by ADR number.
49
+ * Returns an empty array if none exist.
50
+ */
51
+ export async function readADRs(projectRoot, id) {
52
+ const dir = architectureDir(projectRoot);
53
+ const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
54
+ const prefix = `${safeId}-adr-`;
55
+ let entries;
56
+ try {
57
+ entries = await readdir(dir);
58
+ }
59
+ catch {
60
+ // Directory doesn't exist yet
61
+ return [];
62
+ }
63
+ const adrFiles = entries
64
+ .filter((f) => f.startsWith(prefix) && f.endsWith(".md"))
65
+ .sort((a, b) => {
66
+ // Sort numerically by ADR number
67
+ const numA = parseInt(a.slice(prefix.length, -3), 10);
68
+ const numB = parseInt(b.slice(prefix.length, -3), 10);
69
+ return numA - numB;
70
+ });
71
+ const adrs = [];
72
+ for (const file of adrFiles) {
73
+ const content = await readFile(join(dir, file), "utf-8");
74
+ adrs.push(content);
75
+ }
76
+ return adrs;
77
+ }
78
+ /**
79
+ * List all saved architecture IDs, sorted by filename.
80
+ */
81
+ export async function listArchitectures(projectRoot) {
82
+ const dir = architectureDir(projectRoot);
83
+ let entries;
84
+ try {
85
+ entries = await readdir(dir);
86
+ }
87
+ catch {
88
+ // Directory doesn't exist yet
89
+ return [];
90
+ }
91
+ return entries
92
+ .filter((f) => f.endsWith("-architecture.md"))
93
+ .sort()
94
+ .map((f) => f.slice(0, -"-architecture.md".length));
95
+ }
96
+ //# sourceMappingURL=architect-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architect-state.js","sourceRoot":"","sources":["../../src/state/architect-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Save a design discussion document to disk as a markdown file.
3
+ * Overwrites any existing document with the same specId.
4
+ *
5
+ * The content should be a complete markdown document with sections:
6
+ * - Current State
7
+ * - Desired End State
8
+ * - Patterns to Follow
9
+ * - Resolved Design Decisions
10
+ * - Open Questions
11
+ */
12
+ export declare function saveDesign(projectRoot: string, specId: string, content: string): Promise<void>;
13
+ /**
14
+ * Read a design discussion document by specId.
15
+ * Returns the raw markdown content.
16
+ * Throws if not found.
17
+ */
18
+ export declare function readDesign(projectRoot: string, specId: string): Promise<string>;
19
+ //# sourceMappingURL=design-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-state.d.ts","sourceRoot":"","sources":["../../src/state/design-state.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,42 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ensureDir } from "./helpers.js";
4
+ const DESIGNS_DIR = ".bober/designs";
5
+ function designsDir(projectRoot) {
6
+ return join(projectRoot, DESIGNS_DIR);
7
+ }
8
+ function designPath(projectRoot, specId) {
9
+ const safeId = specId.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ return join(designsDir(projectRoot), `${safeId}-design.md`);
11
+ }
12
+ /**
13
+ * Save a design discussion document to disk as a markdown file.
14
+ * Overwrites any existing document with the same specId.
15
+ *
16
+ * The content should be a complete markdown document with sections:
17
+ * - Current State
18
+ * - Desired End State
19
+ * - Patterns to Follow
20
+ * - Resolved Design Decisions
21
+ * - Open Questions
22
+ */
23
+ export async function saveDesign(projectRoot, specId, content) {
24
+ await ensureDir(designsDir(projectRoot));
25
+ const filePath = designPath(projectRoot, specId);
26
+ await writeFile(filePath, content, "utf-8");
27
+ }
28
+ /**
29
+ * Read a design discussion document by specId.
30
+ * Returns the raw markdown content.
31
+ * Throws if not found.
32
+ */
33
+ export async function readDesign(projectRoot, specId) {
34
+ const filePath = designPath(projectRoot, specId);
35
+ try {
36
+ return await readFile(filePath, "utf-8");
37
+ }
38
+ catch (err) {
39
+ throw new Error(`Design document for spec "${specId}" not found at ${filePath}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
40
+ }
41
+ }
42
+ //# sourceMappingURL=design-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-state.js","sourceRoot":"","sources":["../../src/state/design-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,SAAS,UAAU,CAAC,WAAmB;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB,EAAE,MAAc;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,MAAc,EACd,OAAe;IAEf,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,MAAc;IAEd,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6BAA6B,MAAM,kBAAkB,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACpH,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,8 +1,13 @@
1
1
  export { saveContract, loadContract, listContracts, updateContract, } from "./sprint-state.js";
2
2
  export { saveSpec, loadSpec, loadLatestSpec, listSpecs, } from "./plan-state.js";
3
3
  export { PhaseSchema, HistoryEntrySchema, type Phase, type HistoryEntry, appendHistory, loadHistory, updateProgress, } from "./history.js";
4
+ export { saveResearch, readResearch, listResearch, } from "./research-state.js";
5
+ export { saveDesign, readDesign, } from "./design-state.js";
6
+ export { saveOutline, readOutline, } from "./outline-state.js";
7
+ export { saveArchitecture, readArchitecture, saveADR, readADRs, listArchitectures, } from "./architect-state.js";
4
8
  /**
5
- * Ensure the `.bober/` directory and all required subdirectories exist.
9
+ * Ensure the `.bober/` directory and all required subdirectories exist,
10
+ * including the `research/` subdirectory for research documents.
6
11
  */
7
12
  export declare function ensureBoberDir(projectRoot: string): Promise<void>;
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,WAAW,EACX,kBAAkB,EAElB,KAAK,KAAK,EACV,KAAK,YAAY,EAEjB,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAKtB;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,WAAW,EACX,kBAAkB,EAElB,KAAK,KAAK,EACV,KAAK,YAAY,EAEjB,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAK9B;;;GAGG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE"}
@@ -7,10 +7,15 @@ export {
7
7
  PhaseSchema, HistoryEntrySchema,
8
8
  // Functions
9
9
  appendHistory, loadHistory, updateProgress, } from "./history.js";
10
+ export { saveResearch, readResearch, listResearch, } from "./research-state.js";
11
+ export { saveDesign, readDesign, } from "./design-state.js";
12
+ export { saveOutline, readOutline, } from "./outline-state.js";
13
+ export { saveArchitecture, readArchitecture, saveADR, readADRs, listArchitectures, } from "./architect-state.js";
10
14
  const BOBER_DIR = ".bober";
11
- const SUBDIRS = ["contracts", "specs"];
15
+ const SUBDIRS = ["contracts", "specs", "research", "designs", "outlines", "architecture"];
12
16
  /**
13
- * Ensure the `.bober/` directory and all required subdirectories exist.
17
+ * Ensure the `.bober/` directory and all required subdirectories exist,
18
+ * including the `research/` subdirectory for research documents.
14
19
  */
15
20
  export async function ensureBoberDir(projectRoot) {
16
21
  const boberRoot = join(projectRoot, BOBER_DIR);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO;AACL,cAAc;AACd,WAAW,EACX,kBAAkB;AAIlB,YAAY;AACZ,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,OAAO,CAAU,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO;AACL,cAAc;AACd,WAAW,EACX,kBAAkB;AAIlB,YAAY;AACZ,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAU,CAAC;AAEnG;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Save a structure outline document to disk as a markdown file.
3
+ * Overwrites any existing outline with the same specId.
4
+ *
5
+ * The content should be a complete markdown document with sections per phase:
6
+ * - Phase title
7
+ * - Key Changes (types, signatures, interfaces)
8
+ * - Files affected
9
+ * - Test Checkpoint (how to verify independently)
10
+ * - Depends On (prior phases)
11
+ */
12
+ export declare function saveOutline(projectRoot: string, specId: string, content: string): Promise<void>;
13
+ /**
14
+ * Read a structure outline document by specId.
15
+ * Returns the raw markdown content.
16
+ * Throws if not found.
17
+ */
18
+ export declare function readOutline(projectRoot: string, specId: string): Promise<string>;
19
+ //# sourceMappingURL=outline-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline-state.d.ts","sourceRoot":"","sources":["../../src/state/outline-state.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,42 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ensureDir } from "./helpers.js";
4
+ const OUTLINES_DIR = ".bober/outlines";
5
+ function outlinesDir(projectRoot) {
6
+ return join(projectRoot, OUTLINES_DIR);
7
+ }
8
+ function outlinePath(projectRoot, specId) {
9
+ const safeId = specId.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ return join(outlinesDir(projectRoot), `${safeId}-outline.md`);
11
+ }
12
+ /**
13
+ * Save a structure outline document to disk as a markdown file.
14
+ * Overwrites any existing outline with the same specId.
15
+ *
16
+ * The content should be a complete markdown document with sections per phase:
17
+ * - Phase title
18
+ * - Key Changes (types, signatures, interfaces)
19
+ * - Files affected
20
+ * - Test Checkpoint (how to verify independently)
21
+ * - Depends On (prior phases)
22
+ */
23
+ export async function saveOutline(projectRoot, specId, content) {
24
+ await ensureDir(outlinesDir(projectRoot));
25
+ const filePath = outlinePath(projectRoot, specId);
26
+ await writeFile(filePath, content, "utf-8");
27
+ }
28
+ /**
29
+ * Read a structure outline document by specId.
30
+ * Returns the raw markdown content.
31
+ * Throws if not found.
32
+ */
33
+ export async function readOutline(projectRoot, specId) {
34
+ const filePath = outlinePath(projectRoot, specId);
35
+ try {
36
+ return await readFile(filePath, "utf-8");
37
+ }
38
+ catch (err) {
39
+ throw new Error(`Structure outline for spec "${specId}" not found at ${filePath}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
40
+ }
41
+ }
42
+ //# sourceMappingURL=outline-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline-state.js","sourceRoot":"","sources":["../../src/state/outline-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC,SAAS,WAAW,CAAC,WAAmB;IACtC,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,MAAc;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,aAAa,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,MAAc,EACd,OAAe;IAEf,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,MAAc;IAEd,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,kBAAkB,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtH,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ResearchDoc } from "../orchestrator/research-agent.js";
2
+ /**
3
+ * Save a research document to disk as a markdown file.
4
+ * Overwrites any existing document with the same id.
5
+ */
6
+ export declare function saveResearch(projectRoot: string, doc: ResearchDoc): Promise<void>;
7
+ /**
8
+ * Read a research document by id.
9
+ * Throws if not found.
10
+ */
11
+ export declare function readResearch(projectRoot: string, id: string): Promise<ResearchDoc>;
12
+ /**
13
+ * List all saved research document IDs, sorted by filename.
14
+ */
15
+ export declare function listResearch(projectRoot: string): Promise<string[]>;
16
+ //# sourceMappingURL=research-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-state.d.ts","sourceRoot":"","sources":["../../src/state/research-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,mCAAmC,CAAC;AAmIvF;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,WAAW,CAAC,CActB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAezE"}
@@ -0,0 +1,161 @@
1
+ import { readFile, writeFile, readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ensureDir } from "./helpers.js";
4
+ const RESEARCH_DIR = ".bober/research";
5
+ function researchDir(projectRoot) {
6
+ return join(projectRoot, RESEARCH_DIR);
7
+ }
8
+ function researchPath(projectRoot, id) {
9
+ const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ return join(researchDir(projectRoot), `${safeId}.md`);
11
+ }
12
+ /**
13
+ * Serialize a ResearchDoc to markdown format for storage.
14
+ */
15
+ function serializeToMarkdown(doc) {
16
+ const questionsList = doc.questions
17
+ .map((q, i) => `${i + 1}. ${q}`)
18
+ .join("\n");
19
+ return `# Research Document
20
+
21
+ **Research ID:** ${doc.id}
22
+ **Generated:** ${doc.timestamp}
23
+ **Questions Explored:** ${doc.questionsAnswered}/${doc.questions.length}
24
+ **Files Explored:** ${doc.filesExplored.length}
25
+
26
+ ---
27
+
28
+ ## Architecture Overview
29
+
30
+ ${doc.sections.architectureOverview}
31
+
32
+ ## Existing Patterns
33
+
34
+ ${doc.sections.existingPatterns}
35
+
36
+ ## Key Files
37
+
38
+ ${doc.sections.keyFiles}
39
+
40
+ ## Integration Points
41
+
42
+ ${doc.sections.integrationPoints}
43
+
44
+ ## Test Coverage
45
+
46
+ ${doc.sections.testCoverage}
47
+
48
+ ## Risk Areas
49
+
50
+ ${doc.sections.riskAreas}
51
+
52
+ ---
53
+
54
+ ## Exploration Questions
55
+
56
+ ${questionsList}
57
+
58
+ ---
59
+
60
+ ## Files Explored
61
+
62
+ ${doc.filesExplored.map((f) => `- ${f}`).join("\n") || "None recorded."}
63
+
64
+ ---
65
+
66
+ *Generated by bober.research — factual findings only, no implementation recommendations.*
67
+ `;
68
+ }
69
+ /**
70
+ * Parse a markdown research document back into a ResearchDoc.
71
+ * Used by readResearch() to reconstruct the structured type.
72
+ */
73
+ function parseMarkdown(content, id) {
74
+ const extractSection = (heading) => {
75
+ const pattern = new RegExp(`## ${heading}\\n\\n([\\s\\S]*?)(?=\\n## |\\n---\\n|$)`);
76
+ const match = pattern.exec(content);
77
+ return match ? match[1].trim() : "";
78
+ };
79
+ const sections = {
80
+ architectureOverview: extractSection("Architecture Overview"),
81
+ existingPatterns: extractSection("Existing Patterns"),
82
+ keyFiles: extractSection("Key Files"),
83
+ integrationPoints: extractSection("Integration Points"),
84
+ testCoverage: extractSection("Test Coverage"),
85
+ riskAreas: extractSection("Risk Areas"),
86
+ };
87
+ // Extract metadata from the header block
88
+ const generatedMatch = /\*\*Generated:\*\* (.+)/.exec(content);
89
+ const timestamp = generatedMatch ? generatedMatch[1].trim() : new Date().toISOString();
90
+ // Extract exploration questions
91
+ const questionsSection = extractSection("Exploration Questions");
92
+ const questions = questionsSection
93
+ .split("\n")
94
+ .filter((line) => /^\d+\.\s/.test(line))
95
+ .map((line) => line.replace(/^\d+\.\s+/, "").trim())
96
+ .filter(Boolean);
97
+ // Extract files explored
98
+ const filesSection = extractSection("Files Explored");
99
+ const filesExplored = filesSection
100
+ .split("\n")
101
+ .filter((line) => line.startsWith("- "))
102
+ .map((line) => line.slice(2).trim())
103
+ .filter(Boolean);
104
+ const questionsAnsweredMatch = /\*\*Questions Explored:\*\* (\d+)\//.exec(content);
105
+ const questionsAnswered = questionsAnsweredMatch
106
+ ? parseInt(questionsAnsweredMatch[1], 10)
107
+ : questions.length;
108
+ return {
109
+ id,
110
+ timestamp,
111
+ questions,
112
+ findings: content,
113
+ sections,
114
+ filesExplored,
115
+ questionsAnswered,
116
+ };
117
+ }
118
+ /**
119
+ * Save a research document to disk as a markdown file.
120
+ * Overwrites any existing document with the same id.
121
+ */
122
+ export async function saveResearch(projectRoot, doc) {
123
+ await ensureDir(researchDir(projectRoot));
124
+ const filePath = researchPath(projectRoot, doc.id);
125
+ const markdown = serializeToMarkdown(doc);
126
+ await writeFile(filePath, markdown, "utf-8");
127
+ }
128
+ /**
129
+ * Read a research document by id.
130
+ * Throws if not found.
131
+ */
132
+ export async function readResearch(projectRoot, id) {
133
+ const filePath = researchPath(projectRoot, id);
134
+ let content;
135
+ try {
136
+ content = await readFile(filePath, "utf-8");
137
+ }
138
+ catch (err) {
139
+ throw new Error(`Research document "${id}" not found: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
140
+ }
141
+ return parseMarkdown(content, id);
142
+ }
143
+ /**
144
+ * List all saved research document IDs, sorted by filename.
145
+ */
146
+ export async function listResearch(projectRoot) {
147
+ const dir = researchDir(projectRoot);
148
+ let entries;
149
+ try {
150
+ entries = await readdir(dir);
151
+ }
152
+ catch {
153
+ // Directory doesn't exist yet
154
+ return [];
155
+ }
156
+ return entries
157
+ .filter((f) => f.endsWith(".md"))
158
+ .sort()
159
+ .map((f) => f.slice(0, -3)); // strip .md extension
160
+ }
161
+ //# sourceMappingURL=research-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-state.js","sourceRoot":"","sources":["../../src/state/research-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-bober",
3
- "version": "0.8.1",
3
+ "version": "0.10.0",
4
4
  "description": "Generator-Evaluator multi-agent harness for building applications autonomously with any LLM. Supports Claude, GPT, Gemini, Ollama. Includes MCP server for Cursor/Windsurf.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",