get-tbd 0.1.10 → 0.1.11

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 (33) hide show
  1. package/README.md +3 -3
  2. package/dist/bin.mjs +259 -98
  3. package/dist/bin.mjs.map +1 -1
  4. package/dist/cli.mjs +259 -98
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/docs/README.md +3 -3
  7. package/dist/docs/SKILL.md +5 -3
  8. package/dist/docs/shortcuts/standard/agent-handoff.md +58 -0
  9. package/dist/docs/shortcuts/standard/commit-code.md +0 -2
  10. package/dist/docs/shortcuts/standard/create-or-update-pr-simple.md +0 -2
  11. package/dist/docs/shortcuts/standard/create-or-update-pr-with-validation-plan.md +0 -2
  12. package/dist/docs/shortcuts/standard/implement-beads.md +0 -2
  13. package/dist/docs/shortcuts/standard/new-architecture-doc.md +0 -2
  14. package/dist/docs/shortcuts/standard/new-guideline.md +0 -2
  15. package/dist/docs/shortcuts/standard/new-plan-spec.md +0 -2
  16. package/dist/docs/shortcuts/standard/new-research-brief.md +0 -2
  17. package/dist/docs/shortcuts/standard/new-shortcut.md +53 -0
  18. package/dist/docs/shortcuts/standard/new-validation-plan.md +0 -2
  19. package/dist/docs/shortcuts/standard/plan-implementation-with-beads.md +25 -0
  20. package/dist/docs/shortcuts/standard/precommit-process.md +0 -2
  21. package/dist/docs/shortcuts/standard/review-code-python.md +0 -2
  22. package/dist/docs/shortcuts/standard/review-code-typescript.md +0 -2
  23. package/dist/docs/shortcuts/standard/welcome-user.md +1 -3
  24. package/dist/docs/shortcuts/system/shortcut-explanation.md +0 -2
  25. package/dist/docs/shortcuts/system/skill-brief.md +4 -2
  26. package/dist/docs/shortcuts/system/skill.md +5 -3
  27. package/dist/docs/skill-brief.md +4 -2
  28. package/dist/index.mjs +1 -1
  29. package/dist/{src-DJY6bekI.mjs → src-DlYKGbJl.mjs} +2 -2
  30. package/dist/{src-DJY6bekI.mjs.map → src-DlYKGbJl.mjs.map} +1 -1
  31. package/dist/tbd +259 -98
  32. package/package.json +1 -1
  33. package/dist/docs/shortcuts/standard/new-implementation-beads-from-spec.md +0 -29
package/README.md CHANGED
@@ -94,7 +94,7 @@ status or context or knowledge and know what to do next:
94
94
  | What you say | What happens | What runs |
95
95
  | --- | --- | --- |
96
96
  | "Let's plan a new feature that …" | Agent creates a spec from a template | `tbd shortcut new-plan-spec` |
97
- | "Break this spec into beads" | Agent creates implementation beads from the spec | `tbd shortcut new-implementation-beads-from-spec` |
97
+ | "Break this spec into beads" | Agent creates implementation beads from the spec | `tbd shortcut plan-implementation-with-beads` |
98
98
  | "Implement these beads" | Agent works through beads systematically | `tbd shortcut implement-beads` |
99
99
  | "Create a bead for the bug where …" | Agent creates and tracks a bead | `tbd create "..." --type=bug` |
100
100
  | "Let's work on current beads" | Agent finds ready beads and starts working | `tbd ready` |
@@ -340,7 +340,7 @@ tbd template --add=<url> --name=<name>
340
340
  | `new-research-brief` | Create a research document |
341
341
  | `new-architecture-doc` | Create an architecture document |
342
342
  | `new-validation-plan` | Create a test/validation plan |
343
- | `new-implementation-beads-from-spec` | Break a spec into implementation beads |
343
+ | `plan-implementation-with-beads` | Break a spec into implementation beads |
344
344
  | `implement-beads` | Implement beads from a spec |
345
345
  | `precommit-process` | Pre-commit review and testing |
