@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.
- package/dist/index.js +0 -0
- package/dist/scaffolder.js +150 -2
- package/dist/scaffolder.js.map +1 -1
- package/dist/templates/brain.d.ts +6 -0
- package/dist/templates/brain.js +478 -0
- package/dist/templates/brain.js.map +1 -0
- package/dist/templates/claude-md-template.js +90 -1
- package/dist/templates/claude-md-template.js.map +1 -1
- package/dist/templates/core-facade.d.ts +6 -0
- package/dist/templates/core-facade.js +564 -0
- package/dist/templates/core-facade.js.map +1 -0
- package/dist/templates/domain-facade.d.ts +4 -0
- package/dist/templates/domain-facade.js +4 -0
- package/dist/templates/domain-facade.js.map +1 -1
- package/dist/templates/entry-point.js +32 -0
- package/dist/templates/entry-point.js.map +1 -1
- package/dist/templates/facade-factory.d.ts +1 -0
- package/dist/templates/facade-factory.js +63 -0
- package/dist/templates/facade-factory.js.map +1 -0
- package/dist/templates/facade-types.d.ts +1 -0
- package/dist/templates/facade-types.js +46 -0
- package/dist/templates/facade-types.js.map +1 -0
- package/dist/templates/intelligence-loader.d.ts +1 -0
- package/dist/templates/intelligence-loader.js +43 -0
- package/dist/templates/intelligence-loader.js.map +1 -0
- package/dist/templates/intelligence-types.d.ts +1 -0
- package/dist/templates/intelligence-types.js +24 -0
- package/dist/templates/intelligence-types.js.map +1 -0
- package/dist/templates/llm-client.d.ts +7 -0
- package/dist/templates/llm-client.js +300 -0
- package/dist/templates/llm-client.js.map +1 -0
- package/dist/templates/llm-key-pool.d.ts +7 -0
- package/dist/templates/llm-key-pool.js +211 -0
- package/dist/templates/llm-key-pool.js.map +1 -0
- package/dist/templates/llm-types.d.ts +5 -0
- package/dist/templates/llm-types.js +161 -0
- package/dist/templates/llm-types.js.map +1 -0
- package/dist/templates/llm-utils.d.ts +5 -0
- package/dist/templates/llm-utils.js +260 -0
- package/dist/templates/llm-utils.js.map +1 -0
- package/dist/templates/planner.d.ts +5 -0
- package/dist/templates/planner.js +150 -0
- package/dist/templates/planner.js.map +1 -0
- package/dist/templates/setup-script.js +26 -1
- package/dist/templates/setup-script.js.map +1 -1
- package/dist/templates/test-brain.d.ts +6 -0
- package/dist/templates/test-brain.js +474 -0
- package/dist/templates/test-brain.js.map +1 -0
- package/dist/templates/test-facades.js +173 -3
- package/dist/templates/test-facades.js.map +1 -1
- package/dist/templates/test-llm.d.ts +7 -0
- package/dist/templates/test-llm.js +574 -0
- package/dist/templates/test-llm.js.map +1 -0
- package/dist/templates/test-loader.d.ts +5 -0
- package/dist/templates/test-loader.js +146 -0
- package/dist/templates/test-loader.js.map +1 -0
- package/dist/templates/test-planner.d.ts +5 -0
- package/dist/templates/test-planner.js +271 -0
- package/dist/templates/test-planner.js.map +1 -0
- package/dist/templates/test-vault.d.ts +5 -0
- package/dist/templates/test-vault.js +380 -0
- package/dist/templates/test-vault.js.map +1 -0
- package/dist/templates/vault.d.ts +5 -0
- package/dist/templates/vault.js +263 -0
- package/dist/templates/vault.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/scaffolder.test.ts +2 -2
- package/src/scaffolder.ts +153 -2
- package/src/templates/claude-md-template.ts +181 -0
- package/src/templates/domain-facade.ts +4 -0
- package/src/templates/entry-point.ts +32 -0
- package/src/templates/setup-script.ts +28 -1
- package/src/templates/test-facades.ts +173 -3
- 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
|
-
|
|
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
|
|
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"}
|