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.
- package/dist/bin/forgepm.d.ts +2 -0
- package/dist/bin/forgepm.js +4 -0
- package/dist/bin/forgepm.js.map +1 -0
- package/dist/src/backends/base.d.ts +23 -0
- package/dist/src/backends/base.js +2 -0
- package/dist/src/backends/base.js.map +1 -0
- package/dist/src/backends/http-utils.d.ts +6 -0
- package/dist/src/backends/http-utils.js +36 -0
- package/dist/src/backends/http-utils.js.map +1 -0
- package/dist/src/backends/jira.d.ts +16 -0
- package/dist/src/backends/jira.js +117 -0
- package/dist/src/backends/jira.js.map +1 -0
- package/dist/src/backends/linear.d.ts +11 -0
- package/dist/src/backends/linear.js +85 -0
- package/dist/src/backends/linear.js.map +1 -0
- package/dist/src/cli/archaeology.d.ts +38 -0
- package/dist/src/cli/archaeology.js +182 -0
- package/dist/src/cli/archaeology.js.map +1 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +351 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/core/event-bus.d.ts +17 -0
- package/dist/src/core/event-bus.js +33 -0
- package/dist/src/core/event-bus.js.map +1 -0
- package/dist/src/core/event-plugins.d.ts +6 -0
- package/dist/src/core/event-plugins.js +2 -0
- package/dist/src/core/event-plugins.js.map +1 -0
- package/dist/src/core/forge-ops.d.ts +42 -0
- package/dist/src/core/forge-ops.js +101 -0
- package/dist/src/core/forge-ops.js.map +1 -0
- package/dist/src/core/forge.d.ts +44 -0
- package/dist/src/core/forge.js +86 -0
- package/dist/src/core/forge.js.map +1 -0
- package/dist/src/core/schema.d.ts +8 -0
- package/dist/src/core/schema.js +139 -0
- package/dist/src/core/schema.js.map +1 -0
- package/dist/src/core/store.d.ts +24 -0
- package/dist/src/core/store.js +155 -0
- package/dist/src/core/store.js.map +1 -0
- package/dist/src/core/types.d.ts +91 -0
- package/dist/src/core/types.js +19 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/version.d.ts +1 -0
- package/dist/src/core/version.js +20 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/github/pull.d.ts +13 -0
- package/dist/src/github/pull.js +51 -0
- package/dist/src/github/pull.js.map +1 -0
- package/dist/src/github/push.d.ts +20 -0
- package/dist/src/github/push.js +118 -0
- package/dist/src/github/push.js.map +1 -0
- package/dist/src/github/setup.d.ts +10 -0
- package/dist/src/github/setup.js +112 -0
- package/dist/src/github/setup.js.map +1 -0
- package/dist/src/github/slack.d.ts +12 -0
- package/dist/src/github/slack.js +33 -0
- package/dist/src/github/slack.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/server.d.ts +5 -0
- package/dist/src/mcp/server.js +69 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tool-handlers.d.ts +19 -0
- package/dist/src/mcp/tool-handlers.js +123 -0
- package/dist/src/mcp/tool-handlers.js.map +1 -0
- package/dist/src/pm/calibration.d.ts +13 -0
- package/dist/src/pm/calibration.js +56 -0
- package/dist/src/pm/calibration.js.map +1 -0
- package/dist/src/pm/callsheet.d.ts +66 -0
- package/dist/src/pm/callsheet.js +91 -0
- package/dist/src/pm/callsheet.js.map +1 -0
- package/dist/src/pm/drift-detector.d.ts +38 -0
- package/dist/src/pm/drift-detector.js +111 -0
- package/dist/src/pm/drift-detector.js.map +1 -0
- package/dist/src/pm/evm.d.ts +31 -0
- package/dist/src/pm/evm.js +58 -0
- package/dist/src/pm/evm.js.map +1 -0
- package/dist/src/pm/pdca.d.ts +27 -0
- package/dist/src/pm/pdca.js +83 -0
- package/dist/src/pm/pdca.js.map +1 -0
- package/dist/src/pm/recall.d.ts +23 -0
- package/dist/src/pm/recall.js +126 -0
- package/dist/src/pm/recall.js.map +1 -0
- package/dist/src/pm/retrospective.d.ts +35 -0
- package/dist/src/pm/retrospective.js +104 -0
- package/dist/src/pm/retrospective.js.map +1 -0
- package/dist/src/pm/sessions.d.ts +36 -0
- package/dist/src/pm/sessions.js +91 -0
- package/dist/src/pm/sessions.js.map +1 -0
- package/dist/src/pm/tolerances.d.ts +21 -0
- package/dist/src/pm/tolerances.js +54 -0
- package/dist/src/pm/tolerances.js.map +1 -0
- package/dist/src/utils/validation.d.ts +2 -0
- package/dist/src/utils/validation.js +8 -0
- package/dist/src/utils/validation.js.map +1 -0
- 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 @@
|
|
|
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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"}
|