@skillkit/tui 1.18.0 → 1.19.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/dist/index.js CHANGED
@@ -1721,7 +1721,7 @@ var render = async (node, rendererOrConfig = {}) => {
1721
1721
  import { createCliRenderer as createCliRenderer2 } from "@opentui/core";
1722
1722
 
1723
1723
  // src/App.tsx
1724
- import { execFile as execFile2 } from "child_process";
1724
+ import { execFile as execFile5 } from "child_process";
1725
1725
 
1726
1726
  // src/state/types.ts
1727
1727
  var NAV_KEYS = {
@@ -1745,7 +1745,10 @@ var NAV_KEYS = {
1745
1745
  "/": "help",
1746
1746
  "g": "mesh",
1747
1747
  "j": "message",
1748
- "z": "scan"
1748
+ "z": "scan",
1749
+ l: "timeline",
1750
+ v: "lineage",
1751
+ f: "handoff"
1749
1752
  };
1750
1753
  var STATUS_BAR_SHORTCUTS = "b browse m market i installed s sync / help q quit";
1751
1754
  var SIDEBAR_NAV = [
@@ -1785,6 +1788,14 @@ var SIDEBAR_NAV = [
1785
1788
  { key: "j", label: "Messages", screen: "message" }
1786
1789
  ]
1787
1790
  },
1791
+ {
1792
+ section: "Session",
1793
+ items: [
1794
+ { key: "l", label: "Timeline", screen: "timeline" },
1795
+ { key: "v", label: "Lineage", screen: "lineage" },
1796
+ { key: "f", label: "Handoff", screen: "handoff" }
1797
+ ]
1798
+ },
1788
1799
  {
1789
1800
  section: "More",
1790
1801
  items: [
@@ -7214,7 +7225,7 @@ function Memory(props) {
7214
7225
  }));
7215
7226
  }
7216
7227
  };
