@sdsrs/codeagent 0.1.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/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/adapters/code-graph.d.ts +18 -0
- package/dist/adapters/code-graph.d.ts.map +1 -0
- package/dist/adapters/code-graph.js +151 -0
- package/dist/adapters/code-graph.js.map +1 -0
- package/dist/adapters/memory.d.ts +13 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +110 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/orchestration/gsd.d.ts +20 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -0
- package/dist/adapters/orchestration/gsd.js +78 -0
- package/dist/adapters/orchestration/gsd.js.map +1 -0
- package/dist/adapters/orchestration/interface.d.ts +32 -0
- package/dist/adapters/orchestration/interface.d.ts.map +1 -0
- package/dist/adapters/orchestration/interface.js +2 -0
- package/dist/adapters/orchestration/interface.js.map +1 -0
- package/dist/adapters/orchestration/superpowers.d.ts +33 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +1 -0
- package/dist/adapters/orchestration/superpowers.js +117 -0
- package/dist/adapters/orchestration/superpowers.js.map +1 -0
- package/dist/broker/broker.d.ts +40 -0
- package/dist/broker/broker.d.ts.map +1 -0
- package/dist/broker/broker.js +181 -0
- package/dist/broker/broker.js.map +1 -0
- package/dist/broker/compressor.d.ts +7 -0
- package/dist/broker/compressor.d.ts.map +1 -0
- package/dist/broker/compressor.js +61 -0
- package/dist/broker/compressor.js.map +1 -0
- package/dist/broker/context-pack.d.ts +126 -0
- package/dist/broker/context-pack.d.ts.map +1 -0
- package/dist/broker/context-pack.js +103 -0
- package/dist/broker/context-pack.js.map +1 -0
- package/dist/broker/query-parser.d.ts +17 -0
- package/dist/broker/query-parser.d.ts.map +1 -0
- package/dist/broker/query-parser.js +127 -0
- package/dist/broker/query-parser.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +264 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +94 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +10 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +52 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/search.d.ts +9 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +45 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/session.d.ts +9 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +86 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +77 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/renderer.d.ts +47 -0
- package/dist/cli/tui/renderer.d.ts.map +1 -0
- package/dist/cli/tui/renderer.js +237 -0
- package/dist/cli/tui/renderer.js.map +1 -0
- package/dist/hooks/session-start.d.ts +11 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +51 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/stop.d.ts +11 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +93 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/user-prompt.d.ts +12 -0
- package/dist/hooks/user-prompt.d.ts.map +1 -0
- package/dist/hooks/user-prompt.js +46 -0
- package/dist/hooks/user-prompt.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +25 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -0
- package/dist/providers/anthropic-api.js +93 -0
- package/dist/providers/anthropic-api.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +16 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +72 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/claude-sdk.d.ts +18 -0
- package/dist/providers/claude-sdk.d.ts.map +1 -0
- package/dist/providers/claude-sdk.js +141 -0
- package/dist/providers/claude-sdk.js.map +1 -0
- package/dist/providers/interface.d.ts +36 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +2 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/scripts/install-hooks.d.ts +11 -0
- package/dist/scripts/install-hooks.d.ts.map +1 -0
- package/dist/scripts/install-hooks.js +86 -0
- package/dist/scripts/install-hooks.js.map +1 -0
- package/dist/session/manager.d.ts +65 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +143 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/schema.d.ts +7 -0
- package/dist/session/schema.d.ts.map +1 -0
- package/dist/session/schema.js +82 -0
- package/dist/session/schema.js.map +1 -0
- package/dist/utils/exec.d.ts +20 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +28 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/tokens.d.ts +12 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +38 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +90 -0
- package/src/skills/brainstorm.md +33 -0
- package/src/skills/review.md +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 sdsrs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# CodeAgent
|
|
2
|
+
|
|
3
|
+
Context-aware coding assistant that integrates code search, memory, and orchestration into a unified Context Broker.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Global install
|
|
9
|
+
npm install -g codeagent
|
|
10
|
+
|
|
11
|
+
# Or run directly
|
|
12
|
+
npx codeagent chat
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Interactive Chat
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Start a new coding session
|
|
21
|
+
codeagent chat
|
|
22
|
+
|
|
23
|
+
# Resume an existing session
|
|
24
|
+
codeagent chat --resume <sessionId>
|
|
25
|
+
|
|
26
|
+
# Use a specific provider
|
|
27
|
+
codeagent chat --provider api # Direct Anthropic API
|
|
28
|
+
codeagent chat --provider cli # claude -p backend
|
|
29
|
+
codeagent chat --provider sdk # Agent SDK (default)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Code Search
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
codeagent search "payment processing"
|
|
36
|
+
codeagent search "RefundService" --type impact
|
|
37
|
+
codeagent search "processPayment" --type callgraph
|
|
38
|
+
codeagent search "src/payment/" --type overview
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Memory
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
codeagent memory "authentication" # Search memories
|
|
45
|
+
codeagent memory --save "Use cents" --type decision --body "Avoid float issues"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Sessions
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
codeagent session list
|
|
52
|
+
codeagent session show <id>
|
|
53
|
+
codeagent session delete <id>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Configuration
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
codeagent config set orchestration superpowers # or gsd
|
|
60
|
+
codeagent config set model claude-opus-4-6
|
|
61
|
+
codeagent config set maxBudgetUsd 5.0
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Claude Code Integration
|
|
65
|
+
|
|
66
|
+
CodeAgent enhances Claude Code through hooks:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Install hooks to current project
|
|
70
|
+
codeagent install-hooks
|
|
71
|
+
|
|
72
|
+
# Install hooks globally
|
|
73
|
+
codeagent install-hooks:global
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Hooks automatically inject context on every prompt:
|
|
77
|
+
- **UserPromptSubmit** — Code search + memory + orchestration context
|
|
78
|
+
- **SessionStart** — Project overview on session start
|
|
79
|
+
- **Stop** — Extract discoveries to memory
|
|
80
|
+
|
|
81
|
+
## Architecture
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
┌──────────────┐ ┌──────────────┐
|
|
85
|
+
│ devx chat │ │ Claude Code │
|
|
86
|
+
│ (CLI/TUI) │ │ (hooks) │
|
|
87
|
+
└──────┬───────┘ └──────┬───────┘
|
|
88
|
+
│ │
|
|
89
|
+
└─────────┬─────────┘
|
|
90
|
+
▼
|
|
91
|
+
┌─────────────────┐
|
|
92
|
+
│ Context Broker │ ← 5-step pipeline
|
|
93
|
+
│ parse → search │
|
|
94
|
+
│ → memory → orch │
|
|
95
|
+
│ → compress │
|
|
96
|
+
└──┬────┬────┬─────┘
|
|
97
|
+
│ │ │
|
|
98
|
+
┌─────┘ │ └─────┐
|
|
99
|
+
▼ ▼ ▼
|
|
100
|
+
┌────────┐ ┌───────┐ ┌───────┐
|
|
101
|
+
│ Code │ │Memory │ │ Orch │
|
|
102
|
+
│ Graph │ │Engine │ │Adapter│
|
|
103
|
+
│ (Rust) │ │(Node) │ │(swap) │
|
|
104
|
+
└────────┘ └───────┘ └───────┘
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Requirements
|
|
108
|
+
|
|
109
|
+
- Node.js >= 20
|
|
110
|
+
- [code-graph-mcp](https://github.com/sdsrs/code-graph-mcp) (optional, for code search)
|
|
111
|
+
- [claude-mem-lite](https://github.com/sdsrs/claude-mem-lite) (optional, for memory)
|
|
112
|
+
- `ANTHROPIC_API_KEY` environment variable (for API provider)
|
|
113
|
+
|
|
114
|
+
## License
|
|
115
|
+
|
|
116
|
+
MIT
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ParsedQuery } from '../broker/query-parser.js';
|
|
2
|
+
import type { RelevantFile, SymbolInfo } from '../broker/context-pack.js';
|
|
3
|
+
export interface CodeGraphResult {
|
|
4
|
+
repoSummary?: string;
|
|
5
|
+
relevantFiles: RelevantFile[];
|
|
6
|
+
relatedSymbols: SymbolInfo[];
|
|
7
|
+
raw: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Query Code Graph MCP via CLI.
|
|
11
|
+
* Selects the right command based on intent.
|
|
12
|
+
*/
|
|
13
|
+
export declare function queryCodeGraph(parsed: ParsedQuery, tokenBudget: number, repoRoot: string): Promise<CodeGraphResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Get repo map summary via code-graph-mcp map.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getRepoMap(repoRoot: string, timeout?: number): string;
|
|
18
|
+
//# sourceMappingURL=code-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-graph.d.ts","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAuH1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,MAAM,CAKnE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { execSafe } from '../utils/exec.js';
|
|
2
|
+
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Query Code Graph MCP via CLI.
|
|
7
|
+
* Selects the right command based on intent.
|
|
8
|
+
*/
|
|
9
|
+
export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
10
|
+
// Check if index exists
|
|
11
|
+
const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
|
|
12
|
+
if (!fs.existsSync(dbPath)) {
|
|
13
|
+
return { relevantFiles: [], relatedSymbols: [], raw: '' };
|
|
14
|
+
}
|
|
15
|
+
const result = {
|
|
16
|
+
relevantFiles: [],
|
|
17
|
+
relatedSymbols: [],
|
|
18
|
+
raw: '',
|
|
19
|
+
};
|
|
20
|
+
const { intent, symbols, filePaths, keywords } = parsed;
|
|
21
|
+
const searchQuery = [...symbols, ...keywords.slice(0, 3)].join(' ');
|
|
22
|
+
if (!searchQuery && filePaths.length === 0) {
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
switch (intent) {
|
|
27
|
+
case 'impact': {
|
|
28
|
+
if (symbols.length > 0) {
|
|
29
|
+
const { stdout, ok } = execSafe(`code-graph-mcp impact "${symbols[0]}"`, { cwd: repoRoot, timeout: 2000 });
|
|
30
|
+
if (ok)
|
|
31
|
+
result.raw = stdout;
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case 'understand': {
|
|
36
|
+
if (filePaths.length > 0) {
|
|
37
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
38
|
+
const { stdout, ok } = execSafe(`code-graph-mcp overview "${dir}"`, { cwd: repoRoot, timeout: 2000 });
|
|
39
|
+
if (ok)
|
|
40
|
+
result.raw = stdout;
|
|
41
|
+
}
|
|
42
|
+
else if (searchQuery) {
|
|
43
|
+
const { stdout, ok } = execSafe(`code-graph-mcp search "${searchQuery}" --limit 8`, { cwd: repoRoot, timeout: 2000 });
|
|
44
|
+
if (ok)
|
|
45
|
+
result.raw = stdout;
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'callgraph': {
|
|
50
|
+
if (symbols.length > 0) {
|
|
51
|
+
const { stdout, ok } = execSafe(`code-graph-mcp callgraph "${symbols[0]}" --depth 2`, { cwd: repoRoot, timeout: 2000 });
|
|
52
|
+
if (ok)
|
|
53
|
+
result.raw = stdout;
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case 'implement': {
|
|
58
|
+
// Search + overview for implementation context
|
|
59
|
+
const results = [];
|
|
60
|
+
if (searchQuery) {
|
|
61
|
+
const { stdout, ok } = execSafe(`code-graph-mcp search "${searchQuery}" --limit 5`, { cwd: repoRoot, timeout: 2000 });
|
|
62
|
+
if (ok)
|
|
63
|
+
results.push(stdout);
|
|
64
|
+
}
|
|
65
|
+
if (filePaths.length > 0) {
|
|
66
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
67
|
+
const { stdout, ok } = execSafe(`code-graph-mcp overview "${dir}"`, { cwd: repoRoot, timeout: 2000 });
|
|
68
|
+
if (ok)
|
|
69
|
+
results.push(stdout);
|
|
70
|
+
}
|
|
71
|
+
result.raw = results.join('\n\n');
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'debug':
|
|
75
|
+
case 'search':
|
|
76
|
+
case 'general':
|
|
77
|
+
default: {
|
|
78
|
+
if (searchQuery) {
|
|
79
|
+
const { stdout, ok } = execSafe(`code-graph-mcp search "${searchQuery}" --limit 8`, { cwd: repoRoot, timeout: 2000 });
|
|
80
|
+
if (ok)
|
|
81
|
+
result.raw = stdout;
|
|
82
|
+
}
|
|
83
|
+
else if (filePaths.length > 0) {
|
|
84
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
85
|
+
const { stdout, ok } = execSafe(`code-graph-mcp overview "${dir}"`, { cwd: repoRoot, timeout: 2000 });
|
|
86
|
+
if (ok)
|
|
87
|
+
result.raw = stdout;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Graceful degradation — return empty
|
|
95
|
+
}
|
|
96
|
+
// Truncate to budget
|
|
97
|
+
if (result.raw) {
|
|
98
|
+
result.raw = truncateToTokenBudget(result.raw, tokenBudget);
|
|
99
|
+
}
|
|
100
|
+
// Parse raw into structured data (best-effort)
|
|
101
|
+
result.relevantFiles = parseRelevantFiles(result.raw);
|
|
102
|
+
result.relatedSymbols = parseSymbols(result.raw);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get repo map summary via code-graph-mcp map.
|
|
107
|
+
*/
|
|
108
|
+
export function getRepoMap(repoRoot, timeout = 3000) {
|
|
109
|
+
const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
|
|
110
|
+
if (!fs.existsSync(dbPath))
|
|
111
|
+
return '';
|
|
112
|
+
const { stdout } = execSafe('code-graph-mcp map', { cwd: repoRoot, timeout });
|
|
113
|
+
return stdout;
|
|
114
|
+
}
|
|
115
|
+
// --- Parsers for code-graph CLI output ---
|
|
116
|
+
function parseRelevantFiles(raw) {
|
|
117
|
+
if (!raw)
|
|
118
|
+
return [];
|
|
119
|
+
const files = [];
|
|
120
|
+
// Match file paths in output (e.g. "src/foo/bar.ts" or "./src/foo/bar.ts")
|
|
121
|
+
const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\.\w+)/gm) || [];
|
|
122
|
+
const seen = new Set();
|
|
123
|
+
for (const match of fileMatches) {
|
|
124
|
+
const p = match.trim().replace(/^\.\//, '');
|
|
125
|
+
if (seen.has(p) || !p.includes('/'))
|
|
126
|
+
continue;
|
|
127
|
+
seen.add(p);
|
|
128
|
+
files.push({ path: p, reason: 'code-graph search hit' });
|
|
129
|
+
}
|
|
130
|
+
return files.slice(0, 10);
|
|
131
|
+
}
|
|
132
|
+
function parseSymbols(raw) {
|
|
133
|
+
if (!raw)
|
|
134
|
+
return [];
|
|
135
|
+
const symbols = [];
|
|
136
|
+
// Match symbol definitions in overview/callgraph output
|
|
137
|
+
// Typical format: "fn symbol_name" or "struct SymbolName" or " function symbolName"
|
|
138
|
+
const symMatches = raw.match(/(?:fn|function|struct|class|impl|trait|interface|type|const|enum)\s+(\w+)/g) || [];
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
for (const match of symMatches) {
|
|
141
|
+
const parts = match.split(/\s+/);
|
|
142
|
+
const kind = parts[0];
|
|
143
|
+
const name = parts[1];
|
|
144
|
+
if (!name || seen.has(name))
|
|
145
|
+
continue;
|
|
146
|
+
seen.add(name);
|
|
147
|
+
symbols.push({ name, kind, file: '' });
|
|
148
|
+
}
|
|
149
|
+
return symbols.slice(0, 15);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=code-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ParsedQuery } from '../broker/query-parser.js';
|
|
2
|
+
import type { MemoryEntry, Stage } from '../broker/context-pack.js';
|
|
3
|
+
export interface MemoryResult {
|
|
4
|
+
memories: MemoryEntry[];
|
|
5
|
+
bugWarnings: MemoryEntry[];
|
|
6
|
+
raw: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Query memory engine via claude-mem-lite CLI.
|
|
10
|
+
* Searches for relevant memories based on query and stage.
|
|
11
|
+
*/
|
|
12
|
+
export declare function queryMemory(parsed: ParsedQuery, tokenBudget: number, stage?: Stage): Promise<MemoryResult>;
|
|
13
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAsBD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,YAAY,CAAC,CAyDvB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execSafe } from '../utils/exec.js';
|
|
2
|
+
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
3
|
+
/**
|
|
4
|
+
* Determine which memory types to search based on the current stage.
|
|
5
|
+
*/
|
|
6
|
+
function getSearchTypes(stage) {
|
|
7
|
+
switch (stage) {
|
|
8
|
+
case 'brainstorm':
|
|
9
|
+
return ['decision', 'discovery'];
|
|
10
|
+
case 'plan':
|
|
11
|
+
return ['decision', 'discovery', 'task'];
|
|
12
|
+
case 'implement':
|
|
13
|
+
return ['bugfix', 'decision'];
|
|
14
|
+
case 'review':
|
|
15
|
+
return ['bugfix'];
|
|
16
|
+
case 'debug':
|
|
17
|
+
return ['bugfix', 'discovery'];
|
|
18
|
+
default:
|
|
19
|
+
return []; // empty = search all types
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Query memory engine via claude-mem-lite CLI.
|
|
24
|
+
* Searches for relevant memories based on query and stage.
|
|
25
|
+
*/
|
|
26
|
+
export async function queryMemory(parsed, tokenBudget, stage) {
|
|
27
|
+
const result = {
|
|
28
|
+
memories: [],
|
|
29
|
+
bugWarnings: [],
|
|
30
|
+
raw: '',
|
|
31
|
+
};
|
|
32
|
+
const searchQuery = [...parsed.symbols, ...parsed.keywords.slice(0, 3)].join(' ');
|
|
33
|
+
if (!searchQuery)
|
|
34
|
+
return result;
|
|
35
|
+
const types = getSearchTypes(stage);
|
|
36
|
+
const allRaw = [];
|
|
37
|
+
try {
|
|
38
|
+
if (types.length === 0) {
|
|
39
|
+
// Search all types
|
|
40
|
+
const { stdout, ok } = execSafe(`claude-mem-lite search "${searchQuery}" --limit 8`, { timeout: 2000 });
|
|
41
|
+
if (ok && stdout)
|
|
42
|
+
allRaw.push(stdout);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Search each type separately (in parallel we'd Promise.all, but using CLI so sequential)
|
|
46
|
+
for (const type of types.slice(0, 2)) {
|
|
47
|
+
const { stdout, ok } = execSafe(`claude-mem-lite search "${searchQuery}" --type ${type} --limit 5`, { timeout: 2000 });
|
|
48
|
+
if (ok && stdout)
|
|
49
|
+
allRaw.push(stdout);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Also always search for bug warnings (high priority)
|
|
53
|
+
if (!types.includes('bugfix')) {
|
|
54
|
+
const { stdout, ok } = execSafe(`claude-mem-lite search "${searchQuery}" --type bugfix --limit 3`, { timeout: 2000 });
|
|
55
|
+
if (ok && stdout)
|
|
56
|
+
allRaw.push(stdout);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Graceful degradation
|
|
61
|
+
}
|
|
62
|
+
result.raw = allRaw.join('\n---\n');
|
|
63
|
+
// Truncate to budget
|
|
64
|
+
if (result.raw) {
|
|
65
|
+
result.raw = truncateToTokenBudget(result.raw, tokenBudget);
|
|
66
|
+
}
|
|
67
|
+
// Parse raw into structured entries
|
|
68
|
+
const entries = parseMemoryEntries(result.raw);
|
|
69
|
+
result.memories = entries.filter((e) => e.type !== 'bugfix');
|
|
70
|
+
result.bugWarnings = entries.filter((e) => e.type === 'bugfix');
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
// --- Parse memory search output ---
|
|
74
|
+
function parseMemoryEntries(raw) {
|
|
75
|
+
if (!raw)
|
|
76
|
+
return [];
|
|
77
|
+
const entries = [];
|
|
78
|
+
// claude-mem-lite search output format varies, but typically:
|
|
79
|
+
// [ID] [type] title
|
|
80
|
+
// body text...
|
|
81
|
+
// ---
|
|
82
|
+
const blocks = raw.split(/(?:^|\n)---\n/);
|
|
83
|
+
for (const block of blocks) {
|
|
84
|
+
const trimmed = block.trim();
|
|
85
|
+
if (!trimmed)
|
|
86
|
+
continue;
|
|
87
|
+
const lines = trimmed.split('\n');
|
|
88
|
+
const firstLine = lines[0] || '';
|
|
89
|
+
// Try to parse structured format: "#123 [bugfix] Title here"
|
|
90
|
+
const match = firstLine.match(/^#?(\d+)\s*\[(\w+)]\s*(.+)/);
|
|
91
|
+
if (match) {
|
|
92
|
+
entries.push({
|
|
93
|
+
id: parseInt(match[1], 10),
|
|
94
|
+
type: match[2],
|
|
95
|
+
title: match[3].trim(),
|
|
96
|
+
body: lines.slice(1).join('\n').trim(),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Fallback: treat as unstructured
|
|
101
|
+
entries.push({
|
|
102
|
+
type: 'semantic',
|
|
103
|
+
title: firstLine.slice(0, 100),
|
|
104
|
+
body: lines.slice(1).join('\n').trim(),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return entries;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SpecSummary, Stage, TaskSummary } from '../../broker/context-pack.js';
|
|
2
|
+
import type { Evidence, OrchestrationAdapter, StageTransition } from './interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* GSD-Lite orchestration adapter.
|
|
5
|
+
* Reads state directly from .gsd/state.json for speed.
|
|
6
|
+
*/
|
|
7
|
+
export declare class GsdAdapter implements OrchestrationAdapter {
|
|
8
|
+
private repoRoot;
|
|
9
|
+
constructor(repoRoot: string);
|
|
10
|
+
private getStatePath;
|
|
11
|
+
private readState;
|
|
12
|
+
getCurrentStage(): Promise<Stage | null>;
|
|
13
|
+
getActiveSpec(): Promise<SpecSummary | null>;
|
|
14
|
+
getActiveTasks(): Promise<TaskSummary[]>;
|
|
15
|
+
advanceStage(_evidence: Evidence): Promise<StageTransition | null>;
|
|
16
|
+
recordEvidence(_evidence: Evidence): Promise<void>;
|
|
17
|
+
getEngineName(): string;
|
|
18
|
+
getAvailableStages(): Stage[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=gsd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA6BtF;;;GAGG;AACH,qBAAa,UAAW,YAAW,oBAAoB;IACrD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IAWX,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMxC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAU5C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAYxC,YAAY,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAMlE,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,IAAI,MAAM;IAIvB,kBAAkB,IAAI,KAAK,EAAE;CAG9B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
// Map GSD phases to our Stage type
|
|
4
|
+
const PHASE_TO_STAGE = {
|
|
5
|
+
research: 'brainstorm',
|
|
6
|
+
planning: 'plan',
|
|
7
|
+
execution: 'implement',
|
|
8
|
+
review: 'review',
|
|
9
|
+
debugging: 'debug',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* GSD-Lite orchestration adapter.
|
|
13
|
+
* Reads state directly from .gsd/state.json for speed.
|
|
14
|
+
*/
|
|
15
|
+
export class GsdAdapter {
|
|
16
|
+
repoRoot;
|
|
17
|
+
constructor(repoRoot) {
|
|
18
|
+
this.repoRoot = repoRoot;
|
|
19
|
+
}
|
|
20
|
+
getStatePath() {
|
|
21
|
+
return path.join(this.repoRoot, '.gsd', 'state.json');
|
|
22
|
+
}
|
|
23
|
+
readState() {
|
|
24
|
+
const statePath = this.getStatePath();
|
|
25
|
+
try {
|
|
26
|
+
if (!fs.existsSync(statePath))
|
|
27
|
+
return null;
|
|
28
|
+
const raw = fs.readFileSync(statePath, 'utf8');
|
|
29
|
+
return JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getCurrentStage() {
|
|
36
|
+
const state = this.readState();
|
|
37
|
+
if (!state?.phase)
|
|
38
|
+
return null;
|
|
39
|
+
return PHASE_TO_STAGE[state.phase] || 'general';
|
|
40
|
+
}
|
|
41
|
+
async getActiveSpec() {
|
|
42
|
+
const state = this.readState();
|
|
43
|
+
if (!state?.spec?.title)
|
|
44
|
+
return null;
|
|
45
|
+
return {
|
|
46
|
+
id: state.spec.id,
|
|
47
|
+
title: state.spec.title,
|
|
48
|
+
summary: state.spec.summary,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async getActiveTasks() {
|
|
52
|
+
const state = this.readState();
|
|
53
|
+
if (!state?.tasks)
|
|
54
|
+
return [];
|
|
55
|
+
return state.tasks
|
|
56
|
+
.filter((t) => t.status !== 'completed' && t.status !== 'deleted')
|
|
57
|
+
.map((t) => ({
|
|
58
|
+
id: t.id,
|
|
59
|
+
title: t.title,
|
|
60
|
+
status: t.status,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
async advanceStage(_evidence) {
|
|
64
|
+
// For now, stage advancement is done through GSD MCP tools
|
|
65
|
+
// This adapter is read-only
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
async recordEvidence(_evidence) {
|
|
69
|
+
// Read-only adapter — evidence recording done through GSD MCP
|
|
70
|
+
}
|
|
71
|
+
getEngineName() {
|
|
72
|
+
return 'gsd';
|
|
73
|
+
}
|
|
74
|
+
getAvailableStages() {
|
|
75
|
+
return ['brainstorm', 'plan', 'implement', 'review', 'debug'];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=gsd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd.js","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAsB7B,mCAAmC;AACnC,MAAM,cAAc,GAA0B;IAC5C,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAEO,SAAS;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;YACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;YACvB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;SAC5B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,KAAK;YAAE,OAAO,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,KAAK;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAmB;QACpC,2DAA2D;QAC3D,4BAA4B;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAmB;QACtC,8DAA8D;IAChE,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SpecSummary, Stage, TaskSummary } from '../../broker/context-pack.js';
|
|
2
|
+
/**
|
|
3
|
+
* Evidence recorded during a stage.
|
|
4
|
+
*/
|
|
5
|
+
export interface Evidence {
|
|
6
|
+
type: string;
|
|
7
|
+
description: string;
|
|
8
|
+
source: string;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Result of advancing to a new stage.
|
|
13
|
+
*/
|
|
14
|
+
export interface StageTransition {
|
|
15
|
+
from: Stage;
|
|
16
|
+
to: Stage;
|
|
17
|
+
reason: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Abstract interface for orchestration engines.
|
|
21
|
+
* Allows swapping between GSD-Lite and Superpowers.
|
|
22
|
+
*/
|
|
23
|
+
export interface OrchestrationAdapter {
|
|
24
|
+
getCurrentStage(): Promise<Stage | null>;
|
|
25
|
+
getActiveSpec(): Promise<SpecSummary | null>;
|
|
26
|
+
getActiveTasks(): Promise<TaskSummary[]>;
|
|
27
|
+
advanceStage(evidence: Evidence): Promise<StageTransition | null>;
|
|
28
|
+
recordEvidence(evidence: Evidence): Promise<void>;
|
|
29
|
+
getEngineName(): string;
|
|
30
|
+
getAvailableStages(): Stage[];
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEpF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IAEnC,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAGzC,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAClE,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGlD,aAAa,IAAI,MAAM,CAAC;IACxB,kBAAkB,IAAI,KAAK,EAAE,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/adapters/orchestration/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SpecSummary, Stage, TaskSummary } from '../../broker/context-pack.js';
|
|
2
|
+
import type { Evidence, OrchestrationAdapter, StageTransition } from './interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Superpowers orchestration adapter.
|
|
5
|
+
*
|
|
6
|
+
* Key insight: Superpowers is stateless — it doesn't track "current skill".
|
|
7
|
+
* All skills are always available, selection happens at request time.
|
|
8
|
+
*
|
|
9
|
+
* This adapter:
|
|
10
|
+
* - Discovers available skills from the plugin directory
|
|
11
|
+
* - Maps skill names to Stage types
|
|
12
|
+
* - Maintains a lightweight local stage state (in-memory)
|
|
13
|
+
* since Superpowers itself doesn't persist this
|
|
14
|
+
*/
|
|
15
|
+
export declare class SuperpowersAdapter implements OrchestrationAdapter {
|
|
16
|
+
private currentStageValue;
|
|
17
|
+
private availableSkills;
|
|
18
|
+
constructor(_repoRoot: string);
|
|
19
|
+
private getPluginDir;
|
|
20
|
+
private discoverSkills;
|
|
21
|
+
getCurrentStage(): Promise<Stage | null>;
|
|
22
|
+
getActiveSpec(): Promise<SpecSummary | null>;
|
|
23
|
+
getActiveTasks(): Promise<TaskSummary[]>;
|
|
24
|
+
advanceStage(evidence: Evidence): Promise<StageTransition | null>;
|
|
25
|
+
recordEvidence(_evidence: Evidence): Promise<void>;
|
|
26
|
+
getEngineName(): string;
|
|
27
|
+
getAvailableStages(): Stage[];
|
|
28
|
+
/** Get list of discovered skills */
|
|
29
|
+
getSkills(): string[];
|
|
30
|
+
/** Manually set the current stage */
|
|
31
|
+
setStage(stage: Stage): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=superpowers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/superpowers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAgBtF;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,eAAe,CAAgB;gBAE3B,SAAS,EAAE,MAAM;IAI7B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,cAAc;IAiBhB,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMxC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK5C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKxC,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAajE,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,IAAI,MAAM;IAIvB,kBAAkB,IAAI,KAAK,EAAE;IAI7B,oCAAoC;IACpC,SAAS,IAAI,MAAM,EAAE;IAIrB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAG7B"}
|