jfl 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +127 -951
  2. package/dist/commands/context-hub.d.ts.map +1 -1
  3. package/dist/commands/context-hub.js +96 -0
  4. package/dist/commands/context-hub.js.map +1 -1
  5. package/dist/commands/kanban.d.ts +34 -0
  6. package/dist/commands/kanban.d.ts.map +1 -0
  7. package/dist/commands/kanban.js +216 -0
  8. package/dist/commands/kanban.js.map +1 -0
  9. package/dist/commands/peter.d.ts.map +1 -1
  10. package/dist/commands/peter.js +37 -0
  11. package/dist/commands/peter.js.map +1 -1
  12. package/dist/commands/setup.d.ts.map +1 -1
  13. package/dist/commands/setup.js +62 -0
  14. package/dist/commands/setup.js.map +1 -1
  15. package/dist/commands/verify.d.ts.map +1 -1
  16. package/dist/commands/verify.js +28 -0
  17. package/dist/commands/verify.js.map +1 -1
  18. package/dist/dashboard-static/assets/index-CW8oWAdr.css +1 -0
  19. package/dist/dashboard-static/assets/index-Ck8f9dcM.js +121 -0
  20. package/dist/dashboard-static/index.html +2 -2
  21. package/dist/index.js +62 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/flow-engine.d.ts.map +1 -1
  24. package/dist/lib/flow-engine.js +38 -8
  25. package/dist/lib/flow-engine.js.map +1 -1
  26. package/dist/lib/kanban-github.d.ts +81 -0
  27. package/dist/lib/kanban-github.d.ts.map +1 -0
  28. package/dist/lib/kanban-github.js +318 -0
  29. package/dist/lib/kanban-github.js.map +1 -0
  30. package/dist/lib/kanban.d.ts +131 -0
  31. package/dist/lib/kanban.d.ts.map +1 -0
  32. package/dist/lib/kanban.js +340 -0
  33. package/dist/lib/kanban.js.map +1 -0
  34. package/dist/lib/service-gtm.d.ts.map +1 -1
  35. package/dist/lib/service-gtm.js +11 -0
  36. package/dist/lib/service-gtm.js.map +1 -1
  37. package/package.json +1 -1
  38. package/packages/pi/extensions/hud-tool.ts +32 -22
  39. package/packages/pi/extensions/index.ts +19 -17
  40. package/packages/pi/extensions/tool-renderers.ts +30 -36
  41. package/dist/dashboard-static/assets/index-CW9ZxqX8.css +0 -1
  42. package/dist/dashboard-static/assets/index-DNN__p4K.js +0 -121