346
346
  | `commit-code` | Commit with pre-commit checks |
@@ -386,7 +386,7 @@ For non-trivial features, tbd supports a full spec-driven workflow:
386
386
 
387
387
  1. **Plan**: Create a planning spec (`tbd shortcut new-plan-spec`)
388
388
  2. **Break down**: Convert spec into implementation beads
389
- (`tbd shortcut new-implementation-beads-from-spec`)
389
+ (`tbd shortcut plan-implementation-with-beads`)
390
390
  3. **Implement**: Work through beads systematically (`tbd shortcut implement-beads`)
391
391
  4. **Validate**: Create validation plan, run tests (`tbd shortcut new-validation-plan`)
392
392
  5. **Ship**: Commit, create PR (`tbd shortcut create-or-update-pr-with-validation-plan`)
package/dist/bin.mjs CHANGED
@@ -13576,7 +13576,7 @@ function serializeIssue(issue) {
13576
13576
  * Package version, derived from git at build time.
13577
13577
  * Format: X.Y.Z for releases, X.Y.Z-dev.N.hash for dev builds.
13578
13578
  */
13579
- const VERSION$1 = "0.1.10";
13579
+ const VERSION$1 = "0.1.11";
13580
13580
 
13581
13581
  //#endregion
13582
13582
  //#region src/cli/lib/version.ts
@@ -101514,6 +101514,158 @@ const searchCommand = new Command("search").description("Search issues by text")
101514
101514
  await new SearchHandler(command).run(query, options);
101515
101515
  });
101516
101516
 
