forgepm 0.7.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 (97) hide show
  1. package/dist/bin/forgepm.d.ts +2 -0
  2. package/dist/bin/forgepm.js +4 -0
  3. package/dist/bin/forgepm.js.map +1 -0
  4. package/dist/src/backends/base.d.ts +23 -0
  5. package/dist/src/backends/base.js +2 -0
  6. package/dist/src/backends/base.js.map +1 -0
  7. package/dist/src/backends/http-utils.d.ts +6 -0
  8. package/dist/src/backends/http-utils.js +36 -0
  9. package/dist/src/backends/http-utils.js.map +1 -0
  10. package/dist/src/backends/jira.d.ts +16 -0
  11. package/dist/src/backends/jira.js +117 -0
  12. package/dist/src/backends/jira.js.map +1 -0
  13. package/dist/src/backends/linear.d.ts +11 -0
  14. package/dist/src/backends/linear.js +85 -0
  15. package/dist/src/backends/linear.js.map +1 -0
  16. package/dist/src/cli/archaeology.d.ts +38 -0
  17. package/dist/src/cli/archaeology.js +182 -0
  18. package/dist/src/cli/archaeology.js.map +1 -0
  19. package/dist/src/cli/index.d.ts +1 -0
  20. package/dist/src/cli/index.js +351 -0
  21. package/dist/src/cli/index.js.map +1 -0
  22. package/dist/src/core/event-bus.d.ts +17 -0
  23. package/dist/src/core/event-bus.js +33 -0
  24. package/dist/src/core/event-bus.js.map +1 -0
  25. package/dist/src/core/event-plugins.d.ts +6 -0
  26. package/dist/src/core/event-plugins.js +2 -0
  27. package/dist/src/core/event-plugins.js.map +1 -0
  28. package/dist/src/core/forge-ops.d.ts +42 -0
  29. package/dist/src/core/forge-ops.js +101 -0
  30. package/dist/src/core/forge-ops.js.map +1 -0
  31. package/dist/src/core/forge.d.ts +44 -0
  32. package/dist/src/core/forge.js +86 -0
  33. package/dist/src/core/forge.js.map +1 -0
  34. package/dist/src/core/schema.d.ts +8 -0
  35. package/dist/src/core/schema.js +139 -0
  36. package/dist/src/core/schema.js.map +1 -0
  37. package/dist/src/core/store.d.ts +24 -0
  38. package/dist/src/core/store.js +155 -0
  39. package/dist/src/core/store.js.map +1 -0
  40. package/dist/src/core/types.d.ts +91 -0
  41. package/dist/src/core/types.js +19 -0
  42. package/dist/src/core/types.js.map +1 -0
  43. package/dist/src/core/version.d.ts +1 -0
  44. package/dist/src/core/version.js +20 -0
  45. package/dist/src/core/version.js.map +1 -0
  46. package/dist/src/github/pull.d.ts +13 -0
  47. package/dist/src/github/pull.js +51 -0
  48. package/dist/src/github/pull.js.map +1 -0
  49. package/dist/src/github/push.d.ts +20 -0
  50. package/dist/src/github/push.js +118 -0
  51. package/dist/src/github/push.js.map +1 -0
  52. package/dist/src/github/setup.d.ts +10 -0
  53. package/dist/src/github/setup.js +112 -0
  54. package/dist/src/github/setup.js.map +1 -0
  55. package/dist/src/github/slack.d.ts +12 -0
  56. package/dist/src/github/slack.js +33 -0
  57. package/dist/src/github/slack.js.map +1 -0
  58. package/dist/src/index.d.ts +14 -0
  59. package/dist/src/index.js +9 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/dist/src/mcp/server.d.ts +5 -0
  62. package/dist/src/mcp/server.js +69 -0
  63. package/dist/src/mcp/server.js.map +1 -0
  64. package/dist/src/mcp/tool-handlers.d.ts +19 -0
  65. package/dist/src/mcp/tool-handlers.js +123 -0
  66. package/dist/src/mcp/tool-handlers.js.map +1 -0
  67. package/dist/src/pm/calibration.d.ts +13 -0
  68. package/dist/src/pm/calibration.js +56 -0
  69. package/dist/src/pm/calibration.js.map +1 -0
  70. package/dist/src/pm/callsheet.d.ts +66 -0
  71. package/dist/src/pm/callsheet.js +91 -0
  72. package/dist/src/pm/callsheet.js.map +1 -0
  73. package/dist/src/pm/drift-detector.d.ts +38 -0
  74. package/dist/src/pm/drift-detector.js +111 -0
  75. package/dist/src/pm/drift-detector.js.map +1 -0
  76. package/dist/src/pm/evm.d.ts +31 -0
  77. package/dist/src/pm/evm.js +58 -0
  78. package/dist/src/pm/evm.js.map +1 -0
  79. package/dist/src/pm/pdca.d.ts +27 -0
  80. package/dist/src/pm/pdca.js +83 -0
  81. package/dist/src/pm/pdca.js.map +1 -0
  82. package/dist/src/pm/recall.d.ts +23 -0
  83. package/dist/src/pm/recall.js +126 -0
  84. package/dist/src/pm/recall.js.map +1 -0
  85. package/dist/src/pm/retrospective.d.ts +35 -0
  86. package/dist/src/pm/retrospective.js +104 -0
  87. package/dist/src/pm/retrospective.js.map +1 -0
  88. package/dist/src/pm/sessions.d.ts +36 -0
  89. package/dist/src/pm/sessions.js +91 -0
  90. package/dist/src/pm/sessions.js.map +1 -0
  91. package/dist/src/pm/tolerances.d.ts +21 -0
  92. package/dist/src/pm/tolerances.js +54 -0
  93. package/dist/src/pm/tolerances.js.map +1 -0
  94. package/dist/src/utils/validation.d.ts +2 -0
  95. package/dist/src/utils/validation.js +8 -0
  96. package/dist/src/utils/validation.js.map +1 -0
  97. package/package.json +55 -0
