@soleri/forge 5.1.3 → 5.4.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 (77) hide show
  1. package/dist/index.js +0 -0
  2. package/dist/scaffolder.js +150 -2
  3. package/dist/scaffolder.js.map +1 -1
  4. package/dist/templates/brain.d.ts +6 -0
  5. package/dist/templates/brain.js +478 -0
  6. package/dist/templates/brain.js.map +1 -0
  7. package/dist/templates/claude-md-template.js +90 -1
  8. package/dist/templates/claude-md-template.js.map +1 -1
  9. package/dist/templates/core-facade.d.ts +6 -0
  10. package/dist/templates/core-facade.js +564 -0
  11. package/dist/templates/core-facade.js.map +1 -0
  12. package/dist/templates/domain-facade.d.ts +4 -0
  13. package/dist/templates/domain-facade.js +4 -0
  14. package/dist/templates/domain-facade.js.map +1 -1
  15. package/dist/templates/entry-point.js +32 -0
  16. package/dist/templates/entry-point.js.map +1 -1
  17. package/dist/templates/facade-factory.d.ts +1 -0
  18. package/dist/templates/facade-factory.js +63 -0
  19. package/dist/templates/facade-factory.js.map +1 -0
  20. package/dist/templates/facade-types.d.ts +1 -0
  21. package/dist/templates/facade-types.js +46 -0
  22. package/dist/templates/facade-types.js.map +1 -0
  23. package/dist/templates/intelligence-loader.d.ts +1 -0
  24. package/dist/templates/intelligence-loader.js +43 -0
  25. package/dist/templates/intelligence-loader.js.map +1 -0
  26. package/dist/templates/intelligence-types.d.ts +1 -0
  27. package/dist/templates/intelligence-types.js +24 -0
  28. package/dist/templates/intelligence-types.js.map +1 -0
  29. package/dist/templates/llm-client.d.ts +7 -0
  30. package/dist/templates/llm-client.js +300 -0
  31. package/dist/templates/llm-client.js.map +1 -0
  32. package/dist/templates/llm-key-pool.d.ts +7 -0
  33. package/dist/templates/llm-key-pool.js +211 -0
  34. package/dist/templates/llm-key-pool.js.map +1 -0
  35. package/dist/templates/llm-types.d.ts +5 -0
  36. package/dist/templates/llm-types.js +161 -0
  37. package/dist/templates/llm-types.js.map +1 -0
  38. package/dist/templates/llm-utils.d.ts +5 -0
  39. package/dist/templates/llm-utils.js +260 -0
  40. package/dist/templates/llm-utils.js.map +1 -0
  41. package/dist/templates/planner.d.ts +5 -0
  42. package/dist/templates/planner.js +150 -0
  43. package/dist/templates/planner.js.map +1 -0
  44. package/dist/templates/setup-script.js +26 -1
  45. package/dist/templates/setup-script.js.map +1 -1
  46. package/dist/templates/test-brain.d.ts +6 -0
  47. package/dist/templates/test-brain.js +474 -0
  48. package/dist/templates/test-brain.js.map +1 -0
  49. package/dist/templates/test-facades.js +173 -3
  50. package/dist/templates/test-facades.js.map +1 -1
  51. package/dist/templates/test-llm.d.ts +7 -0
  52. package/dist/templates/test-llm.js +574 -0
  53. package/dist/templates/test-llm.js.map +1 -0
  54. package/dist/templates/test-loader.d.ts +5 -0
  55. package/dist/templates/test-loader.js +146 -0
  56. package/dist/templates/test-loader.js.map +1 -0
  57. package/dist/templates/test-planner.d.ts +5 -0
  58. package/dist/templates/test-planner.js +271 -0
  59. package/dist/templates/test-planner.js.map +1 -0
  60. package/dist/templates/test-vault.d.ts +5 -0
  61. package/dist/templates/test-vault.js +380 -0
  62. package/dist/templates/test-vault.js.map +1 -0
  63. package/dist/templates/vault.d.ts +5 -0
  64. package/dist/templates/vault.js +263 -0
  65. package/dist/templates/vault.js.map +1 -0
  66. package/dist/types.d.ts +4 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -1
  69. package/package.json +1 -1
  70. package/src/__tests__/scaffolder.test.ts +2 -2
  71. package/src/scaffolder.ts +153 -2
  72. package/src/templates/claude-md-template.ts +181 -0
  73. package/src/templates/domain-facade.ts +4 -0
  74. package/src/templates/entry-point.ts +32 -0
  75. package/src/templates/setup-script.ts +28 -1
  76. package/src/templates/test-facades.ts +173 -3
  77. package/src/types.ts +2 -0
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Generates src/planning/planner.ts for a new agent.
3
+ * The Planner provides JSON-file-backed plan management with state machine transitions.
4
+ */
5
+ export function generatePlanner() {
6
+ return PLANNER_TEMPLATE;
7
+ }
8
+ const PLANNER_TEMPLATE = [
9
+ "import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';",
10
+ "import { dirname } from 'node:path';",
11
+ '',
12
+ "export type PlanStatus = 'draft' | 'approved' | 'executing' | 'completed';",
13
+ "export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'skipped' | 'failed';",
14
+ '',
15
+ 'export interface PlanTask {',
16
+ ' id: string;',
17
+ ' title: string;',
18
+ ' description: string;',
19
+ ' status: TaskStatus;',
20
+ ' updatedAt: number;',
21
+ '}',
22
+ '',
23
+ 'export interface Plan {',
24
+ ' id: string;',
25
+ ' objective: string;',
26
+ ' scope: string;',
27
+ ' status: PlanStatus;',
28
+ ' decisions: string[];',
29
+ ' tasks: PlanTask[];',
30
+ ' createdAt: number;',
31
+ ' updatedAt: number;',
32
+ '}',
33
+ '',
34
+ 'export interface PlanStore {',
35
+ ' version: string;',
36
+ ' plans: Plan[];',
37
+ '}',
38
+ '',
39
+ 'export class Planner {',
40
+ ' private filePath: string;',
41
+ ' private store: PlanStore;',
42
+ '',
43
+ ' constructor(filePath: string) {',
44
+ ' this.filePath = filePath;',
45
+ ' this.store = this.load();',
46
+ ' }',
47
+ '',
48
+ ' private load(): PlanStore {',
49
+ ' if (!existsSync(this.filePath)) {',
50
+ " return { version: '1.0', plans: [] };",
51
+ ' }',
52
+ ' try {',
53
+ " const data = readFileSync(this.filePath, 'utf-8');",
54
+ ' return JSON.parse(data) as PlanStore;',
55
+ ' } catch {',
56
+ " return { version: '1.0', plans: [] };",
57
+ ' }',
58
+ ' }',
59
+ '',
60
+ ' private save(): void {',
61
+ ' mkdirSync(dirname(this.filePath), { recursive: true });',
62
+ " writeFileSync(this.filePath, JSON.stringify(this.store, null, 2), 'utf-8');",
63
+ ' }',
64
+ '',
65
+ ' create(params: { objective: string; scope: string; decisions?: string[]; tasks?: Array<{ title: string; description: string }> }): Plan {',
66
+ ' const now = Date.now();',
67
+ ' const plan: Plan = {',
68
+ ' id: `plan-${now}-${Math.random().toString(36).slice(2, 8)}`,',
69
+ ' objective: params.objective,',
70
+ ' scope: params.scope,',
71
+ " status: 'draft',",
72
+ ' decisions: params.decisions ?? [],',
73
+ ' tasks: (params.tasks ?? []).map((t, i) => ({',
74
+ ' id: `task-${i + 1}`,',
75
+ ' title: t.title,',
76
+ ' description: t.description,',
77
+ " status: 'pending' as TaskStatus,",
78
+ ' updatedAt: now,',
79
+ ' })),',
80
+ ' createdAt: now,',
81
+ ' updatedAt: now,',
82
+ ' };',
83
+ ' this.store.plans.push(plan);',
84
+ ' this.save();',
85
+ ' return plan;',
86
+ ' }',
87
+ '',
88
+ ' get(planId: string): Plan | null {',
89
+ ' return this.store.plans.find((p) => p.id === planId) ?? null;',
90
+ ' }',
91
+ '',
92
+ ' list(): Plan[] {',
93
+ ' return [...this.store.plans];',
94
+ ' }',
95
+ '',
96
+ ' approve(planId: string): Plan {',
97
+ ' const plan = this.get(planId);',
98
+ ' if (!plan) throw new Error(`Plan not found: ${planId}`);',
99
+ " if (plan.status !== 'draft') throw new Error(`Cannot approve plan in '${plan.status}' status — must be 'draft'`);",
100
+ " plan.status = 'approved';",
101
+ ' plan.updatedAt = Date.now();',
102
+ ' this.save();',
103
+ ' return plan;',
104
+ ' }',
105
+ '',
106
+ ' startExecution(planId: string): Plan {',
107
+ ' const plan = this.get(planId);',
108
+ ' if (!plan) throw new Error(`Plan not found: ${planId}`);',
109
+ " if (plan.status !== 'approved') throw new Error(`Cannot execute plan in '${plan.status}' status — must be 'approved'`);",
110
+ " plan.status = 'executing';",
111
+ ' plan.updatedAt = Date.now();',
112
+ ' this.save();',
113
+ ' return plan;',
114
+ ' }',
115
+ '',
116
+ ' updateTask(planId: string, taskId: string, status: TaskStatus): Plan {',
117
+ ' const plan = this.get(planId);',
118
+ ' if (!plan) throw new Error(`Plan not found: ${planId}`);',
119
+ " if (plan.status !== 'executing') throw new Error(`Cannot update tasks on plan in '${plan.status}' status — must be 'executing'`);",
120
+ ' const task = plan.tasks.find((t) => t.id === taskId);',
121
+ ' if (!task) throw new Error(`Task not found: ${taskId}`);',
122
+ ' task.status = status;',
123
+ ' task.updatedAt = Date.now();',
124
+ ' plan.updatedAt = Date.now();',
125
+ " // Auto-transition: if plan is executing and first task starts, that's fine",
126
+ ' // Auto-start execution when approving and updating first task',
127
+ ' this.save();',
128
+ ' return plan;',
129
+ ' }',
130
+ '',
131
+ ' complete(planId: string): Plan {',
132
+ ' const plan = this.get(planId);',
133
+ ' if (!plan) throw new Error(`Plan not found: ${planId}`);',
134
+ " if (plan.status !== 'executing') throw new Error(`Cannot complete plan in '${plan.status}' status — must be 'executing'`);",
135
+ " plan.status = 'completed';",
136
+ ' plan.updatedAt = Date.now();',
137
+ ' this.save();',
138
+ ' return plan;',
139
+ ' }',
140
+ '',
141
+ ' getExecuting(): Plan[] {',
142
+ " return this.store.plans.filter((p) => p.status === 'executing');",
143
+ ' }',
144
+ '',
145
+ ' getActive(): Plan[] {',
146
+ " return this.store.plans.filter((p) => p.status === 'draft' || p.status === 'approved' || p.status === 'executing');",
147
+ ' }',
148
+ '}',
149
+ ].join('\n');
150
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/templates/planner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,gBAAgB,GAAG;IACvB,+EAA+E;IAC/E,sCAAsC;IACtC,EAAE;IACF,4EAA4E;IAC5E,0FAA0F;IAC1F,EAAE;IACF,6BAA6B;IAC7B,eAAe;IACf,kBAAkB;IAClB,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,GAAG;IACH,EAAE;IACF,yBAAyB;IACzB,eAAe;IACf,sBAAsB;IACtB,kBAAkB;IAClB,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,GAAG;IACH,EAAE;IACF,8BAA8B;IAC9B,oBAAoB;IACpB,kBAAkB;IAClB,GAAG;IACH,EAAE;IACF,wBAAwB;IACxB,6BAA6B;IAC7B,6BAA6B;IAC7B,EAAE;IACF,mCAAmC;IACnC,+BAA+B;IAC/B,+BAA+B;IAC/B,KAAK;IACL,EAAE;IACF,+BAA+B;IAC/B,uCAAuC;IACvC,6CAA6C;IAC7C,OAAO;IACP,WAAW;IACX,0DAA0D;IAC1D,6CAA6C;IAC7C,eAAe;IACf,6CAA6C;IAC7C,OAAO;IACP,KAAK;IACL,EAAE;IACF,0BAA0B;IAC1B,6DAA6D;IAC7D,iFAAiF;IACjF,KAAK;IACL,EAAE;IACF,6IAA6I;IAC7I,6BAA6B;IAC7B,0BAA0B;IAC1B,oEAAoE;IACpE,oCAAoC;IACpC,4BAA4B;IAC5B,wBAAwB;IACxB,0CAA0C;IAC1C,oDAAoD;IACpD,8BAA8B;IAC9B,yBAAyB;IACzB,qCAAqC;IACrC,0CAA0C;IAC1C,yBAAyB;IACzB,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,QAAQ;IACR,kCAAkC;IAClC,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,EAAE;IACF,sCAAsC;IACtC,mEAAmE;IACnE,KAAK;IACL,EAAE;IACF,oBAAoB;IACpB,mCAAmC;IACnC,KAAK;IACL,EAAE;IACF,mCAAmC;IACnC,oCAAoC;IACpC,8DAA8D;IAC9D,uHAAuH;IACvH,+BAA+B;IAC/B,kCAAkC;IAClC,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,EAAE;IACF,0CAA0C;IAC1C,oCAAoC;IACpC,8DAA8D;IAC9D,6HAA6H;IAC7H,gCAAgC;IAChC,kCAAkC;IAClC,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,EAAE;IACF,0EAA0E;IAC1E,oCAAoC;IACpC,8DAA8D;IAC9D,uIAAuI;IACvI,2DAA2D;IAC3D,8DAA8D;IAC9D,2BAA2B;IAC3B,kCAAkC;IAClC,kCAAkC;IAClC,iFAAiF;IACjF,oEAAoE;IACpE,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,EAAE;IACF,oCAAoC;IACpC,oCAAoC;IACpC,8DAA8D;IAC9D,gIAAgI;IAChI,gCAAgC;IAChC,kCAAkC;IAClC,kBAAkB;IAClB,kBAAkB;IAClB,KAAK;IACL,EAAE;IACF,4BAA4B;IAC5B,sEAAsE;IACtE,KAAK;IACL,EAAE;IACF,yBAAyB;IACzB,yHAAyH;IACzH,KAAK;IACL,GAAG;CACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -99,7 +99,32 @@ else
99
99
  fi
