gsd-pi 2.41.0-dev.9446b20 → 2.41.0-dev.97349b1
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/README.md +69 -29
- package/dist/cli-web-branch.d.ts +6 -0
- package/dist/cli-web-branch.js +17 -0
- package/dist/onboarding.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +9 -1
- package/dist/resources/extensions/gsd/auto/phases.js +26 -8
- package/dist/resources/extensions/gsd/auto-dashboard.js +6 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +7 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +12 -4
- package/dist/resources/extensions/gsd/auto-start.js +8 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +147 -13
- package/dist/resources/extensions/gsd/auto.js +36 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +199 -164
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +62 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +8 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/context-store.js +4 -3
- package/dist/resources/extensions/gsd/db-writer.js +5 -2
- package/dist/resources/extensions/gsd/detection.js +1 -1
- package/dist/resources/extensions/gsd/doctor.js +11 -1
- package/dist/resources/extensions/gsd/exit-command.js +12 -2
- package/dist/resources/extensions/gsd/export.js +9 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +2 -2
- package/dist/resources/extensions/gsd/files.js +28 -11
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-service.js +5 -1
- package/dist/resources/extensions/gsd/gsd-db.js +25 -8
- package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
- package/dist/resources/extensions/gsd/guided-flow.js +7 -3
- package/dist/resources/extensions/gsd/journal.js +85 -0
- package/dist/resources/extensions/gsd/md-importer.js +5 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +1 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +2 -2
- package/dist/resources/extensions/gsd/post-unit-hooks.js +24 -412
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +34 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +1 -1
- package/dist/resources/extensions/gsd/repo-identity.js +46 -2
- package/dist/resources/extensions/gsd/rule-registry.js +489 -0
- package/dist/resources/extensions/gsd/rule-types.js +6 -0
- package/dist/resources/extensions/gsd/service-tier.js +138 -0
- package/dist/resources/extensions/gsd/structured-data-formatter.js +2 -1
- package/dist/resources/extensions/gsd/templates/decisions.md +2 -2
- package/dist/resources/extensions/gsd/workflow-templates.js +13 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -6
- package/dist/resources/extensions/gsd/worktree-resolver.js +19 -2
- package/dist/resources/extensions/subagent/index.js +7 -3
- package/dist/resources/extensions/voice/index.js +4 -4
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.c195dc1fdd2adbea.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-9afaaebf6042a1d7.js → webpack-fa307370fcf9fb2c.js} +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +29 -7
- package/package.json +1 -1
- package/packages/native/src/__tests__/text.test.mjs +33 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +10 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +4 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +11 -7
- package/src/resources/extensions/gsd/auto/loop-deps.ts +5 -1
- package/src/resources/extensions/gsd/auto/loop.ts +10 -1
- package/src/resources/extensions/gsd/auto/phases.ts +28 -8
- package/src/resources/extensions/gsd/auto/types.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +7 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +8 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +12 -4
- package/src/resources/extensions/gsd/auto-start.ts +8 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +162 -18
- package/src/resources/extensions/gsd/auto.ts +40 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +209 -162
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +62 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +8 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/context-store.ts +4 -3
- package/src/resources/extensions/gsd/db-writer.ts +6 -2
- package/src/resources/extensions/gsd/detection.ts +1 -1
- package/src/resources/extensions/gsd/doctor.ts +12 -1
- package/src/resources/extensions/gsd/exit-command.ts +14 -2
- package/src/resources/extensions/gsd/export.ts +8 -15
- package/src/resources/extensions/gsd/extension-manifest.json +2 -2
- package/src/resources/extensions/gsd/files.ts +29 -12
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +5 -4
- package/src/resources/extensions/gsd/gsd-db.ts +37 -8
- package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
- package/src/resources/extensions/gsd/guided-flow.ts +7 -3
- package/src/resources/extensions/gsd/journal.ts +134 -0
- package/src/resources/extensions/gsd/md-importer.ts +6 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +1 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +2 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +24 -462
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +35 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +1 -1
- package/src/resources/extensions/gsd/repo-identity.ts +47 -2
- package/src/resources/extensions/gsd/rule-registry.ts +599 -0
- package/src/resources/extensions/gsd/rule-types.ts +68 -0
- package/src/resources/extensions/gsd/service-tier.ts +171 -0
- package/src/resources/extensions/gsd/structured-data-formatter.ts +3 -1
- package/src/resources/extensions/gsd/templates/decisions.md +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -120
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/captures.test.ts +12 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +10 -5
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +15 -10
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +513 -0
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/journal.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parsers.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -25
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +11 -22
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +195 -105
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -3
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +74 -0
- package/src/resources/extensions/gsd/types.ts +3 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +12 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +21 -6
- package/src/resources/extensions/gsd/worktree-resolver.ts +30 -9
- package/src/resources/extensions/subagent/index.ts +7 -3
- package/src/resources/extensions/voice/index.ts +4 -4
- package/dist/web/standalone/.next/static/chunks/4024.279c423e4661ece1.js +0 -9
- /package/dist/web/standalone/.next/static/{02cti5IXH7FycOqkbAkWL → ZrI3HOoXD7Fh84fAHZVxb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{02cti5IXH7FycOqkbAkWL → ZrI3HOoXD7Fh84fAHZVxb}/_ssgManifest.js +0 -0
|
@@ -404,6 +404,8 @@ export interface HookStatusEntry {
|
|
|
404
404
|
|
|
405
405
|
// ─── Database Types (Decisions & Requirements) ────────────────────────────
|
|
406
406
|
|
|
407
|
+
export type DecisionMadeBy = "human" | "agent" | "collaborative";
|
|
408
|
+
|
|
407
409
|
export interface Decision {
|
|
408
410
|
seq: number; // auto-increment primary key
|
|
409
411
|
id: string; // e.g. "D001"
|
|
@@ -413,6 +415,7 @@ export interface Decision {
|
|
|
413
415
|
choice: string; // the specific choice made
|
|
414
416
|
rationale: string; // why this choice
|
|
415
417
|
revisable: string; // whether/when revisable
|
|
418
|
+
made_by: DecisionMadeBy; // who made the decision: human, agent, or collaborative
|
|
416
419
|
superseded_by: string | null; // ID of superseding decision, or null
|
|
417
420
|
}
|
|
418
421
|
|
|
@@ -8,10 +8,21 @@
|
|
|
8
8
|
import { readFileSync, existsSync } from "node:fs";
|
|
9
9
|
import { join, dirname } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { homedir } from "node:os";
|
|
11
12
|
|
|
12
|
-
const __extensionDir =
|
|
13
|
+
const __extensionDir = resolveGsdExtensionDir();
|
|
13
14
|
const registryPath = join(__extensionDir, "workflow-templates", "registry.json");
|
|
14
15
|
|
|
16
|
+
/** Resolve the GSD extension dir with fallback to ~/.gsd/agent/extensions/gsd/. */
|
|
17
|
+
function resolveGsdExtensionDir(): string {
|
|
18
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
if (existsSync(join(moduleDir, "workflow-templates"))) return moduleDir;
|
|
20
|
+
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
21
|
+
const agentGsdDir = join(gsdHome, "agent", "extensions", "gsd");
|
|
22
|
+
if (existsSync(join(agentGsdDir, "workflow-templates"))) return agentGsdDir;
|
|
23
|
+
return moduleDir;
|
|
24
|
+
}
|
|
25
|
+
|
|
15
26
|
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
16
27
|
|
|
17
28
|
export interface TemplateEntry {
|
|
@@ -286,11 +286,26 @@ export function removeWorktree(
|
|
|
286
286
|
name: string,
|
|
287
287
|
opts: { deleteBranch?: boolean; force?: boolean; branch?: string } = {},
|
|
288
288
|
): void {
|
|
289
|
-
|
|
290
|
-
const resolvedWtPath = existsSync(wtPath) ? realpathSync(wtPath) : wtPath;
|
|
289
|
+
let wtPath = worktreePath(basePath, name);
|
|
291
290
|
const branch = opts.branch ?? worktreeBranchName(name);
|
|
292
291
|
const { deleteBranch = true, force = true } = opts;
|
|
293
292
|
|
|
293
|
+
// Resolve the ACTUAL worktree path from git's worktree list.
|
|
294
|
+
// The computed path may differ when .gsd/ is (or was) a symlink to an
|
|
295
|
+
// external state directory — git resolves symlinks at worktree creation
|
|
296
|
+
// time, so its registered path points to the resolved external location.
|
|
297
|
+
// If syncStateToProjectRoot later creates a real .gsd/ directory that
|
|
298
|
+
// shadows the symlink, the computed path diverges from git's record.
|
|
299
|
+
try {
|
|
300
|
+
const entries = nativeWorktreeList(basePath);
|
|
301
|
+
const entry = entries.find(e => e.branch === branch);
|
|
302
|
+
if (entry?.path) {
|
|
303
|
+
wtPath = entry.path;
|
|
304
|
+
}
|
|
305
|
+
} catch { /* fall back to computed path */ }
|
|
306
|
+
|
|
307
|
+
const resolvedWtPath = existsSync(wtPath) ? realpathSync(wtPath) : wtPath;
|
|
308
|
+
|
|
294
309
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
295
310
|
const cwd = process.cwd();
|
|
296
311
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
@@ -306,12 +321,12 @@ export function removeWorktree(
|
|
|
306
321
|
return;
|
|
307
322
|
}
|
|
308
323
|
|
|
309
|
-
// Remove worktree (force if requested, to handle dirty worktrees)
|
|
310
|
-
try { nativeWorktreeRemove(basePath,
|
|
324
|
+
// Remove worktree using the resolved path (force if requested, to handle dirty worktrees)
|
|
325
|
+
try { nativeWorktreeRemove(basePath, resolvedWtPath, force); } catch { /* may fail */ }
|
|
311
326
|
|
|
312
327
|
// If the directory is still there (e.g. locked), try harder with force
|
|
313
|
-
if (existsSync(
|
|
314
|
-
try { nativeWorktreeRemove(basePath,
|
|
328
|
+
if (existsSync(resolvedWtPath)) {
|
|
329
|
+
try { nativeWorktreeRemove(basePath, resolvedWtPath, true); } catch { /* may fail */ }
|
|
315
330
|
}
|
|
316
331
|
|
|
317
332
|
// Prune stale entries so git knows the worktree is gone
|
|
@@ -28,7 +28,7 @@ export interface WorktreeResolverDeps {
|
|
|
28
28
|
basePath: string,
|
|
29
29
|
milestoneId: string,
|
|
30
30
|
roadmapContent: string,
|
|
31
|
-
) => { pushed: boolean };
|
|
31
|
+
) => { pushed: boolean; codeFilesChanged: boolean };
|
|
32
32
|
syncWorktreeStateBack: (
|
|
33
33
|
mainBasePath: string,
|
|
34
34
|
worktreePath: string,
|
|
@@ -371,10 +371,23 @@ export class WorktreeResolver {
|
|
|
371
371
|
milestoneId,
|
|
372
372
|
roadmapContent,
|
|
373
373
|
);
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
374
|
+
if (mergeResult.codeFilesChanged) {
|
|
375
|
+
ctx.notify(
|
|
376
|
+
`Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`,
|
|
377
|
+
"info",
|
|
378
|
+
);
|
|
379
|
+
} else {
|
|
380
|
+
// (#1906) Milestone produced only .gsd/ metadata — no actual code was
|
|
381
|
+
// merged. This typically means the LLM wrote planning artifacts
|
|
382
|
+
// (summaries, roadmaps) but never implemented the code. Surface this
|
|
383
|
+
// clearly so the user knows the milestone is not truly complete.
|
|
384
|
+
ctx.notify(
|
|
385
|
+
`WARNING: Milestone ${milestoneId} merged to main but contained NO code changes — only .gsd/ metadata files. ` +
|
|
386
|
+
`The milestone summary may describe planned work that was never implemented. ` +
|
|
387
|
+
`Review the milestone output and re-run if code is missing.`,
|
|
388
|
+
"warning",
|
|
389
|
+
);
|
|
390
|
+
}
|
|
378
391
|
} else {
|
|
379
392
|
// No roadmap at either location — teardown but PRESERVE the branch so
|
|
380
393
|
// commits are not orphaned. The user can merge manually later (#1573).
|
|
@@ -478,10 +491,18 @@ export class WorktreeResolver {
|
|
|
478
491
|
// Rebuild GitService after merge (branch HEAD changed)
|
|
479
492
|
this.rebuildGitService();
|
|
480
493
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
494
|
+
if (mergeResult.codeFilesChanged) {
|
|
495
|
+
ctx.notify(
|
|
496
|
+
`Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`,
|
|
497
|
+
"info",
|
|
498
|
+
);
|
|
499
|
+
} else {
|
|
500
|
+
ctx.notify(
|
|
501
|
+
`WARNING: Milestone ${milestoneId} merged (branch mode) but contained NO code changes — only .gsd/ metadata. ` +
|
|
502
|
+
`Review the milestone output and re-run if code is missing.`,
|
|
503
|
+
"warning",
|
|
504
|
+
);
|
|
505
|
+
}
|
|
485
506
|
debugLog("WorktreeResolver", {
|
|
486
507
|
action: "mergeAndExit",
|
|
487
508
|
milestoneId,
|
|
@@ -516,12 +516,16 @@ async function runSingleAgentInCmuxSplit(
|
|
|
516
516
|
const bundledPaths = (process.env.GSD_BUNDLED_EXTENSION_PATHS ?? "").split(path.delimiter).map((s) => s.trim()).filter(Boolean);
|
|
517
517
|
const extensionArgs = bundledPaths.flatMap((p) => ["--extension", p]);
|
|
518
518
|
const processArgs = [process.env.GSD_BIN_PATH!, ...extensionArgs, ...buildSubagentProcessArgs(agent, task, tmpPromptPath)];
|
|
519
|
+
// Normalize all paths to forward slashes before embedding in bash strings.
|
|
520
|
+
// On Windows, backslashes are interpreted as escape characters by bash,
|
|
521
|
+
// mangling paths like C:\Users\user into C:Useruser (#1436).
|
|
522
|
+
const bashPath = (p: string) => shellEscape(p.replaceAll("\\", "/"));
|
|
519
523
|
const innerScript = [
|
|
520
|
-
`cd ${
|
|
524
|
+
`cd ${bashPath(cwd ?? defaultCwd)}`,
|
|
521
525
|
"set -o pipefail",
|
|
522
|
-
`${
|
|
526
|
+
`${bashPath(process.execPath)} ${processArgs.map(a => bashPath(a)).join(" ")} 2> >(tee ${bashPath(stderrPath)} >&2) | tee ${bashPath(stdoutPath)}`,
|
|
523
527
|
"status=${PIPESTATUS[0]}",
|
|
524
|
-
`printf '%s' "$status" > ${
|
|
528
|
+
`printf '%s' "$status" > ${bashPath(exitPath)}`,
|
|
525
529
|
].join("; ");
|
|
526
530
|
|
|
527
531
|
const sent = await cmuxClient.sendSurface(cmuxSurfaceId, `bash -lc ${shellEscape(innerScript)}`);
|
|
@@ -2,7 +2,7 @@ import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
|
2
2
|
import { shortcutDesc } from "../shared/mod.js";
|
|
3
3
|
import type { AssistantMessage } from "@gsd/pi-ai";
|
|
4
4
|
import { isKeyRelease, Key, matchesKey, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
5
|
-
import { spawn,
|
|
5
|
+
import { spawn, execFileSync, type ChildProcess } from "node:child_process";
|
|
6
6
|
import * as fs from "node:fs";
|
|
7
7
|
import * as os from "node:os";
|
|
8
8
|
import * as path from "node:path";
|
|
@@ -32,7 +32,7 @@ function linuxPython(): string {
|
|
|
32
32
|
function ensureBinary(): boolean {
|
|
33
33
|
if (fs.existsSync(RECOGNIZER_BIN)) return true;
|
|
34
34
|
try {
|
|
35
|
-
|
|
35
|
+
execFileSync("swiftc", [SWIFT_SRC, "-o", RECOGNIZER_BIN, "-framework", "Speech", "-framework", "AVFoundation"], {
|
|
36
36
|
timeout: 60000,
|
|
37
37
|
});
|
|
38
38
|
return true;
|
|
@@ -54,7 +54,7 @@ function ensureLinuxReady(ctx: ExtensionContext): boolean {
|
|
|
54
54
|
|
|
55
55
|
// Check python3 exists
|
|
56
56
|
try {
|
|
57
|
-
|
|
57
|
+
execFileSync("which", ["python3"], { stdio: "pipe" });
|
|
58
58
|
} catch {
|
|
59
59
|
ctx.ui.notify("Voice: python3 not found — install with: sudo apt install python3", "error");
|
|
60
60
|
return false;
|
|
@@ -63,7 +63,7 @@ function ensureLinuxReady(ctx: ExtensionContext): boolean {
|
|
|
63
63
|
// Check that sounddevice is importable
|
|
64
64
|
const py = linuxPython();
|
|
65
65
|
try {
|
|
66
|
-
|
|
66
|
+
execFileSync(py, ["-c", "import sounddevice"], {
|
|
67
67
|
stdio: "pipe",
|
|
68
68
|
timeout: 10000,
|
|
69
69
|
});
|