7217
- const getTypeIcon = (type) => {
7228
+ const getTypeIcon2 = (type) => {
7218
7229
  switch (type) {
7219
7230
  case "index":
7220
7231
  return "\u25C8";
@@ -7405,7 +7416,7 @@ function Memory(props) {
7405
7416
  setProp(_el$33, "width", 3);
7406
7417
  insert(_el$33, () => idx() === selectedIndex() ? "\u25B8 " : " ");
7407
7418
  insertNode(_el$34, _el$35);
7408
- insert(_el$34, () => getTypeIcon(mem.type), _el$35);
7419
+ insert(_el$34, () => getTypeIcon2(mem.type), _el$35);
7409
7420
  setProp(_el$36, "width", 20);
7410
7421
  insert(_el$36, () => mem.key);
7411
7422
  setProp(_el$37, "width", 12);
@@ -7441,7 +7452,7 @@ function Memory(props) {
7441
7452
  return selectedEntry().key;
7442
7453
  },
7443
7454
  get icon() {
7444
- return getTypeIcon(selectedEntry().type);
7455
+ return getTypeIcon2(selectedEntry().type);
7445
7456
  },
7446
7457
  get fields() {
7447
7458
  return detailFields();
@@ -9049,7 +9060,7 @@ function Plugins(props) {
9049
9060
  else props.onNavigate("home");
9050
9061
  }
9051
9062
  });
9052
- const getTypeIcon = (type) => {
9063
+ const getTypeIcon2 = (type) => {
9053
9064
  switch (type) {
9054
9065
  case "translator":
9055
9066
  return "\u21C4";
@@ -9181,7 +9192,7 @@ function Plugins(props) {
9181
9192
  insert(_el$23, () => selected() ? "\u25B8 " : " ");
9182
9193
  insertNode(_el$24, _el$25);
9183
9194
  setProp(_el$24, "width", 3);
9184
- insert(_el$24, () => getTypeIcon(plugin.type), _el$25);
9195
+ insert(_el$24, () => getTypeIcon2(plugin.type), _el$25);
9185
9196
  setProp(_el$26, "width", 20);
9186
9197
  insert(_el$26, () => plugin.name);
9187
9198
  insertNode(_el$27, _el$28);
@@ -9263,7 +9274,7 @@ function Plugins(props) {
9263
9274
  return `v${selectedPlugin().metadata.version}`;
9264
9275
  },
9265
9276
  get icon() {
9266
- return getTypeIcon(currentPlugin()?.type || "mixed");
9277
+ return getTypeIcon2(currentPlugin()?.type || "mixed");
9267
9278
  },
9268
9279
  get fields() {
9269
9280
  return detailFields();
@@ -11206,117 +11217,1075 @@ function Scan(props) {
11206
11217
  })();
11207
11218
  }
11208
11219
 
11209
- // src/App.tsx
11210
- var DOCS_URL = "https://agenstskills.com/docs";
11211
- function openUrl(url) {
11212
- if (process.platform === "win32") {
11213
- execFile2("cmd", ["/c", "start", "", url]);
11214
- } else {
11215
- const cmd = process.platform === "darwin" ? "open" : "xdg-open";
11216
- execFile2(cmd, [url]);
11220
+ // src/screens/Timeline.tsx
11221
+ import { execFile as execFile2 } from "child_process";
11222
+ function getTypeIcon(type) {
11223
+ switch (type) {
11224
+ case "skill_start":
11225
+ return "\u25B6";
11226
+ case "skill_complete":
11227
+ return "\u2713";
11228
+ case "task_progress":
11229
+ return "\u25C7";
11230
+ case "git_commit":
11231
+ return "\u25CF";
11232
+ case "observation":
11233
+ return "\u25CB";
11234
+ case "decision":
11235
+ return "\u25C6";
11236
+ case "snapshot":
11237
+ return "\u25C8";
11238
+ default:
11239
+ return "\u2022";
11217
11240
  }
11218
11241
  }
11219
- function App(props) {
11220
- const [showSplash, setShowSplash] = createSignal(true);
11221
- const [currentScreen, setCurrentScreen] = createSignal("home");
11222
- const [showSidebar, setShowSidebar] = createSignal(true);
11223
- const [dimensions, setDimensions] = createSignal({
11224
- cols: process.stdout.columns || 80,
11225
- rows: process.stdout.rows || 24
11226
- });
11227
- createEffect(() => {
11228
- const handleResize = () => {
11229
- setDimensions({
11230
- cols: process.stdout.columns || 80,
11231
- rows: process.stdout.rows || 24
11232
- });
11233
- };
11234
- process.stdout.on("resize", handleResize);
11235
- onCleanup(() => {
11236
- process.stdout.off("resize", handleResize);
11242
+ function getTypeColor(type) {
11243
+ switch (type) {
11244
+ case "skill_start":
11245
+ return "#22cc44";
11246
+ case "skill_complete":
11247
+ return "#22cc44";
11248
+ case "git_commit":
11249
+ return "#fbbf24";
11250
+ case "observation":
11251
+ return "#00bbcc";
11252
+ case "decision":
11253
+ return "#aa88ff";
11254
+ case "snapshot":
11255
+ return "#ff88aa";
11256
+ default:
11257
+ return terminalColors.textMuted;
11258
+ }
11259
+ }
11260
+ function formatTimestamp(ts) {
11261
+ try {
11262
+ const d = new Date(ts);
11263
+ if (isNaN(d.getTime())) return ts;
11264
+ return d.toLocaleTimeString("en-US", {
11265
+ hour: "numeric",
11266
+ minute: "2-digit",
11267
+ hour12: true
11237
11268
  });
11238
- });
11239
- const cols = () => dimensions().cols;
11240
- const rows = () => dimensions().rows;
11241
- const sidebarVisible = () => showSidebar() && cols() >= 80;
11242
- const sidebarWidth = () => {
11243
- if (!sidebarVisible()) return 0;
11244
- if (cols() >= 100) return 24;
11245
- return 18;
11246
- };
11247
- const statusBarHeight = 2;
11248
- const contentHeight = () => rows() - statusBarHeight;
11249
- const handleNavigate = (newScreen) => {
11250
- setCurrentScreen(newScreen);
11251
- };
11252
- const handleSplashComplete = () => {
11253
- setShowSplash(false);
11269
+ } catch {
11270
+ return ts;
11271
+ }
11272
+ }
11273
+ function Timeline2(props) {
11274
+ const [loading, setLoading] = createSignal(true);
11275
+ const [result, setResult] = createSignal(null);
11276
+ const [error, setError] = createSignal(null);
11277
+ const [selectedIndex, setSelectedIndex] = createSignal(0);
11278
+ const rows = () => props.rows ?? 24;
11279
+ const visibleCount = () => Math.max(1, rows() - 10);
11280
+ const loadTimeline = () => {
11281
+ setLoading(true);
11282
+ setError(null);
11283
+ try {
11284
+ execFile2("npx", ["skillkit", "timeline", "--json"], {
11285
+ timeout: 15e3,
11286
+ maxBuffer: 1024 * 1024
11287
+ }, (err, stdout, stderr) => {
11288
+ setLoading(false);
11289
+ if (err && !stdout) {
11290
+ setError(stderr || err.message || "Failed to load timeline");
11291
+ return;
11292
+ }
11293
+ try {
11294
+ const parsed = JSON.parse(stdout);
11295
+ setResult(parsed);
11296
+ } catch {
11297
+ setError("Failed to parse timeline data");
11298
+ }
11299
+ });
11300
+ } catch (err) {
11301
+ setLoading(false);
11302
+ setError(err instanceof Error ? err.message : "Failed to load timeline");
11303
+ }
11254
11304
  };
11305
+ createEffect(() => {
11306
+ loadTimeline();
11307
+ });
11308
+ const events = createMemo(() => result()?.events ?? []);
11309
+ const windowStart = createMemo(() => Math.max(0, selectedIndex() - visibleCount() + 1));
11310
+ const visibleEvents = createMemo(() => events().slice(windowStart(), windowStart() + visibleCount()));
11255
11311
  useKeyboard((key) => {
11256
- if (showSplash()) {
11257
- setShowSplash(false);
11258
- return;
11259
- }
11260
- if (key.name === "q" || key.ctrl && key.name === "c") {
11261
- props.onExit ? props.onExit(0) : process.exit(0);
11262
- return;
11263
- }
11264
- if (key.name === "d") {
11265
- openUrl(DOCS_URL);
11266
- return;
11267
- }
11268
- if (key.sequence === "\\") {
11269
- setShowSidebar((v) => !v);
11270
- return;
11271
- }
11272
- const targetScreen = NAV_KEYS[key.name || ""];
11273
- if (targetScreen) {
11274
- setCurrentScreen(targetScreen);
11312
+ if (key.name === "k" || key.name === "up") {
11313
+ setSelectedIndex((i) => Math.max(0, i - 1));
11314
+ } else if (key.name === "j" || key.name === "down") {
11315
+ setSelectedIndex((i) => events().length > 0 ? Math.min(events().length - 1, i + 1) : 0);
11316
+ } else if (key.name === "r") {
11317
+ loadTimeline();
11318
+ } else if (key.name === "escape") {
11319
+ props.onNavigate("home");
11275
11320
  }
11276
- if (key.name === "escape" && currentScreen() !== "home") {
11277
- setCurrentScreen("home");
11321
+ });
11322
+ return (() => {
11323
+ var _el$ = createElement("box"), _el$7 = createElement("text"), _el$9 = createElement("text");
11324
+ insertNode(_el$, _el$7);
11325
+ insertNode(_el$, _el$9);
11326
+ setProp(_el$, "flexDirection", "column");
11327
+ setProp(_el$, "padding", 1);
11328
+ insert(_el$, createComponent2(Header, {
11329
+ title: "Timeline",
11330
+ subtitle: "unified event stream",
11331
+ get count() {
11332
+ return result()?.totalCount;
11333
+ },
11334
+ icon: "\u25B8"
11335
+ }), _el$7);
11336
+ insert(_el$, createComponent2(Show, {
11337
+ get when() {
11338
+ return loading();
11339
+ },
11340
+ get children() {
11341
+ return createComponent2(Spinner, {
11342
+ label: "Loading timeline..."
11343
+ });
11344
+ }
11345
+ }), _el$7);
11346
+ insert(_el$, createComponent2(Show, {
11347
+ get when() {
11348
+ return error();
11349
+ },
11350
+ get children() {
11351
+ var _el$2 = createElement("box"), _el$3 = createElement("text"), _el$4 = createTextNode(`Error: `), _el$5 = createElement("text");
11352
+ insertNode(_el$2, _el$3);
11353
+ insertNode(_el$2, _el$5);
11354
+ setProp(_el$2, "flexDirection", "column");
11355
+ insertNode(_el$3, _el$4);
11356
+ setProp(_el$3, "fg", "#ff5555");
11357
+ insert(_el$3, error, null);
11358
+ insertNode(_el$5, createTextNode(`Press r to retry`));
11359
+ effect((_$p) => setProp(_el$5, "fg", terminalColors.textMuted, _$p));
11360
+ return _el$2;
11361
+ }
11362
+ }), _el$7);
11363
+ insert(_el$, createComponent2(Show, {
11364
+ get when() {
11365
+ return memo2(() => !!!loading())() && !error();
11366
+ },
11367
+ get children() {
11368
+ return [createComponent2(Show, {
11369
+ get when() {
11370
+ return events().length === 0;
11371
+ },
11372
+ get children() {
11373
+ return createComponent2(EmptyState, {
11374
+ title: "No timeline events",
11375
+ description: "Events appear as you execute skills and make commits"
11376
+ });
11377
+ }
11378
+ }), createComponent2(Show, {
11379
+ get when() {
11380
+ return events().length > 0;
11381
+ },
11382
+ get children() {
11383
+ return createComponent2(For, {
11384
+ get each() {
11385
+ return visibleEvents();
11386
+ },
11387
+ children: (event, idx) => {
11388
+ const absoluteIdx = () => windowStart() + idx();
11389
+ const isSelected = () => absoluteIdx() === selectedIndex();
11390
+ return (() => {
11391
+ var _el$1 = createElement("box"), _el$10 = createElement("box"), _el$11 = createElement("text"), _el$12 = createElement("text"), _el$13 = createElement("text"), _el$14 = createElement("text");
11392
+ insertNode(_el$1, _el$10);
11393
+ setProp(_el$1, "flexDirection", "column");
11394
+ insertNode(_el$10, _el$11);
11395
+ insertNode(_el$10, _el$12);
11396
+ insertNode(_el$10, _el$13);
11397
+ insertNode(_el$10, _el$14);
11398
+ setProp(_el$10, "flexDirection", "row");
11399
+ setProp(_el$10, "gap", 1);
11400
+ insert(_el$11, () => isSelected() ? ">" : " ");
11401
+ setProp(_el$12, "width", 9);
11402
+ insert(_el$12, () => formatTimestamp(event.timestamp));
11403
+ insert(_el$13, () => getTypeIcon(event.type));
11404
+ insert(_el$14, () => event.summary);
11405
+ insert(_el$1, createComponent2(Show, {
11406
+ get when() {
11407
+ return memo2(() => !!isSelected())() && event.source;
11408
+ },
11409
+ get children() {
11410
+ var _el$15 = createElement("text"), _el$16 = createTextNode(` source: `);
11411
+ insertNode(_el$15, _el$16);
11412
+ insert(_el$15, () => event.source, null);
11413
+ effect((_$p) => setProp(_el$15, "fg", terminalColors.textMuted, _$p));
11414
+ return _el$15;
11415
+ }
11416
+ }), null);
11417
+ effect((_p$) => {
11418
+ var _v$ = isSelected() ? terminalColors.accent : terminalColors.textMuted, _v$2 = terminalColors.textMuted, _v$3 = getTypeColor(event.type), _v$4 = isSelected() ? terminalColors.text : terminalColors.textMuted;
11419
+ _v$ !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$, _p$.e));
11420
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$2, _p$.t));
11421
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$13, "fg", _v$3, _p$.a));
11422
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$14, "fg", _v$4, _p$.o));
11423
+ return _p$;
11424
+ }, {
11425
+ e: void 0,
11426
+ t: void 0,
11427
+ a: void 0,
11428
+ o: void 0
11429
+ });
11430
+ return _el$1;
11431
+ })();
11432
+ }
11433
+ });
11434
+ }
11435
+ })];
11436
+ }
11437
+ }), _el$7);
11438
+ insertNode(_el$7, createTextNode(` `));
11439
+ insertNode(_el$9, createTextNode(`j/k navigate r refresh esc back`));
11440
+ effect((_$p) => setProp(_el$9, "fg", terminalColors.textMuted, _$p));
11441
+ return _el$;
11442
+ })();
11443
+ }
11444
+
11445
+ // src/screens/Lineage.tsx
11446
+ import { execFile as execFile3 } from "child_process";
11447
+ function formatDuration(ms) {
11448
+ const seconds = Math.floor(ms / 1e3);
11449
+ const minutes = Math.floor(seconds / 60);
11450
+ if (minutes > 0) return `${minutes}m`;
11451
+ return `${seconds}s`;
11452
+ }
11453
+ function Lineage(props) {
11454
+ const [loading, setLoading] = createSignal(true);
11455
+ const [result, setResult] = createSignal(null);
11456
+ const [error, setError] = createSignal(null);
11457
+ const [selectedIndex, setSelectedIndex] = createSignal(0);
11458
+ const [viewMode, setViewMode] = createSignal("skills");
11459
+ const rows = () => props.rows ?? 24;
11460
+ const visibleCount = () => Math.max(1, rows() - 14);
11461
+ const loadLineage = () => {
11462
+ setLoading(true);
11463
+ setError(null);
11464
+ try {
11465
+ execFile3("npx", ["skillkit", "lineage", "--json"], {
11466
+ timeout: 15e3,
11467
+ maxBuffer: 1024 * 1024
11468
+ }, (err, stdout, stderr) => {
11469
+ setLoading(false);
11470
+ if (err && !stdout) {
11471
+ setError(stderr || err.message || "Failed to load lineage");
11472
+ return;
11473
+ }
11474
+ try {
11475
+ const parsed = JSON.parse(stdout);
11476
+ setResult(parsed);
11477
+ } catch {
11478
+ setError("Failed to parse lineage data");
11479
+ }
11480
+ });
11481
+ } catch (err) {
11482
+ setLoading(false);
11483
+ setError(err instanceof Error ? err.message : "Failed to load lineage");
11278
11484
  }
11485
+ };
11486
+ createEffect(() => {
11487
+ loadLineage();
11279
11488
  });
11280
- const screenProps = () => ({
11281
- onNavigate: handleNavigate,
11282
- cols: Math.max(1, cols() - sidebarWidth() - 2),
11283
- rows: Math.max(1, contentHeight() - 1)
11489
+ const items = createMemo(() => {
11490
+ if (viewMode() === "skills") return result()?.skills ?? [];
11491
+ return result()?.files ?? [];
11284
11492
  });
11285
- return createComponent2(Show, {
11286
- get when() {
11287
- return !showSplash();
11288
- },
11289
- get fallback() {
11290
- return createComponent2(Splash, {
11291
- onComplete: handleSplashComplete,
11292
- duration: 3e3
11293
- });
11294
- },
11295
- get children() {
11296
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("box");
11297
- insertNode(_el$, _el$2);
11298
- setProp(_el$, "flexDirection", "column");
11299
- insertNode(_el$2, _el$3);
11300
- setProp(_el$2, "flexDirection", "row");
11301
- insert(_el$2, createComponent2(Show, {
11302
- get when() {
11303
- return sidebarVisible();
11304
- },
11305
- get children() {
11306
- return createComponent2(Sidebar, {
11307
- get screen() {
11308
- return currentScreen();
11309
- },
11310
- onNavigate: handleNavigate
11311
- });
11312
- }
11313
- }), _el$3);
11314
- setProp(_el$3, "flexDirection", "column");
11315
- setProp(_el$3, "flexGrow", 1);
11316
- setProp(_el$3, "paddingX", 1);
11317
- insert(_el$3, createComponent2(Switch, {
11318
- get fallback() {
11319
- return createComponent2(Home, mergeProps3(screenProps));
11493
+ const windowStart = createMemo(() => Math.max(0, selectedIndex() - visibleCount() + 1));
11494
+ const visibleItems = createMemo(() => items().slice(windowStart(), windowStart() + visibleCount()));
11495
+ useKeyboard((key) => {
11496
+ if (key.name === "k" || key.name === "up") {
11497
+ setSelectedIndex((i) => Math.max(0, i - 1));
11498
+ } else if (key.name === "j" || key.name === "down") {
11499
+ setSelectedIndex((i) => items().length > 0 ? Math.min(items().length - 1, i + 1) : 0);
11500
+ } else if (key.name === "tab") {
11501
+ setViewMode((m) => m === "skills" ? "files" : "skills");
11502
+ setSelectedIndex(0);
11503
+ } else if (key.name === "r") {
11504
+ loadLineage();
11505
+ } else if (key.name === "escape") {
11506
+ props.onNavigate("home");
11507
+ }
11508
+ });
11509
+ return (() => {
11510
+ var _el$ = createElement("box"), _el$30 = createElement("text"), _el$32 = createElement("text");
11511
+ insertNode(_el$, _el$30);
11512
+ insertNode(_el$, _el$32);
11513
+ setProp(_el$, "flexDirection", "column");
11514
+ setProp(_el$, "padding", 1);
11515
+ insert(_el$, createComponent2(Header, {
11516
+ title: "Lineage",
11517
+ subtitle: "skill impact graph",
11518
+ icon: "\u25C9"
11519
+ }), _el$30);
11520
+ insert(_el$, createComponent2(Show, {
11521
+ get when() {
11522
+ return loading();
11523
+ },
11524
+ get children() {
11525
+ return createComponent2(Spinner, {
11526
+ label: "Loading lineage..."
11527
+ });
11528
+ }
11529
+ }), _el$30);
11530
+ insert(_el$, createComponent2(Show, {
11531
+ get when() {
11532
+ return error();
11533
+ },
11534
+ get children() {
11535
+ var _el$2 = createElement("box"), _el$3 = createElement("text"), _el$4 = createTextNode(`Error: `), _el$5 = createElement("text");
11536
+ insertNode(_el$2, _el$3);
11537
+ insertNode(_el$2, _el$5);
11538
+ setProp(_el$2, "flexDirection", "column");
11539
+ insertNode(_el$3, _el$4);
11540
+ setProp(_el$3, "fg", "#ff5555");
11541
+ insert(_el$3, error, null);
11542
+ insertNode(_el$5, createTextNode(`Press r to retry`));
11543
+ effect((_$p) => setProp(_el$5, "fg", terminalColors.textMuted, _$p));
11544
+ return _el$2;
11545
+ }
11546
+ }), _el$30);
11547
+ insert(_el$, createComponent2(Show, {
11548
+ get when() {
11549
+ return memo2(() => !!(!loading() && !error()))() && result();
11550
+ },
11551
+ get children() {
11552
+ return [(() => {
11553
+ var _el$7 = createElement("box"), _el$8 = createElement("text"), _el$9 = createTextNode(` executions`), _el$0 = createElement("text"), _el$10 = createElement("text"), _el$11 = createTextNode(` commits`), _el$12 = createElement("text"), _el$14 = createElement("text"), _el$15 = createTextNode(` files`);
11554
+ insertNode(_el$7, _el$8);
11555
+ insertNode(_el$7, _el$0);
11556
+ insertNode(_el$7, _el$10);
11557
+ insertNode(_el$7, _el$12);
11558
+ insertNode(_el$7, _el$14);
11559
+ setProp(_el$7, "flexDirection", "row");
11560
+ setProp(_el$7, "gap", 2);
11561
+ setProp(_el$7, "marginBottom", 1);
11562
+ insertNode(_el$8, _el$9);
11563
+ insert(_el$8, () => result().stats.totalSkillExecutions, _el$9);
11564
+ insertNode(_el$0, createTextNode(`|`));
11565
+ insertNode(_el$10, _el$11);
11566
+ insert(_el$10, () => result().stats.totalCommits, _el$11);
11567
+ insertNode(_el$12, createTextNode(`|`));
11568
+ insertNode(_el$14, _el$15);
11569
+ insert(_el$14, () => result().stats.totalFilesChanged, _el$15);
11570
+ insert(_el$7, createComponent2(Show, {
11571
+ get when() {
11572
+ return result().stats.mostImpactfulSkill;
11573
+ },
11574
+ get children() {
11575
+ return [(() => {
11576
+ var _el$16 = createElement("text");
11577
+ insertNode(_el$16, createTextNode(`|`));
11578
+ effect((_$p) => setProp(_el$16, "fg", terminalColors.textMuted, _$p));
11579
+ return _el$16;
11580
+ })(), (() => {
11581
+ var _el$18 = createElement("text"), _el$19 = createTextNode(`top: `);
11582
+ insertNode(_el$18, _el$19);
11583
+ setProp(_el$18, "fg", "#22cc44");
11584
+ insert(_el$18, () => result().stats.mostImpactfulSkill, null);
11585
+ return _el$18;
11586
+ })()];
11587
+ }
11588
+ }), null);
11589
+ effect((_p$) => {
11590
+ var _v$ = terminalColors.text, _v$2 = terminalColors.textMuted, _v$3 = terminalColors.text, _v$4 = terminalColors.textMuted, _v$5 = terminalColors.text;
11591
+ _v$ !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$, _p$.e));
11592
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$0, "fg", _v$2, _p$.t));
11593
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$3, _p$.a));
11594
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$12, "fg", _v$4, _p$.o));
11595
+ _v$5 !== _p$.i && (_p$.i = setProp(_el$14, "fg", _v$5, _p$.i));
11596
+ return _p$;
11597
+ }, {
11598
+ e: void 0,
11599
+ t: void 0,
11600
+ a: void 0,
11601
+ o: void 0,
11602
+ i: void 0
11603
+ });
11604
+ return _el$7;
11605
+ })(), (() => {
11606
+ var _el$20 = createElement("box"), _el$21 = createElement("text"), _el$22 = createTextNode(`Skills (`), _el$23 = createTextNode(`)`), _el$24 = createElement("text"), _el$25 = createTextNode(`Files (`), _el$26 = createTextNode(`)`), _el$27 = createElement("text");
11607
+ insertNode(_el$20, _el$21);
11608
+ insertNode(_el$20, _el$24);
11609
+ insertNode(_el$20, _el$27);
11610
+ setProp(_el$20, "flexDirection", "row");
11611
+ setProp(_el$20, "gap", 2);
11612
+ setProp(_el$20, "marginBottom", 1);
11613
+ insertNode(_el$21, _el$22);
11614
+ insertNode(_el$21, _el$23);
11615
+ insert(_el$21, () => result()?.skills?.length ?? 0, _el$23);
11616
+ insertNode(_el$24, _el$25);
11617
+ insertNode(_el$24, _el$26);
11618
+ insert(_el$24, () => result()?.files?.length ?? 0, _el$26);
11619
+ insertNode(_el$27, createTextNode(`(Tab to switch)`));
11620
+ effect((_p$) => {
11621
+ var _v$6 = viewMode() === "skills" ? terminalColors.accent : terminalColors.textMuted, _v$7 = viewMode() === "skills", _v$8 = viewMode() === "files" ? terminalColors.accent : terminalColors.textMuted, _v$9 = viewMode() === "files", _v$0 = terminalColors.textMuted;
11622
+ _v$6 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$6, _p$.e));
11623
+ _v$7 !== _p$.t && (_p$.t = setProp(_el$21, "bold", _v$7, _p$.t));
11624
+ _v$8 !== _p$.a && (_p$.a = setProp(_el$24, "fg", _v$8, _p$.a));
11625
+ _v$9 !== _p$.o && (_p$.o = setProp(_el$24, "bold", _v$9, _p$.o));
11626
+ _v$0 !== _p$.i && (_p$.i = setProp(_el$27, "fg", _v$0, _p$.i));
11627
+ return _p$;
11628
+ }, {
11629
+ e: void 0,
11630
+ t: void 0,
11631
+ a: void 0,
11632
+ o: void 0,
11633
+ i: void 0
11634
+ });
11635
+ return _el$20;
11636
+ })(), (() => {
11637
+ var _el$29 = createElement("text");
11638
+ insert(_el$29, () => "\u2500".repeat(Math.min(60, (props.cols ?? 80) - 4)));
11639
+ effect((_$p) => setProp(_el$29, "fg", terminalColors.textMuted, _$p));
11640
+ return _el$29;
11641
+ })(), createComponent2(Show, {
11642
+ get when() {
11643
+ return items().length === 0;
11644
+ },
11645
+ get children() {
11646
+ return createComponent2(EmptyState, {
11647
+ get title() {
11648
+ return viewMode() === "skills" ? "No skill lineage data" : "No file lineage data";
11649
+ },
11650
+ description: "Execute skills to build lineage history"
11651
+ });
11652
+ }
11653
+ }), createComponent2(Show, {
11654
+ get when() {
11655
+ return items().length > 0;
11656
+ },
11657
+ get children() {
11658
+ return createComponent2(For, {
11659
+ get each() {
11660
+ return visibleItems();
11661
+ },
11662
+ children: (item, idx) => {
11663
+ const absoluteIdx = () => windowStart() + idx();
11664
+ const isSelected = () => absoluteIdx() === selectedIndex();
11665
+ return (() => {
11666
+ var _el$34 = createElement("box");
11667
+ setProp(_el$34, "flexDirection", "column");
11668
+ insert(_el$34, createComponent2(Show, {
11669
+ get when() {
11670
+ return viewMode() === "skills";
11671
+ },
11672
+ get children() {
11673
+ return (() => {
11674
+ const skill = item;
11675
+ return (() => {
11676
+ var _el$35 = createElement("box"), _el$36 = createElement("text"), _el$37 = createElement("text"), _el$38 = createElement("text"), _el$39 = createTextNode(`x`), _el$40 = createElement("text"), _el$41 = createElement("text"), _el$42 = createTextNode(` commits`), _el$43 = createElement("text"), _el$44 = createTextNode(` files`);
11677
+ insertNode(_el$35, _el$36);
11678
+ insertNode(_el$35, _el$37);
11679
+ insertNode(_el$35, _el$38);
11680
+ insertNode(_el$35, _el$40);
11681
+ insertNode(_el$35, _el$41);
11682
+ insertNode(_el$35, _el$43);
11683
+ setProp(_el$35, "flexDirection", "row");
11684
+ setProp(_el$35, "gap", 1);
11685
+ insert(_el$36, () => isSelected() ? ">" : " ");
11686
+ setProp(_el$37, "width", 24);
11687
+ insert(_el$37, () => skill.skillName);
11688
+ insertNode(_el$38, _el$39);
11689
+ setProp(_el$38, "width", 8);
11690
+ insert(_el$38, () => skill.executions, _el$39);
11691
+ setProp(_el$40, "width", 8);
11692
+ insert(_el$40, () => formatDuration(skill.totalDurationMs));
11693
+ insertNode(_el$41, _el$42);
11694
+ setProp(_el$41, "fg", "#fbbf24");
11695
+ setProp(_el$41, "width", 8);
11696
+ insert(_el$41, () => skill.commits.length, _el$42);
11697
+ insertNode(_el$43, _el$44);
11698
+ insert(_el$43, () => skill.filesModified.length, _el$44);
11699
+ effect((_p$) => {
11700
+ var _v$1 = isSelected() ? terminalColors.accent : terminalColors.textMuted, _v$10 = isSelected() ? terminalColors.text : terminalColors.textMuted, _v$11 = terminalColors.textMuted, _v$12 = terminalColors.textMuted, _v$13 = terminalColors.textMuted;
11701
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$1, _p$.e));
11702
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$37, "fg", _v$10, _p$.t));
11703
+ _v$11 !== _p$.a && (_p$.a = setProp(_el$38, "fg", _v$11, _p$.a));
11704
+ _v$12 !== _p$.o && (_p$.o = setProp(_el$40, "fg", _v$12, _p$.o));
11705
+ _v$13 !== _p$.i && (_p$.i = setProp(_el$43, "fg", _v$13, _p$.i));
11706
+ return _p$;
11707
+ }, {
11708
+ e: void 0,
11709
+ t: void 0,
11710
+ a: void 0,
11711
+ o: void 0,
11712
+ i: void 0
11713
+ });
11714
+ return _el$35;
11715
+ })();
11716
+ })();
11717
+ }
11718
+ }), null);
11719
+ insert(_el$34, createComponent2(Show, {
11720
+ get when() {
11721
+ return viewMode() === "files";
11722
+ },
11723
+ get children() {
11724
+ return (() => {
11725
+ const file = item;
11726
+ return (() => {
11727
+ var _el$45 = createElement("box"), _el$46 = createElement("text"), _el$47 = createElement("text"), _el$48 = createElement("text"), _el$49 = createTextNode(` commits`), _el$50 = createElement("text");
11728
+ insertNode(_el$45, _el$46);
11729
+ insertNode(_el$45, _el$47);
11730
+ insertNode(_el$45, _el$48);
11731
+ insertNode(_el$45, _el$50);
11732
+ setProp(_el$45, "flexDirection", "row");
11733
+ setProp(_el$45, "gap", 1);
11734
+ insert(_el$46, () => isSelected() ? ">" : " ");
11735
+ setProp(_el$47, "width", 36);
11736
+ insert(_el$47, () => file.path);
11737
+ insertNode(_el$48, _el$49);
11738
+ setProp(_el$48, "fg", "#fbbf24");
11739
+ setProp(_el$48, "width", 10);
11740
+ insert(_el$48, () => file.commitCount, _el$49);
11741
+ insert(_el$50, () => file.skills.join(", "));
11742
+ effect((_p$) => {
11743
+ var _v$14 = isSelected() ? terminalColors.accent : terminalColors.textMuted, _v$15 = isSelected() ? terminalColors.text : terminalColors.textMuted, _v$16 = terminalColors.textMuted;
11744
+ _v$14 !== _p$.e && (_p$.e = setProp(_el$46, "fg", _v$14, _p$.e));
11745
+ _v$15 !== _p$.t && (_p$.t = setProp(_el$47, "fg", _v$15, _p$.t));
11746
+ _v$16 !== _p$.a && (_p$.a = setProp(_el$50, "fg", _v$16, _p$.a));
11747
+ return _p$;
11748
+ }, {
11749
+ e: void 0,
11750
+ t: void 0,
11751
+ a: void 0
11752
+ });
11753
+ return _el$45;
11754
+ })();
11755
+ })();
11756
+ }
11757
+ }), null);
11758
+ return _el$34;
11759
+ })();
11760
+ }
11761
+ });
11762
+ }
11763
+ })];
11764
+ }
11765
+ }), _el$30);
11766
+ insertNode(_el$30, createTextNode(` `));
11767
+ insertNode(_el$32, createTextNode(`j/k navigate Tab switch view r refresh esc back`));
11768
+ effect((_$p) => setProp(_el$32, "fg", terminalColors.textMuted, _$p));
11769
+ return _el$;
11770
+ })();
11771
+ }
11772
+
11773
+ // src/screens/Handoff.tsx
11774
+ import { execFile as execFile4 } from "child_process";
11775
+ function changeTypeLabel(changeType) {
11776
+ switch (changeType) {
11777
+ case "modified":
11778
+ return "M";
11779
+ case "created":
11780
+ return "A";
11781
+ default:
11782
+ return "D";
11783
+ }
11784
+ }
11785
+ function Handoff(props) {
11786
+ const [loading, setLoading] = createSignal(true);
11787
+ const [result, setResult] = createSignal(null);
11788
+ const [error, setError] = createSignal(null);
11789
+ const [section, setSection] = createSignal("accomplished");
11790
+ const loadHandoff = () => {
11791
+ setLoading(true);
11792
+ setError(null);
11793
+ try {
11794
+ execFile4("npx", ["skillkit", "session", "handoff", "--json"], {
11795
+ timeout: 15e3,
11796
+ maxBuffer: 1024 * 1024
11797
+ }, (err, stdout, stderr) => {
11798
+ setLoading(false);
11799
+ if (err && !stdout) {
11800
+ setError(stderr || err.message || "Failed to generate handoff");
11801
+ return;
11802
+ }
11803
+ try {
11804
+ const parsed = JSON.parse(stdout);
11805
+ setResult(parsed);
11806
+ } catch {
11807
+ setError("Failed to parse handoff data");
11808
+ }
11809
+ });
11810
+ } catch (err) {
11811
+ setLoading(false);
11812
+ setError(err instanceof Error ? err.message : "Failed to generate handoff");
11813
+ }
11814
+ };
11815
+ createEffect(() => {
11816
+ loadHandoff();
11817
+ });
11818
+ const sections = ["accomplished", "pending", "files", "recommendations"];
11819
+ useKeyboard((key) => {
11820
+ if (key.name === "tab") {
11821
+ const idx = sections.indexOf(section());
11822
+ setSection(sections[(idx + 1) % sections.length]);
11823
+ } else if (key.name === "r") {
11824
+ loadHandoff();
11825
+ } else if (key.name === "escape") {
11826
+ props.onNavigate("home");
11827
+ }
11828
+ });
11829
+ return (() => {
11830
+ var _el$ = createElement("box"), _el$36 = createElement("text"), _el$38 = createElement("text");
11831
+ insertNode(_el$, _el$36);
11832
+ insertNode(_el$, _el$38);
11833
+ setProp(_el$, "flexDirection", "column");
11834
+ setProp(_el$, "padding", 1);
11835
+ insert(_el$, createComponent2(Header, {
11836
+ title: "Handoff",
11837
+ subtitle: "agent-to-agent context transfer",
11838
+ icon: "\u21C4"
11839
+ }), _el$36);
11840
+ insert(_el$, createComponent2(Show, {
11841
+ get when() {
11842
+ return loading();
11843
+ },
11844
+ get children() {
11845
+ return createComponent2(Spinner, {
11846
+ label: "Generating handoff document..."
11847
+ });
11848
+ }
11849
+ }), _el$36);
11850
+ insert(_el$, createComponent2(Show, {
11851
+ get when() {
11852
+ return error();
11853
+ },
11854
+ get children() {
11855
+ var _el$2 = createElement("box"), _el$3 = createElement("text"), _el$4 = createTextNode(`Error: `), _el$5 = createElement("text");
11856
+ insertNode(_el$2, _el$3);
11857
+ insertNode(_el$2, _el$5);
11858
+ setProp(_el$2, "flexDirection", "column");
11859
+ insertNode(_el$3, _el$4);
11860
+ setProp(_el$3, "fg", "#ff5555");
11861
+ insert(_el$3, error, null);
11862
+ insertNode(_el$5, createTextNode(`Press r to retry`));
11863
+ effect((_$p) => setProp(_el$5, "fg", terminalColors.textMuted, _$p));
11864
+ return _el$2;
11865
+ }
11866
+ }), _el$36);
11867
+ insert(_el$, createComponent2(Show, {
11868
+ get when() {
11869
+ return memo2(() => !!(!loading() && !error()))() && result();
11870
+ },
11871
+ get children() {
11872
+ return [(() => {
11873
+ var _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("text"), _el$1 = createElement("text"), _el$11 = createElement("text");
11874
+ insertNode(_el$7, _el$8);
11875
+ insertNode(_el$7, _el$0);
11876
+ insertNode(_el$7, _el$1);
11877
+ insertNode(_el$7, _el$11);
11878
+ setProp(_el$7, "flexDirection", "row");
11879
+ setProp(_el$7, "gap", 1);
11880
+ setProp(_el$7, "marginBottom", 1);
11881
+ insertNode(_el$8, createTextNode(`from:`));
11882
+ insert(_el$0, () => result().fromAgent);
11883
+ insertNode(_el$1, createTextNode(`|`));
11884
+ insert(_el$11, () => result().generatedAt);
11885
+ effect((_p$) => {
11886
+ var _v$ = terminalColors.textMuted, _v$2 = terminalColors.text, _v$3 = terminalColors.textMuted, _v$4 = terminalColors.textMuted;
11887
+ _v$ !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$, _p$.e));
11888
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$0, "fg", _v$2, _p$.t));
11889
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$1, "fg", _v$3, _p$.a));
11890
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$11, "fg", _v$4, _p$.o));
11891
+ return _p$;
11892
+ }, {
11893
+ e: void 0,
11894
+ t: void 0,
11895
+ a: void 0,
11896
+ o: void 0
11897
+ });
11898
+ return _el$7;
11899
+ })(), (() => {
11900
+ var _el$12 = createElement("box"), _el$13 = createElement("text");
11901
+ insertNode(_el$12, _el$13);
11902
+ setProp(_el$12, "flexDirection", "row");
11903
+ setProp(_el$12, "gap", 2);
11904
+ setProp(_el$12, "marginBottom", 1);
11905
+ insert(_el$12, createComponent2(For, {
11906
+ each: sections,
11907
+ children: (s) => (() => {
11908
+ var _el$40 = createElement("text");
11909
+ insert(_el$40, () => s.charAt(0).toUpperCase() + s.slice(1));
11910
+ effect((_p$) => {
11911
+ var _v$5 = section() === s ? terminalColors.accent : terminalColors.textMuted, _v$6 = section() === s;
11912
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$40, "fg", _v$5, _p$.e));
11913
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$40, "bold", _v$6, _p$.t));
11914
+ return _p$;
11915
+ }, {
11916
+ e: void 0,
11917
+ t: void 0
11918
+ });
11919
+ return _el$40;
11920
+ })()
11921
+ }), _el$13);
11922
+ insertNode(_el$13, createTextNode(`(Tab to switch)`));
11923
+ effect((_$p) => setProp(_el$13, "fg", terminalColors.textMuted, _$p));
11924
+ return _el$12;
11925
+ })(), (() => {
11926
+ var _el$15 = createElement("text");
11927
+ insert(_el$15, () => "\u2500".repeat(Math.min(60, (props.cols ?? 80) - 4)));
11928
+ effect((_$p) => setProp(_el$15, "fg", terminalColors.textMuted, _$p));
11929
+ return _el$15;
11930
+ })(), createComponent2(Show, {
11931
+ get when() {
11932
+ return section() === "accomplished";
11933
+ },
11934
+ get children() {
11935
+ return [(() => {
11936
+ var _el$16 = createElement("text");
11937
+ insertNode(_el$16, createTextNode(`Accomplished Tasks`));
11938
+ setProp(_el$16, "bold", true);
11939
+ effect((_$p) => setProp(_el$16, "fg", terminalColors.text, _$p));
11940
+ return _el$16;
11941
+ })(), (() => {
11942
+ var _el$18 = createElement("text");
11943
+ insertNode(_el$18, createTextNode(` `));
11944
+ return _el$18;
11945
+ })(), createComponent2(Show, {
11946
+ get when() {
11947
+ return result().accomplished.tasks.length === 0;
11948
+ },
11949
+ get children() {
11950
+ return createComponent2(EmptyState, {
11951
+ title: "No accomplished tasks in this session"
11952
+ });
11953
+ }
11954
+ }), createComponent2(For, {
11955
+ get each() {
11956
+ return result().accomplished.tasks;
11957
+ },
11958
+ children: (task) => (() => {
11959
+ var _el$41 = createElement("box"), _el$42 = createElement("text"), _el$44 = createElement("text");
11960
+ insertNode(_el$41, _el$42);
11961
+ insertNode(_el$41, _el$44);
11962
+ setProp(_el$41, "flexDirection", "row");
11963
+ setProp(_el$41, "gap", 1);
11964
+ insertNode(_el$42, createTextNode(`\u2713`));
11965
+ setProp(_el$42, "fg", "#22cc44");
11966
+ insert(_el$44, () => task.name);
11967
+ insert(_el$41, createComponent2(Show, {
11968
+ get when() {
11969
+ return task.duration;
11970
+ },
11971
+ get children() {
11972
+ var _el$45 = createElement("text"), _el$46 = createTextNode(`(`), _el$47 = createTextNode(`)`);
11973
+ insertNode(_el$45, _el$46);
11974
+ insertNode(_el$45, _el$47);
11975
+ insert(_el$45, () => task.duration, _el$47);
11976
+ effect((_$p) => setProp(_el$45, "fg", terminalColors.textMuted, _$p));
11977
+ return _el$45;
11978
+ }
11979
+ }), null);
11980
+ effect((_$p) => setProp(_el$44, "fg", terminalColors.text, _$p));
11981
+ return _el$41;
11982
+ })()
11983
+ }), createComponent2(Show, {
11984
+ get when() {
11985
+ return result().accomplished.commits.length > 0;
11986
+ },
11987
+ get children() {
11988
+ return [(() => {
11989
+ var _el$20 = createElement("text");
11990
+ insertNode(_el$20, createTextNode(` `));
11991
+ return _el$20;
11992
+ })(), (() => {
11993
+ var _el$22 = createElement("text");
11994
+ insertNode(_el$22, createTextNode(`Commits`));
11995
+ setProp(_el$22, "bold", true);
11996
+ effect((_$p) => setProp(_el$22, "fg", terminalColors.text, _$p));
11997
+ return _el$22;
11998
+ })(), createComponent2(For, {
11999
+ get each() {
12000
+ return result().accomplished.commits;
12001
+ },
12002
+ children: (commit) => (() => {
12003
+ var _el$48 = createElement("box"), _el$49 = createElement("text"), _el$51 = createElement("text"), _el$52 = createElement("text");
12004
+ insertNode(_el$48, _el$49);
12005
+ insertNode(_el$48, _el$51);
12006
+ insertNode(_el$48, _el$52);
12007
+ setProp(_el$48, "flexDirection", "row");
12008
+ setProp(_el$48, "gap", 1);
12009
+ insertNode(_el$49, createTextNode(`\u25CF`));
12010
+ setProp(_el$49, "fg", "#fbbf24");
12011
+ insert(_el$51, () => commit.sha.slice(0, 7));
12012
+ insert(_el$52, () => commit.message);
12013
+ effect((_p$) => {
12014
+ var _v$7 = terminalColors.textMuted, _v$8 = terminalColors.text;
12015
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$51, "fg", _v$7, _p$.e));
12016
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$52, "fg", _v$8, _p$.t));
12017
+ return _p$;
12018
+ }, {
12019
+ e: void 0,
12020
+ t: void 0
12021
+ });
12022
+ return _el$48;
12023
+ })()
12024
+ })];
12025
+ }
12026
+ })];
12027
+ }
12028
+ }), createComponent2(Show, {
12029
+ get when() {
12030
+ return section() === "pending";
12031
+ },
12032
+ get children() {
12033
+ return [(() => {
12034
+ var _el$24 = createElement("text");
12035
+ insertNode(_el$24, createTextNode(`Pending Tasks`));
12036
+ setProp(_el$24, "bold", true);
12037
+ effect((_$p) => setProp(_el$24, "fg", terminalColors.text, _$p));
12038
+ return _el$24;
12039
+ })(), (() => {
12040
+ var _el$26 = createElement("text");
12041
+ insertNode(_el$26, createTextNode(` `));
12042
+ return _el$26;
12043
+ })(), createComponent2(Show, {
12044
+ get when() {
12045
+ return result().pending.tasks.length === 0;
12046
+ },
12047
+ get children() {
12048
+ return createComponent2(EmptyState, {
12049
+ title: "No pending tasks"
12050
+ });
12051
+ }
12052
+ }), createComponent2(For, {
12053
+ get each() {
12054
+ return result().pending.tasks;
12055
+ },
12056
+ children: (task) => (() => {
12057
+ var _el$53 = createElement("box"), _el$54 = createElement("text"), _el$56 = createElement("text");
12058
+ insertNode(_el$53, _el$54);
12059
+ insertNode(_el$53, _el$56);
12060
+ setProp(_el$53, "flexDirection", "row");
12061
+ setProp(_el$53, "gap", 1);
12062
+ insertNode(_el$54, createTextNode(`\u25CB`));
12063
+ setProp(_el$54, "fg", "#ffaa00");
12064
+ insert(_el$56, () => task.name);
12065
+ effect((_$p) => setProp(_el$56, "fg", terminalColors.text, _$p));
12066
+ return _el$53;
12067
+ })()
12068
+ })];
12069
+ }
12070
+ }), createComponent2(Show, {
12071
+ get when() {
12072
+ return section() === "files";
12073
+ },
12074
+ get children() {
12075
+ return [(() => {
12076
+ var _el$28 = createElement("text");
12077
+ insertNode(_el$28, createTextNode(`Key Files`));
12078
+ setProp(_el$28, "bold", true);
12079
+ effect((_$p) => setProp(_el$28, "fg", terminalColors.text, _$p));
12080
+ return _el$28;
12081
+ })(), (() => {
12082
+ var _el$30 = createElement("text");
12083
+ insertNode(_el$30, createTextNode(` `));
12084
+ return _el$30;
12085
+ })(), createComponent2(Show, {
12086
+ get when() {
12087
+ return result().keyFiles.length === 0;
12088
+ },
12089
+ get children() {
12090
+ return createComponent2(EmptyState, {
12091
+ title: "No key files tracked"
12092
+ });
12093
+ }
12094
+ }), createComponent2(For, {
12095
+ get each() {
12096
+ return result().keyFiles;
12097
+ },
12098
+ children: (file) => (() => {
12099
+ var _el$57 = createElement("box"), _el$58 = createElement("text"), _el$59 = createElement("text");
12100
+ insertNode(_el$57, _el$58);
12101
+ insertNode(_el$57, _el$59);
12102
+ setProp(_el$57, "flexDirection", "row");
12103
+ setProp(_el$57, "gap", 1);
12104
+ insert(_el$58, () => changeTypeLabel(file.changeType));
12105
+ insert(_el$59, () => file.path);
12106
+ effect((_p$) => {
12107
+ var _v$9 = terminalColors.textMuted, _v$0 = terminalColors.text;
12108
+ _v$9 !== _p$.e && (_p$.e = setProp(_el$58, "fg", _v$9, _p$.e));
12109
+ _v$0 !== _p$.t && (_p$.t = setProp(_el$59, "fg", _v$0, _p$.t));
12110
+ return _p$;
12111
+ }, {
12112
+ e: void 0,
12113
+ t: void 0
12114
+ });
12115
+ return _el$57;
12116
+ })()
12117
+ })];
12118
+ }
12119
+ }), createComponent2(Show, {
12120
+ get when() {
12121
+ return section() === "recommendations";
12122
+ },
12123
+ get children() {
12124
+ return [(() => {
12125
+ var _el$32 = createElement("text");
12126
+ insertNode(_el$32, createTextNode(`Recommendations`));
12127
+ setProp(_el$32, "bold", true);
12128
+ effect((_$p) => setProp(_el$32, "fg", terminalColors.text, _$p));
12129
+ return _el$32;
12130
+ })(), (() => {
12131
+ var _el$34 = createElement("text");
12132
+ insertNode(_el$34, createTextNode(` `));
12133
+ return _el$34;
12134
+ })(), createComponent2(Show, {
12135
+ get when() {
12136
+ return result().recommendations.length === 0;
12137
+ },
12138
+ get children() {
12139
+ return createComponent2(EmptyState, {
12140
+ title: "No recommendations"
12141
+ });
12142
+ }
12143
+ }), createComponent2(For, {
12144
+ get each() {
12145
+ return result().recommendations;
12146
+ },
12147
+ children: (rec) => (() => {
12148
+ var _el$60 = createElement("box"), _el$61 = createElement("text"), _el$63 = createElement("text");
12149
+ insertNode(_el$60, _el$61);
12150
+ insertNode(_el$60, _el$63);
12151
+ setProp(_el$60, "flexDirection", "row");
12152
+ setProp(_el$60, "gap", 1);
12153
+ insertNode(_el$61, createTextNode(`\u2192`));
12154
+ insert(_el$63, rec);
12155
+ effect((_p$) => {
12156
+ var _v$1 = terminalColors.accent, _v$10 = terminalColors.text;
12157
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$61, "fg", _v$1, _p$.e));
12158
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$63, "fg", _v$10, _p$.t));
12159
+ return _p$;
12160
+ }, {
12161
+ e: void 0,
12162
+ t: void 0
12163
+ });
12164
+ return _el$60;
12165
+ })()
12166
+ })];
12167
+ }
12168
+ })];
12169
+ }
12170
+ }), _el$36);
12171
+ insertNode(_el$36, createTextNode(` `));
12172
+ insertNode(_el$38, createTextNode(`Tab switch section r refresh esc back`));
12173
+ effect((_$p) => setProp(_el$38, "fg", terminalColors.textMuted, _$p));
12174
+ return _el$;
12175
+ })();
12176
+ }
12177
+
12178
+ // src/App.tsx
12179
+ var DOCS_URL = "https://agenstskills.com/docs";
12180
+ function openUrl(url) {
12181
+ if (process.platform === "win32") {
12182
+ execFile5("cmd", ["/c", "start", "", url]);
12183
+ } else {
12184
+ const cmd = process.platform === "darwin" ? "open" : "xdg-open";
12185
+ execFile5(cmd, [url]);
12186
+ }
12187
+ }
12188
+ function App(props) {
12189
+ const [showSplash, setShowSplash] = createSignal(true);
12190
+ const [currentScreen, setCurrentScreen] = createSignal("home");
12191
+ const [showSidebar, setShowSidebar] = createSignal(true);
12192
+ const [dimensions, setDimensions] = createSignal({
12193
+ cols: process.stdout.columns || 80,
12194
+ rows: process.stdout.rows || 24
12195
+ });
12196
+ createEffect(() => {
12197
+ const handleResize = () => {
12198
+ setDimensions({
12199
+ cols: process.stdout.columns || 80,
12200
+ rows: process.stdout.rows || 24
12201
+ });
12202
+ };
12203
+ process.stdout.on("resize", handleResize);
12204
+ onCleanup(() => {
12205
+ process.stdout.off("resize", handleResize);
12206
+ });
12207
+ });
12208
+ const cols = () => dimensions().cols;
12209
+ const rows = () => dimensions().rows;
12210
+ const sidebarVisible = () => showSidebar() && cols() >= 80;
12211
+ const sidebarWidth = () => {
12212
+ if (!sidebarVisible()) return 0;
12213
+ if (cols() >= 100) return 24;
12214
+ return 18;
12215
+ };
12216
+ const statusBarHeight = 2;
12217
+ const contentHeight = () => rows() - statusBarHeight;
12218
+ const handleNavigate = (newScreen) => {
12219
+ setCurrentScreen(newScreen);
12220
+ };
12221
+ const handleSplashComplete = () => {
12222
+ setShowSplash(false);
12223
+ };
12224
+ useKeyboard((key) => {
12225
+ if (showSplash()) {
12226
+ setShowSplash(false);
12227
+ return;
12228
+ }
12229
+ if (key.name === "q" || key.ctrl && key.name === "c") {
12230
+ props.onExit ? props.onExit(0) : process.exit(0);
12231
+ return;
12232
+ }
12233
+ if (key.name === "d") {
12234
+ openUrl(DOCS_URL);
12235
+ return;
12236
+ }
12237
+ if (key.sequence === "\\") {
12238
+ setShowSidebar((v) => !v);
12239
+ return;
12240
+ }
12241
+ const targetScreen = NAV_KEYS[key.name || ""];
12242
+ if (targetScreen) {
12243
+ setCurrentScreen(targetScreen);
12244
+ }
12245
+ if (key.name === "escape" && currentScreen() !== "home") {
12246
+ setCurrentScreen("home");
12247
+ }
12248
+ });
12249
+ const screenProps = () => ({
12250
+ onNavigate: handleNavigate,
12251
+ cols: Math.max(1, cols() - sidebarWidth() - 2),
12252
+ rows: Math.max(1, contentHeight() - 1)
12253
+ });
12254
+ return createComponent2(Show, {
12255
+ get when() {
12256
+ return !showSplash();
12257
+ },
12258
+ get fallback() {
12259
+ return createComponent2(Splash, {
12260
+ onComplete: handleSplashComplete,
12261
+ duration: 3e3
12262
+ });
12263
+ },
12264
+ get children() {
12265
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("box");
12266
+ insertNode(_el$, _el$2);
12267
+ setProp(_el$, "flexDirection", "column");
12268
+ insertNode(_el$2, _el$3);
12269
+ setProp(_el$2, "flexDirection", "row");
12270
+ insert(_el$2, createComponent2(Show, {
12271
+ get when() {
12272
+ return sidebarVisible();
12273
+ },
12274
+ get children() {
12275
+ return createComponent2(Sidebar, {
12276
+ get screen() {
12277
+ return currentScreen();
12278
+ },
12279
+ onNavigate: handleNavigate
12280
+ });
12281
+ }
12282
+ }), _el$3);
12283
+ setProp(_el$3, "flexDirection", "column");
12284
+ setProp(_el$3, "flexGrow", 1);
12285
+ setProp(_el$3, "paddingX", 1);
12286
+ insert(_el$3, createComponent2(Switch, {
12287
+ get fallback() {
12288
+ return createComponent2(Home, mergeProps3(screenProps));
11320
12289
  },
11321
12290
  get children() {
11322
12291
  return [createComponent2(Match, {
@@ -11466,6 +12435,27 @@ function App(props) {
11466
12435
  get children() {
11467
12436
  return createComponent2(Scan, mergeProps3(screenProps));
11468
12437
  }
12438
+ }), createComponent2(Match, {
12439
+ get when() {
12440
+ return currentScreen() === "timeline";
12441
+ },
12442
+ get children() {
12443
+ return createComponent2(Timeline2, mergeProps3(screenProps));
12444
+ }
12445
+ }), createComponent2(Match, {
12446
+ get when() {
12447
+ return currentScreen() === "lineage";
12448
+ },
12449
+ get children() {
12450
+ return createComponent2(Lineage, mergeProps3(screenProps));
12451
+ }
12452
+ }), createComponent2(Match, {
12453
+ get when() {
12454
+ return currentScreen() === "handoff";
12455
+ },
12456
+ get children() {
12457
+ return createComponent2(Handoff, mergeProps3(screenProps));
12458
+ }
11469
12459
  })];
11470
12460
  }
11471
12461
  }));
@@ -11890,7 +12880,10 @@ var SCREEN_LABELS = {
11890
12880
  help: "Help",
11891
12881
  mesh: "Mesh",
11892
12882
  message: "Message",
11893
- scan: "Security Scan"
12883
+ scan: "Security Scan",
12884
+ timeline: "Timeline",
12885
+ lineage: "Lineage",
12886
+ handoff: "Handoff"
11894
12887
  };
11895
12888
  function BottomStatusBar(props) {
11896
12889
  const version = getVersion();
@@ -14130,6 +15123,7 @@ export {
14130
15123
  FeatureList,
14131
15124
  FocusRing,
14132
15125
  FormField,
15126
+ Handoff,
14133
15127
  Header,
14134
15128
  Help,
14135
15129
  HighlightableListItem,
@@ -14141,6 +15135,7 @@ export {
14141
15135
  InlineStatus,
14142
15136
  Installed,
14143
15137
  InteractiveArea,
15138
+ Lineage,
14144
15139
  LoadingState,
14145
15140
  Marketplace,
14146
15141
  Memory,
@@ -14180,6 +15175,7 @@ export {
14180
15175
  Team,
14181
15176
  TextAreaField,
14182
15177
  ThreePaneLayout,
15178
+ Timeline2 as Timeline,
14183
15179
  Translate,
14184
15180
  Try,
14185
15181
  VerticalTabBar,