101517
+ //#endregion
101518
+ //#region src/cli/lib/sections.ts
101519
+ /**
101520
+ * Render the REPOSITORY section.
101521
+ *
101522
+ * Used by: status, doctor
101523
+ *
101524
+ * Shows:
101525
+ * - tbd version
101526
+ * - Repository path
101527
+ * - Initialization status
101528
+ * - Git repository status and branch
101529
+ * - Git version (with support warning if needed)
101530
+ *
101531
+ * @param data - Repository data to render
101532
+ * @param colors - Color functions
101533
+ * @param options - Rendering options
101534
+ */
101535
+ function renderRepositorySection(data, colors, options) {
101536
+ if (options?.showHeading) console.log(colors.bold(formatHeading("Repository")));
101537
+ console.log(`${colors.bold("tbd")} v${data.version}`);
101538
+ console.log(`Repository: ${data.workingDirectory}`);
101539
+ if (data.initialized) console.log(` ${colors.success(ICONS.SUCCESS)} Initialized (.tbd/)`);
101540
+ else console.log(` ${colors.error(ICONS.ERROR)} Not initialized`);
101541
+ if (data.gitRepository) {
101542
+ const branchInfo = data.gitBranch ? ` (${data.gitBranch})` : "";
101543
+ console.log(` ${colors.success(ICONS.SUCCESS)} Git repository${branchInfo}`);
101544
+ if (data.gitVersion) {
101545
+ const versionIcon = data.gitVersionSupported ? colors.success(ICONS.SUCCESS) : colors.warn(ICONS.WARN);
101546
+ const versionNote = data.gitVersionSupported ? "" : ` ${colors.dim(`(requires ${MIN_GIT_VERSION}+)`)}`;
101547
+ console.log(` ${versionIcon} Git ${data.gitVersion}${versionNote}`);
101548
+ }
101549
+ } else console.log(` ${colors.error(ICONS.ERROR)} Git repository not found`);
101550
+ }
101551
+ /**
101552
+ * Render the CONFIG section (sync branch, remote, prefix).
101553
+ *
101554
+ * Used by: status, doctor
101555
+ *
101556
+ * Shows key-value pairs with dim keys.
101557
+ *
101558
+ * @param data - Config data to render
101559
+ * @param colors - Color functions
101560
+ */
101561
+ function renderConfigSection(data, colors) {
101562
+ if (!data.syncBranch && !data.remote && !data.displayPrefix) return;
101563
+ console.log("");
101564
+ if (data.syncBranch) console.log(`${colors.dim("Sync branch:")} ${data.syncBranch}`);
101565
+ if (data.remote) console.log(`${colors.dim("Remote:")} ${data.remote}`);
101566
+ if (data.displayPrefix) console.log(`${colors.dim("ID prefix:")} ${data.displayPrefix}-`);
101567
+ }
101568
+ /**
101569
+ * Render the INTEGRATIONS section.
101570
+ *
101571
+ * Used by: status, doctor
101572
+ *
101573
+ * Shows diagnostic lines for each integration check.
101574
+ *
101575
+ * @param checks - Array of integration checks
101576
+ * @param colors - Color functions
101577
+ * @returns Whether any integrations are missing (for follow-up suggestions)
101578
+ */
101579
+ function renderIntegrationsSection(checks, colors) {
101580
+ console.log("");
101581
+ console.log(colors.bold(formatHeading("Integrations")));
101582
+ let hasMissing = false;
101583
+ for (const check of checks) {
101584
+ const icon = check.installed ? colors.success(ICONS.SUCCESS) : colors.dim(ICONS.ERROR);
101585
+ const pathDim = colors.dim(`(${check.path})`);
101586
+ console.log(` ${icon} ${check.name} ${pathDim}`);
101587
+ if (!check.installed) hasMissing = true;
101588
+ }
101589
+ return hasMissing;
101590
+ }
101591
+ /**
101592
+ * Render the STATISTICS section.
101593
+ *
101594
+ * Used by: stats, doctor
101595
+ *
101596
+ * Shows aligned statistic block with labels and values.
101597
+ *
101598
+ * @param data - Statistics data to render
101599
+ * @param colors - Color functions
101600
+ * @param options - Rendering options
101601
+ */
101602
+ function renderStatisticsSection(data, colors, options) {
101603
+ if (options?.showHeading !== false) {
101604
+ console.log("");
101605
+ console.log(colors.bold(formatHeading("Statistics")));
101606
+ }
101607
+ const maxLabelLen = Math.max(...[
101608
+ "Ready",
101609
+ "In progress",
101610
+ "Blocked",
101611
+ "Open",
101612
+ "Total"
101613
+ ].map((l) => l.length));
101614
+ const formatLine = (label, value) => {
101615
+ return ` ${label}:${" ".repeat(maxLabelLen - label.length + 1)}${value}`;
101616
+ };
101617
+ console.log(formatLine("Ready", data.ready));
101618
+ console.log(formatLine("In progress", data.inProgress));
101619
+ console.log(formatLine("Blocked", data.blocked));
101620
+ console.log(formatLine("Open", data.open));
101621
+ console.log(formatLine("Total", data.total));
101622
+ }
101623
+ /**
101624
+ * Render a warning block about beads coexistence.
101625
+ *
101626
+ * Used by: status
101627
+ *
101628
+ * @param colors - Color functions
101629
+ */
101630
+ function renderBeadsWarning(colors) {
101631
+ console.log("");
101632
+ console.log(`${colors.warn(ICONS.WARN)} Beads directory detected alongside tbd`);
101633
+ console.log("This may cause confusion for AI agents.");
101634
+ console.log(`Run ${colors.bold("tbd setup beads --disable")} for migration options`);
101635
+ }
101636
+ /**
101637
+ * Render worktree status line.
101638
+ *
101639
+ * Used by: status
101640
+ *
101641
+ * @param path - Worktree path
101642
+ * @param healthy - Whether worktree is healthy
101643
+ * @param colors - Color functions
101644
+ */
101645
+ function renderWorktreeStatus(path, healthy, colors) {
101646
+ console.log("");
101647
+ if (healthy) console.log(`${colors.dim("Worktree:")} ${path} (healthy)`);
101648
+ else {
101649
+ console.log(`${colors.warn("Worktree:")} ${path} (${colors.error("unhealthy")})`);
101650
+ console.log(" Run: tbd doctor --fix");
101651
+ }
101652
+ }
101653
+ /**
101654
+ * Render footer with command suggestions.
101655
+ *
101656
+ * Used by: status, doctor, stats
101657
+ *
101658
+ * @param suggestions - Array of {command, description} pairs
101659
+ * @param colors - Color functions
101660
+ */
101661
+ function renderFooter(suggestions, colors) {
101662
+ console.log("");
101663
+ if (suggestions.length === 0) return;
101664
+ const parts = suggestions.map((s) => `${colors.bold(`'${s.command}'`)} for ${s.description}`);
101665
+ if (parts.length === 1) console.log(`Use ${parts[0]}.`);
101666
+ else console.log(`Use ${parts.join(", ")}.`);
101667
+ }
101668
+
101517
101669
  //#endregion