@@ -0,0 +1,351 @@
1
+ import { Command } from 'commander';
2
+ import { createForge } from '../core/forge.js';
3
+ import { join } from 'node:path';
4
+ import { existsSync, mkdirSync } from 'node:fs';
5
+ import { startMcpServer } from '../mcp/server.js';
6
+ import { GitHubPullSync } from '../github/pull.js';
7
+ import { RetrospectiveEngine } from '../pm/retrospective.js';
8
+ import { ArchaeologyEngine } from './archaeology.js';
9
+ import { setupGitHubProject } from '../github/setup.js';
10
+ import { VERSION } from '../core/version.js';
11
+ // Configurable via env for testing
12
+ function getDbPath(cwd) {
13
+ return process.env['FORGEPM_DB'] ?? join(cwd, '.forgepm', 'project.db');
14
+ }
15
+ function requireDb(dbPath, json = false) {
16
+ if (existsSync(dbPath))
17
+ return true;
18
+ if (json) {
19
+ console.log(JSON.stringify({ error: 'No forgepm project found' }));
20
+ }
21
+ else {
22
+ console.error('No forgepm project found. Run `forge init` first.');
23
+ }
24
+ process.exitCode = 1;
25
+ return false;
26
+ }
27
+ function getForgeDir(cwd) {
28
+ const dbPath = process.env['FORGEPM_DB'];
29
+ if (dbPath)
30
+ return join(dbPath, '..');
31
+ return join(cwd, '.forgepm');
32
+ }
33
+ function buildProgressBar(done, total, width = 10) {
34
+ if (total === 0)
35
+ return '░'.repeat(width);
36
+ const filled = Math.round((done / total) * width);
37
+ return '█'.repeat(filled) + '░'.repeat(width - filled);
38
+ }
39
+ function taskStatusIcon(status) {
40
+ switch (status) {
41
+ case 'done': return '✅';
42
+ case 'in_progress': return '🔄';
43
+ case 'blocked': return '🚫';
44
+ default: return '⬚';
45
+ }
46
+ }
47
+ export async function main(argv, cwd) {
48
+ const workDir = cwd ?? process.cwd();
49
+ const program = new Command();
50
+ program
51
+ .name('forge')
52
+ .description('Invisible PM for AI agents')
53
+ .version(VERSION);
54
+ // ─── init ───────────────────────────────────────────────────────────────────
55
+ program
56
+ .command('init')
57
+ .description('Initialize forgepm in current directory')
58
+ .option('-n, --name <name>', 'Project name', 'unnamed')
59
+ .option('--github', 'Enable GitHub sync')
60
+ .option('-p, --preset <preset>', 'Tolerance preset', 'new-feature')
61
+ .option('--from-existing', 'Import project history from git log')
62
+ .option('--since <period>', 'Git log time window (default: "6 months ago")', '6 months ago')
63
+ .option('--dry-run', 'Preview import without writing to DB')
64
+ .option('--force', 'Overwrite existing .forgepm/ directory')
65
+ .action(async (opts) => {
66
+ const forgeDir = getForgeDir(workDir);
67
+ const dbPath = getDbPath(workDir);
68
+ // Check existing project (only if using default .forgepm/ dir, not FORGEPM_DB override)
69
+ const dbExists = existsSync(getDbPath(workDir));
70
+ if (dbExists && !opts.force && !opts.dryRun) {
71
+ console.error('Project already initialized. Use --force to overwrite.');
72
+ process.exitCode = 1;
73
+ return;
74
+ }
75
+ if (!existsSync(forgeDir)) {
76
+ mkdirSync(forgeDir, { recursive: true });
77
+ }
78
+ const knownPresets = ['new-feature', 'bug-fix', 'refactor', 'spike'];
79
+ const preset = knownPresets.includes(opts.preset) ? opts.preset : 'new-feature';
80
+ const forge = await createForge(dbPath, {
81
+ name: opts.name,
82
+ tolerancePreset: preset,
83
+ });
84
+ // Persist config to DB
85
+ forge.store.run(`INSERT OR REPLACE INTO project_config
86
+ (id, name, current_phase, phases, tolerance_preset, wip_limit, github_sync, pm_model)
87
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
88
+ 'default',
89
+ opts.name,
90
+ 'planning',
91
+ '["planning","development","review","done"]',
92
+ opts.preset,
93
+ 3,
94
+ opts.github ? 1 : 0,
95
+ 'sonnet',
96
+ ]);
97
+ // Archaeology mode
98
+ if (opts.fromExisting) {
99
+ const engine = new ArchaeologyEngine(forge.store);
100
+ try {
101
+ const result = await engine.run(workDir, {
102
+ since: opts.since ?? '6 months ago',
103
+ dryRun: opts.dryRun ?? false,
104
+ github: opts.github ?? false,
105
+ force: opts.force ?? false,
106
+ }, (i, total, title) => {
107
+ process.stdout.write(`\r [${i}/${total}] ${title.slice(0, 60).padEnd(60)}`);
108
+ });
109
+ if (opts.dryRun) {
110
+ console.log('\n\nDRY RUN — no changes written\n');
111
+ console.log(`Would create ${result.tasks.length} tasks from ${result.commitsAnalyzed} commits:\n`);
112
+ for (const t of result.tasks.slice(0, 30)) {
113
+ console.log(` ${t.id} [${t.type}] ${t.title} (complexity ${t.complexity}, ${t.linesChanged} LOC)`);
114
+ }
115
+ if (result.tasks.length > 30)
116
+ console.log(` ... and ${result.tasks.length - 30} more`);
117
+ console.log('\nRun without --dry-run to import.');
118
+ }
119
+ else {
120
+ console.log(`\n\nImported ${result.tasksCreated} tasks from ${result.commitsAnalyzed} commits.`);
121
+ if (result.githubIssuesImported > 0)
122
+ console.log(`GitHub issues imported: ${result.githubIssuesImported}`);
123
+ console.log('Run `forge status` to review.');
124
+ }
125
+ }
126
+ catch (err) {
127
+ console.error(err instanceof Error ? err.message : String(err));
128
+ process.exitCode = 1;
129
+ }
130
+ }
131
+ else {
132
+ if (opts.github) {
133
+ try {
134
+ const { execFile: ef } = await import('node:child_process');
135
+ const { promisify: p } = await import('node:util');
136
+ const run = p(ef);
137
+ const { stdout } = await run('git', ['remote', 'get-url', 'origin'], { cwd: workDir });
138
+ const match = stdout.trim().match(/[/:]([^/]+)\/([^/.]+?)(?:\.git)?$/);
139
+ if (match) {
140
+ const [, owner, repo] = match;
141
+ console.log(`Setting up GitHub Projects V2 for ${owner}/${repo}...`);
142
+ const result = await setupGitHubProject(owner, repo);
143
+ forge.store.run('UPDATE project_config SET github_owner = ?, github_repo = ?, github_project_number = ? WHERE id = ?', [owner, repo, result.projectNumber, 'default']);
144
+ console.log(`GitHub project #${result.projectNumber} created with ${result.fieldsCreated.length} fields and ${result.labelsCreated.length} labels.`);
145
+ }
146
+ else {
147
+ console.log('Could not parse GitHub remote. Run from a repo with a GitHub remote.');
148
+ }
149
+ }
150
+ catch {
151
+ console.log('GitHub setup failed. Ensure gh CLI is authenticated.');
152
+ }
153
+ }
154
+ console.log('forgepm initialized in .forgepm/');
155
+ }
156
+ forge.store.close();
157
+ });
158
+ // ─── do ─────────────────────────────────────────────────────────────────────
159
+ program
160
+ .command('do <description>')
161
+ .description('Create and start a task from a description')
162
+ .action(async (description) => {
163
+ const dbPath = getDbPath(workDir);
164
+ if (!requireDb(dbPath))
165
+ return;
166
+ const forge = await createForge(dbPath);
167
+ // Auto-start session if none active
168
+ if (!forge.sessions.getCurrentSession()) {
169
+ forge.sessions.startSession(description, 100000);
170
+ }
171
+ // Use nextId to avoid collision on non-contiguous IDs
172
+ const taskId = forge.store.nextId('TASK');
173
+ const complexity = 5;
174
+ // Insert task
175
+ forge.store.run(`INSERT INTO tasks (id, title, complexity, status)
176
+ VALUES (?, ?, ?, ?)`, [taskId, description, complexity, 'todo']);
177
+ // Start the task
178
+ const result = forge.startTask(taskId, complexity);
179
+ if (!result.ok) {
180
+ console.error(`Failed to start task: ${result.error}`);
181
+ forge.store.close();
182
+ process.exitCode = 1;
183
+ return;
184
+ }
185
+ const { estimatedTokens } = result.value;
186
+ forge.store.close();
187
+ console.log(`Task ${taskId} created and started. Estimated: ${estimatedTokens} tokens.`);
188
+ });
189
+ // ─── status ─────────────────────────────────────────────────────────────────
190
+ program
191
+ .command('status')
192
+ .description('Show project status')
193
+ .option('--json', 'Output machine-readable JSON')
194
+ .option('--gate <level>', 'CI gate level: "green" (strict) or "yellow" (default)', 'yellow')
195
+ .option('--min-cpi <n>', 'Fail if CPI below threshold', parseFloat)
196
+ .option('--min-spi <n>', 'Fail if SPI below threshold', parseFloat)
197
+ .action(async (opts) => {
198
+ const dbPath = getDbPath(workDir);
199
+ if (!requireDb(dbPath, opts.json))
200
+ return;
201
+ const forge = await createForge(dbPath);
202
+ const sheet = forge.getStatus(true);
203
+ const configRow = forge.store.query('SELECT name FROM project_config WHERE id = ?', ['default'])[0];
204
+ const projectName = configRow?.name ?? sheet.projectName;
205
+ const tasks = forge.store.query('SELECT id, title, status FROM tasks ORDER BY rowid');
206
+ const done = tasks.filter(t => t.status === 'done').length;
207
+ const inProgress = tasks.filter(t => t.status === 'in_progress').length;
208
+ const blocked = tasks.filter(t => t.status === 'blocked').length;
209
+ const total = tasks.length;
210
+ const spi = sheet.internal?.spi ?? 1.0;
211
+ const cpi = sheet.internal?.cpi ?? 1.0;
212
+ const health = (sheet.internal?.health ?? 'GREEN');
213
+ const signal = sheet.internal?.signal ?? 'No data';
214
+ forge.store.close();
215
+ if (opts.json) {
216
+ // Determine gate pass/fail
217
+ let gatePassed = health !== 'RED';
218
+ if (opts.gate === 'green')
219
+ gatePassed = health === 'GREEN';
220
+ if (opts.minCpi !== undefined && cpi < opts.minCpi)
221
+ gatePassed = false;
222
+ if (opts.minSpi !== undefined && spi < opts.minSpi)
223
+ gatePassed = false;
224
+ const output = {
225
+ project: projectName,
226
+ health,
227
+ gate: gatePassed ? 'pass' : 'fail',
228
+ spi: Math.round(spi * 100) / 100,
229
+ cpi: Math.round(cpi * 100) / 100,
230
+ tasks: { total, done, in_progress: inProgress, blocked },
231
+ signal,
232
+ ts: new Date().toISOString(),
233
+ };
234
+ console.log(JSON.stringify(output, null, 2));
235
+ if (!gatePassed)
236
+ process.exitCode = 1;
237
+ return;
238
+ }
239
+ // Human-readable output
240
+ const bar = buildProgressBar(done, total);
241
+ const separator = '━'.repeat(27);
242
+ console.log(``);
243
+ console.log(` forgepm — ${projectName}`);
244
+ console.log(` ${separator}`);
245
+ console.log(` Progress: ${bar} ${done}/${total} tasks`);
246
+ console.log(``);
247
+ for (const task of tasks) {
248
+ const icon = taskStatusIcon(task.status);
249
+ console.log(` ${icon} ${task.title}`);
250
+ }
251
+ if (tasks.length === 0) {
252
+ console.log(' (no tasks yet)');
253
+ }
254
+ console.log(``);
255
+ console.log(` Estimate: ${sheet.estimate}`);
256
+ console.log(``);
257
+ });
258
+ // ─── retro ──────────────────────────────────────────────────────────────────
259
+ program
260
+ .command('retro')
261
+ .description('Generate a session retrospective')
262
+ .option('--session <id>', 'Session ID (default: most recent)')
263
+ .option('--json', 'Output JSON instead of markdown')
264
+ .action(async (opts) => {
265
+ const dbPath = getDbPath(workDir);
266
+ if (!requireDb(dbPath, opts.json))
267
+ return;
268
+ const forge = await createForge(dbPath);
269
+ const engine = new RetrospectiveEngine(forge.store);
270
+ const report = engine.generate(opts.session);
271
+ if (!report) {
272
+ if (opts.json) {
273
+ console.log(JSON.stringify({ error: 'No session found' }));
274
+ }
275
+ else {
276
+ console.error('No session found. Start a session with `forge do` first.');
277
+ }
278
+ forge.store.close();
279
+ process.exitCode = 1;
280
+ return;
281
+ }
282
+ if (opts.json) {
283
+ console.log(JSON.stringify(report, null, 2));
284
+ }
285
+ else {
286
+ console.log(engine.formatMarkdown(report));
287
+ }
288
+ forge.store.close();
289
+ });
290
+ // ─── pull ───────────────────────────────────────────────────────────────────
291
+ program
292
+ .command('pull')
293
+ .description('Pull status updates from GitHub Issues')
294
+ .action(async () => {
295
+ const dbPath = getDbPath(workDir);
296
+ if (!requireDb(dbPath))
297
+ return;
298
+ const forge = await createForge(dbPath);
299
+ const configRow = forge.store.query('SELECT github_owner, github_repo, github_sync FROM project_config WHERE id = ?', ['default'])[0];
300
+ if (!configRow || !configRow.github_sync || !configRow.github_owner || !configRow.github_repo) {
301
+ console.error('GitHub sync not enabled. Run `forge init --github` first.');
302
+ forge.store.close();
303
+ process.exitCode = 1;
304
+ return;
305
+ }
306
+ const pull = new GitHubPullSync(configRow.github_owner, configRow.github_repo);
307
+ const result = await pull.pull(forge.store, forge.bus);
308
+ forge.store.close();
309
+ if (result.errors.length > 0) {
310
+ for (const err of result.errors)
311
+ console.error(`Error: ${err}`);
312
+ process.exitCode = 1;
313
+ return;
314
+ }
315
+ console.log(`Fetched ${result.totalFetched} issues, closed ${result.tasksClosed} tasks locally.`);
316
+ });
317
+ // ─── backends ───────────────────────────────────────────────────────────────
318
+ program
319
+ .command('backends')
320
+ .description('List available and active backends')
321
+ .action(async () => {
322
+ const available = [
323
+ { name: 'github', envVars: ['GH_TOKEN (via gh auth)'], status: 'built-in' },
324
+ { name: 'linear', envVars: ['LINEAR_API_KEY', 'LINEAR_TEAM_ID (optional)'], status: 'available' },
325
+ { name: 'jira', envVars: ['JIRA_BASE_URL', 'JIRA_EMAIL', 'JIRA_API_TOKEN', 'JIRA_PROJECT_KEY'], status: 'available' },
326
+ ];
327
+ console.log('\nAvailable backends:\n');
328
+ for (const b of available) {
329
+ const envStatus = b.envVars.map(v => {
330
+ const key = v.split(' ')[0];
331
+ return process.env[key] ? `${v} ✅` : `${v} ❌`;
332
+ });
333
+ console.log(` ${b.name} (${b.status})`);
334
+ for (const e of envStatus)
335
+ console.log(` ${e}`);
336
+ }
337
+ console.log('\nUse: forge init --backend <name>');
338
+ console.log('Run: forge backends --validate to test connectivity');
339
+ console.log('');
340
+ });
341
+ // ─── serve ──────────────────────────────────────────────────────────────────
342
+ program
343
+ .command('serve')
344
+ .description('Start MCP server')
345
+ .action(async () => {
346
+ const dbPath = getDbPath(workDir);
347
+ await startMcpServer(dbPath);
348
+ });
349
+ await program.parseAsync(['node', 'forge', ...argv]);
350
+ }
351
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DomainEvent } from './types.js';
2
+ type EventType = DomainEvent['type'];
3
+ type EventHandler<T extends EventType> = (event: Extract<DomainEvent, {
4
+ type: T;
5
+ }>) => void;
6
+ type AnyHandler = (event: DomainEvent) => void;
7
+ export declare class EventBus {
8
+ private emitter;
9
+ constructor();
10
+ publish(event: DomainEvent): void;
11
+ on<T extends EventType>(type: T, handler: EventHandler<T>): void;
12
+ off<T extends EventType>(type: T, handler: EventHandler<T>): void;
13
+ onAny(handler: AnyHandler): void;
14
+ offAny(handler: AnyHandler): void;
15
+ removeAllListeners(type?: EventType): void;
16
+ }
17
+ export {};
@@ -0,0 +1,33 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ const ANY_EVENT = '__any__';
3
+ export class EventBus {
4
+ emitter;
5
+ constructor() {
6
+ this.emitter = new EventEmitter();
7
+ }
8
+ publish(event) {
9
+ this.emitter.emit(event.type, event);
10
+ this.emitter.emit(ANY_EVENT, event);
11
+ }
12
+ on(type, handler) {
13
+ this.emitter.on(type, handler);
14
+ }
15
+ off(type, handler) {
16
+ this.emitter.off(type, handler);
17
+ }
18
+ onAny(handler) {
19
+ this.emitter.on(ANY_EVENT, handler);
20
+ }
21
+ offAny(handler) {
22
+ this.emitter.off(ANY_EVENT, handler);
23
+ }
24
+ removeAllListeners(type) {
25
+ if (type !== undefined) {
26
+ this.emitter.removeAllListeners(type);
27
+ }
28
+ else {
29
+ this.emitter.removeAllListeners();
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO7C,MAAM,SAAS,GAAG,SAAkB,CAAC;AAErC,MAAM,OAAO,QAAQ;IACX,OAAO,CAAe;IAE9B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,KAAkB;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,CAAsB,IAAO,EAAE,OAAwB;QACvD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAuC,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAsB,IAAO,EAAE,OAAwB;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAuC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,OAAmB;QACvB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAuC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,OAAmB;QACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAuC,CAAC,CAAC;IACvE,CAAC;IAED,kBAAkB,CAAC,IAAgB;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { DomainEvent } from './types.js';
2
+ import type { OverlayStore } from './store.js';
3
+ export interface EventPlugin {
4
+ name: string;
5
+ onEvent(event: DomainEvent, store: OverlayStore): void;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-plugins.js","sourceRoot":"","sources":["../../../src/core/event-plugins.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import type { OverlayStore } from './store.js';
2
+ import type { Result, ForgeConfig } from './types.js';
3
+ import type { CalibrationEngine } from '../pm/calibration.js';
4
+ import type { EvmEngine, EvmTaskData } from '../pm/evm.js';
5
+ import type { ToleranceChecker } from '../pm/tolerances.js';
6
+ import type { PdcaTracker, FailureType } from '../pm/pdca.js';
7
+ import type { SessionManager } from '../pm/sessions.js';
8
+ import type { CallSheetGenerator, CallSheet, InternalMetrics } from '../pm/callsheet.js';
9
+ import type { EventBus } from './event-bus.js';
10
+ import type { EventPlugin } from './event-plugins.js';
11
+ export interface ForgeDeps {
12
+ config: ForgeConfig;
13
+ store: OverlayStore;
14
+ bus: EventBus;
15
+ calibration: CalibrationEngine;
16
+ evm: EvmEngine;
17
+ tolerances: ToleranceChecker;
18
+ pdca: PdcaTracker;
19
+ sessions: SessionManager;
20
+ callsheet: CallSheetGenerator;
21
+ plugins: EventPlugin[];
22
+ }
23
+ export declare function getEvmTasks(store: OverlayStore, calibration: CalibrationEngine): EvmTaskData[];
24
+ export declare function startTask(d: ForgeDeps, taskId: string, complexity?: number): Result<{
25
+ taskId: string;
26
+ estimatedTokens: number;
27
+ modelTier: string;
28
+ }>;
29
+ export declare function completeTask(d: ForgeDeps, taskId: string, actualTokens: number): Result<{
30
+ taskId: string;
31
+ spi: number;
32
+ cpi: number;
33
+ signal: string;
34
+ }>;
35
+ export declare function failTask(d: ForgeDeps, taskId: string, reason: string, failureType: FailureType): Result<{
36
+ taskId: string;
37
+ escalated: boolean;
38
+ newModel: string | null;
39
+ }>;
40
+ export declare function getStatus(d: ForgeDeps, includeInternal: boolean): (CallSheet & {
41
+ internal: InternalMetrics;
42
+ }) | CallSheet;
@@ -0,0 +1,101 @@
1
+ import { getModelTier } from './types.js';
2
+ export function getEvmTasks(store, calibration) {
3
+ return store.query('SELECT id, complexity, status FROM tasks').map(t => {
4
+ const row = store.query('SELECT planned_tokens, actual_tokens FROM evm_metrics WHERE task_id = ?', [t.id])[0];
5
+ return {
6
+ taskId: t.id, complexity: t.complexity,
7
+ plannedTokens: row?.planned_tokens ?? calibration.getEstimate(t.complexity),
8
+ actualTokens: row?.actual_tokens ?? 0, status: t.status,
9
+ };
10
+ });
11
+ }
12
+ export function startTask(d, taskId, complexity) {
13
+ const task = d.store.query('SELECT id, complexity FROM tasks WHERE id = ?', [taskId])[0];
14
+ if (!task)
15
+ return { ok: false, error: 'Task not found', hint: `No task with id ${taskId}` };
16
+ const comp = complexity ?? task.complexity;
17
+ const estimatedTokens = d.calibration.getEstimate(comp);
18
+ const modelTier = getModelTier(comp);
19
+ d.store.run('UPDATE tasks SET status = ?, model_tier = ?, complexity = ?, updated_at = datetime("now") WHERE id = ?', ['in_progress', modelTier, comp, taskId]);
20
+ d.store.run('INSERT OR REPLACE INTO evm_metrics (task_id, planned_tokens, actual_tokens, updated_at) VALUES (?, ?, 0, datetime("now"))', [taskId, estimatedTokens]);
21
+ d.pdca.startTask(taskId, comp);
22
+ const session = d.sessions.getCurrentSession();
23
+ if (session) {
24
+ d.sessions.addTask(taskId);
25
+ d.store.run('INSERT OR IGNORE INTO session_tasks (session_id, task_id) VALUES (?, ?)', [session.id, taskId]);
26
+ d.store.run('UPDATE sessions SET tokens_spent = ? WHERE id = ?', [session.tokensSpent, session.id]);
27
+ }
28
+ d.bus.publish({ type: 'task.started', taskId });
29
+ return { ok: true, value: { taskId, estimatedTokens, modelTier } };
30
+ }
31
+ export function completeTask(d, taskId, actualTokens) {
32
+ const task = d.store.query('SELECT id, complexity FROM tasks WHERE id = ?', [taskId])[0];
33
+ if (!task)
34
+ return { ok: false, error: 'Task not found', hint: `No task with id ${taskId}` };
35
+ d.store.run('UPDATE tasks SET status = ?, updated_at = datetime("now") WHERE id = ?', ['done', taskId]);
36
+ d.store.run('UPDATE evm_metrics SET actual_tokens = ?, updated_at = datetime("now") WHERE task_id = ?', [actualTokens, taskId]);
37
+ d.pdca.completeTask(taskId);
38
+ const session = d.sessions.getCurrentSession();
39
+ if (session) {
40
+ d.sessions.recordTokens(taskId, actualTokens);
41
+ d.sessions.recordTaskCompletion(taskId, task.complexity);
42
+ }
43
+ checkTolerances(d, taskId, task.complexity, actualTokens);
44
+ d.bus.publish({ type: 'task.completed', taskId, actualTokens });
45
+ const metrics = d.evm.calculateMetrics(getEvmTasks(d.store, d.calibration));
46
+ return { ok: true, value: { taskId, spi: metrics.spi, cpi: metrics.cpi, signal: metrics.signal } };
47
+ }
48
+ function checkTolerances(d, taskId, complexity, actualTokens) {
49
+ const results = d.tolerances.checkTask(d.calibration.getEstimate(complexity), actualTokens, d.config.tolerancePreset);
50
+ for (const tr of results) {
51
+ if (tr.status === 'breached') {
52
+ d.bus.publish({ type: 'tolerance.breached', taskId, dimension: tr.dimension, actual: tr.actual, limit: tr.upperBound });
53
+ }
54
+ else if (tr.status === 'at_risk') {
55
+ d.bus.publish({ type: 'tolerance.warning', taskId, dimension: tr.dimension, actual: tr.actual, limit: tr.upperBound });
56
+ }
57
+ }
58
+ }
59
+ export function failTask(d, taskId, reason, failureType) {
60
+ const result = d.pdca.recordFailure(taskId, reason, failureType);
61
+ if (!result.ok)
62
+ return { ok: false, error: result.error, hint: result.hint };
63
+ const state = result.value;
64
+ const escalated = state.currentPhase === 'escalated';
65
+ const newModel = state.escalationCount > 0 ? state.modelTier : null;
66
+ // Always emit task.failed for lesson capture
67
+ d.store.run('UPDATE tasks SET last_failure_reason = ?, updated_at = datetime("now") WHERE id = ?', [reason, taskId]);
68
+ d.bus.publish({ type: 'task.failed', taskId, reason, iteration: state.iteration });
69
+ if (escalated) {
70
+ d.store.run('UPDATE tasks SET status = ?, updated_at = datetime("now") WHERE id = ?', ['blocked', taskId]);
71
+ d.bus.publish({ type: 'escalation.required', taskId, reason });
72
+ }
73
+ else if (newModel) {
74
+ d.store.run('UPDATE tasks SET model_tier = ?, escalation_count = ?, updated_at = datetime("now") WHERE id = ?', [newModel, state.escalationCount, taskId]);
75
+ }
76
+ return { ok: true, value: { taskId, escalated, newModel } };
77
+ }
78
+ export function getStatus(d, includeInternal) {
79
+ const tasks = d.store.query('SELECT id, title, status, complexity FROM tasks');
80
+ const evmMetrics = d.evm.calculateMetrics(getEvmTasks(d.store, d.calibration));
81
+ const session = d.sessions.getSummary();
82
+ const input = {
83
+ projectName: d.config.name, goal: session?.goal ?? d.config.name,
84
+ tasks: tasks.map(t => ({ id: t.id, title: t.title, taskStatus: t.status, complexity: t.complexity })),
85
+ spi: evmMetrics.spi, cpi: evmMetrics.cpi, health: evmMetrics.health, evmSignal: evmMetrics.signal,
86
+ avgTokensPerMinute: 500, tokensRemaining: session ? session.tokensRemaining : 0,
87
+ };
88
+ if (!includeInternal)
89
+ return d.callsheet.generateForHuman(input);
90
+ const agentSheet = d.callsheet.generateForAgent(input);
91
+ // Surface recent drift alerts in internal metrics
92
+ const recentDrifts = d.store.query("SELECT data FROM events WHERE type = 'agent.drift.detected' ORDER BY id DESC LIMIT 5");
93
+ if (recentDrifts.length > 0) {
94
+ agentSheet.internal.driftAlerts = recentDrifts.map(r => {
95
+ const parsed = JSON.parse(r.data);
96
+ return { driftType: parsed.driftType, expected: parsed.expected, actual: parsed.actual, severity: parsed.severity };
97
+ });
98
+ }
99
+ return agentSheet;
100
+ }
101
+ //# sourceMappingURL=forge-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-ops.js","sourceRoot":"","sources":["../../../src/core/forge-ops.ts"],"names":[],"mappings":"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"}