@bradygaster/squad-sdk 0.8.5 → 0.8.16
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/README.md +3 -3
- package/dist/adapter/client.d.ts +1 -0
- package/dist/adapter/client.d.ts.map +1 -1
- package/dist/adapter/client.js +29 -19
- package/dist/adapter/client.js.map +1 -1
- package/dist/adapter/errors.js.map +1 -1
- package/dist/agents/charter-compiler.js.map +1 -1
- package/dist/agents/history-shadow.js.map +1 -1
- package/dist/agents/lifecycle.js.map +1 -1
- package/dist/agents/onboarding.js +12 -12
- package/dist/agents/onboarding.js.map +1 -1
- package/dist/build/ci-pipeline.js.map +1 -1
- package/dist/build/github-dist.d.ts +2 -2
- package/dist/build/github-dist.js +3 -3
- package/dist/build/github-dist.js.map +1 -1
- package/dist/build/install-migration.js +2 -2
- package/dist/build/install-migration.js.map +1 -1
- package/dist/build/release.js.map +1 -1
- package/dist/build/versioning.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/config/agent-doc.js.map +1 -1
- package/dist/config/agent-source.js.map +1 -1
- package/dist/config/doc-sync.js.map +1 -1
- package/dist/config/init.js +1 -1
- package/dist/config/init.js.map +1 -1
- package/dist/config/legacy-fallback.js.map +1 -1
- package/dist/config/markdown-migration.js.map +1 -1
- package/dist/config/migration.js.map +1 -1
- package/dist/config/routing.js.map +1 -1
- package/dist/coordinator/fan-out.js.map +1 -1
- package/dist/coordinator/index.d.ts.map +1 -1
- package/dist/coordinator/index.js +9 -3
- package/dist/coordinator/index.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/multi-squad.d.ts +89 -0
- package/dist/multi-squad.d.ts.map +1 -0
- package/dist/multi-squad.js +233 -0
- package/dist/multi-squad.js.map +1 -0
- package/dist/ralph/triage.d.ts +48 -0
- package/dist/ralph/triage.d.ts.map +1 -0
- package/dist/ralph/triage.js +310 -0
- package/dist/ralph/triage.js.map +1 -0
- package/dist/remote/bridge.d.ts +77 -0
- package/dist/remote/bridge.d.ts.map +1 -0
- package/dist/remote/bridge.js +553 -0
- package/dist/remote/bridge.js.map +1 -0
- package/dist/remote/index.d.ts +7 -0
- package/dist/remote/index.d.ts.map +1 -0
- package/dist/remote/index.js +6 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote/protocol.d.ts +130 -0
- package/dist/remote/protocol.d.ts.map +1 -0
- package/dist/remote/protocol.js +25 -0
- package/dist/remote/protocol.js.map +1 -0
- package/dist/remote/types.d.ts +34 -0
- package/dist/remote/types.d.ts.map +1 -0
- package/dist/remote/types.js +5 -0
- package/dist/remote/types.js.map +1 -0
- package/dist/runtime/benchmarks.js.map +1 -1
- package/dist/runtime/constants.d.ts +2 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +2 -0
- package/dist/runtime/constants.js.map +1 -1
- package/dist/runtime/otel-init.d.ts +12 -0
- package/dist/runtime/otel-init.d.ts.map +1 -1
- package/dist/runtime/otel-init.js +18 -0
- package/dist/runtime/otel-init.js.map +1 -1
- package/dist/runtime/otel.d.ts +2 -0
- package/dist/runtime/otel.d.ts.map +1 -1
- package/dist/runtime/otel.js +28 -6
- package/dist/runtime/otel.js.map +1 -1
- package/dist/sharing/conflicts.js +7 -5
- package/dist/sharing/conflicts.js.map +1 -1
- package/dist/sharing/export.js.map +1 -1
- package/dist/sharing/import.js.map +1 -1
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/upstream/resolver.js.map +1 -1
- package/dist/utils/safe-timestamp.d.ts +6 -0
- package/dist/utils/safe-timestamp.d.ts.map +1 -0
- package/dist/utils/safe-timestamp.js +8 -0
- package/dist/utils/safe-timestamp.js.map +1 -0
- package/package.json +205 -197
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-squad resolution, configuration, and migration.
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple personal squads via a global config directory:
|
|
5
|
+
* - Windows: %APPDATA%/squad/
|
|
6
|
+
* - macOS: ~/Library/Application Support/squad/
|
|
7
|
+
* - Linux: $XDG_CONFIG_HOME/squad/ (default ~/.config/squad/)
|
|
8
|
+
*
|
|
9
|
+
* Each squad is registered in squads.json and has its own directory
|
|
10
|
+
* under squads/{name}/ in the global config root.
|
|
11
|
+
*
|
|
12
|
+
* Resolution chain for resolveSquadPath():
|
|
13
|
+
* explicit name → SQUAD_NAME env var → active in squads.json → "default" → legacy fallback
|
|
14
|
+
*
|
|
15
|
+
* @module multi-squad
|
|
16
|
+
*/
|
|
17
|
+
/** A single squad entry in squads.json. */
|
|
18
|
+
export interface SquadEntry {
|
|
19
|
+
/** Human-readable squad name (kebab-case recommended). */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Absolute path to the squad's .squad/ state directory. */
|
|
22
|
+
path: string;
|
|
23
|
+
/** ISO-8601 timestamp when this squad was created. */
|
|
24
|
+
created_at: string;
|
|
25
|
+
}
|
|
26
|
+
/** Schema for the global squads.json config file. */
|
|
27
|
+
export interface MultiSquadConfig {
|
|
28
|
+
/** All registered squads. */
|
|
29
|
+
squads: SquadEntry[];
|
|
30
|
+
/** Name of the currently active squad. */
|
|
31
|
+
active: string;
|
|
32
|
+
}
|
|
33
|
+
/** Information returned by listSquads(). */
|
|
34
|
+
export interface SquadInfo {
|
|
35
|
+
name: string;
|
|
36
|
+
path: string;
|
|
37
|
+
active: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the platform-appropriate global config directory for squads.
|
|
41
|
+
* Delegates to resolveGlobalSquadPath() which handles Windows/macOS/Linux.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSquadRoot(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the filesystem path for a named squad's state directory.
|
|
46
|
+
*
|
|
47
|
+
* Resolution chain:
|
|
48
|
+
* 1. Explicit `name` parameter
|
|
49
|
+
* 2. SQUAD_NAME environment variable
|
|
50
|
+
* 3. `active` field in squads.json
|
|
51
|
+
* 4. "default"
|
|
52
|
+
* 5. Legacy ~/.squad fallback (if no squads.json exists)
|
|
53
|
+
*
|
|
54
|
+
* Triggers auto-migration on first call if a legacy layout is detected.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveSquadPath(name?: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* List all registered squads with their active status.
|
|
59
|
+
*/
|
|
60
|
+
export declare function listSquads(): SquadInfo[];
|
|
61
|
+
/**
|
|
62
|
+
* Create a new squad directory and register it in squads.json.
|
|
63
|
+
* Returns the absolute path to the new squad's state directory.
|
|
64
|
+
*
|
|
65
|
+
* @throws If a squad with the given name already exists.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createSquad(name: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* Delete a squad by name. Removes its directory and unregisters it.
|
|
70
|
+
*
|
|
71
|
+
* @throws If the squad is the currently active one, or if it doesn't exist.
|
|
72
|
+
*/
|
|
73
|
+
export declare function deleteSquad(name: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Set the active squad in squads.json.
|
|
76
|
+
*
|
|
77
|
+
* @throws If the named squad is not registered.
|
|
78
|
+
*/
|
|
79
|
+
export declare function switchSquad(name: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Detect legacy ~/.squad layout and register it as "default" in squads.json.
|
|
82
|
+
*
|
|
83
|
+
* Migration is **non-destructive**: files are NOT moved. The existing path
|
|
84
|
+
* is simply registered in squads.json so the new resolution chain finds it.
|
|
85
|
+
*
|
|
86
|
+
* @returns `true` if migration was performed, `false` if not needed.
|
|
87
|
+
*/
|
|
88
|
+
export declare function migrateIfNeeded(): boolean;
|
|
89
|
+
//# sourceMappingURL=multi-squad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-squad.d.ts","sourceRoot":"","sources":["../src/multi-squad.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AA8DD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBtD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAUxC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBhD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAwB9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAc9C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAoCzC"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-squad resolution, configuration, and migration.
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple personal squads via a global config directory:
|
|
5
|
+
* - Windows: %APPDATA%/squad/
|
|
6
|
+
* - macOS: ~/Library/Application Support/squad/
|
|
7
|
+
* - Linux: $XDG_CONFIG_HOME/squad/ (default ~/.config/squad/)
|
|
8
|
+
*
|
|
9
|
+
* Each squad is registered in squads.json and has its own directory
|
|
10
|
+
* under squads/{name}/ in the global config root.
|
|
11
|
+
*
|
|
12
|
+
* Resolution chain for resolveSquadPath():
|
|
13
|
+
* explicit name → SQUAD_NAME env var → active in squads.json → "default" → legacy fallback
|
|
14
|
+
*
|
|
15
|
+
* @module multi-squad
|
|
16
|
+
*/
|
|
17
|
+
import fs from 'node:fs';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { resolveGlobalSquadPath } from './resolution.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Constants
|
|
22
|
+
// ============================================================================
|
|
23
|
+
const SQUADS_JSON = 'squads.json';
|
|
24
|
+
const SQUADS_DIR = 'squads';
|
|
25
|
+
const DEFAULT_SQUAD = 'default';
|
|
26
|
+
const LEGACY_DIR = '.squad';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Internal helpers
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/** Path to squads.json inside the global config root. */
|
|
31
|
+
function squadsJsonPath() {
|
|
32
|
+
return path.join(resolveGlobalSquadPath(), SQUADS_JSON);
|
|
33
|
+
}
|
|
34
|
+
/** Read and parse squads.json, returning null if missing or malformed. */
|
|
35
|
+
function loadSquadsConfig() {
|
|
36
|
+
const configPath = squadsJsonPath();
|
|
37
|
+
if (!fs.existsSync(configPath)) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
42
|
+
const parsed = JSON.parse(raw);
|
|
43
|
+
if (parsed !== null &&
|
|
44
|
+
typeof parsed === 'object' &&
|
|
45
|
+
'squads' in parsed &&
|
|
46
|
+
Array.isArray(parsed.squads) &&
|
|
47
|
+
'active' in parsed &&
|
|
48
|
+
typeof parsed.active === 'string') {
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Write squads.json atomically. */
|
|
58
|
+
function saveSquadsConfig(config) {
|
|
59
|
+
const configPath = squadsJsonPath();
|
|
60
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
/** Validate a squad name: non-empty, no slashes, no dots-only. */
|
|
63
|
+
function validateName(name) {
|
|
64
|
+
if (!name || /[/\\]/.test(name) || /^\.+$/.test(name)) {
|
|
65
|
+
throw new Error(`Invalid squad name: "${name}". Names must be non-empty and cannot contain slashes.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Public API
|
|
70
|
+
// ============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Returns the platform-appropriate global config directory for squads.
|
|
73
|
+
* Delegates to resolveGlobalSquadPath() which handles Windows/macOS/Linux.
|
|
74
|
+
*/
|
|
75
|
+
export function getSquadRoot() {
|
|
76
|
+
return resolveGlobalSquadPath();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the filesystem path for a named squad's state directory.
|
|
80
|
+
*
|
|
81
|
+
* Resolution chain:
|
|
82
|
+
* 1. Explicit `name` parameter
|
|
83
|
+
* 2. SQUAD_NAME environment variable
|
|
84
|
+
* 3. `active` field in squads.json
|
|
85
|
+
* 4. "default"
|
|
86
|
+
* 5. Legacy ~/.squad fallback (if no squads.json exists)
|
|
87
|
+
*
|
|
88
|
+
* Triggers auto-migration on first call if a legacy layout is detected.
|
|
89
|
+
*/
|
|
90
|
+
export function resolveSquadPath(name) {
|
|
91
|
+
// Auto-migrate legacy layout if needed
|
|
92
|
+
migrateIfNeeded();
|
|
93
|
+
const resolved = name ??
|
|
94
|
+
process.env['SQUAD_NAME'] ??
|
|
95
|
+
loadSquadsConfig()?.active ??
|
|
96
|
+
DEFAULT_SQUAD;
|
|
97
|
+
const config = loadSquadsConfig();
|
|
98
|
+
// Look up registered path
|
|
99
|
+
if (config) {
|
|
100
|
+
const entry = config.squads.find((s) => s.name === resolved);
|
|
101
|
+
if (entry) {
|
|
102
|
+
return entry.path;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Fallback: derive path inside global config dir
|
|
106
|
+
const root = getSquadRoot();
|
|
107
|
+
return path.join(root, SQUADS_DIR, resolved);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List all registered squads with their active status.
|
|
111
|
+
*/
|
|
112
|
+
export function listSquads() {
|
|
113
|
+
const config = loadSquadsConfig();
|
|
114
|
+
if (!config) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
return config.squads.map((s) => ({
|
|
118
|
+
name: s.name,
|
|
119
|
+
path: s.path,
|
|
120
|
+
active: s.name === config.active,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create a new squad directory and register it in squads.json.
|
|
125
|
+
* Returns the absolute path to the new squad's state directory.
|
|
126
|
+
*
|
|
127
|
+
* @throws If a squad with the given name already exists.
|
|
128
|
+
*/
|
|
129
|
+
export function createSquad(name) {
|
|
130
|
+
validateName(name);
|
|
131
|
+
// Ensure squads.json exists (migrate or bootstrap)
|
|
132
|
+
migrateIfNeeded();
|
|
133
|
+
let config = loadSquadsConfig();
|
|
134
|
+
if (!config) {
|
|
135
|
+
config = { squads: [], active: DEFAULT_SQUAD };
|
|
136
|
+
}
|
|
137
|
+
if (config.squads.some((s) => s.name === name)) {
|
|
138
|
+
throw new Error(`Squad "${name}" already exists.`);
|
|
139
|
+
}
|
|
140
|
+
const squadDir = path.join(getSquadRoot(), SQUADS_DIR, name);
|
|
141
|
+
fs.mkdirSync(squadDir, { recursive: true });
|
|
142
|
+
config.squads.push({
|
|
143
|
+
name,
|
|
144
|
+
path: squadDir,
|
|
145
|
+
created_at: new Date().toISOString(),
|
|
146
|
+
});
|
|
147
|
+
saveSquadsConfig(config);
|
|
148
|
+
return squadDir;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Delete a squad by name. Removes its directory and unregisters it.
|
|
152
|
+
*
|
|
153
|
+
* @throws If the squad is the currently active one, or if it doesn't exist.
|
|
154
|
+
*/
|
|
155
|
+
export function deleteSquad(name) {
|
|
156
|
+
validateName(name);
|
|
157
|
+
const config = loadSquadsConfig();
|
|
158
|
+
if (!config) {
|
|
159
|
+
throw new Error(`Squad "${name}" not found.`);
|
|
160
|
+
}
|
|
161
|
+
if (config.active === name) {
|
|
162
|
+
throw new Error(`Cannot delete the active squad "${name}". Switch to another squad first.`);
|
|
163
|
+
}
|
|
164
|
+
const idx = config.squads.findIndex((s) => s.name === name);
|
|
165
|
+
if (idx === -1) {
|
|
166
|
+
throw new Error(`Squad "${name}" not found.`);
|
|
167
|
+
}
|
|
168
|
+
const entry = config.squads[idx];
|
|
169
|
+
if (entry && fs.existsSync(entry.path)) {
|
|
170
|
+
fs.rmSync(entry.path, { recursive: true, force: true });
|
|
171
|
+
}
|
|
172
|
+
config.squads.splice(idx, 1);
|
|
173
|
+
saveSquadsConfig(config);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Set the active squad in squads.json.
|
|
177
|
+
*
|
|
178
|
+
* @throws If the named squad is not registered.
|
|
179
|
+
*/
|
|
180
|
+
export function switchSquad(name) {
|
|
181
|
+
validateName(name);
|
|
182
|
+
const config = loadSquadsConfig();
|
|
183
|
+
if (!config) {
|
|
184
|
+
throw new Error(`No squads configured. Cannot switch to "${name}".`);
|
|
185
|
+
}
|
|
186
|
+
if (!config.squads.some((s) => s.name === name)) {
|
|
187
|
+
throw new Error(`Squad "${name}" not found. Register it first with createSquad().`);
|
|
188
|
+
}
|
|
189
|
+
config.active = name;
|
|
190
|
+
saveSquadsConfig(config);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Detect legacy ~/.squad layout and register it as "default" in squads.json.
|
|
194
|
+
*
|
|
195
|
+
* Migration is **non-destructive**: files are NOT moved. The existing path
|
|
196
|
+
* is simply registered in squads.json so the new resolution chain finds it.
|
|
197
|
+
*
|
|
198
|
+
* @returns `true` if migration was performed, `false` if not needed.
|
|
199
|
+
*/
|
|
200
|
+
export function migrateIfNeeded() {
|
|
201
|
+
const root = getSquadRoot();
|
|
202
|
+
const configPath = path.join(root, SQUADS_JSON);
|
|
203
|
+
// If squads.json already exists, no migration needed
|
|
204
|
+
if (fs.existsSync(configPath)) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
// Check for legacy ~/.squad directory
|
|
208
|
+
const home = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '';
|
|
209
|
+
const legacyDir = path.join(home, LEGACY_DIR);
|
|
210
|
+
if (!home || !fs.existsSync(legacyDir) || !fs.statSync(legacyDir).isDirectory()) {
|
|
211
|
+
// No legacy layout — bootstrap empty config
|
|
212
|
+
const config = {
|
|
213
|
+
squads: [],
|
|
214
|
+
active: DEFAULT_SQUAD,
|
|
215
|
+
};
|
|
216
|
+
saveSquadsConfig(config);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
// Legacy layout detected — register it as "default" without moving files
|
|
220
|
+
const config = {
|
|
221
|
+
squads: [
|
|
222
|
+
{
|
|
223
|
+
name: DEFAULT_SQUAD,
|
|
224
|
+
path: legacyDir,
|
|
225
|
+
created_at: new Date().toISOString(),
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
active: DEFAULT_SQUAD,
|
|
229
|
+
};
|
|
230
|
+
saveSquadsConfig(config);
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=multi-squad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-squad.js","sourceRoot":"","sources":["../src/multi-squad.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA+BzD,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,yDAAyD;AACzD,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IACE,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,QAAQ,IAAI,MAAM;YAClB,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,MAAM,CAAC;YACzD,QAAQ,IAAI,MAAM;YAClB,OAAQ,MAAkC,CAAC,MAAM,KAAK,QAAQ,EAC9D,CAAC;YACD,OAAO,MAA0B,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,SAAS,gBAAgB,CAAC,MAAwB;IAChD,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,kEAAkE;AAClE,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,wDAAwD,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,uCAAuC;IACvC,eAAe,EAAE,CAAC;IAElB,MAAM,QAAQ,GACZ,IAAI;QACJ,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACzB,gBAAgB,EAAE,EAAE,MAAM;QAC1B,aAAa,CAAC;IAEhB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,0BAA0B;IAC1B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC7D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;KACjC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,mDAAmD;IACnD,eAAe,EAAE,CAAC;IAClB,IAAI,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,IAAI;QACJ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC;IACH,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,mCAAmC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,oDAAoD,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEhD,qDAAqD;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAChF,4CAA4C;QAC5C,MAAM,MAAM,GAAqB;YAC/B,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,aAAa;SACtB,CAAC;QACF,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yEAAyE;IACzE,MAAM,MAAM,GAAqB;QAC/B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC;SACF;QACD,MAAM,EAAE,aAAa;KACtB,CAAC;IACF,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Parsed routing rule from routing.md */
|
|
2
|
+
export interface RoutingRule {
|
|
3
|
+
workType: string;
|
|
4
|
+
agentName: string;
|
|
5
|
+
keywords: string[];
|
|
6
|
+
}
|
|
7
|
+
/** Parsed module ownership rule from routing.md */
|
|
8
|
+
export interface ModuleOwnership {
|
|
9
|
+
modulePath: string;
|
|
10
|
+
primary: string;
|
|
11
|
+
secondary: string | null;
|
|
12
|
+
}
|
|
13
|
+
/** Team member from team.md roster */
|
|
14
|
+
export interface TeamMember {
|
|
15
|
+
name: string;
|
|
16
|
+
role: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
/** Triage decision result */
|
|
20
|
+
export interface TriageDecision {
|
|
21
|
+
agent: TeamMember;
|
|
22
|
+
reason: string;
|
|
23
|
+
source: 'module-ownership' | 'routing-rule' | 'role-keyword' | 'lead-fallback';
|
|
24
|
+
confidence: 'high' | 'medium' | 'low';
|
|
25
|
+
}
|
|
26
|
+
/** Issue data for triage */
|
|
27
|
+
export interface TriageIssue {
|
|
28
|
+
number: number;
|
|
29
|
+
title: string;
|
|
30
|
+
body?: string;
|
|
31
|
+
labels: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Parse routing rules from routing.md content */
|
|
34
|
+
export declare function parseRoutingRules(routingMd: string): RoutingRule[];
|
|
35
|
+
/** Parse module ownership from routing.md content */
|
|
36
|
+
export declare function parseModuleOwnership(routingMd: string): ModuleOwnership[];
|
|
37
|
+
/** Parse team roster from team.md content */
|
|
38
|
+
export declare function parseRoster(teamMd: string): TeamMember[];
|
|
39
|
+
/**
|
|
40
|
+
* Triage an issue using routing rules, module ownership, and roster.
|
|
41
|
+
* Priority order:
|
|
42
|
+
* 1. Module path match — issue mentions a file path matching module ownership
|
|
43
|
+
* 2. Work type keyword — issue content matches routing rule keywords
|
|
44
|
+
* 3. Role keyword — fallback to generic role-based matching (frontend/backend/test)
|
|
45
|
+
* 4. Lead fallback — assign to Lead/Architect if no match
|
|
46
|
+
*/
|
|
47
|
+
export declare function triageIssue(issue: TriageIssue, rules: RoutingRule[], modules: ModuleOwnership[], roster: TeamMember[]): TriageDecision | null;
|
|
48
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/ralph/triage.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;IAC/E,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAOD,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAwBlE;AAED,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAsBzE;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CA4BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,eAAe,EAAE,EAC1B,MAAM,EAAE,UAAU,EAAE,GACnB,cAAc,GAAG,IAAI,CA6DvB"}
|