100
100
  fi
101
101
 
102
- echo ""
102
+ ${config.hookPacks?.length
103
+ ? `# Install hook packs to global ~/.claude/
104
+ AGENT_CLAUDE_DIR="$AGENT_DIR/.claude"
105
+ GLOBAL_CLAUDE_DIR="$HOME/.claude"
106
+
107
+ if [ -d "$AGENT_CLAUDE_DIR" ]; then
108
+ echo ""
109
+ echo "Installing hook packs..."
110
+ mkdir -p "$GLOBAL_CLAUDE_DIR"
111
+ installed=0
112
+ skipped=0
113
+ for hook_file in "$AGENT_CLAUDE_DIR"/hookify.*.local.md; do
114
+ [ -f "$hook_file" ] || continue
115
+ dest="$GLOBAL_CLAUDE_DIR/$(basename "$hook_file")"
116
+ if [ -f "$dest" ]; then
117
+ skipped=$((skipped + 1))
118
+ else
119
+ cp "$hook_file" "$dest"
120
+ installed=$((installed + 1))
121
+ fi
122
+ done
123
+ echo "[ok] Hooks: $installed installed, $skipped already present"
124
+ fi
125
+
126
+ `
127
+ : ''}echo ""
103
128
  echo "=== Setup Complete ==="
