coaia-visualizer 1.5.10 → 1.6.1
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 +5 -0
- package/STC.md +18 -0
- package/STCISSUE.md +36 -0
- package/cli.ts +8 -0
- package/dist/cli.js +7 -0
- package/dist/skill.js +342 -0
- package/jgwill.coaia-visualizer-8--496dca71-d476-4ac9-ba9f-376add118dd8--260208.txt +2612 -0
- package/mcp/dist/api-client.d.ts +138 -0
- package/mcp/dist/api-client.d.ts.map +1 -0
- package/mcp/dist/api-client.js +115 -0
- package/mcp/dist/api-client.js.map +1 -0
- package/mcp/dist/index.d.ts +2 -0
- package/mcp/dist/index.d.ts.map +1 -0
- package/mcp/dist/index.js +286 -0
- package/mcp/dist/index.js.map +1 -0
- package/mcp/dist/tools/index.d.ts +18 -0
- package/mcp/dist/tools/index.d.ts.map +1 -0
- package/mcp/dist/tools/index.js +322 -0
- package/mcp/dist/tools/index.js.map +1 -0
- package/mcp/package-lock.json +210 -0
- package/next-env.d.ts +6 -0
- package/package.json +1 -1
- package/rispecs/github-project-runtime-memory-integration.spec.md +381 -0
- package/skill.ts +385 -0
- package/.coaia/jgwill-coaia-visualizer.jsonl +0 -6
- package/test-run.log +0 -101
package/skill.ts
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import {
|
|
2
|
+
lstatSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
readlinkSync,
|
|
5
|
+
realpathSync,
|
|
6
|
+
rmSync,
|
|
7
|
+
symlinkSync,
|
|
8
|
+
unlinkSync,
|
|
9
|
+
writeFileSync,
|
|
10
|
+
} from 'fs';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { dirname, relative as relativePath, resolve } from 'path';
|
|
13
|
+
import { createInterface } from 'readline/promises';
|
|
14
|
+
import type minimist from 'minimist';
|
|
15
|
+
|
|
16
|
+
type EmbeddedSkillFile = {
|
|
17
|
+
relativePath: string;
|
|
18
|
+
content: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const SKILL_NAME = 'coaia-visualizer';
|
|
22
|
+
|
|
23
|
+
const COAIA_VISUALIZER_SKILL_MD = [
|
|
24
|
+
'---',
|
|
25
|
+
'name: coaia-visualizer',
|
|
26
|
+
'description: Use coaia-visualizer to launch, inspect, edit, and expose COAIA structural tension chart JSONL files through a web UI, REST API, and optional MCP bridge.',
|
|
27
|
+
'license: MIT',
|
|
28
|
+
'compatibility: Requires the coaia-visualizer package. Optional MCP bridge uses coaia-visualizer-mcp.',
|
|
29
|
+
'metadata:',
|
|
30
|
+
' author: Guillaume D. Isabelle',
|
|
31
|
+
' version: "1.0.0"',
|
|
32
|
+
'allowed-tools: Bash(coaia-visualizer:*), Bash(coaia-visualizer-mcp:*)',
|
|
33
|
+
'---',
|
|
34
|
+
'',
|
|
35
|
+
'# coaia-visualizer',
|
|
36
|
+
'',
|
|
37
|
+
'`coaia-visualizer` is the visual and API surface for COAIA Structural Tension Chart JSONL files. Use it when an LLM or human needs to inspect chart hierarchy, current reality, action-step telescoping, narrative beats, and chart progress through the web UI or the visualizer MCP bridge.',
|
|
38
|
+
'',
|
|
39
|
+
'## Status',
|
|
40
|
+
'',
|
|
41
|
+
'!`coaia-visualizer --help 2>/dev/null || echo "Not installed: npm install -g coaia-visualizer"`',
|
|
42
|
+
'',
|
|
43
|
+
'## Relationship To coaia-narrative',
|
|
44
|
+
'',
|
|
45
|
+
'- `coaia-narrative` is the primary chart-memory authoring MCP and CLI.',
|
|
46
|
+
'- `coaia-visualizer` reads the same JSONL format and presents it as an interactive UI.',
|
|
47
|
+
'- `coaia-visualizer-mcp` connects an LLM to a running visualizer REST API, not directly to the file.',
|
|
48
|
+
'- Prefer `coaia-narrative` MCP for pure memory creation. Prefer `coaia-visualizer` when the UI/API context matters.',
|
|
49
|
+
'',
|
|
50
|
+
'## Launch The UI',
|
|
51
|
+
'',
|
|
52
|
+
'```bash',
|
|
53
|
+
'coaia-visualizer -M ./memory.jsonl --no-open',
|
|
54
|
+
'coaia-visualizer --docker -M ./memory.jsonl --port 4321',
|
|
55
|
+
'coaia-visualizer -M ./memory.jsonl --live --poll-interval 2000',
|
|
56
|
+
'```',
|
|
57
|
+
'',
|
|
58
|
+
'The memory file must exist. The CLI sets `COAIAV_MEMORY_PATH` and starts the Next.js visualizer against that file.',
|
|
59
|
+
'',
|
|
60
|
+
'## MCP Bridge Setup',
|
|
61
|
+
'',
|
|
62
|
+
'The visualizer MCP requires a running visualizer API and a token shared through `COAIAN_API_TOKEN`.',
|
|
63
|
+
'',
|
|
64
|
+
'```bash',
|
|
65
|
+
'export COAIAN_API_TOKEN="$(openssl rand -hex 32)"',
|
|
66
|
+
'coaia-visualizer -M ./memory.jsonl --port 4321 --no-open',
|
|
67
|
+
'```',
|
|
68
|
+
'',
|
|
69
|
+
'Then configure the MCP client:',
|
|
70
|
+
'',
|
|
71
|
+
'```json',
|
|
72
|
+
'{',
|
|
73
|
+
' "mcpServers": {',
|
|
74
|
+
' "coaia-visualizer": {',
|
|
75
|
+
' "command": "npx",',
|
|
76
|
+
' "args": ["-y", "coaia-visualizer-mcp"],',
|
|
77
|
+
' "env": {',
|
|
78
|
+
' "COAIAN_API_TOKEN": "the-same-token",',
|
|
79
|
+
' "COAIAV_API_URL": "http://localhost:4321"',
|
|
80
|
+
' }',
|
|
81
|
+
' }',
|
|
82
|
+
' }',
|
|
83
|
+
'}',
|
|
84
|
+
'```',
|
|
85
|
+
'',
|
|
86
|
+
'If no token is provided to the visualizer, it generates a temporary one and logs it on first API access. For repeatable agent work, set `COAIAN_API_TOKEN` explicitly.',
|
|
87
|
+
'',
|
|
88
|
+
'## Tool Map',
|
|
89
|
+
'',
|
|
90
|
+
'| MCP Tool | Use |',
|
|
91
|
+
'|---|---|',
|
|
92
|
+
'| `list_charts` | Start here; read chart hierarchy from the visualizer API |',
|
|
93
|
+
'| `get_chart` | Inspect one chart with outcome, reality, actions, metadata |',
|
|
94
|
+
'| `create_chart` | Create a chart through the visualizer API |',
|
|
95
|
+
'| `update_chart` | Update desired outcome, current reality, or due date |',
|
|
96
|
+
'| `add_action_step` | Add a new telescoped action chart with explicit current reality |',
|
|
97
|
+
'| `update_action_step` | Change an action description |',
|
|
98
|
+
'| `mark_action_complete` | Mark an action complete |',
|
|
99
|
+
'| `update_action_progress` | Add progress without completion |',
|
|
100
|
+
'| `update_current_reality` | Add current-reality observations |',
|
|
101
|
+
'| `toggle_action_completion` | Toggle action completion state |',
|
|
102
|
+
'| `delete_action_step` | Remove an action step |',
|
|
103
|
+
'| `create_telescoped_chart` | Convert an existing action into a sub-chart |',
|
|
104
|
+
'| `delete_chart` | Delete a chart and its descendants |',
|
|
105
|
+
'| `search_charts` | Search by text and filters |',
|
|
106
|
+
'| `get_chart_progress` | Calculate chart progress |',
|
|
107
|
+
'',
|
|
108
|
+
'## Structural-Tension Discipline',
|
|
109
|
+
'',
|
|
110
|
+
'- Do not treat charts as generic task boards.',
|
|
111
|
+
'- Do not default current reality to "ready to begin."',
|
|
112
|
+
'- Action steps are strategic secondary choices, and visualizer action creation should include an honest current reality.',
|
|
113
|
+
'- Use `create_telescoped_chart` only for an existing action. Use `add_action_step` for a new action.',
|
|
114
|
+
'',
|
|
115
|
+
'## References',
|
|
116
|
+
'',
|
|
117
|
+
'- `references/visualizer-workflow.md` for UI and CLI launch patterns.',
|
|
118
|
+
'- `references/mcp-bridge.md` for API/MCP wiring.',
|
|
119
|
+
'- `references/structural-tension-foundation.md` for shared methodology.',
|
|
120
|
+
'- `references/install-and-environment.md` for install and environment notes.',
|
|
121
|
+
].join('\n') + '\n';
|
|
122
|
+
|
|
123
|
+
const VISUALIZER_WORKFLOW_MD = [
|
|
124
|
+
'# Visualizer Workflow',
|
|
125
|
+
'',
|
|
126
|
+
'Use `coaia-visualizer` when the work benefits from seeing the chart hierarchy or when an agent needs REST/API access to the visualizer runtime.',
|
|
127
|
+
'',
|
|
128
|
+
'Common launch forms:',
|
|
129
|
+
'',
|
|
130
|
+
'```bash',
|
|
131
|
+
'coaia-visualizer -M ./memory.jsonl',
|
|
132
|
+
'coaia-visualizer -M ./memory.jsonl --port 4321 --no-open',
|
|
133
|
+
'coaia-visualizer --docker -M ./memory.jsonl --port 4321',
|
|
134
|
+
'coaia-visualizer -M ./memory.jsonl --live --poll-interval 2000',
|
|
135
|
+
'```',
|
|
136
|
+
'',
|
|
137
|
+
'The UI reads structural tension charts, current realities, action steps, narrative beats, and relations from JSONL. It can also edit charts through API routes when running as the app server.',
|
|
138
|
+
].join('\n') + '\n';
|
|
139
|
+
|
|
140
|
+
const MCP_BRIDGE_MD = [
|
|
141
|
+
'# MCP Bridge',
|
|
142
|
+
'',
|
|
143
|
+
'`coaia-visualizer-mcp` is a stdio MCP server that talks to the visualizer REST API. It does not parse the JSONL file by itself.',
|
|
144
|
+
'',
|
|
145
|
+
'Required runtime pieces:',
|
|
146
|
+
'',
|
|
147
|
+
'1. A running visualizer app.',
|
|
148
|
+
'2. `COAIAN_API_TOKEN` set in the visualizer process.',
|
|
149
|
+
'3. The same `COAIAN_API_TOKEN` set for the MCP process.',
|
|
150
|
+
'4. `COAIAV_API_URL` pointing at the running visualizer, usually `http://localhost:4321`.',
|
|
151
|
+
'',
|
|
152
|
+
'MCP client config:',
|
|
153
|
+
'',
|
|
154
|
+
'```json',
|
|
155
|
+
'{',
|
|
156
|
+
' "mcpServers": {',
|
|
157
|
+
' "coaia-visualizer": {',
|
|
158
|
+
' "command": "npx",',
|
|
159
|
+
' "args": ["-y", "coaia-visualizer-mcp"],',
|
|
160
|
+
' "env": {',
|
|
161
|
+
' "COAIAN_API_TOKEN": "your-token",',
|
|
162
|
+
' "COAIAV_API_URL": "http://localhost:4321"',
|
|
163
|
+
' }',
|
|
164
|
+
' }',
|
|
165
|
+
' }',
|
|
166
|
+
'}',
|
|
167
|
+
'```',
|
|
168
|
+
'',
|
|
169
|
+
'Use `list_charts` before mutation tools so the agent has current chart IDs and hierarchy.',
|
|
170
|
+
].join('\n') + '\n';
|
|
171
|
+
|
|
172
|
+
const STRUCTURAL_TENSION_FOUNDATION_MD = [
|
|
173
|
+
'# Structural Tension Foundation',
|
|
174
|
+
'',
|
|
175
|
+
'The visualizer presents the same methodology used by `coaia-narrative`.',
|
|
176
|
+
'',
|
|
177
|
+
'Core rules:',
|
|
178
|
+
'',
|
|
179
|
+
'- Desired Outcome is what is being created.',
|
|
180
|
+
'- Current Reality is the factual present state in relation to that outcome.',
|
|
181
|
+
'- Structural tension is active disequilibrium, not a gap to fill.',
|
|
182
|
+
'- Action steps are strategic secondary choices, not independent to-do items.',
|
|
183
|
+
'- Each action step can become a telescoped chart with its own current reality.',
|
|
184
|
+
'',
|
|
185
|
+
'Current reality must not be invented. Avoid "ready to begin", "prepared to start", or motivational filler. Use concrete present facts.',
|
|
186
|
+
].join('\n') + '\n';
|
|
187
|
+
|
|
188
|
+
const INSTALL_AND_ENVIRONMENT_MD = [
|
|
189
|
+
'# Install And Environment',
|
|
190
|
+
'',
|
|
191
|
+
'Install:',
|
|
192
|
+
'',
|
|
193
|
+
'```bash',
|
|
194
|
+
'npm install -g coaia-visualizer',
|
|
195
|
+
'coaia-visualizer skill show',
|
|
196
|
+
'coaia-visualizer skill install --yes',
|
|
197
|
+
'```',
|
|
198
|
+
'',
|
|
199
|
+
'Important environment variables:',
|
|
200
|
+
'',
|
|
201
|
+
'| Variable | Purpose |',
|
|
202
|
+
'|---|---|',
|
|
203
|
+
'| `COAIAN_MF` | Default memory file path |',
|
|
204
|
+
'| `COAIAV_PORT` | Default server port |',
|
|
205
|
+
'| `COAIAV_LIVE` | Enable live mode when `true` |',
|
|
206
|
+
'| `COAIAV_POLL_INTERVAL` | Live polling interval in milliseconds |',
|
|
207
|
+
'| `COAIAV_AUTO_PLAY` | Enable audio autoplay when `true` |',
|
|
208
|
+
'| `COAIAV_AUDIO_DIR` | Audio directory path |',
|
|
209
|
+
'| `COAIAN_API_TOKEN` | Bearer token for REST API and MCP bridge |',
|
|
210
|
+
'| `COAIAV_API_URL` | MCP bridge target API URL |',
|
|
211
|
+
'',
|
|
212
|
+
'`coaia-visualizer skill install` writes `.agents/skills/coaia-visualizer`. Add `--global` for `~/.agents/skills/coaia-visualizer`. Add `--yes` to create the matching `.claude/skills/coaia-visualizer` symlink.',
|
|
213
|
+
].join('\n') + '\n';
|
|
214
|
+
|
|
215
|
+
const EMBEDDED_SKILL_FILES: EmbeddedSkillFile[] = [
|
|
216
|
+
{ relativePath: 'SKILL.md', content: COAIA_VISUALIZER_SKILL_MD },
|
|
217
|
+
{ relativePath: 'references/visualizer-workflow.md', content: VISUALIZER_WORKFLOW_MD },
|
|
218
|
+
{ relativePath: 'references/mcp-bridge.md', content: MCP_BRIDGE_MD },
|
|
219
|
+
{ relativePath: 'references/structural-tension-foundation.md', content: STRUCTURAL_TENSION_FOUNDATION_MD },
|
|
220
|
+
{ relativePath: 'references/install-and-environment.md', content: INSTALL_AND_ENVIRONMENT_MD },
|
|
221
|
+
];
|
|
222
|
+
|
|
223
|
+
function getSkillInstallDir(globalInstall: boolean): string {
|
|
224
|
+
return globalInstall
|
|
225
|
+
? resolve(homedir(), '.agents', 'skills', SKILL_NAME)
|
|
226
|
+
: resolve(process.cwd(), '.agents', 'skills', SKILL_NAME);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function getClaudeSkillLinkPath(globalInstall: boolean): string {
|
|
230
|
+
return globalInstall
|
|
231
|
+
? resolve(homedir(), '.claude', 'skills', SKILL_NAME)
|
|
232
|
+
: resolve(process.cwd(), '.claude', 'skills', SKILL_NAME);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function pathExists(pathName: string): boolean {
|
|
236
|
+
try {
|
|
237
|
+
lstatSync(pathName);
|
|
238
|
+
return true;
|
|
239
|
+
} catch {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function removePath(pathName: string): void {
|
|
245
|
+
const stat = lstatSync(pathName);
|
|
246
|
+
if (stat.isDirectory() && !stat.isSymbolicLink()) {
|
|
247
|
+
rmSync(pathName, { recursive: true, force: true });
|
|
248
|
+
} else {
|
|
249
|
+
unlinkSync(pathName);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function writeEmbeddedSkill(targetDir: string, force: boolean): void {
|
|
254
|
+
if (pathExists(targetDir)) {
|
|
255
|
+
if (!force) {
|
|
256
|
+
throw new Error(`Skill already exists: ${targetDir} (use --force to replace it)`);
|
|
257
|
+
}
|
|
258
|
+
removePath(targetDir);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
mkdirSync(targetDir, { recursive: true });
|
|
262
|
+
for (const file of EMBEDDED_SKILL_FILES) {
|
|
263
|
+
const destination = resolve(targetDir, file.relativePath);
|
|
264
|
+
mkdirSync(dirname(destination), { recursive: true });
|
|
265
|
+
writeFileSync(destination, file.content, 'utf-8');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function ensureClaudeSymlink(linkPath: string, targetDir: string, force: boolean): boolean {
|
|
270
|
+
const parentDir = dirname(linkPath);
|
|
271
|
+
if (pathExists(parentDir)) {
|
|
272
|
+
const resolvedTargetParent = realpathSync(dirname(targetDir));
|
|
273
|
+
const resolvedLinkParent = realpathSync(parentDir);
|
|
274
|
+
|
|
275
|
+
if (resolvedTargetParent === resolvedLinkParent) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const linkTarget = relativePath(parentDir, targetDir) || '.';
|
|
281
|
+
mkdirSync(parentDir, { recursive: true });
|
|
282
|
+
|
|
283
|
+
if (pathExists(linkPath)) {
|
|
284
|
+
const stat = lstatSync(linkPath);
|
|
285
|
+
if (stat.isSymbolicLink() && readlinkSync(linkPath) === linkTarget) {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
if (!force) {
|
|
289
|
+
throw new Error(`Claude skill path already exists: ${linkPath} (use --force to replace it)`);
|
|
290
|
+
}
|
|
291
|
+
removePath(linkPath);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
symlinkSync(linkTarget, linkPath, 'dir');
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async function shouldCreateClaudeSymlink(linkPath: string, autoYes: boolean): Promise<boolean> {
|
|
299
|
+
if (autoYes) {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
303
|
+
console.log(`Tip: create a Claude symlink manually at ${linkPath}`);
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const rl = createInterface({
|
|
308
|
+
input: process.stdin,
|
|
309
|
+
output: process.stdout,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
try {
|
|
313
|
+
const answer = await rl.question(`Create a symlink in ${linkPath}? [y/N] `);
|
|
314
|
+
const normalized = answer.trim().toLowerCase();
|
|
315
|
+
return normalized === 'y' || normalized === 'yes';
|
|
316
|
+
} finally {
|
|
317
|
+
rl.close();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
async function installSkill(globalInstall: boolean, force: boolean, autoYes: boolean): Promise<void> {
|
|
322
|
+
const installDir = getSkillInstallDir(globalInstall);
|
|
323
|
+
writeEmbeddedSkill(installDir, force);
|
|
324
|
+
console.log(`Installed coaia-visualizer skill to ${installDir}`);
|
|
325
|
+
|
|
326
|
+
const claudeLinkPath = getClaudeSkillLinkPath(globalInstall);
|
|
327
|
+
if (!(await shouldCreateClaudeSymlink(claudeLinkPath, autoYes))) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const linked = ensureClaudeSymlink(claudeLinkPath, installDir, force);
|
|
332
|
+
if (linked) {
|
|
333
|
+
console.log(`Linked Claude skill at ${claudeLinkPath}`);
|
|
334
|
+
} else {
|
|
335
|
+
console.log(`Claude already sees the skill via ${dirname(claudeLinkPath)}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
export function showCoaiaVisualizerSkill(): void {
|
|
340
|
+
console.log('coaia-visualizer Skill (embedded)');
|
|
341
|
+
console.log('');
|
|
342
|
+
process.stdout.write(COAIA_VISUALIZER_SKILL_MD);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export function showSkillCommandHelp(): void {
|
|
346
|
+
console.log([
|
|
347
|
+
'Usage: coaia-visualizer skill <show|install|help> [options]',
|
|
348
|
+
'',
|
|
349
|
+
'Commands:',
|
|
350
|
+
' show Print the packaged coaia-visualizer skill',
|
|
351
|
+
' install Install into ./.agents/skills/coaia-visualizer',
|
|
352
|
+
' help Show this help',
|
|
353
|
+
'',
|
|
354
|
+
'Options for install:',
|
|
355
|
+
' --global Install into ~/.agents/skills/coaia-visualizer',
|
|
356
|
+
' --yes, -y Also create the .claude/skills/coaia-visualizer symlink',
|
|
357
|
+
' --force, -f Replace existing install or symlink',
|
|
358
|
+
].join('\n'));
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
export async function handleSkillCommand(args: minimist.ParsedArgs): Promise<void> {
|
|
362
|
+
const subcommand = String(args._[1] || '');
|
|
363
|
+
|
|
364
|
+
if (args.help || args.h || subcommand === 'help') {
|
|
365
|
+
showSkillCommandHelp();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (!subcommand) {
|
|
370
|
+
showSkillCommandHelp();
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (subcommand === 'show') {
|
|
375
|
+
showCoaiaVisualizerSkill();
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (subcommand === 'install') {
|
|
380
|
+
await installSkill(Boolean(args.global), Boolean(args.force || args.f), Boolean(args.yes || args.y));
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
throw new Error(`Unknown skill command: ${subcommand}`);
|
|
385
|
+
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{"type":"entity","name":"chart_1770523106343_chart","entityType":"structural_tension_chart","observations":["Chart created for jgwill/coaia-visualizer on 2026-02-08T03:58:26.343Z"],"metadata":{"chartId":"chart_1770523106343","repository":"jgwill/coaia-visualizer","level":0,"createdAt":"2026-02-08T03:58:26.343Z","updatedAt":"2026-02-08T03:58:26.343Z"}}
|
|
2
|
-
{"type":"entity","name":"chart_1770523106343_desired_outcome","entityType":"desired_outcome","observations":["Successful development and collaboration on jgwill/coaia-visualizer"],"metadata":{"chartId":"chart_1770523106343","createdAt":"2026-02-08T03:58:26.343Z","updatedAt":"2026-02-08T03:58:26.343Z"}}
|
|
3
|
-
{"type":"entity","name":"chart_1770523106343_current_reality","entityType":"current_reality","observations":["Repository initialized with STC bot integration","[2026-02-08T03:58:26.404Z] @stcissue triggered: Issue #8 - LIVE_MODE_DESIGN.md (issues.opened)","[2026-02-08T04:38:12.548Z] @stcissue triggered: Issue #8 - Live Narrative Witness Mode (issues.edited)","[2026-02-12T04:05:37.474Z] @stcissue triggered: Issue #9 - file watching issue (issues.opened)","[2026-02-18T19:29:54.244Z] @stcissue triggered: Issue #10 - Containerization (issues.opened)"],"metadata":{"chartId":"chart_1770523106343","createdAt":"2026-02-08T03:58:26.343Z","updatedAt":"2026-02-18T19:29:54.244Z"}}
|
|
4
|
-
{"type":"relation","from":"chart_1770523106343_chart","to":"chart_1770523106343_desired_outcome","relationType":"contains","metadata":{"createdAt":"2026-02-08T03:58:26.343Z"}}
|
|
5
|
-
{"type":"relation","from":"chart_1770523106343_chart","to":"chart_1770523106343_current_reality","relationType":"contains","metadata":{"createdAt":"2026-02-08T03:58:26.343Z"}}
|
|
6
|
-
{"type":"relation","from":"chart_1770523106343_current_reality","to":"chart_1770523106343_desired_outcome","relationType":"creates_tension_with","metadata":{"createdAt":"2026-02-08T03:58:26.343Z"}}
|
package/test-run.log
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
=========================================
|
|
2
|
-
COAIA Visualizer MCP Test Environment
|
|
3
|
-
=========================================
|
|
4
|
-
|
|
5
|
-
Working directory: /workspace/repos/jgwill/coaia-visualizer-feat-4
|
|
6
|
-
|
|
7
|
-
⚠ Warning: No ANTHROPIC_API_KEY or GOOGLE_API_KEY found
|
|
8
|
-
Tests will use direct HTTP calls instead of CLI clients
|
|
9
|
-
|
|
10
|
-
Cleaning up previous test results...
|
|
11
|
-
Building Docker images...
|
|
12
|
-
time="2026-01-16T09:09:43-05:00" level=warning msg="The \"ANTHROPIC_API_KEY\" variable is not set. Defaulting to a blank string."
|
|
13
|
-
time="2026-01-16T09:09:43-05:00" level=warning msg="The \"GOOGLE_API_KEY\" variable is not set. Defaulting to a blank string."
|
|
14
|
-
#0 building with "default" instance using docker driver
|
|
15
|
-
|
|
16
|
-
#1 [visualizer-app internal] load build definition from Dockerfile.app
|
|
17
|
-
#1 transferring dockerfile: 1.09kB done
|
|
18
|
-
#1 DONE 0.0s
|
|
19
|
-
|
|
20
|
-
#2 [visualizer-app internal] load metadata for docker.io/library/node:20-alpine
|
|
21
|
-
#2 DONE 0.2s
|
|
22
|
-
|
|
23
|
-
#3 [visualizer-app internal] load .dockerignore
|
|
24
|
-
#3 transferring context: 121B done
|
|
25
|
-
#3 DONE 0.0s
|
|
26
|
-
|
|
27
|
-
#4 [visualizer-app builder 1/6] FROM docker.io/library/node:20-alpine@sha256:3960ed74dfe320a67bf8da9555b6bade25ebda2b22b6081d2f60fd7d5d430e9c
|
|
28
|
-
#4 DONE 0.0s
|
|
29
|
-
|
|
30
|
-
#5 [visualizer-app internal] load build context
|
|
31
|
-
#5 transferring context: 82.91kB 0.2s done
|
|
32
|
-
#5 DONE 0.2s
|
|
33
|
-
|
|
34
|
-
#6 [visualizer-app builder 2/6] WORKDIR /app
|
|
35
|
-
#6 CACHED
|
|
36
|
-
|
|
37
|
-
#7 [visualizer-app runner 3/13] RUN npm install -g pnpm@latest
|
|
38
|
-
#7 CACHED
|
|
39
|
-
|
|
40
|
-
#8 [visualizer-app builder 3/6] COPY package.json pnpm-lock.yaml ./
|
|
41
|
-
#8 CACHED
|
|
42
|
-
|
|
43
|
-
#9 [visualizer-app runner 4/13] COPY package.json pnpm-lock.yaml ./
|
|
44
|
-
#9 CACHED
|
|
45
|
-
|
|
46
|
-
#10 [visualizer-app builder 4/6] RUN npm install -g pnpm@latest && pnpm install --frozen-lockfile
|
|
47
|
-
#10 4.059
|
|
48
|
-
#10 4.059 added 1 package in 3s
|
|
49
|
-
#10 4.059
|
|
50
|
-
#10 4.060 1 package is looking for funding
|
|
51
|
-
#10 4.060 run `npm fund` for details
|
|
52
|
-
#10 4.064 npm notice
|
|
53
|
-
#10 4.064 npm notice New major version of npm available! 10.8.2 -> 11.7.0
|
|
54
|
-
#10 4.064 npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.7.0
|
|
55
|
-
#10 4.064 npm notice To update run: npm install -g npm@11.7.0
|
|
56
|
-
#10 4.064 npm notice
|
|
57
|
-
#10 5.648 Lockfile is up to date, resolution step is skipped
|
|
58
|
-
#10 5.842 Progress: resolved 1, reused 0, downloaded 0, added 0
|
|
59
|
-
#10 6.386 Packages: +296
|
|
60
|
-
#10 6.386 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
61
|
-
#10 6.846 Progress: resolved 296, reused 0, downloaded 0, added 0
|
|
62
|
-
#10 9.510 Progress: resolved 296, reused 0, downloaded 1, added 0
|
|
63
|
-
#10 ...
|
|
64
|
-
|
|
65
|
-
#11 [visualizer-app runner 5/13] RUN pnpm install --prod --frozen-lockfile --ignore-scripts
|
|
66
|
-
#11 1.835 Lockfile is up to date, resolution step is skipped
|
|
67
|
-
#11 1.898 Progress: resolved 1, reused 0, downloaded 0, added 0
|
|
68
|
-
#11 2.020 Packages: +267
|
|
69
|
-
#11 2.020 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
70
|
-
#11 2.966 Progress: resolved 267, reused 0, downloaded 27, added 20
|
|
71
|
-
#11 3.978 Progress: resolved 267, reused 0, downloaded 142, added 56
|
|
72
|
-
#11 5.006 Progress: resolved 267, reused 0, downloaded 218, added 101
|
|
73
|
-
#11 6.017 Progress: resolved 267, reused 0, downloaded 258, added 221
|
|
74
|
-
#11 7.020 Progress: resolved 267, reused 0, downloaded 260, added 259
|
|
75
|
-
#11 8.018 Progress: resolved 267, reused 0, downloaded 261, added 261
|
|
76
|
-
#11 ...
|
|
77
|
-
|
|
78
|
-
#10 [visualizer-app builder 4/6] RUN npm install -g pnpm@latest && pnpm install --frozen-lockfile
|
|
79
|
-
#10 10.56 Progress: resolved 296, reused 0, downloaded 100, added 95
|
|
80
|
-
#10 11.57 Progress: resolved 296, reused 0, downloaded 196, added 195
|
|
81
|
-
#10 12.60 Progress: resolved 296, reused 0, downloaded 248, added 231
|
|
82
|
-
#10 13.60 Progress: resolved 296, reused 0, downloaded 284, added 283
|
|
83
|
-
#10 14.60 Progress: resolved 296, reused 0, downloaded 288, added 288
|
|
84
|
-
#10 15.60 Progress: resolved 296, reused 0, downloaded 289, added 288
|
|
85
|
-
#10 16.60 Progress: resolved 296, reused 0, downloaded 290, added 290
|
|
86
|
-
#10 19.46 Progress: resolved 296, reused 0, downloaded 291, added 290
|
|
87
|
-
#10 20.46 Progress: resolved 296, reused 0, downloaded 291, added 291
|
|
88
|
-
#10 22.03 Progress: resolved 296, reused 0, downloaded 292, added 291
|
|
89
|
-
#10 ...
|
|
90
|
-
|
|
91
|
-
#11 [visualizer-app runner 5/13] RUN pnpm install --prod --frozen-lockfile --ignore-scripts
|
|
92
|
-
#11 12.39 Progress: resolved 267, reused 0, downloaded 262, added 261
|
|
93
|
-
#11 13.39 Progress: resolved 267, reused 0, downloaded 262, added 262
|
|
94
|
-
#11 14.39 Progress: resolved 267, reused 0, downloaded 264, added 264
|
|
95
|
-
#11 15.39 Progress: resolved 267, reused 0, downloaded 265, added 265
|
|
96
|
-
#11 ...
|
|
97
|
-
|
|
98
|
-
#10 [visualizer-app builder 4/6] RUN npm install -g pnpm@latest && pnpm install --frozen-lockfile
|
|
99
|
-
#10 23.04 Progress: resolved 296, reused 0, downloaded 292, added 292
|
|
100
|
-
#10 24.40 Progress: resolved 296, reused 0, downloaded 293, added 292
|
|
101
|
-
#10 25.40 Progress: resolved 296, reused 0, downloaded 293, added 293
|