@@ -1 +1 @@
1
- {"version":3,"file":"context-hub.d.ts","sourceRoot":"","sources":["../../src/commands/context-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAy9EH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBjF;AAkMD,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiHxF;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,iBA8lBzF"}
1
+ {"version":3,"file":"context-hub.d.ts","sourceRoot":"","sources":["../../src/commands/context-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0jFH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBjF;AAkMD,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiHxF;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,iBA8lBzF"}
@@ -1335,6 +1335,102 @@ function createServer(projectRoot, port, eventBus, flowEngine) {
1335
1335
  }
1336
1336
  return;
1337
1337
  }
1338
+ // Kanban board
1339
+ // ── Kanban API (GitHub Issues-backed) ──────────────────────
1340
+ if (url.pathname === "/api/kanban" && req.method === "GET") {
1341
+ try {
1342
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
1343
+ const scope = url.searchParams.get("scope") ?? undefined;
1344
+ const source = url.searchParams.get("source") ?? undefined;
1345
+ const filter = (scope || source) ? { scope, source } : undefined;
1346
+ const kb = new GitHubKanban(projectRoot);
1347
+ const board = await kb.getBoard(filter);
1348
+ res.writeHead(200, { "Content-Type": "application/json" });
1349
+ res.end(JSON.stringify(board));
1350
+ }
1351
+ catch (err) {
1352
+ res.writeHead(500, { "Content-Type": "application/json" });
1353
+ res.end(JSON.stringify({ error: err.message }));
1354
+ }
1355
+ return;
1356
+ }
1357
+ if (url.pathname === "/api/kanban/cards" && req.method === "GET") {
1358
+ try {
1359
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
1360
+ const scope = url.searchParams.get("scope") ?? undefined;
1361
+ const source = url.searchParams.get("source") ?? undefined;
1362
+ const filter = (scope || source) ? { scope, source } : undefined;
1363
+ const kb = new GitHubKanban(projectRoot);
1364
+ const cards = await kb.getCards(filter);
1365
+ res.writeHead(200, { "Content-Type": "application/json" });
1366
+ res.end(JSON.stringify(cards));
1367
+ }
1368
+ catch (err) {
1369
+ res.writeHead(500, { "Content-Type": "application/json" });
1370
+ res.end(JSON.stringify({ error: err.message }));
1371
+ }
1372
+ return;
1373
+ }
1374
+ if (url.pathname === "/api/kanban/scopes" && req.method === "GET") {
1375
+ try {
1376
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
1377
+ const kb = new GitHubKanban(projectRoot);
1378
+ const workspace = kb.getWorkspaceInfo();
1379
+ const services = kb.getRegisteredServices();
1380
+ res.writeHead(200, { "Content-Type": "application/json" });
1381
+ res.end(JSON.stringify({ workspace, services }));
1382
+ }
1383
+ catch (err) {
1384
+ res.writeHead(500, { "Content-Type": "application/json" });
1385
+ res.end(JSON.stringify({ error: err.message }));
1386
+ }
1387
+ return;
1388
+ }
1389
+ if (url.pathname === "/api/kanban" && req.method === "POST") {
1390
+ let body = "";
1391
+ req.on("data", (chunk) => { body += chunk; });
1392
+ req.on("end", async () => {
1393
+ try {
1394
+ const data = JSON.parse(body || "{}");
1395
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
1396
+ const kb = new GitHubKanban(projectRoot);
1397
+ if (data.action === "create") {
1398
+ const number = kb.create({
1399
+ title: data.title,
1400
+ description: data.description,
1401
+ source: data.source ?? "human",
1402
+ priority: data.priority ?? 0,
1403
+ scope: data.scope,
1404
+ labels: data.labels,
1405
+ });
1406
+ res.writeHead(201, { "Content-Type": "application/json" });
1407
+ res.end(JSON.stringify({ id: `#${number}`, number }));
1408
+ }
1409
+ else if (data.action === "move") {
1410
+ // Accept both #8 and 8 format
1411
+ const num = typeof data.id === "string" ? parseInt(data.id.replace("#", "")) : data.id;
1412
+ kb.move(num, data.column);
1413
+ res.writeHead(200, { "Content-Type": "application/json" });
1414
+ res.end(JSON.stringify({ ok: true }));
1415
+ }
1416
+ else if (data.action === "pick") {
1417
+ const num = typeof data.id === "string" ? parseInt(data.id.replace("#", "")) : data.id;
1418
+ kb.pick(num, data.agent);
1419
+ res.writeHead(200, { "Content-Type": "application/json" });
1420
+ res.end(JSON.stringify({ ok: true }));
1421
+ }
1422
+ else {
1423
+ res.writeHead(400, { "Content-Type": "application/json" });
1424
+ res.end(JSON.stringify({ error: "Unknown action" }));
1425
+ }
1426
+ }
1427
+ catch (err) {
1428
+ res.writeHead(500, { "Content-Type": "application/json" });
1429
+ res.end(JSON.stringify({ error: err.message }));
1430
+ }
1431
+ });
1432
+ return;
1433
+ }
1338
1434
  // Flow definitions
1339
1435
  if (url.pathname === "/api/flows" && req.method === "GET") {
1340
1436
  if (!flowEngine) {