gsd-pi 2.76.0-dev.4100bd590 → 2.76.0-dev.4c866b677

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 (117) hide show
  1. package/dist/resource-loader.d.ts +1 -1
  2. package/dist/resource-loader.js +2 -8
  3. package/dist/resources/extensions/gsd/auto/phases.js +4 -1
  4. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  5. package/dist/resources/extensions/gsd/auto-model-selection.js +13 -2
  6. package/dist/resources/extensions/gsd/auto-start.js +28 -10
  7. package/dist/resources/extensions/gsd/auto.js +4 -1
  8. package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
  9. package/dist/resources/extensions/gsd/gsd-db.js +59 -3
  10. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  11. package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
  12. package/dist/resources/extensions/gsd/safety/file-change-validator.js +1 -1
  13. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  14. package/dist/web/standalone/.next/BUILD_ID +1 -1
  15. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  16. package/dist/web/standalone/.next/build-manifest.json +2 -2
  17. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  18. package/dist/web/standalone/.next/required-server-files.json +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.html +1 -1
  36. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  43. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  45. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  46. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  47. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  48. package/dist/web/standalone/server.js +1 -1
  49. package/package.json +1 -1
  50. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  51. package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
  52. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  53. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
  54. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
  55. package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
  56. package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
  57. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
  58. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
  59. package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
  60. package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
  61. package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
  62. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  63. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  64. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  65. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
  66. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  67. package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
  68. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  69. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
  70. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  71. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
  72. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
  73. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
  74. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  75. package/packages/pi-coding-agent/dist/core/model-registry.js +76 -10
  76. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  80. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  82. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
  83. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  84. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  85. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  86. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  87. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  88. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
  89. package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
  90. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
  91. package/packages/pi-coding-agent/src/core/model-registry.ts +86 -10
  92. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  93. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
  94. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  95. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  96. package/scripts/link-workspace-packages.cjs +1 -0
  97. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  98. package/src/resources/extensions/gsd/auto/phases.ts +4 -0
  99. package/src/resources/extensions/gsd/auto/session.ts +7 -1
  100. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -1
  101. package/src/resources/extensions/gsd/auto-start.ts +28 -10
  102. package/src/resources/extensions/gsd/auto.ts +4 -1
  103. package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
  104. package/src/resources/extensions/gsd/gsd-db.ts +65 -3
  105. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  106. package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
  107. package/src/resources/extensions/gsd/safety/file-change-validator.ts +1 -1
  108. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  109. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +33 -3
  110. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +38 -0
  111. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
  112. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +20 -0
  113. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +87 -0
  114. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  115. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  116. /package/dist/web/standalone/.next/static/{YnUwu2WWaT0_hyTLUF4nq → jDqWYbuP_CG6Kjc-uKwkN}/_buildManifest.js +0 -0
  117. /package/dist/web/standalone/.next/static/{YnUwu2WWaT0_hyTLUF4nq → jDqWYbuP_CG6Kjc-uKwkN}/_ssgManifest.js +0 -0
@@ -9,6 +9,7 @@ import {
9
9
  isDbAvailable,
10
10
  wasDbOpenAttempted,
11
11
  getDbProvider,
12
+ getDbStatus,
12
13
  insertDecision,
13
14
  getDecisionById,
14
15
  insertRequirement,
@@ -561,6 +562,92 @@ describe('gsd-db', () => {
561
562
  });
562
563
  });
563
564
 