101518
101670
  //#region src/cli/commands/status.ts
101519
101671
  /**
@@ -101650,82 +101802,72 @@ var StatusHandler = class extends BaseCommand {
101650
101802
  renderText(data) {
101651
101803
  const colors = this.output.getColors();
101652
101804
  if (!data.initialized) {
101653
- console.log(`${colors.warn("Not a tbd repository.")}`);
101654
- console.log("");
101655
- console.log("Detected:");
101656
- if (data.git_repository) {
101657
- const branchInfo = data.git_branch ? ` (${data.git_branch} branch)` : "";
101658
- console.log(` ${colors.success("✓")} Git repository${branchInfo}`);
101659
- if (data.git_version) {
101660
- const versionStatus = data.git_version_supported ? colors.success("✓") : colors.warn("⚠");
101661
- const versionNote = data.git_version_supported ? "" : ` ${colors.dim(`(requires ${MIN_GIT_VERSION}+)`)}`;
101662
- console.log(` ${versionStatus} Git ${data.git_version}${versionNote}`);
101663
- }
101664
- } else console.log(` ${colors.error("✗")} Git repository not found`);
101665
- if (data.beads_detected) {
101666
- const countInfo = data.beads_issue_count !== null ? ` (.beads/ with ${data.beads_issue_count} issues)` : "";
101667
- console.log(` ${colors.success("✓")} Beads repository${countInfo}`);
101668
- } else console.log(` ${colors.dim("✗")} Beads not detected`);
101669
- console.log(` ${colors.error("✗")} tbd not initialized`);
101670
- console.log("");
101671
- console.log("To get started:");
101672
- if (data.beads_detected) console.log(` ${colors.bold("tbd setup --auto")} # Migrate from Beads (recommended)`);
101673
- else console.log(` ${colors.bold("tbd setup --auto --prefix=<name>")} # Full setup with prefix`);
101674
- console.log(` ${colors.bold("tbd init --prefix=X")} # Surgical init only`);
101805
+ this.renderPreInitText(data, colors);
101675
101806
  return;
101676
101807
  }
101677
- console.log(`${colors.bold("tbd")} v${data.tbd_version}`);
101808
+ renderRepositorySection({
101809
+ version: data.tbd_version,
101810
+ workingDirectory: data.working_directory,
101811
+ initialized: data.initialized,
101812
+ gitRepository: data.git_repository,
101813
+ gitBranch: data.git_branch,
101814
+ gitVersion: data.git_version,
101815
+ gitVersionSupported: data.git_version_supported
101816
+ }, colors);
101817
+ if (data.beads_detected) renderBeadsWarning(colors);
101818
+ renderConfigSection({
101819
+ syncBranch: data.sync_branch,
101820
+ remote: data.remote,
101821
+ displayPrefix: data.display_prefix
101822
+ }, colors);
101823
+ if (renderIntegrationsSection([{
101824
+ name: "Claude Code hooks",
101825
+ installed: data.integrations.claude_code,
101826
+ path: data.integrations.claude_code_path
101827
+ }, {
101828
+ name: "Codex AGENTS.md",
101829
+ installed: data.integrations.codex,
101830
+ path: data.integrations.codex_path
101831
+ }], colors)) {
101832
+ console.log("");
101833
+ console.log(`Run ${colors.bold("tbd setup auto")} to configure detected agents`);
101834
+ }
101835
+ if (data.worktree_healthy !== null && data.worktree_path) renderWorktreeStatus(data.worktree_path, data.worktree_healthy, colors);
101836
+ renderFooter([{
101837
+ command: "tbd stats",
101838
+ description: "issue statistics"
101839
+ }, {
101840
+ command: "tbd doctor",
101841
+ description: "health checks"
101842
+ }], colors);
101843
+ }
101844
+ /**
101845
+ * Render pre-init text (unique to status command).
101846
+ * This is not shared with doctor since doctor requires initialization.
101847
+ */
101848
+ renderPreInitText(data, colors) {
101849
+ console.log(`${colors.warn("Not a tbd repository.")}`);
101678
101850
  console.log("");
101679
- console.log(`Repository: ${data.working_directory}`);
101680
- console.log(` ${colors.success("✓")} Initialized (.tbd/)`);
101851
+ console.log("Detected:");
101681
101852
  if (data.git_repository) {
101682
- const branchInfo = data.git_branch ? ` (${data.git_branch})` : "";
101683
- console.log(` ${colors.success("✓")} Git repository${branchInfo}`);
101853
+ const branchInfo = data.git_branch ? ` (${data.git_branch} branch)` : "";
101854
+ console.log(` ${colors.success(ICONS.SUCCESS)} Git repository${branchInfo}`);
101684
101855
  if (data.git_version) {
101685
- const versionStatus = data.git_version_supported ? colors.success("✓") : colors.warn("⚠");
101856
+ const versionStatus = data.git_version_supported ? colors.success(ICONS.SUCCESS) : colors.warn(ICONS.WARN);
101686
101857
  const versionNote = data.git_version_supported ? "" : ` ${colors.dim(`(requires ${MIN_GIT_VERSION}+)`)}`;
101687
101858
  console.log(` ${versionStatus} Git ${data.git_version}${versionNote}`);
101688
101859
  }
101689
- }
101860
+ } else console.log(` ${colors.error(ICONS.ERROR)} Git repository not found`);
101690
101861
  if (data.beads_detected) {
101691
- console.log("");
101692
- console.log(`${colors.warn("⚠")} Beads directory detected alongside tbd`);
101693
- console.log(` This may cause confusion for AI agents.`);
101694
- console.log(` Run ${colors.bold("tbd setup beads --disable")} for migration options`);
101695
- }
101696
- if (data.sync_branch || data.remote || data.display_prefix) {
101697
- console.log("");
101698
- if (data.sync_branch) console.log(`${colors.dim("Sync branch:")} ${data.sync_branch}`);
101699
- if (data.remote) console.log(`${colors.dim("Remote:")} ${data.remote}`);
101700
- if (data.display_prefix) console.log(`${colors.dim("ID prefix:")} ${data.display_prefix}-`);
101701
- }
101862
+ const countInfo = data.beads_issue_count !== null ? ` (.beads/ with ${data.beads_issue_count} issues)` : "";
101863
+ console.log(` ${colors.success(ICONS.SUCCESS)} Beads repository${countInfo}`);
101864
+ } else console.log(` ${colors.dim(ICONS.ERROR)} Beads not detected`);
101865
+ console.log(` ${colors.error(ICONS.ERROR)} tbd not initialized`);
101702
101866
  console.log("");
