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,44 @@
|
|
|
1
|
+
import { EventBus } from './event-bus.js';
|
|
2
|
+
import { OverlayStore } from './store.js';
|
|
3
|
+
import type { ForgeConfig, Result } from './types.js';
|
|
4
|
+
import type { EventPlugin } from './event-plugins.js';
|
|
5
|
+
import { CalibrationEngine } from '../pm/calibration.js';
|
|
6
|
+
import { EvmEngine } from '../pm/evm.js';
|
|
7
|
+
import { ToleranceChecker } from '../pm/tolerances.js';
|
|
8
|
+
import { PdcaTracker } from '../pm/pdca.js';
|
|
9
|
+
import type { FailureType } from '../pm/pdca.js';
|
|
10
|
+
import { SessionManager } from '../pm/sessions.js';
|
|
11
|
+
import { CallSheetGenerator } from '../pm/callsheet.js';
|
|
12
|
+
import type { CallSheet, InternalMetrics } from '../pm/callsheet.js';
|
|
13
|
+
export interface ForgeInstance {
|
|
14
|
+
config: ForgeConfig;
|
|
15
|
+
store: OverlayStore;
|
|
16
|
+
bus: EventBus;
|
|
17
|
+
calibration: CalibrationEngine;
|
|
18
|
+
evm: EvmEngine;
|
|
19
|
+
tolerances: ToleranceChecker;
|
|
20
|
+
pdca: PdcaTracker;
|
|
21
|
+
sessions: SessionManager;
|
|
22
|
+
callsheet: CallSheetGenerator;
|
|
23
|
+
plugins: EventPlugin[];
|
|
24
|
+
startTask(taskId: string, complexity?: number): Result<{
|
|
25
|
+
taskId: string;
|
|
26
|
+
estimatedTokens: number;
|
|
27
|
+
modelTier: string;
|
|
28
|
+
}>;
|
|
29
|
+
completeTask(taskId: string, actualTokens: number): Result<{
|
|
30
|
+
taskId: string;
|
|
31
|
+
spi: number;
|
|
32
|
+
cpi: number;
|
|
33
|
+
signal: string;
|
|
34
|
+
}>;
|
|
35
|
+
failTask(taskId: string, reason: string, failureType: FailureType): Result<{
|
|
36
|
+
taskId: string;
|
|
37
|
+
escalated: boolean;
|
|
38
|
+
newModel: string | null;
|
|
39
|
+
}>;
|
|
40
|
+
getStatus(includeInternal?: boolean): (CallSheet & {
|
|
41
|
+
internal: InternalMetrics;
|
|
42
|
+
}) | CallSheet;
|
|
43
|
+
}
|
|
44
|
+
export declare function createForge(dbPath: string, configOverrides?: Partial<ForgeConfig>, extraPlugins?: EventPlugin[]): Promise<ForgeInstance>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { EventBus } from './event-bus.js';
|
|
2
|
+
import { OverlayStore } from './store.js';
|
|
3
|
+
import { DEFAULT_CONFIG } from './types.js';
|
|
4
|
+
import { CalibrationEngine, DEFAULT_CALIBRATION } from '../pm/calibration.js';
|
|
5
|
+
import { EvmEngine } from '../pm/evm.js';
|
|
6
|
+
import { ToleranceChecker } from '../pm/tolerances.js';
|
|
7
|
+
import { PdcaTracker } from '../pm/pdca.js';
|
|
8
|
+
import { SessionManager } from '../pm/sessions.js';
|
|
9
|
+
import { CallSheetGenerator } from '../pm/callsheet.js';
|
|
10
|
+
import { startTask, completeTask, failTask, getStatus } from './forge-ops.js';
|
|
11
|
+
import { DriftDetector } from '../pm/drift-detector.js';
|
|
12
|
+
import { RetrospectiveEngine } from '../pm/retrospective.js';
|
|
13
|
+
export async function createForge(dbPath, configOverrides, extraPlugins = []) {
|
|
14
|
+
const config = { ...DEFAULT_CONFIG, ...configOverrides };
|
|
15
|
+
const store = new OverlayStore(dbPath);
|
|
16
|
+
await store.init();
|
|
17
|
+
const bus = new EventBus();
|
|
18
|
+
const calibration = loadCalibration(store);
|
|
19
|
+
const evm = new EvmEngine(calibration);
|
|
20
|
+
const tolerances = new ToleranceChecker();
|
|
21
|
+
const pdca = new PdcaTracker();
|
|
22
|
+
const sessions = new SessionManager();
|
|
23
|
+
const callsheet = new CallSheetGenerator();
|
|
24
|
+
// Load project-specific drift thresholds from DB if available
|
|
25
|
+
const configRow = store.query('SELECT drift_thresholds FROM project_config WHERE id = ? LIMIT 1', ['default']);
|
|
26
|
+
const driftOverrides = configRow[0]?.drift_thresholds ? JSON.parse(configRow[0].drift_thresholds) : undefined;
|
|
27
|
+
const plugins = [new DriftDetector(driftOverrides), ...extraPlugins];
|
|
28
|
+
const deps = { config, store, bus, calibration, evm, tolerances, pdca, sessions, callsheet, plugins };
|
|
29
|
+
wireEvents(deps);
|
|
30
|
+
return {
|
|
31
|
+
...deps,
|
|
32
|
+
startTask: (taskId, complexity) => startTask(deps, taskId, complexity),
|
|
33
|
+
completeTask: (taskId, tokens) => completeTask(deps, taskId, tokens),
|
|
34
|
+
failTask: (taskId, reason, type) => failTask(deps, taskId, reason, type),
|
|
35
|
+
getStatus: (includeInternal) => getStatus(deps, includeInternal ?? false),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function loadCalibration(store) {
|
|
39
|
+
const rows = store.query('SELECT complexity_score, avg_tokens, sample_count FROM calibration ORDER BY complexity_score');
|
|
40
|
+
const seed = rows.length > 0 ? rows : DEFAULT_CALIBRATION.map(c => ({
|
|
41
|
+
complexity_score: c.complexity_score, avg_tokens: c.avg_tokens, sample_count: c.sample_count,
|
|
42
|
+
}));
|
|
43
|
+
return new CalibrationEngine(seed);
|
|
44
|
+
}
|
|
45
|
+
function wireEvents(d) {
|
|
46
|
+
// Core: calibration update on task completion
|
|
47
|
+
d.bus.on('task.completed', (event) => {
|
|
48
|
+
const complexity = d.store.query('SELECT complexity FROM tasks WHERE id = ?', [event.taskId])[0]?.complexity ?? 3;
|
|
49
|
+
const cal = d.calibration.update(complexity, event.actualTokens);
|
|
50
|
+
d.store.run('UPDATE calibration SET avg_tokens = ?, sample_count = ?, updated_at = datetime("now") WHERE complexity_score = ?', [cal.avg_tokens, cal.sample_count, cal.complexity_score]);
|
|
51
|
+
});
|
|
52
|
+
// Core: persist session state to DB
|
|
53
|
+
d.bus.on('session.started', (event) => {
|
|
54
|
+
d.store.run("INSERT OR REPLACE INTO sessions (id, goal, token_budget, tokens_spent, velocity_points, status, started_at) VALUES (?, ?, ?, 0, 0, 'active', ?)", [event.sessionId, event.goal, 100000, new Date().toISOString()]);
|
|
55
|
+
});
|
|
56
|
+
d.bus.on('session.ended', (event) => {
|
|
57
|
+
d.store.run("UPDATE sessions SET status = 'completed', velocity_points = ?, completed_at = ? WHERE id = ?", [event.velocity, new Date().toISOString(), event.sessionId]);
|
|
58
|
+
// Auto-trigger retrospective
|
|
59
|
+
const retro = new RetrospectiveEngine(d.store);
|
|
60
|
+
const report = retro.generate(event.sessionId);
|
|
61
|
+
if (report) {
|
|
62
|
+
d.store.run("INSERT INTO lessons_learned (source, entity_id, description, created_at) VALUES (?, ?, ?, datetime('now'))", ['auto_retro', event.sessionId, `Session retro: ${report.progress.done}/${report.progress.total} tasks, SPI ${report.evm.spi}, CPI ${report.evm.cpi}`]);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Core: persist PDCA iterations to DB
|
|
66
|
+
d.bus.on('task.started', (event) => {
|
|
67
|
+
d.store.run("INSERT INTO pdca_iterations (task_id, iteration, phase, timestamp) VALUES (?, 0, 'plan', ?)", [event.taskId, new Date().toISOString()]);
|
|
68
|
+
});
|
|
69
|
+
// Core: auto-capture lessons + persist PDCA failure
|
|
70
|
+
d.bus.on('task.failed', (event) => {
|
|
71
|
+
d.store.run("INSERT INTO lessons_learned (source, entity_id, failure_type, description, created_at) VALUES (?, ?, ?, ?, datetime('now'))", ['pdca_failure', event.taskId, 'unknown', event.reason]);
|
|
72
|
+
d.store.run("INSERT INTO pdca_iterations (task_id, iteration, phase, failure_reason, timestamp) VALUES (?, ?, 'do', ?, ?)", [event.taskId, event.iteration, event.reason, new Date().toISOString()]);
|
|
73
|
+
});
|
|
74
|
+
// Core: auto-capture lessons from tolerance breaches
|
|
75
|
+
d.bus.on('tolerance.breached', (event) => {
|
|
76
|
+
d.store.run("INSERT INTO lessons_learned (source, entity_id, description, created_at) VALUES (?, ?, ?, datetime('now'))", ['tolerance_breach', event.taskId, `${event.dimension} breached: actual ${event.actual} vs limit ${event.limit}`]);
|
|
77
|
+
});
|
|
78
|
+
// Dispatch to registered plugins
|
|
79
|
+
d.bus.onAny((event) => {
|
|
80
|
+
d.store.appendEvent(event);
|
|
81
|
+
for (const plugin of d.plugins) {
|
|
82
|
+
plugin.onEvent(event, d.store);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../../src/core/forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const SCHEMA_VERSION = 4;
|
|
2
|
+
export interface Migration {
|
|
3
|
+
version: number;
|
|
4
|
+
sql: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const MIGRATIONS: Migration[];
|
|
7
|
+
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS project_config (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n current_phase TEXT NOT NULL,\n phases TEXT NOT NULL,\n tolerance_preset TEXT NOT NULL,\n wip_limit INTEGER NOT NULL DEFAULT 3,\n github_sync INTEGER NOT NULL DEFAULT 0,\n github_owner TEXT,\n github_repo TEXT,\n github_project_number INTEGER,\n slack_webhook TEXT,\n standup_timeout_hours INTEGER NOT NULL DEFAULT 4,\n pm_model TEXT NOT NULL DEFAULT 'sonnet',\n active_backends TEXT NOT NULL DEFAULT '[]',\n drift_thresholds TEXT NOT NULL DEFAULT '{}'\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT,\n why TEXT,\n status TEXT NOT NULL DEFAULT 'backlog',\n complexity INTEGER NOT NULL DEFAULT 3,\n model_tier TEXT NOT NULL DEFAULT 'haiku',\n assignee TEXT,\n story_id TEXT,\n depends_on TEXT NOT NULL DEFAULT '[]',\n acceptance_criteria TEXT NOT NULL DEFAULT '[]',\n dod_checks TEXT NOT NULL DEFAULT '[]',\n token_source TEXT NOT NULL DEFAULT 'estimated',\n github_issue_number INTEGER,\n escalation_count INTEGER NOT NULL DEFAULT 0,\n last_failure_reason TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS stories (\n id TEXT PRIMARY KEY, epic_id TEXT, title TEXT NOT NULL, user_story TEXT, why TEXT,\n story_points INTEGER, status TEXT NOT NULL DEFAULT 'backlog',\n acceptance_criteria TEXT NOT NULL DEFAULT '[]', priority_rank INTEGER NOT NULL DEFAULT 0,\n sprint_id TEXT, github_issue_number INTEGER, created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS epics (\n id TEXT PRIMARY KEY, title TEXT NOT NULL, description TEXT, why TEXT,\n status TEXT NOT NULL DEFAULT 'open', github_issue_number INTEGER,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS sprints (\n id TEXT PRIMARY KEY, name TEXT NOT NULL, goal TEXT, status TEXT NOT NULL DEFAULT 'planned',\n capacity_tokens INTEGER, velocity_points REAL, started_at TEXT, completed_at TEXT,\n retrospective TEXT, github_iteration_id INTEGER, created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS evm_metrics (\n task_id TEXT PRIMARY KEY, planned_tokens INTEGER NOT NULL,\n actual_tokens INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS tolerances (\n id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT NOT NULL, scope_id TEXT NOT NULL,\n dimension TEXT NOT NULL, target REAL NOT NULL, upper_bound REAL NOT NULL,\n unit TEXT NOT NULL DEFAULT 'tokens'\n);\n\nCREATE TABLE IF NOT EXISTS tolerance_checks (\n id INTEGER PRIMARY KEY AUTOINCREMENT, tolerance_id INTEGER NOT NULL, task_id TEXT NOT NULL,\n actual_value REAL NOT NULL, status TEXT NOT NULL, checked_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS pdca_iterations (\n id INTEGER PRIMARY KEY AUTOINCREMENT, task_id TEXT NOT NULL, iteration INTEGER NOT NULL,\n phase TEXT NOT NULL, model_used TEXT, failure_reason TEXT, outcome TEXT, timestamp TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS calibration (\n complexity_score INTEGER PRIMARY KEY, avg_tokens INTEGER NOT NULL,\n sample_count INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY, sprint_id TEXT, goal TEXT, token_budget INTEGER,\n tokens_spent INTEGER NOT NULL DEFAULT 0, velocity_points REAL,\n status TEXT NOT NULL DEFAULT 'active', started_at TEXT NOT NULL, completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS session_tasks (\n session_id TEXT NOT NULL, task_id TEXT NOT NULL, PRIMARY KEY (session_id, task_id)\n);\n\nCREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, entity_id TEXT,\n data TEXT NOT NULL DEFAULT '{}', timestamp TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS lessons_learned (\n id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT NOT NULL, entity_id TEXT NOT NULL,\n failure_type TEXT, description TEXT NOT NULL, action TEXT,\n tags TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS sync_outbox (\n id INTEGER PRIMARY KEY AUTOINCREMENT, entity_type TEXT NOT NULL, entity_id TEXT NOT NULL,\n operation TEXT NOT NULL, payload TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')), synced_at TEXT\n);\n";
|
|
8
|
+
export declare const CALIBRATION_SEED: readonly [readonly [1, 300], readonly [2, 500], readonly [3, 800], readonly [4, 1200], readonly [5, 1800], readonly [6, 2500], readonly [7, 3500], readonly [8, 5000], readonly [9, 7000], readonly [10, 10000]];
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
export const SCHEMA_VERSION = 4;
|
|
2
|
+
export const MIGRATIONS = [
|
|
3
|
+
{
|
|
4
|
+
version: 2,
|
|
5
|
+
sql: `
|
|
6
|
+
ALTER TABLE tasks ADD COLUMN dod_checks TEXT NOT NULL DEFAULT '[]';
|
|
7
|
+
ALTER TABLE tasks ADD COLUMN token_source TEXT NOT NULL DEFAULT 'estimated';
|
|
8
|
+
`,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
version: 3,
|
|
12
|
+
sql: `ALTER TABLE project_config ADD COLUMN active_backends TEXT NOT NULL DEFAULT '[]';`,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
version: 4,
|
|
16
|
+
sql: `ALTER TABLE project_config ADD COLUMN drift_thresholds TEXT NOT NULL DEFAULT '{}';`,
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
export const SCHEMA_SQL = `
|
|
20
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
21
|
+
version INTEGER NOT NULL
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS project_config (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
name TEXT NOT NULL,
|
|
27
|
+
current_phase TEXT NOT NULL,
|
|
28
|
+
phases TEXT NOT NULL,
|
|
29
|
+
tolerance_preset TEXT NOT NULL,
|
|
30
|
+
wip_limit INTEGER NOT NULL DEFAULT 3,
|
|
31
|
+
github_sync INTEGER NOT NULL DEFAULT 0,
|
|
32
|
+
github_owner TEXT,
|
|
33
|
+
github_repo TEXT,
|
|
34
|
+
github_project_number INTEGER,
|
|
35
|
+
slack_webhook TEXT,
|
|
36
|
+
standup_timeout_hours INTEGER NOT NULL DEFAULT 4,
|
|
37
|
+
pm_model TEXT NOT NULL DEFAULT 'sonnet',
|
|
38
|
+
active_backends TEXT NOT NULL DEFAULT '[]',
|
|
39
|
+
drift_thresholds TEXT NOT NULL DEFAULT '{}'
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
43
|
+
id TEXT PRIMARY KEY,
|
|
44
|
+
title TEXT NOT NULL,
|
|
45
|
+
description TEXT,
|
|
46
|
+
why TEXT,
|
|
47
|
+
status TEXT NOT NULL DEFAULT 'backlog',
|
|
48
|
+
complexity INTEGER NOT NULL DEFAULT 3,
|
|
49
|
+
model_tier TEXT NOT NULL DEFAULT 'haiku',
|
|
50
|
+
assignee TEXT,
|
|
51
|
+
story_id TEXT,
|
|
52
|
+
depends_on TEXT NOT NULL DEFAULT '[]',
|
|
53
|
+
acceptance_criteria TEXT NOT NULL DEFAULT '[]',
|
|
54
|
+
dod_checks TEXT NOT NULL DEFAULT '[]',
|
|
55
|
+
token_source TEXT NOT NULL DEFAULT 'estimated',
|
|
56
|
+
github_issue_number INTEGER,
|
|
57
|
+
escalation_count INTEGER NOT NULL DEFAULT 0,
|
|
58
|
+
last_failure_reason TEXT,
|
|
59
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
60
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS stories (
|
|
64
|
+
id TEXT PRIMARY KEY, epic_id TEXT, title TEXT NOT NULL, user_story TEXT, why TEXT,
|
|
65
|
+
story_points INTEGER, status TEXT NOT NULL DEFAULT 'backlog',
|
|
66
|
+
acceptance_criteria TEXT NOT NULL DEFAULT '[]', priority_rank INTEGER NOT NULL DEFAULT 0,
|
|
67
|
+
sprint_id TEXT, github_issue_number INTEGER, created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE TABLE IF NOT EXISTS epics (
|
|
71
|
+
id TEXT PRIMARY KEY, title TEXT NOT NULL, description TEXT, why TEXT,
|
|
72
|
+
status TEXT NOT NULL DEFAULT 'open', github_issue_number INTEGER,
|
|
73
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE TABLE IF NOT EXISTS sprints (
|
|
77
|
+
id TEXT PRIMARY KEY, name TEXT NOT NULL, goal TEXT, status TEXT NOT NULL DEFAULT 'planned',
|
|
78
|
+
capacity_tokens INTEGER, velocity_points REAL, started_at TEXT, completed_at TEXT,
|
|
79
|
+
retrospective TEXT, github_iteration_id INTEGER, created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS evm_metrics (
|
|
83
|
+
task_id TEXT PRIMARY KEY, planned_tokens INTEGER NOT NULL,
|
|
84
|
+
actual_tokens INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
CREATE TABLE IF NOT EXISTS tolerances (
|
|
88
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT NOT NULL, scope_id TEXT NOT NULL,
|
|
89
|
+
dimension TEXT NOT NULL, target REAL NOT NULL, upper_bound REAL NOT NULL,
|
|
90
|
+
unit TEXT NOT NULL DEFAULT 'tokens'
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
CREATE TABLE IF NOT EXISTS tolerance_checks (
|
|
94
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, tolerance_id INTEGER NOT NULL, task_id TEXT NOT NULL,
|
|
95
|
+
actual_value REAL NOT NULL, status TEXT NOT NULL, checked_at TEXT NOT NULL
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
CREATE TABLE IF NOT EXISTS pdca_iterations (
|
|
99
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, task_id TEXT NOT NULL, iteration INTEGER NOT NULL,
|
|
100
|
+
phase TEXT NOT NULL, model_used TEXT, failure_reason TEXT, outcome TEXT, timestamp TEXT NOT NULL
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
CREATE TABLE IF NOT EXISTS calibration (
|
|
104
|
+
complexity_score INTEGER PRIMARY KEY, avg_tokens INTEGER NOT NULL,
|
|
105
|
+
sample_count INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
109
|
+
id TEXT PRIMARY KEY, sprint_id TEXT, goal TEXT, token_budget INTEGER,
|
|
110
|
+
tokens_spent INTEGER NOT NULL DEFAULT 0, velocity_points REAL,
|
|
111
|
+
status TEXT NOT NULL DEFAULT 'active', started_at TEXT NOT NULL, completed_at TEXT
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
CREATE TABLE IF NOT EXISTS session_tasks (
|
|
115
|
+
session_id TEXT NOT NULL, task_id TEXT NOT NULL, PRIMARY KEY (session_id, task_id)
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
119
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, entity_id TEXT,
|
|
120
|
+
data TEXT NOT NULL DEFAULT '{}', timestamp TEXT NOT NULL
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
CREATE TABLE IF NOT EXISTS lessons_learned (
|
|
124
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT NOT NULL, entity_id TEXT NOT NULL,
|
|
125
|
+
failure_type TEXT, description TEXT NOT NULL, action TEXT,
|
|
126
|
+
tags TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
CREATE TABLE IF NOT EXISTS sync_outbox (
|
|
130
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, entity_type TEXT NOT NULL, entity_id TEXT NOT NULL,
|
|
131
|
+
operation TEXT NOT NULL, payload TEXT NOT NULL DEFAULT '{}',
|
|
132
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')), synced_at TEXT
|
|
133
|
+
);
|
|
134
|
+
`;
|
|
135
|
+
export const CALIBRATION_SEED = [
|
|
136
|
+
[1, 300], [2, 500], [3, 800], [4, 1200], [5, 1800],
|
|
137
|
+
[6, 2500], [7, 3500], [8, 5000], [9, 7000], [10, 10000],
|
|
138
|
+
];
|
|
139
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAOhC,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,CAAC;QACV,GAAG,EAAE;;;KAGJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,GAAG,EAAE,mFAAmF;KACzF;IACD;QACE,OAAO,EAAE,CAAC;QACV,GAAG,EAAE,oFAAoF;KAC1F;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHzB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;IAClD,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC;CAC/C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type BindParams } from 'sql.js';
|
|
2
|
+
import type { DomainEvent } from './types.js';
|
|
3
|
+
export declare class OverlayStore {
|
|
4
|
+
private dbPath;
|
|
5
|
+
private db;
|
|
6
|
+
private SQL;
|
|
7
|
+
private idCounters;
|
|
8
|
+
private writesSinceLastSave;
|
|
9
|
+
private autoSaveThreshold;
|
|
10
|
+
constructor(dbPath: string);
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
private assertDb;
|
|
13
|
+
private runSchema;
|
|
14
|
+
private runMigrations;
|
|
15
|
+
private restoreIdCounters;
|
|
16
|
+
private seedCalibration;
|
|
17
|
+
query<T>(sql: string, params?: BindParams): T[];
|
|
18
|
+
run(sql: string, params?: BindParams): void;
|
|
19
|
+
nextId(prefix: string): string;
|
|
20
|
+
appendEvent(event: DomainEvent): void;
|
|
21
|
+
save(): void;
|
|
22
|
+
close(): void;
|
|
23
|
+
getSchemaVersion(): number;
|
|
24
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import initSqlJs from 'sql.js';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { SCHEMA_VERSION, SCHEMA_SQL, MIGRATIONS, CALIBRATION_SEED } from './schema.js';
|
|
5
|
+
export class OverlayStore {
|
|
6
|
+
dbPath;
|
|
7
|
+
db = null;
|
|
8
|
+
SQL = null;
|
|
9
|
+
idCounters = new Map();
|
|
10
|
+
writesSinceLastSave = 0;
|
|
11
|
+
autoSaveThreshold = 1;
|
|
12
|
+
constructor(dbPath) {
|
|
13
|
+
this.dbPath = path.resolve(dbPath);
|
|
14
|
+
}
|
|
15
|
+
async init() {
|
|
16
|
+
this.SQL = await initSqlJs();
|
|
17
|
+
const dir = path.dirname(this.dbPath);
|
|
18
|
+
if (!fs.existsSync(dir)) {
|
|
19
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
if (fs.existsSync(this.dbPath)) {
|
|
22
|
+
const buffer = fs.readFileSync(this.dbPath);
|
|
23
|
+
this.db = new this.SQL.Database(buffer);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.db = new this.SQL.Database();
|
|
27
|
+
}
|
|
28
|
+
this.runSchema();
|
|
29
|
+
this.runMigrations();
|
|
30
|
+
this.seedCalibration();
|
|
31
|
+
this.restoreIdCounters();
|
|
32
|
+
}
|
|
33
|
+
assertDb() {
|
|
34
|
+
if (!this.db)
|
|
35
|
+
throw new Error('OverlayStore not initialized — call init() first');
|
|
36
|
+
return this.db;
|
|
37
|
+
}
|
|
38
|
+
runSchema() {
|
|
39
|
+
const db = this.assertDb();
|
|
40
|
+
db.run(SCHEMA_SQL);
|
|
41
|
+
// Track schema version
|
|
42
|
+
const rows = this.query('SELECT version FROM schema_version LIMIT 1');
|
|
43
|
+
if (rows.length === 0) {
|
|
44
|
+
db.run('INSERT INTO schema_version (version) VALUES (?)', [SCHEMA_VERSION]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
runMigrations() {
|
|
48
|
+
const currentVersion = this.getSchemaVersion();
|
|
49
|
+
const pending = MIGRATIONS.filter(m => m.version > currentVersion);
|
|
50
|
+
if (pending.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const db = this.assertDb();
|
|
53
|
+
for (const migration of pending) {
|
|
54
|
+
db.run(migration.sql);
|
|
55
|
+
db.run('UPDATE schema_version SET version = ?', [migration.version]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
restoreIdCounters() {
|
|
59
|
+
// Table/prefix are hardcoded constants — safe to interpolate table names
|
|
60
|
+
// LIKE pattern uses bind param to avoid any injection risk
|
|
61
|
+
const tables = [
|
|
62
|
+
{ table: 'tasks', prefix: 'TASK', offset: 6 },
|
|
63
|
+
{ table: 'stories', prefix: 'STORY', offset: 7 },
|
|
64
|
+
{ table: 'epics', prefix: 'EPIC', offset: 6 },
|
|
65
|
+
{ table: 'sessions', prefix: 'SESSION', offset: 9 },
|
|
66
|
+
{ table: 'sprints', prefix: 'SPRINT', offset: 8 },
|
|
67
|
+
];
|
|
68
|
+
for (const { table, prefix, offset } of tables) {
|
|
69
|
+
const rows = this.query(`SELECT MAX(CAST(SUBSTR(id, ${offset}) AS INTEGER)) as max_num FROM ${table} WHERE id LIKE ?`, [`${prefix}-%`]);
|
|
70
|
+
const maxNum = rows[0]?.max_num;
|
|
71
|
+
if (maxNum != null && maxNum > 0) {
|
|
72
|
+
this.idCounters.set(prefix, maxNum);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
seedCalibration() {
|
|
77
|
+
const now = new Date().toISOString();
|
|
78
|
+
for (const [score, tokens] of CALIBRATION_SEED) {
|
|
79
|
+
const existing = this.query('SELECT complexity_score FROM calibration WHERE complexity_score = ?', [score]);
|
|
80
|
+
if (existing.length === 0) {
|
|
81
|
+
this.run('INSERT INTO calibration (complexity_score, avg_tokens, sample_count, updated_at) VALUES (?, ?, 0, ?)', [score, tokens, now]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
query(sql, params) {
|
|
86
|
+
const db = this.assertDb();
|
|
87
|
+
const stmt = db.prepare(sql);
|
|
88
|
+
if (params !== undefined) {
|
|
89
|
+
stmt.bind(params);
|
|
90
|
+
}
|
|
91
|
+
const results = [];
|
|
92
|
+
while (stmt.step()) {
|
|
93
|
+
results.push(stmt.getAsObject());
|
|
94
|
+
}
|
|
95
|
+
stmt.free();
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
run(sql, params) {
|
|
99
|
+
const db = this.assertDb();
|
|
100
|
+
if (params !== undefined) {
|
|
101
|
+
db.run(sql, params);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
db.run(sql);
|
|
105
|
+
}
|
|
106
|
+
// Auto-save after write operations to prevent data loss on crash
|
|
107
|
+
const upper = sql.trimStart().toUpperCase();
|
|
108
|
+
if (upper.startsWith('INSERT') || upper.startsWith('UPDATE') || upper.startsWith('DELETE')) {
|
|
109
|
+
this.writesSinceLastSave++;
|
|
110
|
+
if (this.writesSinceLastSave >= this.autoSaveThreshold) {
|
|
111
|
+
this.save();
|
|
112
|
+
this.writesSinceLastSave = 0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
nextId(prefix) {
|
|
117
|
+
const current = this.idCounters.get(prefix) ?? 0;
|
|
118
|
+
const next = current + 1;
|
|
119
|
+
this.idCounters.set(prefix, next);
|
|
120
|
+
return `${prefix}-${String(next).padStart(3, '0')}`;
|
|
121
|
+
}
|
|
122
|
+
appendEvent(event) {
|
|
123
|
+
const now = new Date().toISOString();
|
|
124
|
+
let entityId = null;
|
|
125
|
+
if ('taskId' in event)
|
|
126
|
+
entityId = event.taskId;
|
|
127
|
+
else if ('sessionId' in event)
|
|
128
|
+
entityId = event.sessionId;
|
|
129
|
+
this.run('INSERT INTO events (type, entity_id, data, timestamp) VALUES (?, ?, ?, ?)', [
|
|
130
|
+
event.type,
|
|
131
|
+
entityId ?? '',
|
|
132
|
+
JSON.stringify(event),
|
|
133
|
+
now,
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
save() {
|
|
137
|
+
if (!this.db)
|
|
138
|
+
return; // guard: no-op after close
|
|
139
|
+
const data = this.db.export();
|
|
140
|
+
fs.writeFileSync(this.dbPath, Buffer.from(data));
|
|
141
|
+
this.writesSinceLastSave = 0;
|
|
142
|
+
}
|
|
143
|
+
close() {
|
|
144
|
+
if (!this.db)
|
|
145
|
+
return;
|
|
146
|
+
this.save();
|
|
147
|
+
this.db.close();
|
|
148
|
+
this.db = null;
|
|
149
|
+
}
|
|
150
|
+
getSchemaVersion() {
|
|
151
|
+
const rows = this.query('SELECT version FROM schema_version LIMIT 1');
|
|
152
|
+
return rows[0]?.version ?? 0;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type DomainEvent = {
|
|
2
|
+
type: 'task.started';
|
|
3
|
+
taskId: string;
|
|
4
|
+
} | {
|
|
5
|
+
type: 'task.completed';
|
|
6
|
+
taskId: string;
|
|
7
|
+
actualTokens: number;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'task.failed';
|
|
10
|
+
taskId: string;
|
|
11
|
+
reason: string;
|
|
12
|
+
iteration: number;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'task.escalated';
|
|
15
|
+
taskId: string;
|
|
16
|
+
fromModel: ModelTier;
|
|
17
|
+
toModel: ModelTier;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'tolerance.breached';
|
|
20
|
+
taskId: string;
|
|
21
|
+
dimension: string;
|
|
22
|
+
actual: number;
|
|
23
|
+
limit: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'tolerance.warning';
|
|
26
|
+
taskId: string;
|
|
27
|
+
dimension: string;
|
|
28
|
+
actual: number;
|
|
29
|
+
limit: number;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'session.started';
|
|
32
|
+
sessionId: string;
|
|
33
|
+
goal: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'session.ended';
|
|
36
|
+
sessionId: string;
|
|
37
|
+
velocity: number;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'escalation.required';
|
|
40
|
+
taskId: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'pull.task_closed';
|
|
44
|
+
taskId: string;
|
|
45
|
+
issueNumber: number;
|
|
46
|
+
} | {
|
|
47
|
+
type: 'pull.completed';
|
|
48
|
+
synced: number;
|
|
49
|
+
} | {
|
|
50
|
+
type: 'session.retrospective_generated';
|
|
51
|
+
sessionId: string;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'agent.drift.detected';
|
|
54
|
+
taskId: string;
|
|
55
|
+
driftType: string;
|
|
56
|
+
expected: string;
|
|
57
|
+
actual: string;
|
|
58
|
+
severity: string;
|
|
59
|
+
};
|
|
60
|
+
export type Result<T, E = string> = {
|
|
61
|
+
ok: true;
|
|
62
|
+
value: T;
|
|
63
|
+
} | {
|
|
64
|
+
ok: false;
|
|
65
|
+
error: E;
|
|
66
|
+
hint: string;
|
|
67
|
+
};
|
|
68
|
+
export type ModelTier = 'haiku' | 'sonnet' | 'opus';
|
|
69
|
+
export type ComplexityScore = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
|
|
70
|
+
export declare function getModelTier(complexity: number): ModelTier;
|
|
71
|
+
export type TaskStatus = 'backlog' | 'todo' | 'in_progress' | 'review' | 'done' | 'blocked';
|
|
72
|
+
export type PdcaPhase = 'plan' | 'do' | 'check' | 'act' | 'done' | 'escalated';
|
|
73
|
+
export type ToleranceStatus = 'on_track' | 'at_risk' | 'breached';
|
|
74
|
+
export type EvmHealth = 'GREEN' | 'YELLOW' | 'RED';
|
|
75
|
+
export type TolerancePreset = 'new-feature' | 'bug-fix' | 'refactor' | 'spike';
|
|
76
|
+
export interface ForgeConfig {
|
|
77
|
+
name: string;
|
|
78
|
+
currentPhase: string;
|
|
79
|
+
phases: string[];
|
|
80
|
+
tolerancePreset: TolerancePreset;
|
|
81
|
+
wipLimit: number;
|
|
82
|
+
githubSync: boolean;
|
|
83
|
+
githubOwner?: string;
|
|
84
|
+
githubRepo?: string;
|
|
85
|
+
githubProjectNumber?: number;
|
|
86
|
+
slackWebhook?: string;
|
|
87
|
+
standupTimeoutHours: number;
|
|
88
|
+
pmModel: ModelTier;
|
|
89
|
+
activeBackends: string[];
|
|
90
|
+
}
|
|
91
|
+
export declare const DEFAULT_CONFIG: ForgeConfig;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function getModelTier(complexity) {
|
|
2
|
+
if (complexity <= 3)
|
|
3
|
+
return 'haiku';
|
|
4
|
+
if (complexity <= 6)
|
|
5
|
+
return 'sonnet';
|
|
6
|
+
return 'opus';
|
|
7
|
+
}
|
|
8
|
+
export const DEFAULT_CONFIG = {
|
|
9
|
+
name: 'unnamed',
|
|
10
|
+
currentPhase: 'plan',
|
|
11
|
+
phases: ['plan', 'build', 'ship'],
|
|
12
|
+
tolerancePreset: 'new-feature',
|
|
13
|
+
wipLimit: 3,
|
|
14
|
+
githubSync: false,
|
|
15
|
+
standupTimeoutHours: 4,
|
|
16
|
+
pmModel: 'sonnet',
|
|
17
|
+
activeBackends: [],
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AA0BD,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,MAAM;IACpB,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,aAAa;IAC9B,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,KAAK;IACjB,mBAAmB,EAAE,CAAC;IACtB,OAAO,EAAE,QAAQ;IACjB,cAAc,EAAE,EAAE;CACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION: string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function findUp(startDir, filename) {
|
|
5
|
+
let dir = startDir;
|
|
6
|
+
while (true) {
|
|
7
|
+
const candidate = join(dir, filename);
|
|
8
|
+
if (existsSync(candidate))
|
|
9
|
+
return candidate;
|
|
10
|
+
const parent = dirname(dir);
|
|
11
|
+
if (parent === dir)
|
|
12
|
+
return null;
|
|
13
|
+
dir = parent;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const pkgPath = findUp(__dirname, 'package.json');
|
|
18
|
+
const pkg = pkgPath ? JSON.parse(readFileSync(pkgPath, 'utf-8')) : { version: '0.0.0' };
|
|
19
|
+
export const VERSION = pkg.version;
|
|
20
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,MAAM,CAAC,QAAgB,EAAE,QAAgB;IAChD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAClD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAwB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC/G,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { OverlayStore } from '../core/store.js';
|
|
2
|
+
import type { EventBus } from '../core/event-bus.js';
|
|
3
|
+
export interface PullResult {
|
|
4
|
+
totalFetched: number;
|
|
5
|
+
tasksClosed: number;
|
|
6
|
+
errors: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare class GitHubPullSync {
|
|
9
|
+
private owner;
|
|
10
|
+
private repo;
|
|
11
|
+
constructor(owner: string, repo: string);
|
|
12
|
+
pull(store: OverlayStore, bus: EventBus): Promise<PullResult>;
|
|
13
|
+
}
|