565
+ // ─── getDbStatus ───────────────────────────────────────────────────────────
566
+
567
+ describe('getDbStatus', () => {
568
+ test('getDbStatus: initial state before any open', () => {
569
+ closeDatabase();
570
+ const status = getDbStatus();
571
+ assert.strictEqual(status.available, false, 'available false before open');
572
+ assert.strictEqual(status.attempted, false, 'attempted false before open');
573
+ assert.strictEqual(status.lastError, null, 'lastError null before open');
574
+ assert.strictEqual(status.lastPhase, null, 'lastPhase null before open');
575
+ });
576
+
577
+ test('getDbStatus: available after successful open', () => {
578
+ openDatabase(':memory:');
579
+ const status = getDbStatus();
580
+ assert.strictEqual(status.available, true, 'available true after open');
581
+ assert.strictEqual(status.attempted, true, 'attempted true after open');
582
+ assert.ok(status.provider !== null, 'provider set after open');
583
+ assert.strictEqual(status.lastError, null, 'lastError null on success');
584
+ assert.strictEqual(status.lastPhase, null, 'lastPhase null on success');
585
+ closeDatabase();
586
+ });
587
+
588
+ test('getDbStatus: resets lastError/lastPhase after closeDatabase', () => {
589
+ // Simulate a failed open to set error state
590
+ const corruptPath = path.join(os.tmpdir(), `gsd-corrupt-${Date.now()}.db`);
591
+ fs.writeFileSync(corruptPath, Buffer.from('not a sqlite file at all!!!!!'));
592
+ try {
593
+ openDatabase(corruptPath);
594
+ } catch {
595
+ // expected
596
+ }
597
+ assert.ok(getDbStatus().lastError !== null, 'lastError set after failed open');
598
+
599
+ // closeDatabase should clear it even though no DB was opened
600
+ closeDatabase();
601
+ const status = getDbStatus();
602
+ assert.strictEqual(status.lastError, null, 'lastError cleared by closeDatabase');
603
+ assert.strictEqual(status.lastPhase, null, 'lastPhase cleared by closeDatabase');
604
+ assert.strictEqual(status.attempted, false, 'attempted reset by closeDatabase');
605
+ fs.unlinkSync(corruptPath);
606
+ });
607
+
608
+ test('getDbStatus: captures open-phase error on corrupt file', () => {
609
+ closeDatabase();
610
+ const corruptPath = path.join(os.tmpdir(), `gsd-corrupt-${Date.now()}.db`);
611
+ fs.writeFileSync(corruptPath, Buffer.from('not a sqlite file at all!!!!!'));
612
+ try {
613
+ openDatabase(corruptPath);
614
+ } catch {
615
+ // expected — both providers should reject a non-SQLite file
616
+ }
617
+ const status = getDbStatus();
618
+ if (!status.available) {
619
+ // open failed (expected in most environments)
620
+ assert.strictEqual(status.attempted, true, 'attempted true after failed open');
621
+ // provider may reject at raw-open level ("open") or at SQL init level ("initSchema")
622
+ assert.ok(
623
+ status.lastPhase === 'open' || status.lastPhase === 'initSchema',
624
+ `lastPhase should be "open" or "initSchema", got: ${status.lastPhase}`,
625
+ );
626
+ assert.ok(status.lastError instanceof Error, 'lastError is an Error');
627
+ }
628
+ // If somehow it succeeded (unlikely with garbage content), that's also fine
629
+ closeDatabase();
630
+ try { fs.unlinkSync(corruptPath); } catch { /* best effort */ }
631
+ });
632
+
633
+ test('getDbStatus: error state resets on next successful open', () => {
634
+ closeDatabase();
635
+ const corruptPath = path.join(os.tmpdir(), `gsd-corrupt-${Date.now()}.db`);
636
+ fs.writeFileSync(corruptPath, Buffer.from('not a sqlite file at all!!!!!'));
637
+ try { openDatabase(corruptPath); } catch { /* expected */ }
638
+ assert.ok(!getDbStatus().available, 'DB unavailable after corrupt open');
639
+
640
+ // Now open a valid in-memory DB — error state should clear
641
+ openDatabase(':memory:');
642
+ const status = getDbStatus();
643
+ assert.strictEqual(status.available, true, 'available after valid open');
644
+ assert.strictEqual(status.lastError, null, 'lastError cleared on successful open');
645
+ assert.strictEqual(status.lastPhase, null, 'lastPhase cleared on successful open');
646
+ closeDatabase();
647
+ try { fs.unlinkSync(corruptPath); } catch { /* best effort */ }
648
+ });
649
+ });
650
+
564
651
  // ─── Final Report ──────────────────────────────────────────────────────────
565
652
 
566
653
  });
@@ -178,6 +178,33 @@ test("init-wizard: multiple project files detected together", (t) => {
178
178
  }
179
179
  });
