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
@@ -0,0 +1,34 @@
1
+ /**
2
+ * jfl kanban — GitHub Issues-backed task board
3
+ *
4
+ * Cards are GitHub Issues with jfl/ labels. Git is the source of truth.
5
+ * Humans create and prioritize. Agents pick and execute.
6
+ *
7
+ * @purpose CLI command for kanban task board
8
+ */
9
+ export declare function kanbanLs(projectRoot: string, opts: {
10
+ json?: boolean;
11
+ column?: string;
12
+ scope?: string;
13
+ compact?: boolean;
14
+ }): Promise<void>;
15
+ export declare function kanbanAdd(projectRoot: string, title: string, opts: {
16
+ description?: string;
17
+ priority?: string;
18
+ source?: string;
19
+ scope?: string;
20
+ label?: string[];
21
+ }): Promise<void>;
22
+ export declare function kanbanMove(projectRoot: string, id: string, column: string, opts: {
23
+ agent?: string;
24
+ }): Promise<void>;
25
+ export declare function kanbanPick(projectRoot: string, opts: {
26
+ agent?: string;
27
+ }): Promise<void>;
28
+ export declare function kanbanDone(projectRoot: string, id: string, opts: {
29
+ agent?: string;
30
+ }): Promise<void>;
31
+ export declare function kanbanBootstrap(projectRoot: string, opts: {
32
+ workflow?: boolean;
33
+ }): Promise<void>;
34
+ //# sourceMappingURL=kanban.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban.d.ts","sourceRoot":"","sources":["../../src/commands/kanban.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwDH,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBAmC/H;AAED,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,iBAevK;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAKzG;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAiB7E;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAKzF;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,iBAgFtF"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * jfl kanban — GitHub Issues-backed task board
3
+ *
4
+ * Cards are GitHub Issues with jfl/ labels. Git is the source of truth.
5
+ * Humans create and prioritize. Agents pick and execute.
6
+ *
7
+ * @purpose CLI command for kanban task board
8
+ */
9
+ import chalk from "chalk";
10
+ import { execSync } from "child_process";
11
+ import { GitHubKanban } from "../lib/kanban-github.js";
12
+ const COL_COLORS = {
13
+ backlog: chalk.gray,
14
+ in_progress: chalk.cyan,
15
+ eval: chalk.yellow,
16
+ done: chalk.green,
17
+ };
18
+ const COL_LABELS = {
19
+ backlog: "Backlog",
20
+ in_progress: "In Progress",
21
+ eval: "In Review",
22
+ done: "Done",
23
+ };
24
+ function renderCard(card, compact = false) {
25
+ const score = card.score !== null ? ` [${card.score.toFixed(2)}]` : "";
26
+ const agent = card.agent ? chalk.dim(` (${card.agent})`) : "";
27
+ const prio = card.priority > 0 ? chalk.magenta(` P${card.priority}`) : "";
28
+ const src = chalk.dim(` [${card.source}]`);
29
+ const scope = card.scope ? chalk.blue(` [${card.scope}]`) : "";
30
+ const labels = card.labels?.length ? " " + card.labels.map(l => chalk.dim(`#${l}`)).join(" ") : "";
31
+ if (compact) {
32
+ return ` ${chalk.bold(card.id)} ${card.title}${prio}${score}${agent}${scope}`;
33
+ }
34
+ const lines = [
35
+ ` ${chalk.bold(card.id)} ${card.title}${prio}${score}${agent}${src}${scope}`,
36
+ ];
37
+ if (card.description) {
38
+ const desc = card.description.split("\n")[0].slice(0, 80);
39
+ lines.push(chalk.gray(` ${desc}`));
40
+ }
41
+ if (labels) {
42
+ lines.push(chalk.dim(` ${labels.trim()}`));
43
+ }
44
+ const linkParts = [];
45
+ if (card.links?.pr)
46
+ linkParts.push(`PR #${card.links.pr}`);
47
+ if (card.links?.eval)
48
+ linkParts.push(`eval:${card.links.eval}`);
49
+ if (card.links?.journal)
50
+ linkParts.push(`journal:${card.links.journal}`);
51
+ if (card.links?.violation)
52
+ linkParts.push(`violation:${card.links.violation}`);
53
+ if (linkParts.length) {
54
+ lines.push(chalk.dim(` → ${linkParts.join(" · ")}`));
55
+ }
56
+ if (card.url) {
57
+ lines.push(chalk.dim(` ${card.url}`));
58
+ }
59
+ return lines.join("\n");
60
+ }
61
+ export async function kanbanLs(projectRoot, opts) {
62
+ const kb = new GitHubKanban(projectRoot);
63
+ const filter = opts.scope ? { scope: opts.scope } : undefined;
64
+ const board = await kb.getBoard(filter);
65
+ if (opts.json) {
66
+ if (opts.column) {
67
+ console.log(JSON.stringify(board[opts.column] ?? [], null, 2));
68
+ }
69
+ else {
70
+ console.log(JSON.stringify(board, null, 2));
71
+ }
72
+ return;
73
+ }
74
+ const columns = opts.column
75
+ ? [opts.column]
76
+ : ["backlog", "in_progress", "eval", "done"];
77
+ console.log(chalk.bold("\n JFL Kanban\n"));
78
+ for (const col of columns) {
79
+ const cards = board[col];
80
+ const label = COL_LABELS[col] ?? col;
81
+ const color = COL_COLORS[col] ?? chalk.white;
82
+ console.log(color(` ${label} (${cards.length})`));
83
+ if (cards.length === 0) {
84
+ console.log(chalk.dim(" (empty)"));
85
+ }
86
+ else {
87
+ for (const card of cards) {
88
+ console.log(renderCard(card, opts.compact));
89
+ }
90
+ }
91
+ console.log();
92
+ }
93
+ }
94
+ export async function kanbanAdd(projectRoot, title, opts) {
95
+ const kb = new GitHubKanban(projectRoot);
96
+ const number = kb.create({
97
+ title,
98
+ description: opts.description,
99
+ source: opts.source ?? "human",
100
+ priority: opts.priority ? parseInt(opts.priority) : 0,
101
+ scope: opts.scope,
102
+ labels: opts.label,
103
+ });
104
+ const id = `#${number}`;
105
+ console.log(chalk.green(` ✓ Created ${id}: ${title}`));
106
+ if (!process.stdout.isTTY) {
107
+ process.stdout.write(id);
108
+ }
109
+ }
110
+ export async function kanbanMove(projectRoot, id, column, opts) {
111
+ const kb = new GitHubKanban(projectRoot);
112
+ const num = parseInt(id.replace("#", ""));
113
+ kb.move(num, column);
114
+ console.log(chalk.green(` ✓ Moved #${num} → ${column}`));
115
+ }
116
+ export async function kanbanPick(projectRoot, opts) {
117
+ const kb = new GitHubKanban(projectRoot);
118
+ const cards = await kb.getCards({ column: "backlog" });
119
+ if (cards.length === 0) {
120
+ console.log(chalk.yellow(" No cards in backlog"));
121
+ process.exit(1);
122
+ }
123
+ // Pick highest priority
124
+ const card = cards[0];
125
+ kb.pick(card.number, opts.agent ?? "");
126
+ console.log(chalk.cyan(` ⚡ Picked ${card.id}: ${card.title}`));
127
+ if (!process.stdout.isTTY) {
128
+ process.stdout.write(card.title);
129
+ if (card.description)
130
+ process.stdout.write(`\n\n${card.description}`);
131
+ }
132
+ }
133
+ export async function kanbanDone(projectRoot, id, opts) {
134
+ const kb = new GitHubKanban(projectRoot);
135
+ const num = parseInt(id.replace("#", ""));
136
+ kb.move(num, "done");
137
+ console.log(chalk.green(` ✓ Done: #${num}`));
138
+ }
139
+ export async function kanbanBootstrap(projectRoot, opts) {
140
+ const kb = new GitHubKanban(projectRoot);
141
+ const info = kb.getWorkspaceInfo();
142
+ // 1. Create column labels
143
+ GitHubKanban.bootstrap(info.repo);
144
+ console.log(chalk.green(` ✓ Column labels created (backlog, in-progress, eval, done)`));
145
+ // 2. Create scope labels for registered services
146
+ const services = kb.getRegisteredServices();
147
+ for (const s of services) {
148
+ try {
149
+ execSync(`gh label create "scope:${s.name}" --repo ${info.repo} --color 1971C2 --description "Scope: ${s.name}" --force`, {
150
+ encoding: "utf-8", timeout: 10000,
151
+ });
152
+ }
153
+ catch { }
154
+ }
155
+ if (services.length > 0) {
156
+ console.log(chalk.green(` ✓ ${services.length} scope labels created`));
157
+ }
158
+ // 3. Create source labels
159
+ const sources = [
160
+ { name: "source:human", color: "495057", desc: "Created by human" },
161
+ { name: "source:agent", color: "7C6F64", desc: "Created by agent" },
162
+ { name: "source:setup", color: "0B7285", desc: "Created by jfl setup" },
163
+ { name: "source:verify", color: "C92A2A", desc: "Created by jfl verify" },
164
+ { name: "source:findings", color: "E67700", desc: "Created by findings" },
165
+ ];
166
+ for (const s of sources) {
167
+ try {
168
+ execSync(`gh label create "${s.name}" --repo ${info.repo} --color ${s.color} --description "${s.desc}" --force`, {
169
+ encoding: "utf-8", timeout: 10000,
170
+ });
171
+ }
172
+ catch { }
173
+ }
174
+ console.log(chalk.green(` ✓ Source labels created`));
175
+ // 4. Create priority labels
176
+ const priorities = [
177
+ { name: "priority:critical", color: "B60205", desc: "Priority 8-10" },
178
+ { name: "priority:high", color: "D93F0B", desc: "Priority 5-7" },
179
+ { name: "priority:low", color: "0E8A16", desc: "Priority 1-4" },
180
+ ];
181
+ for (const p of priorities) {
182
+ try {
183
+ execSync(`gh label create "${p.name}" --repo ${info.repo} --color ${p.color} --description "${p.desc}" --force`, {
184
+ encoding: "utf-8", timeout: 10000,
185
+ });
186
+ }
187
+ catch { }
188
+ }
189
+ console.log(chalk.green(` ✓ Priority labels created`));
190
+ // 5. Install GitHub Action workflow
191
+ if (opts.workflow) {
192
+ const { existsSync, mkdirSync, copyFileSync } = await import("fs");
193
+ const { join, dirname } = await import("path");
194
+ const workflowDir = join(projectRoot, ".github", "workflows");
195
+ const workflowPath = join(workflowDir, "kanban.yml");
196
+ if (!existsSync(workflowDir)) {
197
+ mkdirSync(workflowDir, { recursive: true });
198
+ }
199
+ // Copy the workflow from the jfl-cli package
200
+ const sourceWorkflow = join(dirname(new URL(import.meta.url).pathname), "../../.github/workflows/kanban.yml");
201
+ if (existsSync(sourceWorkflow)) {
202
+ copyFileSync(sourceWorkflow, workflowPath);
203
+ console.log(chalk.green(` ✓ GitHub Action installed (.github/workflows/kanban.yml)`));
204
+ console.log(chalk.dim(` Auto-moves: branch created → in_progress, PR opened → eval, PR merged → done`));
205
+ }
206
+ else {
207
+ console.log(chalk.yellow(` ⚠ Workflow template not found — install manually from jfl-cli repo`));
208
+ }
209
+ }
210
+ console.log();
211
+ console.log(chalk.bold(` Kanban ready on ${info.repo}`));
212
+ console.log(chalk.dim(` Board: jfl kanban ls`));
213
+ console.log(chalk.dim(` Add: jfl kanban add "My task" --priority 5`));
214
+ console.log(chalk.dim(` View: gh issue list --label jfl/backlog`));
215
+ }
216
+ //# sourceMappingURL=kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban.js","sourceRoot":"","sources":["../../src/commands/kanban.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"peter.d.ts","sourceRoot":"","sources":["../../src/commands/peter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6nEH,wBAAsB,YAAY,CAChC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAO,iBA4JrK"}
1
+ {"version":3,"file":"peter.d.ts","sourceRoot":"","sources":["../../src/commands/peter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiqEH,wBAAsB,YAAY,CAChC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAO,iBA4JrK"}
@@ -721,6 +721,24 @@ Respond with ONLY a JSON array, no other text.`;
721
721
  source: "experiment",
722
722
  reasoning: proposal.reasoning,
723
723
  });
724
+ // Create GitHub Issue for the experiment
725
+ try {
726
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
727
+ const kb = new GitHubKanban(projectRoot);
728
+ const issueNum = kb.create({
729
+ title: proposal.task.slice(0, 120),
730
+ description: `Predicted delta: +${proposal.predicted_delta.toFixed(4)}. ${proposal.reasoning}\n\nAuthored-by: peter-parker (jfl-cli)`,
731
+ source: "agent",
732
+ priority: Math.round(proposal.predicted_delta * 10),
733
+ agent: "peter-parker",
734
+ labels: ["agent"],
735
+ });
736
+ if (issueNum) {
737
+ kb.pick(issueNum, "peter-parker");
738
+ console.log(chalk.gray(` 📋 Issue #${issueNum} → in_progress`));
739
+ }
740
+ }
741
+ catch { }
724
742
  console.log(chalk.cyan(" Dispatching to Peter Parker PR workflow...\n"));