104
129
  echo ""
105
130
  echo "Next:"
@@ -1 +1 @@
1
- {"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO;;;;cAIK,MAAM,CAAC,EAAE;;YAEX,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;mBAmBJ,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;gCAeE,MAAM,CAAC,IAAI;;;;;;;;oBAQvB,MAAM,CAAC,IAAI;;;wBAGP,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;uFAkBoD,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;qFAmBX,MAAM,CAAC,EAAE;;;;;;;;;;;;;4BAalE,MAAM,CAAC,IAAI;;QAE/B,MAAM,CAAC,IAAI;CAClB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO;;;;cAIK,MAAM,CAAC,EAAE;;YAEX,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;mBAmBJ,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;gCAeE,MAAM,CAAC,IAAI;;;;;;;;oBAQvB,MAAM,CAAC,IAAI;;;wBAGP,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;uFAkBoD,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;qFAmBX,MAAM,CAAC,EAAE;;;;;;;;EAS5F,MAAM,CAAC,SAAS,EAAE,MAAM;QACtB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBL;QACG,CAAC,CAAC,EACN;;;;;4BAK4B,MAAM,CAAC,IAAI;;QAE/B,MAAM,CAAC,IAAI;CAClB,CAAC;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generates brain test file for a new agent.
3
+ * Tests cover: TF-IDF scoring, intelligent search, auto-tagging,
4
+ * duplicate detection, feedback, adaptive weights, vocabulary.
5
+ */
6
+ export declare function generateBrainTest(): string;