180
180
 
181
+ // ─── Git init + initial commit regression (#4530) ───────────────────────────
182
+
183
+ import { execFileSync } from "node:child_process";
184
+ import { nativeInit, nativeAddAll, nativeCommit } from "../native-git-bridge.ts";
185
+
186
+ test("init-wizard: nativeInit + nativeAddAll + nativeCommit produces a reachable HEAD (#4530)", (t) => {
187
+ // Regression: showProjectInit called nativeInit but never committed, leaving
188
+ // the branch unborn. git log and git worktree add both fail on zero-commit repos.
189
+ const dir = makeTempDir("git-init-commit");
190
+ t.after(() => { cleanup(dir); });
191
+
192
+ nativeInit(dir, "main");
193
+ execFileSync("git", ["config", "user.email", "test@test.com"], { cwd: dir });
194
+ execFileSync("git", ["config", "user.name", "Test"], { cwd: dir });
195
+ writeFileSync(join(dir, ".gitignore"), "*.log\n", "utf-8");
196
+
197
+ nativeAddAll(dir);
198
+ nativeCommit(dir, "chore: init project");
199
+
200
+ // git log must succeed (was: fatal: your current branch 'main' does not have any commits yet)
201
+ const subject = execFileSync("git", ["log", "-1", "--format=%s"], {
202
+ cwd: dir,
203
+ encoding: "utf-8",
204
+ }).trim();
205
+ assert.equal(subject, "chore: init project");
206
+ });
207
+
181
208
  test("init-wizard: v1 with both .planning/ and .gsd/ prioritizes v2", (t) => {
182
209
  const dir = makeTempDir("both-v1-v2");
183
210
  try {
@@ -0,0 +1,49 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { join } from "node:path";
4
+
5
+ import { resolveExtensionDirFromCandidates } from "../prompt-loader.ts";
6
+
7
+ function makeExists(paths: Set<string>): (path: string) => boolean {
8
+ return (path: string) => paths.has(path);
9
+ }
10
+
11
+ test("resolveExtensionDirFromCandidates prefers user-local dir when both trees are valid", () => {
12
+ const moduleDir = "/npm/global/gsd";
13
+ const agentDir = "/home/user/.gsd/agent/extensions/gsd";
14
+ const paths = new Set<string>([
15
+ join(moduleDir, "prompts"),
16
+ join(moduleDir, "templates", "task-summary.md"),
17
+ join(agentDir, "prompts"),
18
+ join(agentDir, "templates", "task-summary.md"),
19
+ ]);
20
+
21
+ const resolved = resolveExtensionDirFromCandidates(moduleDir, agentDir, makeExists(paths));
22
+ assert.equal(resolved, agentDir);
23
+ });
24
+
25
+ test("resolveExtensionDirFromCandidates rejects module dir missing task-summary template", () => {
26
+ const moduleDir = "/npm/global/gsd";
27
+ const agentDir = "/home/user/.gsd/agent/extensions/gsd";
28
+ const paths = new Set<string>([
29
+ join(moduleDir, "prompts"),
30
+ // Missing module templates/task-summary.md on purpose.
31
+ join(agentDir, "prompts"),
32
+ join(agentDir, "templates", "task-summary.md"),
33
+ ]);
34
+
35
+ const resolved = resolveExtensionDirFromCandidates(moduleDir, agentDir, makeExists(paths));
36
+ assert.equal(resolved, agentDir);
37
+ });
38
+
39
+ test("resolveExtensionDirFromCandidates falls back to prompts-only dir when neither tree is fully valid", () => {
40
+ const moduleDir = "/npm/global/gsd";
41
+ const agentDir = "/home/user/.gsd/agent/extensions/gsd";
42
+ const paths = new Set<string>([
43
+ join(moduleDir, "prompts"),
44
+ // Neither side has templates/task-summary.md.
45
+ ]);
46
+
47
+ const resolved = resolveExtensionDirFromCandidates(moduleDir, agentDir, makeExists(paths));
48
+ assert.equal(resolved, moduleDir);
49
+ });