725
743
  await runWithPR(projectRoot, proposal.task);
726
744
  }
@@ -1061,6 +1079,25 @@ Suggest the SINGLE highest-value change. JSON format:
1061
1079
  source: "autoresearch",
1062
1080
  },
1063
1081
  });
1082
+ // Update GitHub Issue — move done or revert to backlog
1083
+ try {
1084
+ const { GitHubKanban } = await import("../lib/kanban-github.js");
1085
+ const kb = new GitHubKanban(projectRoot);
1086
+ const cards = await kb.getCards({ column: "in_progress" });
1087
+ const ppCards = cards.filter(c => c.agent === "peter-parker");
1088
+ if (ppCards.length > 0) {
1089
+ const card = ppCards[ppCards.length - 1];
1090
+ if (delta > 0 || testsAdded > 0) {
1091
+ kb.move(card.number, "done");
1092
+ console.log(chalk.gray(` 📋 Issue ${card.id} → done (${score.toFixed(4)})`));
1093
+ }
1094
+ else {
1095
+ kb.move(card.number, "backlog");
1096
+ console.log(chalk.gray(` 📋 Issue ${card.id} → backlog (no improvement)`));
1097
+ }
1098
+ }
1099
+ }
1100
+ catch { }
1064
1101
  gitExec(["checkout", baseBranch], projectRoot);
1065
1102
  }
1066
1103
  console.log(chalk.bold(`\n ── Autoresearch Complete ${"─".repeat(35)}\n`));