101703
- console.log(colors.bold(formatHeading("Integrations")));
101704
- let hasMissingIntegrations = false;
101705
- if (data.integrations.claude_code) console.log(` ${colors.success("")} Claude Code hooks ${colors.dim(`(${data.integrations.claude_code_path})`)}`);
101706
- else {
101707
- console.log(` ${colors.dim("✗")} Claude Code hooks ${colors.dim(`(${data.integrations.claude_code_path})`)}`);
101708
- hasMissingIntegrations = true;
101709
- }
101710
- if (data.integrations.codex) console.log(` ${colors.success("✓")} Codex AGENTS.md ${colors.dim(`(${data.integrations.codex_path})`)}`);
101711
- else {
101712
- console.log(` ${colors.dim("✗")} Codex AGENTS.md ${colors.dim(`(${data.integrations.codex_path})`)}`);
101713
- hasMissingIntegrations = true;
101714
- }
101715
- if (hasMissingIntegrations) {
101716
- console.log("");
101717
- console.log(`Run ${colors.bold("tbd setup auto")} to configure detected agents`);
101718
- }
101719
- if (data.worktree_healthy !== null) {
101720
- console.log("");
101721
- if (data.worktree_healthy) console.log(`${colors.dim("Worktree:")} ${data.worktree_path} (healthy)`);
101722
- else {
101723
- console.log(`${colors.warn("Worktree:")} ${data.worktree_path} (${colors.error("unhealthy")})`);
101724
- console.log(` Run: tbd doctor --fix`);
101725
- }
101726
- }
101727
- console.log("");
101728
- console.log(`Use ${colors.bold("'tbd stats'")} for issue statistics, ${colors.bold("'tbd doctor'")} for health checks.`);
101867
+ console.log("To get started:");
101868
+ if (data.beads_detected) console.log(` ${colors.bold("tbd setup --auto")} # Migrate from Beads (recommended)`);
101869
+ else console.log(` ${colors.bold("tbd setup --auto --prefix=<name>")} # Full setup with prefix`);
101870
+ console.log(` ${colors.bold("tbd init --prefix=X")} # Surgical init only`);
101729
101871
  }
