design-brain-memory 0.2.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/README.md +167 -0
- package/dist/agentBrowser.d.ts +9 -0
- package/dist/agentBrowser.js +96 -0
- package/dist/agentBrowser.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +212 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +27 -0
- package/dist/commands.js +178 -0
- package/dist/commands.js.map +1 -0
- package/dist/extractFromImage.d.ts +7 -0
- package/dist/extractFromImage.js +72 -0
- package/dist/extractFromImage.js.map +1 -0
- package/dist/extractFromUrl.d.ts +13 -0
- package/dist/extractFromUrl.js +605 -0
- package/dist/extractFromUrl.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +3 -0
- package/dist/interactive.js +42 -0
- package/dist/interactive.js.map +1 -0
- package/dist/llm.d.ts +33 -0
- package/dist/llm.js +250 -0
- package/dist/llm.js.map +1 -0
- package/dist/query.d.ts +25 -0
- package/dist/query.js +150 -0
- package/dist/query.js.map +1 -0
- package/dist/render.d.ts +2 -0
- package/dist/render.js +365 -0
- package/dist/render.js.map +1 -0
- package/dist/skillPrompt.d.ts +3 -0
- package/dist/skillPrompt.js +66 -0
- package/dist/skillPrompt.js.map +1 -0
- package/dist/store.d.ts +14 -0
- package/dist/store.js +69 -0
- package/dist/store.js.map +1 -0
- package/dist/svg.d.ts +5 -0
- package/dist/svg.js +162 -0
- package/dist/svg.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +9 -0
- package/dist/util.js +51 -0
- package/dist/util.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# design-brain-memory
|
|
2
|
+
|
|
3
|
+
A relational markdown design brain that uses **Agent Browser CLI** for capture and supports **bring-your-own LLM** via base URL + API key.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- Capture inspirations from URLs and screenshots.
|
|
8
|
+
- Extract colors, typography, components, motion, layout, CSS variables.
|
|
9
|
+
- Add responsive coverage via multiple viewports.
|
|
10
|
+
- Capture interaction state signals (`hover`, `focus`, `active`) from runtime + CSS rules.
|
|
11
|
+
- Capture journey steps by click-through exploration.
|
|
12
|
+
- Build version lineage (`fingerprint`, `version`, `supersedes`, diffs).
|
|
13
|
+
- Store everything in `.design-brain/` (markdown + graph CSV).
|
|
14
|
+
- Query with `search` (keyword) and `ask` (semantic; optional LLM).
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g design-brain-memory
|
|
20
|
+
agent-browser install
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Install directly from GitHub:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g github:design-brain/design-brain
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Install as a skill
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
design-brain-memory install-skill
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
or
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx -y skills add design-brain/design-brain
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`ingest` will also suggest this once in interactive terminals.
|
|
42
|
+
|
|
43
|
+
## Bring your own LLM
|
|
44
|
+
|
|
45
|
+
Set once:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
export DESIGN_BRAIN_LLM_BASE_URL="https://api.openai.com/v1"
|
|
49
|
+
export DESIGN_BRAIN_LLM_API_KEY="<your-api-key>"
|
|
50
|
+
export DESIGN_BRAIN_LLM_MODEL="gpt-4o-mini"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Or pass per command:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
--llm-base-url <url> --llm-api-key <key> --llm-model <model>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Any OpenAI-compatible endpoint works.
|
|
60
|
+
|
|
61
|
+
## Commands
|
|
62
|
+
|
|
63
|
+
### Initialize
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
design-brain-memory init --root /path/to/workspace
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Ingest URL inspiration
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
design-brain-memory ingest \
|
|
73
|
+
--project checkout-redesign \
|
|
74
|
+
--project-name "Checkout Redesign" \
|
|
75
|
+
--url https://stripe.com \
|
|
76
|
+
--name "Stripe checkout inspiration" \
|
|
77
|
+
--inspiration "Button hierarchy + neutral surfaces" \
|
|
78
|
+
--journey-steps 4 \
|
|
79
|
+
--viewport desktop=1440x1200 tablet=1024x1366 mobile=390x844 \
|
|
80
|
+
--tags payments,checkout,cta
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Ingest screenshot inspiration
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
design-brain-memory ingest \
|
|
87
|
+
--project checkout-redesign \
|
|
88
|
+
--screenshot ./screens/inspo-hero.png \
|
|
89
|
+
--name "Hero screenshot" \
|
|
90
|
+
--tags hero,landing
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Record outcome
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
design-brain-memory outcome \
|
|
97
|
+
--project checkout-redesign \
|
|
98
|
+
--title "v1 shipped" \
|
|
99
|
+
--description "Shipped card-based checkout with clear primary CTA" \
|
|
100
|
+
--inspired-by inspo-stripe-checkout-1234abcd \
|
|
101
|
+
--artifact-url https://app.example.com/checkout \
|
|
102
|
+
--tags shipped,frontend
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Search
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
design-brain-memory search --query "button hierarchy" --project checkout-redesign
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Ask
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
design-brain-memory ask --query "What CTA patterns repeated across inspirations?" --project checkout-redesign
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Reindex
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
design-brain-memory reindex
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Prompt control
|
|
124
|
+
|
|
125
|
+
Use `-y` / `--yes` to skip interactive prompts in local scripts and CI.
|
|
126
|
+
|
|
127
|
+
## Output structure
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
.design-brain/
|
|
131
|
+
├── README.md
|
|
132
|
+
├── database.json
|
|
133
|
+
├── graph/
|
|
134
|
+
│ ├── entities.csv
|
|
135
|
+
│ └── relations.csv
|
|
136
|
+
├── assets/
|
|
137
|
+
│ └── <project-id>/*.png
|
|
138
|
+
└── projects/
|
|
139
|
+
└── <project-id>/
|
|
140
|
+
├── README.md
|
|
141
|
+
├── index.md
|
|
142
|
+
├── inspirations/*.md
|
|
143
|
+
├── outcomes/*.md
|
|
144
|
+
└── tokens/
|
|
145
|
+
├── colors.md
|
|
146
|
+
├── typography.md
|
|
147
|
+
├── components.md
|
|
148
|
+
├── motion.md
|
|
149
|
+
└── layout.md
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Retrieval examples
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
rg "supersedes|inspired_by" .design-brain/graph/relations.csv
|
|
156
|
+
rg "Interaction States|Responsive Coverage" .design-brain/projects
|
|
157
|
+
rg "fingerprint" .design-brain/projects/*/inspirations/*.md
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Notes
|
|
161
|
+
|
|
162
|
+
- Browser usage follows Agent Browser CLI patterns from the upstream README (`open`, `set viewport`, `snapshot`, `click`, `hover`, `focus`, `eval`, `screenshot`, `back`, `close`).
|
|
163
|
+
- If `agent-browser` is not globally installed, the CLI falls back to `npx agent-browser`.
|
|
164
|
+
|
|
165
|
+
## Credits
|
|
166
|
+
|
|
167
|
+
- Built on top of [Agent Browser CLI](https://github.com/vercel-labs/agent-browser) by Vercel Labs.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface AgentBrowserJsonResponse {
|
|
2
|
+
success: boolean;
|
|
3
|
+
data: Record<string, unknown>;
|
|
4
|
+
error: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function runAgentBrowserJson(args: string[], options?: {
|
|
7
|
+
session?: string;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}): Promise<AgentBrowserJsonResponse>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
let cachedRunner = null;
|
|
3
|
+
function canExecute(command, args) {
|
|
4
|
+
const result = spawnSync(command, args, {
|
|
5
|
+
stdio: 'ignore',
|
|
6
|
+
env: {
|
|
7
|
+
...process.env,
|
|
8
|
+
NPM_CONFIG_UPDATE_NOTIFIER: 'false',
|
|
9
|
+
npm_config_update_notifier: 'false',
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
return result.status === 0;
|
|
13
|
+
}
|
|
14
|
+
function resolveRunner() {
|
|
15
|
+
if (cachedRunner) {
|
|
16
|
+
return cachedRunner;
|
|
17
|
+
}
|
|
18
|
+
const fromEnv = process.env.DESIGN_BRAIN_AGENT_BROWSER_BIN;
|
|
19
|
+
if (fromEnv && canExecute(fromEnv, ['--version'])) {
|
|
20
|
+
cachedRunner = { command: fromEnv, prefixArgs: [] };
|
|
21
|
+
return cachedRunner;
|
|
22
|
+
}
|
|
23
|
+
if (canExecute('agent-browser', ['--version'])) {
|
|
24
|
+
cachedRunner = { command: 'agent-browser', prefixArgs: [] };
|
|
25
|
+
return cachedRunner;
|
|
26
|
+
}
|
|
27
|
+
cachedRunner = { command: 'npx', prefixArgs: ['--yes', 'agent-browser'] };
|
|
28
|
+
return cachedRunner;
|
|
29
|
+
}
|
|
30
|
+
function parseJsonFromOutput(stdout) {
|
|
31
|
+
const lines = stdout
|
|
32
|
+
.split(/\r?\n/)
|
|
33
|
+
.map((line) => line.trim())
|
|
34
|
+
.filter((line) => line.length > 0);
|
|
35
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
36
|
+
const line = lines[i];
|
|
37
|
+
if (!line.startsWith('{') || !line.endsWith('}')) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const parsed = JSON.parse(line);
|
|
42
|
+
if (typeof parsed.success === 'boolean') {
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// keep searching
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Failed to parse Agent Browser JSON response. Output:\n${stdout}`);
|
|
51
|
+
}
|
|
52
|
+
export async function runAgentBrowserJson(args, options = {}) {
|
|
53
|
+
const runner = resolveRunner();
|
|
54
|
+
const finalArgs = [
|
|
55
|
+
...runner.prefixArgs,
|
|
56
|
+
...(options.session ? ['--session', options.session] : []),
|
|
57
|
+
'--json',
|
|
58
|
+
...args,
|
|
59
|
+
];
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
const child = spawn(runner.command, finalArgs, {
|
|
62
|
+
cwd: options.cwd,
|
|
63
|
+
env: {
|
|
64
|
+
...process.env,
|
|
65
|
+
NPM_CONFIG_UPDATE_NOTIFIER: 'false',
|
|
66
|
+
npm_config_update_notifier: 'false',
|
|
67
|
+
},
|
|
68
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
69
|
+
});
|
|
70
|
+
let stdout = '';
|
|
71
|
+
let stderr = '';
|
|
72
|
+
child.stdout.on('data', (chunk) => {
|
|
73
|
+
stdout += chunk.toString();
|
|
74
|
+
});
|
|
75
|
+
child.stderr.on('data', (chunk) => {
|
|
76
|
+
stderr += chunk.toString();
|
|
77
|
+
});
|
|
78
|
+
child.on('error', (error) => {
|
|
79
|
+
reject(error);
|
|
80
|
+
});
|
|
81
|
+
child.on('close', (code) => {
|
|
82
|
+
if (code !== 0) {
|
|
83
|
+
reject(new Error(`agent-browser command failed (${code}): ${stderr || stdout}`));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
resolve(parseJsonFromOutput(stdout));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const details = stderr ? `${error.message}\n${stderr}` : error.message;
|
|
91
|
+
reject(new Error(details));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=agentBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentBrowser.js","sourceRoot":"","sources":["../src/agentBrowser.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { askBrain, initBrain, ingestInspiration, recordOutcome, reindexBrain, searchBrain, } from './commands.js';
|
|
5
|
+
import { shouldSkipPrompts } from './interactive.js';
|
|
6
|
+
import { resolveLlmConfig } from './llm.js';
|
|
7
|
+
import { getDefaultSkillRepo, installSkill, maybePromptSkillInstall } from './skillPrompt.js';
|
|
8
|
+
function toStringList(value) {
|
|
9
|
+
if (!value) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return value.flatMap((item) => item.split(',')).map((item) => item.trim()).filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
return value.split(',').map((item) => item.trim()).filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
function parseInteger(value, defaultValue) {
|
|
18
|
+
const parsed = Number.parseInt(value, 10);
|
|
19
|
+
return Number.isFinite(parsed) ? parsed : defaultValue;
|
|
20
|
+
}
|
|
21
|
+
function parseViewports(values) {
|
|
22
|
+
if (!values || values.length === 0) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const parsed = values
|
|
26
|
+
.flatMap((value) => value.split(','))
|
|
27
|
+
.map((item) => item.trim())
|
|
28
|
+
.filter(Boolean)
|
|
29
|
+
.map((item, index) => {
|
|
30
|
+
const [label, size] = item.includes('=') ? item.split('=') : [`vp${index + 1}`, item];
|
|
31
|
+
const [widthRaw, heightRaw] = size.split('x');
|
|
32
|
+
const width = Number.parseInt(widthRaw, 10);
|
|
33
|
+
const height = Number.parseInt(heightRaw, 10);
|
|
34
|
+
if (!Number.isFinite(width) || !Number.isFinite(height)) {
|
|
35
|
+
throw new Error(`Invalid viewport format: ${item}. Use label=1440x1200.`);
|
|
36
|
+
}
|
|
37
|
+
return { label: label.trim(), width, height };
|
|
38
|
+
});
|
|
39
|
+
return parsed.length > 0 ? parsed : undefined;
|
|
40
|
+
}
|
|
41
|
+
async function main() {
|
|
42
|
+
const program = new Command();
|
|
43
|
+
program
|
|
44
|
+
.name('design-brain-memory')
|
|
45
|
+
.description('Relational markdown design memory powered by Agent Browser CLI')
|
|
46
|
+
.version('0.2.0')
|
|
47
|
+
.option('-y, --yes', 'Skip interactive prompts');
|
|
48
|
+
program
|
|
49
|
+
.command('init')
|
|
50
|
+
.description('Initialize .design-brain in the given workspace')
|
|
51
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
await initBrain(path.resolve(options.root));
|
|
54
|
+
console.log(`Initialized design brain at ${path.resolve(options.root, '.design-brain')}`);
|
|
55
|
+
});
|
|
56
|
+
program
|
|
57
|
+
.command('ingest')
|
|
58
|
+
.description('Ingest a URL or screenshot into a project design wiki')
|
|
59
|
+
.requiredOption('--project <project>', 'Project ID/slug')
|
|
60
|
+
.option('--project-name <name>', 'Readable project name')
|
|
61
|
+
.option('--project-description <text>', 'Project description shown in the wiki')
|
|
62
|
+
.option('--url <url>', 'Website URL inspiration source')
|
|
63
|
+
.option('--screenshot <path>', 'Local screenshot inspiration source')
|
|
64
|
+
.option('--name <name>', 'Record name')
|
|
65
|
+
.option('--notes <notes>', 'Freeform notes about why it matters')
|
|
66
|
+
.option('--inspiration <text>', 'Summary of what this source inspired')
|
|
67
|
+
.option('--tags <tags...>', 'Tags list (repeat or comma-separated)')
|
|
68
|
+
.option('--journey-steps <n>', 'How many click-through journey steps to capture', '3')
|
|
69
|
+
.option('--viewport <viewports...>', 'Responsive viewports: desktop=1440x1200,mobile=390x844')
|
|
70
|
+
.option('--llm-base-url <url>', 'OpenAI-compatible LLM base URL')
|
|
71
|
+
.option('--llm-api-key <key>', 'LLM API key')
|
|
72
|
+
.option('--llm-model <model>', 'LLM model id')
|
|
73
|
+
.option('--llm-timeout-ms <ms>', 'LLM timeout in milliseconds', '30000')
|
|
74
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
75
|
+
.option('--no-visuals', 'Skip SVG visual generation')
|
|
76
|
+
.action(async (options) => {
|
|
77
|
+
const llm = resolveLlmConfig({
|
|
78
|
+
baseUrl: options.llmBaseUrl,
|
|
79
|
+
apiKey: options.llmApiKey,
|
|
80
|
+
model: options.llmModel,
|
|
81
|
+
timeoutMs: parseInteger(options.llmTimeoutMs, 30000),
|
|
82
|
+
});
|
|
83
|
+
const result = await ingestInspiration({
|
|
84
|
+
rootDir: path.resolve(options.root),
|
|
85
|
+
project: options.project,
|
|
86
|
+
projectName: options.projectName,
|
|
87
|
+
projectDescription: options.projectDescription,
|
|
88
|
+
url: options.url,
|
|
89
|
+
screenshot: options.screenshot,
|
|
90
|
+
name: options.name,
|
|
91
|
+
notes: options.notes,
|
|
92
|
+
inspirationSummary: options.inspiration,
|
|
93
|
+
tags: toStringList(options.tags),
|
|
94
|
+
llm,
|
|
95
|
+
journeySteps: parseInteger(options.journeySteps, 3),
|
|
96
|
+
responsiveViewports: parseViewports(options.viewport),
|
|
97
|
+
skipVisuals: !options.visuals,
|
|
98
|
+
});
|
|
99
|
+
console.log(`Captured inspiration ${result.inspirationId} in project ${result.projectId}`);
|
|
100
|
+
const globalOptions = program.opts();
|
|
101
|
+
await maybePromptSkillInstall(shouldSkipPrompts(Boolean(globalOptions.yes)));
|
|
102
|
+
});
|
|
103
|
+
program
|
|
104
|
+
.command('outcome')
|
|
105
|
+
.description('Record what the team built and link it to inspirations')
|
|
106
|
+
.requiredOption('--project <project>', 'Project ID/slug')
|
|
107
|
+
.requiredOption('--title <title>', 'Outcome title')
|
|
108
|
+
.requiredOption('--description <description>', 'Outcome description')
|
|
109
|
+
.option('--artifact-url <url>', 'Deployed link, Figma link, or PR URL')
|
|
110
|
+
.option('--inspired-by <ids...>', 'Linked inspiration IDs')
|
|
111
|
+
.option('--tags <tags...>', 'Tags list (repeat or comma-separated)')
|
|
112
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
113
|
+
.action(async (options) => {
|
|
114
|
+
const result = await recordOutcome({
|
|
115
|
+
rootDir: path.resolve(options.root),
|
|
116
|
+
project: options.project,
|
|
117
|
+
title: options.title,
|
|
118
|
+
description: options.description,
|
|
119
|
+
inspiredBy: toStringList(options.inspiredBy),
|
|
120
|
+
artifactUrl: options.artifactUrl,
|
|
121
|
+
tags: toStringList(options.tags),
|
|
122
|
+
});
|
|
123
|
+
console.log(`Recorded outcome ${result.outcomeId} in project ${result.projectId}`);
|
|
124
|
+
});
|
|
125
|
+
program
|
|
126
|
+
.command('search')
|
|
127
|
+
.description('Keyword search over relational design memory')
|
|
128
|
+
.requiredOption('--query <text>', 'Search query')
|
|
129
|
+
.option('--project <project>', 'Filter to project')
|
|
130
|
+
.option('--limit <n>', 'Max results', '10')
|
|
131
|
+
.option('--json', 'Output as JSON', false)
|
|
132
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
133
|
+
.action(async (options) => {
|
|
134
|
+
const results = await searchBrain({
|
|
135
|
+
rootDir: path.resolve(options.root),
|
|
136
|
+
query: options.query,
|
|
137
|
+
project: options.project,
|
|
138
|
+
limit: parseInteger(options.limit, 10),
|
|
139
|
+
});
|
|
140
|
+
if (options.json) {
|
|
141
|
+
console.log(JSON.stringify(results, null, 2));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (results.length === 0) {
|
|
145
|
+
console.log('No matches found.');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
for (const result of results) {
|
|
149
|
+
console.log(`[${result.type}] ${result.projectId}/${result.id} :: ${result.title} (score=${result.score})`);
|
|
150
|
+
console.log(` ${result.snippet}`);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
program
|
|
154
|
+
.command('ask')
|
|
155
|
+
.description('Ask a design question against the design brain')
|
|
156
|
+
.requiredOption('--query <text>', 'Question')
|
|
157
|
+
.option('--project <project>', 'Filter to project')
|
|
158
|
+
.option('--limit <n>', 'Context result count', '8')
|
|
159
|
+
.option('--llm-base-url <url>', 'OpenAI-compatible LLM base URL')
|
|
160
|
+
.option('--llm-api-key <key>', 'LLM API key')
|
|
161
|
+
.option('--llm-model <model>', 'LLM model id')
|
|
162
|
+
.option('--llm-timeout-ms <ms>', 'LLM timeout in milliseconds', '30000')
|
|
163
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
164
|
+
.action(async (options) => {
|
|
165
|
+
const llm = resolveLlmConfig({
|
|
166
|
+
baseUrl: options.llmBaseUrl,
|
|
167
|
+
apiKey: options.llmApiKey,
|
|
168
|
+
model: options.llmModel,
|
|
169
|
+
timeoutMs: parseInteger(options.llmTimeoutMs, 30000),
|
|
170
|
+
});
|
|
171
|
+
const result = await askBrain({
|
|
172
|
+
rootDir: path.resolve(options.root),
|
|
173
|
+
query: options.query,
|
|
174
|
+
project: options.project,
|
|
175
|
+
limit: parseInteger(options.limit, 8),
|
|
176
|
+
llm,
|
|
177
|
+
});
|
|
178
|
+
console.log(result.answer);
|
|
179
|
+
if (result.matches.length > 0) {
|
|
180
|
+
console.log('\nSources:');
|
|
181
|
+
for (const match of result.matches.slice(0, 8)) {
|
|
182
|
+
console.log(`- [${match.type}] ${match.projectId}/${match.id}: ${match.title}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
program
|
|
187
|
+
.command('install-skill')
|
|
188
|
+
.description('Install Design Brain skill into your local skills registry')
|
|
189
|
+
.option('--repo <repo>', 'Skill repository override', getDefaultSkillRepo())
|
|
190
|
+
.action(async (options) => {
|
|
191
|
+
const installed = installSkill(options.repo);
|
|
192
|
+
if (!installed) {
|
|
193
|
+
throw new Error(`Skill install failed. Try manually: npx -y skills add ${options.repo}`);
|
|
194
|
+
}
|
|
195
|
+
console.log(`Installed skill from ${options.repo}`);
|
|
196
|
+
});
|
|
197
|
+
program
|
|
198
|
+
.command('reindex')
|
|
199
|
+
.description('Regenerate markdown wiki and relation graph from database.json')
|
|
200
|
+
.option('--root <dir>', 'Workspace root', process.cwd())
|
|
201
|
+
.option('--no-visuals', 'Skip SVG visual generation')
|
|
202
|
+
.action(async (options) => {
|
|
203
|
+
await reindexBrain(path.resolve(options.root), !options.visuals);
|
|
204
|
+
console.log(`Reindexed ${path.resolve(options.root, '.design-brain')}`);
|
|
205
|
+
});
|
|
206
|
+
await program.parseAsync(process.argv);
|
|
207
|
+
}
|
|
208
|
+
main().catch((error) => {
|
|
209
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
210
|
+
process.exit(1);
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,SAAS,YAAY,CAAC,KAAyB;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,YAAoB;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB;IACvC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM;SAClB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,wBAAwB,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,qBAAqB,CAAC;SAC3B,WAAW,CAAC,gEAAgE,CAAC;SAC7E,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;IAEnD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uDAAuD,CAAC;SACpE,cAAc,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;SACxD,MAAM,CAAC,8BAA8B,EAAE,uCAAuC,CAAC;SAC/E,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;SACtC,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,sBAAsB,EAAE,sCAAsC,CAAC;SACtE,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,qBAAqB,EAAE,iDAAiD,EAAE,GAAG,CAAC;SACrF,MAAM,CAAC,2BAA2B,EAAE,wDAAwD,CAAC;SAC7F,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC;SAC7C,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,OAAO,CAAC;SACvE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAkBd,EAAE,EAAE;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,MAAM,EAAE,OAAO,CAAC,SAAS;YACzB,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;SACrD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,kBAAkB,EAAE,OAAO,CAAC,WAAW;YACvC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YAChC,GAAG;YACH,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACnD,mBAAmB,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;YACrD,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,aAAa,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAE3F,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,EAAqB,CAAC;QACxD,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,wDAAwD,CAAC;SACrE,cAAc,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;SACxD,cAAc,CAAC,iBAAiB,EAAE,eAAe,CAAC;SAClD,cAAc,CAAC,6BAA6B,EAAE,qBAAqB,CAAC;SACpE,MAAM,CAAC,sBAAsB,EAAE,sCAAsC,CAAC;SACtE,MAAM,CAAC,wBAAwB,EAAE,wBAAwB,CAAC;SAC1D,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAQd,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC;SAChD,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;SAClD,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;YAChC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5G,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,gBAAgB,EAAE,UAAU,CAAC;SAC5C,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;SAClD,MAAM,CAAC,aAAa,EAAE,sBAAsB,EAAE,GAAG,CAAC;SAClD,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC;SAC7C,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,OAAO,CAAC;SACvE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OASd,EAAE,EAAE;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,MAAM,EAAE,OAAO,CAAC,SAAS;YACzB,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;SACrD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,GAAG;SACJ,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yDAAyD,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvD,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;QAC5D,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IngestOptions, LlmConfig, OutcomeOptions } from './types.js';
|
|
2
|
+
export declare function initBrain(rootDir: string): Promise<void>;
|
|
3
|
+
export declare function ingestInspiration(options: IngestOptions): Promise<{
|
|
4
|
+
projectId: string;
|
|
5
|
+
inspirationId: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function recordOutcome(options: OutcomeOptions): Promise<{
|
|
8
|
+
projectId: string;
|
|
9
|
+
outcomeId: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function reindexBrain(rootDir: string, skipVisuals?: boolean): Promise<void>;
|
|
12
|
+
export declare function searchBrain(params: {
|
|
13
|
+
rootDir: string;
|
|
14
|
+
query: string;
|
|
15
|
+
project?: string;
|
|
16
|
+
limit?: number;
|
|
17
|
+
}): Promise<import("./query.js").SearchResult[]>;
|
|
18
|
+
export declare function askBrain(params: {
|
|
19
|
+
rootDir: string;
|
|
20
|
+
query: string;
|
|
21
|
+
project?: string;
|
|
22
|
+
limit?: number;
|
|
23
|
+
llm?: LlmConfig;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
answer: string;
|
|
26
|
+
matches: import("./query.js").SearchResult[];
|
|
27
|
+
}>;
|