101730
101872
  };
101731
101873
  const statusCommand = new Command("status").description("Show repository status and orientation").action(async (_options, command) => {
@@ -101792,14 +101934,21 @@ var StatsHandler = class extends BaseCommand {
101792
101934
  this.output.data(stats, () => {
101793
101935
  const colors = this.output.getColors();
101794
101936
  console.log(colors.bold("Summary:"));
101795
- console.log(` Ready: ${stats.ready}`);
101796
- console.log(` In progress: ${stats.byStatus.in_progress}`);
101797
- console.log(` Blocked: ${stats.blocked}`);
101798
- console.log(` Open: ${stats.byStatus.open}`);
101799
- console.log(` Total: ${stats.total}`);
101937
+ renderStatisticsSection({
101938
+ ready: stats.ready,
101939
+ inProgress: stats.byStatus.in_progress,
101940
+ blocked: stats.blocked,
101941
+ open: stats.byStatus.open,
101942
+ total: stats.total
101943
+ }, colors, { showHeading: false });
101800
101944
  if (stats.total === 0) {
101801
- console.log("");
101802
- console.log(`Use ${colors.bold("'tbd status'")} for setup info, ${colors.bold("'tbd doctor'")} for health checks.`);
101945
+ renderFooter([{
101946
+ command: "tbd status",
101947
+ description: "setup info"
101948
+ }, {
101949
+ command: "tbd doctor",
101950
+ description: "health checks"
101951
+ }], colors);
101803
101952
  return;
101804
101953
  }
101805
101954
  console.log("");
@@ -101821,8 +101970,13 @@ var StatsHandler = class extends BaseCommand {
101821
101970
  const count = stats.byPriority[i];
101822
101971
  if (count !== void 0 && count > 0) console.log(` ${formatPriority(i)} (${priorityLabels[i].padEnd(8)}) ${count}`);
101823
101972
  }
101824
- console.log("");
101825
- console.log(`Use ${colors.bold("'tbd status'")} for setup info, ${colors.bold("'tbd doctor'")} for health checks.`);
101973
+ renderFooter([{
101974
+ command: "tbd status",
101975
+ description: "setup info"
101976
+ }, {
101977
+ command: "tbd doctor",
101978
+ description: "health checks"
101979
+ }], colors);
101826
101980
  });
101827
101981
  }
101828
101982
  };
@@ -101930,24 +102084,21 @@ var DoctorHandler = class extends BaseCommand {
101930
102084
  healthy: allOk
101931
102085
  }, () => {
101932
102086
  const colors = this.output.getColors();
101933
- console.log(colors.bold(formatHeading("Repository")));
101934
- console.log(`tbd v${VERSION}`);
101935
- console.log(`Repository: ${this.cwd}`);
101936
- console.log(` ${colors.success("✓")} Initialized (.tbd/)`);
101937
- if (statusInfo.gitBranch) console.log(` ${colors.success("✓")} Git repository (${statusInfo.gitBranch})`);
101938
- if (this.config) {
101939
- console.log("");
101940
- console.log(`${colors.dim("Sync branch:")} ${this.config.sync.branch}`);
101941
- console.log(`${colors.dim("Remote:")} ${this.config.sync.remote}`);
101942
- if (this.config.display.id_prefix) console.log(`${colors.dim("ID prefix:")} ${this.config.display.id_prefix}-`);
101943
- }
101944
- console.log("");
101945
- console.log(colors.bold(formatHeading("Statistics")));
101946
- console.log(` Ready: ${statsInfo.ready}`);
101947
- console.log(` In progress: ${statsInfo.inProgress}`);
101948
- console.log(` Blocked: ${statsInfo.blocked}`);
101949
- console.log(` Open: ${statsInfo.open}`);
101950
- console.log(` Total: ${statsInfo.total}`);
102087
+ renderRepositorySection({
102088
+ version: VERSION,
102089
+ workingDirectory: this.cwd,
102090
+ initialized: true,
102091
+ gitRepository: !!statusInfo.gitBranch,
102092
+ gitBranch: statusInfo.gitBranch,
102093
+ gitVersion: null,
102094
+ gitVersionSupported: true
102095
+ }, colors, { showHeading: true });
102096
+ if (this.config) renderConfigSection({
102097
+ syncBranch: this.config.sync.branch,
102098
+ remote: this.config.sync.remote,
102099
+ displayPrefix: this.config.display.id_prefix
102100
+ }, colors);
102101
+ renderStatisticsSection(statsInfo, colors);
101951
102102
  console.log("");
101952
102103
  console.log(colors.bold(formatHeading("Integrations")));
101953
102104
  renderDiagnostics(integrationChecks, colors);
@@ -105753,8 +105904,18 @@ const TBD_SESSION_SCRIPT = `#!/bin/bash
105753
105904
  # Installed by: tbd setup --auto
105754
105905
  # This script runs on SessionStart and PreCompact
105755
105906
 
105907
+ # Get npm global bin directory (if npm is available)
105908
+ NPM_GLOBAL_BIN=""
105909
+ if command -v npm &> /dev/null; then
105910
+ NPM_PREFIX=$(npm config get prefix 2>/dev/null)
105911
+ if [ -n "$NPM_PREFIX" ] && [ -d "$NPM_PREFIX/bin" ]; then
105912
+ NPM_GLOBAL_BIN="$NPM_PREFIX/bin"
105913
+ fi
105914
+ fi
105915
+
105756
105916
  # Add common binary locations to PATH (persists for entire script)
105757
- export PATH="$HOME/.local/bin:$HOME/bin:/usr/local/bin:$PATH"
105917
+ # Include npm global bin if found
105918
+ export PATH="$NPM_GLOBAL_BIN:$HOME/.local/bin:$HOME/bin:/usr/local/bin:$PATH"
105758
105919
 
105759
105920
  # Function to ensure tbd is available
105760
105921
  ensure_tbd() {
@@ -105797,9 +105958,9 @@ ensure_tbd() {
105797
105958
  else
105798
105959
  echo "[tbd] WARNING: tbd installed but not found in PATH"
105799
105960
  echo "[tbd] Checking common locations..."
105800
- # Try to find and add to path
105801
- for dir in ~/.local/bin ~/.local/node_modules/.bin /usr/local/bin; do
105802
- if [ -x "$dir/tbd" ]; then
105961
+ # Try to find and add to path (include npm global bin)
105962
+ for dir in "$NPM_GLOBAL_BIN" ~/.local/bin ~/.local/node_modules/.bin /usr/local/bin; do
105963
+ if [ -n "$dir" ] && [ -x "$dir/tbd" ]; then
105803
105964
  export PATH="$dir:$PATH"
105804
105965
  echo "[tbd] Found at $dir/tbd"
105805
105966
  return 0