gsd-pi 2.44.0-dev.73f2fd5 → 2.44.0-dev.8894d5b
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/resources/extensions/gsd/auto/infra-errors.js +0 -3
- package/dist/resources/extensions/gsd/auto/phases.js +36 -36
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -24
- package/dist/resources/extensions/gsd/auto-timers.js +3 -57
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +0 -4
- package/dist/resources/extensions/gsd/auto-worktree.js +6 -9
- package/dist/resources/extensions/gsd/auto.js +3 -30
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +0 -136
- package/dist/resources/extensions/gsd/commands/catalog.js +1 -6
- package/dist/resources/extensions/gsd/commands/handlers/core.js +0 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +0 -5
- package/dist/resources/extensions/gsd/db-writer.js +16 -34
- package/dist/resources/extensions/gsd/doctor.js +0 -8
- package/dist/resources/extensions/gsd/git-service.js +3 -8
- package/dist/resources/extensions/gsd/gsd-db.js +1 -12
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +14 -3
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +37 -7
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +0 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +0 -1
- package/dist/resources/extensions/gsd/tools/replan-slice.js +0 -2
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -6
- package/dist/resources/extensions/mcp-client/index.js +0 -14
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -20
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/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 +20 -20
- 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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +1 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +1 -15
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -11
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +1 -20
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +0 -3
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +0 -6
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +0 -17
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +1 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +0 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +2 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +2 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +8 -17
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -7
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.ts +1 -15
- package/packages/pi-coding-agent/src/core/model-registry.ts +1 -21
- package/packages/pi-coding-agent/src/core/settings-manager.ts +0 -9
- package/packages/pi-coding-agent/src/main.ts +0 -19
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +0 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +3 -18
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -16
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +1 -8
- package/src/resources/extensions/gsd/auto/infra-errors.ts +0 -3
- package/src/resources/extensions/gsd/auto/phases.ts +48 -45
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -24
- package/src/resources/extensions/gsd/auto-timers.ts +3 -64
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -5
- package/src/resources/extensions/gsd/auto-worktree.ts +6 -9
- package/src/resources/extensions/gsd/auto.ts +3 -37
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +0 -129
- package/src/resources/extensions/gsd/commands/catalog.ts +1 -6
- package/src/resources/extensions/gsd/commands/handlers/core.ts +0 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +0 -5
- package/src/resources/extensions/gsd/db-writer.ts +17 -39
- package/src/resources/extensions/gsd/doctor.ts +1 -7
- package/src/resources/extensions/gsd/git-service.ts +2 -6
- package/src/resources/extensions/gsd/gsd-db.ts +1 -16
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +14 -3
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +37 -7
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -11
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +0 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +0 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +0 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -7
- package/src/resources/extensions/mcp-client/index.ts +0 -20
- package/dist/resources/extensions/gsd/commands-mcp-status.js +0 -187
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +0 -88
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +0 -15
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/local-model-check.js +0 -41
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +0 -32
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +0 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +0 -40
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +0 -1
- package/packages/pi-coding-agent/src/core/local-model-check.ts +0 -45
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +0 -38
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +0 -48
- package/src/resources/extensions/gsd/commands-mcp-status.ts +0 -247
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +0 -88
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +0 -114
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +0 -66
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -49
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +0 -127
- /package/dist/web/standalone/.next/static/{kxxAA66bah_yhPYqLBHE2 → oZMtyM-zfu6Inx-S59cOl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{kxxAA66bah_yhPYqLBHE2 → oZMtyM-zfu6Inx-S59cOl}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Critical invariant: generated markdown must round-trip through
|
|
9
9
|
// parseDecisionsTable() and parseRequirementsSections() with field fidelity.
|
|
10
10
|
import { resolve } from 'node:path';
|
|
11
|
-
import { readFileSync, existsSync
|
|
11
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
12
12
|
import { resolveGsdRootFile } from './paths.js';
|
|
13
13
|
import { saveFile } from './files.js';
|
|
14
14
|
import { GSDError, GSD_STALE_STATE, GSD_IO_ERROR } from './errors.js';
|
|
@@ -356,46 +356,28 @@ export async function updateRequirementInDb(id, updates, basePath) {
|
|
|
356
356
|
export async function saveArtifactToDb(opts, basePath) {
|
|
357
357
|
try {
|
|
358
358
|
const db = await import('./gsd-db.js');
|
|
359
|
-
// Guard against path traversal before any reads/writes
|
|
360
|
-
const gsdDir = resolve(basePath, '.gsd');
|
|
361
|
-
const fullPath = resolve(basePath, '.gsd', opts.path);
|
|
362
|
-
if (!fullPath.startsWith(gsdDir)) {
|
|
363
|
-
throw new GSDError(GSD_IO_ERROR, `saveArtifactToDb: path escapes .gsd/ directory: ${opts.path}`);
|
|
364
|
-
}
|
|
365
|
-
// Shrinkage guard: if the file already exists and the new content is
|
|
366
|
-
// significantly smaller (<50%), preserve the richer file on disk and
|
|
367
|
-
// store its content in the DB instead of the abbreviated version.
|
|
368
|
-
let dbContent = opts.content;
|
|
369
|
-
let skipDiskWrite = false;
|
|
370
|
-
if (existsSync(fullPath)) {
|
|
371
|
-
const existingSize = statSync(fullPath).size;
|
|
372
|
-
const newSize = Buffer.byteLength(opts.content, 'utf-8');
|
|
373
|
-
if (existingSize > 0 && newSize < existingSize * 0.5) {
|
|
374
|
-
process.stderr.write(`gsd-db: saveArtifactToDb — new content (${newSize}B) is <50% of existing file ` +
|
|
375
|
-
`(${existingSize}B) at ${opts.path}. Preserving disk file to prevent data loss.\n`);
|
|
376
|
-
dbContent = readFileSync(fullPath, 'utf-8');
|
|
377
|
-
skipDiskWrite = true;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
359
|
db.insertArtifact({
|
|
381
360
|
path: opts.path,
|
|
382
361
|
artifact_type: opts.artifact_type,
|
|
383
362
|
milestone_id: opts.milestone_id ?? null,
|
|
384
363
|
slice_id: opts.slice_id ?? null,
|
|
385
364
|
task_id: opts.task_id ?? null,
|
|
386
|
-
full_content:
|
|
365
|
+
full_content: opts.content,
|
|
387
366
|
});
|
|
388
|
-
// Write the file to disk (
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
367
|
+
// Write the file to disk (guard against path traversal)
|
|
368
|
+
const gsdDir = resolve(basePath, '.gsd');
|
|
369
|
+
const fullPath = resolve(basePath, '.gsd', opts.path);
|
|
370
|
+
if (!fullPath.startsWith(gsdDir)) {
|
|
371
|
+
throw new GSDError(GSD_IO_ERROR, `saveArtifactToDb: path escapes .gsd/ directory: ${opts.path}`);
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
await saveFile(fullPath, opts.content);
|
|
375
|
+
}
|
|
376
|
+
catch (diskErr) {
|
|
377
|
+
process.stderr.write(`gsd-db: saveArtifactToDb — disk write failed, rolling back DB row: ${diskErr.message}\n`);
|
|
378
|
+
const rollbackAdapter = db._getAdapter();
|
|
379
|
+
rollbackAdapter?.prepare('DELETE FROM artifacts WHERE path = :path').run({ ':path': opts.path });
|
|
380
|
+
throw diskErr;
|
|
399
381
|
}
|
|
400
382
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
401
383
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
@@ -441,7 +441,6 @@ export async function runGSDDoctor(basePath, options) {
|
|
|
441
441
|
id: s.id,
|
|
442
442
|
title: s.title,
|
|
443
443
|
done: s.status === "complete",
|
|
444
|
-
pending: s.status === "pending",
|
|
445
444
|
risk: (s.risk || "medium"),
|
|
446
445
|
depends: s.depends,
|
|
447
446
|
demo: s.demo,
|
|
@@ -529,10 +528,6 @@ export async function runGSDDoctor(basePath, options) {
|
|
|
529
528
|
}
|
|
530
529
|
const slicePath = resolveSlicePath(basePath, milestoneId, slice.id);
|
|
531
530
|
if (!slicePath) {
|
|
532
|
-
// Pending slices haven't been planned yet — directories are created
|
|
533
|
-
// lazily by ensurePreconditions() at dispatch time. Skip them.
|
|
534
|
-
if (slice.pending)
|
|
535
|
-
continue;
|
|
536
531
|
const expectedPath = relSlicePath(basePath, milestoneId, slice.id);
|
|
537
532
|
issues.push({
|
|
538
533
|
severity: slice.done ? "warning" : "error",
|
|
@@ -554,9 +549,6 @@ export async function runGSDDoctor(basePath, options) {
|
|
|
554
549
|
}
|
|
555
550
|
const tasksDir = resolveTasksDir(basePath, milestoneId, slice.id);
|
|
556
551
|
if (!tasksDir) {
|
|
557
|
-
// Pending slices haven't been planned yet — tasks/ is created on demand.
|
|
558
|
-
if (slice.pending)
|
|
559
|
-
continue;
|
|
560
552
|
issues.push({
|
|
561
553
|
severity: slice.done ? "warning" : "error",
|
|
562
554
|
code: "missing_tasks_dir",
|
|
@@ -510,18 +510,13 @@ export class GitServiceImpl {
|
|
|
510
510
|
* Returns the PR URL on success, or null on failure.
|
|
511
511
|
* Non-fatal: callers should treat failure as best-effort.
|
|
512
512
|
*/
|
|
513
|
-
export function createDraftPR(basePath, milestoneId, title, body
|
|
513
|
+
export function createDraftPR(basePath, milestoneId, title, body) {
|
|
514
514
|
try {
|
|
515
|
-
const
|
|
515
|
+
const result = execFileSync("gh", [
|
|
516
516
|
"pr", "create", "--draft",
|
|
517
517
|
"--title", title,
|
|
518
518
|
"--body", body,
|
|
519
|
-
];
|
|
520
|
-
if (opts?.head)
|
|
521
|
-
args.push("--head", opts.head);
|
|
522
|
-
if (opts?.base)
|
|
523
|
-
args.push("--base", opts.base);
|
|
524
|
-
const result = execFileSync("gh", args, { cwd: basePath, encoding: "utf8", timeout: 30000, env: GIT_NO_PROMPT_ENV });
|
|
519
|
+
], { cwd: basePath, encoding: "utf8", timeout: 30000, env: GIT_NO_PROMPT_ENV });
|
|
525
520
|
return result.trim();
|
|
526
521
|
}
|
|
527
522
|
catch {
|
|
@@ -253,7 +253,6 @@ function initSchema(db, fileBacked) {
|
|
|
253
253
|
inputs TEXT NOT NULL DEFAULT '[]',
|
|
254
254
|
expected_output TEXT NOT NULL DEFAULT '[]',
|
|
255
255
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
256
|
-
full_plan_md TEXT NOT NULL DEFAULT '',
|
|
257
256
|
sequence INTEGER DEFAULT 0, -- DEAD CODE: no tool exposes sequence — always 0
|
|
258
257
|
PRIMARY KEY (milestone_id, slice_id, id),
|
|
259
258
|
FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id)
|
|
@@ -543,13 +542,6 @@ function migrateSchema(db) {
|
|
|
543
542
|
":applied_at": new Date().toISOString(),
|
|
544
543
|
});
|
|
545
544
|
}
|
|
546
|
-
if (currentVersion < 11) {
|
|
547
|
-
ensureColumn(db, "tasks", "full_plan_md", `ALTER TABLE tasks ADD COLUMN full_plan_md TEXT NOT NULL DEFAULT ''`);
|
|
548
|
-
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
549
|
-
":version": 11,
|
|
550
|
-
":applied_at": new Date().toISOString(),
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
545
|
db.exec("COMMIT");
|
|
554
546
|
}
|
|
555
547
|
catch (err) {
|
|
@@ -1005,8 +997,7 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
|
|
|
1005
997
|
verify = COALESCE(:verify, verify),
|
|
1006
998
|
inputs = COALESCE(:inputs, inputs),
|
|
1007
999
|
expected_output = COALESCE(:expected_output, expected_output),
|
|
1008
|
-
observability_impact = COALESCE(:observability_impact, observability_impact)
|
|
1009
|
-
full_plan_md = COALESCE(:full_plan_md, full_plan_md)
|
|
1000
|
+
observability_impact = COALESCE(:observability_impact, observability_impact)
|
|
1010
1001
|
WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`).run({
|
|
1011
1002
|
":milestone_id": milestoneId,
|
|
1012
1003
|
":slice_id": sliceId,
|
|
@@ -1019,7 +1010,6 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
|
|
|
1019
1010
|
":inputs": planning.inputs ? JSON.stringify(planning.inputs) : null,
|
|
1020
1011
|
":expected_output": planning.expectedOutput ? JSON.stringify(planning.expectedOutput) : null,
|
|
1021
1012
|
":observability_impact": planning.observabilityImpact ?? null,
|
|
1022
|
-
":full_plan_md": planning.fullPlanMd ?? null,
|
|
1023
1013
|
});
|
|
1024
1014
|
}
|
|
1025
1015
|
function rowToSlice(row) {
|
|
@@ -1088,7 +1078,6 @@ function rowToTask(row) {
|
|
|
1088
1078
|
inputs: JSON.parse(row["inputs"] || "[]"),
|
|
1089
1079
|
expected_output: JSON.parse(row["expected_output"] || "[]"),
|
|
1090
1080
|
observability_impact: row["observability_impact"] ?? "",
|
|
1091
|
-
full_plan_md: row["full_plan_md"] ?? "",
|
|
1092
1081
|
sequence: row["sequence"] ?? 0,
|
|
1093
1082
|
};
|
|
1094
1083
|
}
|
|
@@ -298,7 +298,7 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
|
|
|
298
298
|
mkdirSync(tasksDir, { recursive: true });
|
|
299
299
|
const absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
300
300
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
301
|
-
const content =
|
|
301
|
+
const content = renderTaskPlanMarkdown(task);
|
|
302
302
|
await writeAndStore(absPath, artifactPath, content, {
|
|
303
303
|
artifact_type: "PLAN",
|
|
304
304
|
milestone_id: milestoneId,
|
|
@@ -21,8 +21,8 @@ Then:
|
|
|
21
21
|
4. Verify each **success criterion** from the milestone definition in `{{roadmapPath}}`. For each criterion, confirm it was met with specific evidence from slice summaries, test results, or observable behavior. List any criterion that was NOT met.
|
|
22
22
|
5. Verify the milestone's **definition of done** — all slices are `[x]`, all slice summaries exist, and any cross-slice integration points work correctly.
|
|
23
23
|
6. Validate **requirement status transitions**. For each requirement that changed status during this milestone, confirm the transition is supported by evidence. Requirements can move between Active, Validated, Deferred, Blocked, or Out of Scope — but only with proof.
|
|
24
|
-
7.
|
|
25
|
-
8. Update `.gsd/REQUIREMENTS.md` if any requirement status transitions were validated in step
|
|
24
|
+
7. Write `{{milestoneSummaryPath}}` using the milestone-summary template. Fill all frontmatter fields and narrative sections. The `requirement_outcomes` field must list every requirement that changed status with `from_status`, `to_status`, and `proof`.
|
|
25
|
+
8. Update `.gsd/REQUIREMENTS.md` if any requirement status transitions were validated in step 5.
|
|
26
26
|
9. Update `.gsd/PROJECT.md` to reflect milestone completion and current project state.
|
|
27
27
|
10. Review all slice summaries for cross-cutting lessons, patterns, or gotchas that emerged during this milestone. Append any non-obvious, reusable insights to `.gsd/KNOWLEDGE.md`.
|
|
28
28
|
11. Do not commit manually — the system auto-commits your changes after this unit completes.
|
|
@@ -31,4 +31,6 @@ Then:
|
|
|
31
31
|
|
|
32
32
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
33
33
|
|
|
34
|
+
**You MUST write `{{milestoneSummaryPath}}` AND update PROJECT.md before finishing.**
|
|
35
|
+
|
|
34
36
|
When done, say: "Milestone {{milestoneId}} complete."
|
|
@@ -63,7 +63,7 @@ Then:
|
|
|
63
63
|
- a matching task plan file with description, steps, must-haves, verification, inputs, and expected output
|
|
64
64
|
- **Inputs and Expected Output must list concrete backtick-wrapped file paths** (e.g. `` `src/types.ts` ``). These are machine-parsed to derive task dependencies — vague prose without paths breaks parallel execution. Every task must have at least one output file path.
|
|
65
65
|
- Observability Impact section **only if the task touches runtime boundaries, async flows, or error paths** — omit it otherwise
|
|
66
|
-
6. **Persist planning state through
|
|
66
|
+
6. **Persist planning state through DB-backed tools.** Call `gsd_plan_slice` with the full slice planning payload (goal, demo, must-haves, verification, tasks, and metadata). Then call `gsd_plan_task` for each task to persist its planning fields. These tools write to the DB and render `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` files automatically. Do **not** rely on direct `PLAN.md` writes as the source of truth; the DB-backed tools are the canonical write path for slice and task planning state.
|
|
67
67
|
7. **Self-audit the plan.** Walk through each check — if any fail, fix the plan files before moving on:
|
|
68
68
|
- **Completion semantics:** If every task were completed exactly as written, the slice goal/demo should actually be true.
|
|
69
69
|
- **Requirement coverage:** Every must-have in the slice maps to at least one task. No must-have is orphaned. If `REQUIREMENTS.md` exists, every Active requirement this slice owns maps to at least one task.
|
|
@@ -50,14 +50,14 @@ If all criteria have at least one remaining owning slice, the coverage check pas
|
|
|
50
50
|
|
|
51
51
|
**If the roadmap is still good:**
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Write `{{assessmentPath}}` with a brief confirmation that roadmap coverage still holds after {{completedSliceId}}. If requirements exist, explicitly note whether requirement coverage remains sound. If `gsd_reassess_roadmap` is available, use it with `verdict: "roadmap-confirmed"`, an empty `sliceChanges` object, and the assessment text — the tool writes the assessment to the DB and renders ASSESSMENT.md.
|
|
54
54
|
|
|
55
55
|
**If changes are needed:**
|
|
56
56
|
|
|
57
|
-
**Persist changes through `gsd_reassess_roadmap`.** Pass: `milestoneId`, `completedSliceId`, `verdict` (e.g. "roadmap-adjusted"), `assessment` (text explaining the decision), and `sliceChanges` with `modified` (array of sliceId, title, risk, depends, demo), `added` (same shape), `removed` (array of slice ID strings). The tool structurally enforces preservation of completed slices, writes the assessment to the DB, re-renders
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
{{commitInstruction}}
|
|
57
|
+
1. **Persist changes through `gsd_reassess_roadmap`.** Pass: `milestoneId`, `completedSliceId`, `verdict` (e.g. "roadmap-adjusted"), `assessment` (text explaining the decision), and `sliceChanges` with `modified` (array of sliceId, title, risk, depends, demo), `added` (same shape), `removed` (array of slice ID strings). The tool structurally enforces preservation of completed slices, writes the assessment to the DB, re-renders ROADMAP.md, and renders ASSESSMENT.md. Skip step 2 when this tool succeeds.
|
|
58
|
+
2. **Degraded fallback — direct file writes:** If `gsd_reassess_roadmap` is not available, rewrite the remaining (unchecked) slices in `{{roadmapPath}}` directly. Keep completed slices exactly as they are (`[x]`). Update the boundary map for changed slices. Update the proof strategy if risks changed. Update requirement coverage if ownership or scope changed.
|
|
59
|
+
3. Write `{{assessmentPath}}` explaining what changed and why — keep it brief and concrete.
|
|
60
|
+
4. If `.gsd/REQUIREMENTS.md` exists and requirement ownership or status changed, update it.
|
|
61
|
+
5. {{commitInstruction}}
|
|
62
62
|
|
|
63
63
|
When done, say: "Roadmap reassessed."
|
|
@@ -32,8 +32,19 @@ Consider these captures when rewriting the remaining tasks — they represent th
|
|
|
32
32
|
|
|
33
33
|
1. Read the blocker task summary carefully. Understand exactly what was discovered and why it blocks the current plan.
|
|
34
34
|
2. Analyze the remaining `[ ]` tasks in the slice plan. Determine which are still valid, which need modification, and which should be replaced.
|
|
35
|
-
3. **Persist replan state through `gsd_replan_slice`.** Call it with: `milestoneId`, `sliceId`, `blockerTaskId`, `blockerDescription`, `whatChanged`, `updatedTasks` (array of task objects with taskId, title, description, estimate, files, verify, inputs, expectedOutput), `removedTaskIds` (array of task ID strings). The tool structurally enforces preservation of completed tasks, writes replan history to the DB, re-renders
|
|
36
|
-
4.
|
|
37
|
-
|
|
35
|
+
3. **Persist replan state through `gsd_replan_slice`.** Call it with the following parameters: `milestoneId`, `sliceId`, `blockerTaskId`, `blockerDescription`, `whatChanged`, `updatedTasks` (array of task objects with taskId, title, description, estimate, files, verify, inputs, expectedOutput), `removedTaskIds` (array of task ID strings). The tool structurally enforces preservation of completed tasks, writes replan history to the DB, re-renders PLAN.md, and renders REPLAN.md. Skip steps 4–5 when this tool succeeds.
|
|
36
|
+
4. **Degraded fallback — direct file writes:** If `gsd_replan_slice` is not available, fall back to writing files directly. Write `{{replanPath}}` documenting:
|
|
37
|
+
- What blocker was discovered and in which task
|
|
38
|
+
- What changed in the plan and why
|
|
39
|
+
- Which incomplete tasks were modified, added, or removed
|
|
40
|
+
- Any new risks or considerations introduced by the replan
|
|
41
|
+
5. If using the degraded fallback, rewrite `{{planPath}}` with the updated slice plan:
|
|
42
|
+
- Keep all `[x]` tasks exactly as they were (same IDs, same descriptions, same checkmarks)
|
|
43
|
+
- Update the `[ ]` tasks to address the blocker
|
|
44
|
+
- Ensure the slice Goal and Demo sections are still achievable with the new tasks, or update them if the blocker fundamentally changes what the slice can deliver
|
|
45
|
+
- Update the Files Likely Touched section if the replan changes which files are affected
|
|
46
|
+
- If a DB-backed planning tool exists for this phase, use it as the source of truth and make any rewritten `PLAN.md` reflect that persisted state rather than bypassing it
|
|
47
|
+
6. If any incomplete task had a `T0x-PLAN.md`, remove or rewrite it to match the new task description.
|
|
48
|
+
7. Do not commit manually — the system auto-commits your changes after this unit completes.
|
|
38
49
|
|
|
39
50
|
When done, say: "Slice {{sliceId}} replanned."
|
|
@@ -16,8 +16,6 @@ All relevant context has been preloaded below — the roadmap, all slice summari
|
|
|
16
16
|
|
|
17
17
|
{{inlinedContext}}
|
|
18
18
|
|
|
19
|
-
{{skillActivation}}
|
|
20
|
-
|
|
21
19
|
## Validation Steps
|
|
22
20
|
|
|
23
21
|
1. For each **success criterion** in `{{roadmapPath}}`, check whether slice summaries and UAT results provide evidence that it was met. Record pass/fail per criterion.
|
|
@@ -27,15 +25,47 @@ All relevant context has been preloaded below — the roadmap, all slice summari
|
|
|
27
25
|
5. Determine a verdict:
|
|
28
26
|
- `pass` — all criteria met, all slices delivered, no gaps
|
|
29
27
|
- `needs-attention` — minor gaps that do not block completion (document them)
|
|
30
|
-
- `needs-remediation` — material gaps found; remediation slices
|
|
28
|
+
- `needs-remediation` — material gaps found; add remediation slices to the roadmap
|
|
29
|
+
|
|
30
|
+
## Output
|
|
31
|
+
|
|
32
|
+
Write `{{validationPath}}` with this structure:
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
---
|
|
36
|
+
verdict: <pass|needs-attention|needs-remediation>
|
|
37
|
+
remediation_round: {{remediationRound}}
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# Milestone Validation: {{milestoneId}}
|
|
31
41
|
|
|
32
|
-
##
|
|
42
|
+
## Success Criteria Checklist
|
|
43
|
+
- [x] Criterion 1 — evidence: ...
|
|
44
|
+
- [ ] Criterion 2 — gap: ...
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
## Slice Delivery Audit
|
|
47
|
+
| Slice | Claimed | Delivered | Status |
|
|
48
|
+
|-------|---------|-----------|--------|
|
|
49
|
+
| S01 | ... | ... | pass |
|
|
50
|
+
|
|
51
|
+
## Cross-Slice Integration
|
|
52
|
+
(any boundary mismatches)
|
|
53
|
+
|
|
54
|
+
## Requirement Coverage
|
|
55
|
+
(any unaddressed requirements)
|
|
56
|
+
|
|
57
|
+
## Verdict Rationale
|
|
58
|
+
(why this verdict was chosen)
|
|
59
|
+
|
|
60
|
+
## Remediation Plan
|
|
61
|
+
(only if verdict is needs-remediation — list new slices to add to the roadmap)
|
|
62
|
+
```
|
|
35
63
|
|
|
36
64
|
If verdict is `needs-remediation`:
|
|
37
|
-
-
|
|
38
|
-
- These
|
|
65
|
+
- Add new slices to `{{roadmapPath}}` with unchecked `[ ]` status
|
|
66
|
+
- These slices will be planned and executed before validation re-runs
|
|
67
|
+
|
|
68
|
+
**You MUST write `{{validationPath}}` before finishing.**
|
|
39
69
|
|
|
40
70
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
41
71
|
|
|
@@ -10,10 +10,6 @@
|
|
|
10
10
|
export function classifyProviderError(errorMsg) {
|
|
11
11
|
const isRateLimit = /rate.?limit|too many requests|429/i.test(errorMsg);
|
|
12
12
|
const isServerError = /internal server error|500|502|503|overloaded|server_error|api_error|service.?unavailable/i.test(errorMsg);
|
|
13
|
-
// Connection/process errors — transient, auto-resume after brief backoff (#2309).
|
|
14
|
-
// These indicate the process was killed, the connection was reset, or a network
|
|
15
|
-
// blip occurred. They are NOT permanent failures.
|
|
16
|
-
const isConnectionError = /terminated|connection.?reset|connection.?refused|other side closed|fetch failed|network.?(?:is\s+)?unavailable|ECONNREFUSED|ECONNRESET|EPIPE/i.test(errorMsg);
|
|
17
13
|
// Permanent errors — never auto-resume
|
|
18
14
|
const isPermanent = /auth|unauthorized|forbidden|invalid.*key|invalid.*api|billing|quota exceeded|account/i.test(errorMsg);
|
|
19
15
|
if (isPermanent && !isRateLimit) {
|
|
@@ -28,9 +24,6 @@ export function classifyProviderError(errorMsg) {
|
|
|
28
24
|
if (isServerError) {
|
|
29
25
|
return { isTransient: true, isRateLimit: false, suggestedDelayMs: 30_000 }; // 30s for server errors
|
|
30
26
|
}
|
|
31
|
-
if (isConnectionError) {
|
|
32
|
-
return { isTransient: true, isRateLimit: false, suggestedDelayMs: 15_000 }; // 15s for connection errors
|
|
33
|
-
}
|
|
34
27
|
// Unknown error — treat as permanent (user reviews)
|
|
35
28
|
return { isTransient: false, isRateLimit: false, suggestedDelayMs: 0 };
|
|
36
29
|
}
|
|
@@ -91,7 +91,6 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
91
91
|
verify: updatedTask.verify || "",
|
|
92
92
|
inputs: updatedTask.inputs || [],
|
|
93
93
|
expectedOutput: updatedTask.expectedOutput || [],
|
|
94
|
-
fullPlanMd: updatedTask.fullPlanMd,
|
|
95
94
|
});
|
|
96
95
|
}
|
|
97
96
|
else {
|
|
@@ -111,7 +110,6 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
111
110
|
verify: updatedTask.verify || "",
|
|
112
111
|
inputs: updatedTask.inputs || [],
|
|
113
112
|
expectedOutput: updatedTask.expectedOutput || [],
|
|
114
|
-
fullPlanMd: updatedTask.fullPlanMd,
|
|
115
113
|
});
|
|
116
114
|
}
|
|
117
115
|
}
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
import { existsSync, unlinkSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { debugLog } from "./debug-logger.js";
|
|
18
|
-
import { MergeConflictError } from "./git-service.js";
|
|
19
18
|
// ─── WorktreeResolver ──────────────────────────────────────────────────────
|
|
20
19
|
export class WorktreeResolver {
|
|
21
20
|
s;
|
|
@@ -309,11 +308,6 @@ export class WorktreeResolver {
|
|
|
309
308
|
/* best-effort */
|
|
310
309
|
}
|
|
311
310
|
}
|
|
312
|
-
// Re-throw MergeConflictError so the auto loop can detect real code
|
|
313
|
-
// conflicts and stop instead of retrying forever (#2330).
|
|
314
|
-
if (err instanceof MergeConflictError) {
|
|
315
|
-
throw err;
|
|
316
|
-
}
|
|
317
311
|
}
|
|
318
312
|
// Always restore basePath and rebuild — whether merge succeeded or failed
|
|
319
313
|
this.restoreToProjectRoot();
|
|
@@ -162,20 +162,6 @@ function formatToolList(serverName, tools) {
|
|
|
162
162
|
lines.push(`Call with: mcp_call(server="${serverName}", tool="<tool_name>", args={...})`);
|
|
163
163
|
return lines.join("\n");
|
|
164
164
|
}
|
|
165
|
-
// ─── Status helper (consumed by /gsd mcp) ─────────────────────────────────────
|
|
166
|
-
/**
|
|
167
|
-
* Return the live connection status for a named MCP server.
|
|
168
|
-
* Safe to call even when the server has never been connected.
|
|
169
|
-
*/
|
|
170
|
-
export function getConnectionStatus(name) {
|
|
171
|
-
const conn = connections.get(name);
|
|
172
|
-
const cached = toolCache.get(name);
|
|
173
|
-
return {
|
|
174
|
-
connected: !!conn,
|
|
175
|
-
tools: cached ? cached.map((t) => t.name) : [],
|
|
176
|
-
error: undefined,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
165
|
// ─── Extension ────────────────────────────────────────────────────────────────
|
|
180
166
|
export default function (pi) {
|
|
181
167
|
// ── mcp_servers ──────────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
oZMtyM-zfu6Inx-S59cOl
|
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
{
|
|
2
|
-
"/_not-found/page": "/_not-found",
|
|
3
2
|
"/_global-error/page": "/_global-error",
|
|
3
|
+
"/_not-found/page": "/_not-found",
|
|
4
4
|
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
5
5
|
"/api/boot/route": "/api/boot",
|
|
6
6
|
"/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
|
|
7
|
-
"/api/cleanup/route": "/api/cleanup",
|
|
8
|
-
"/api/browse-directories/route": "/api/browse-directories",
|
|
9
7
|
"/api/dev-mode/route": "/api/dev-mode",
|
|
10
|
-
"/api/
|
|
8
|
+
"/api/browse-directories/route": "/api/browse-directories",
|
|
9
|
+
"/api/cleanup/route": "/api/cleanup",
|
|
10
|
+
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
11
|
+
"/api/git/route": "/api/git",
|
|
11
12
|
"/api/doctor/route": "/api/doctor",
|
|
13
|
+
"/api/forensics/route": "/api/forensics",
|
|
12
14
|
"/api/export-data/route": "/api/export-data",
|
|
13
|
-
"/api/
|
|
14
|
-
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
15
|
+
"/api/history/route": "/api/history",
|
|
15
16
|
"/api/inspect/route": "/api/inspect",
|
|
16
|
-
"/api/captures/route": "/api/captures",
|
|
17
17
|
"/api/hooks/route": "/api/hooks",
|
|
18
|
-
"/api/history/route": "/api/history",
|
|
19
18
|
"/api/knowledge/route": "/api/knowledge",
|
|
19
|
+
"/api/captures/route": "/api/captures",
|
|
20
20
|
"/api/live-state/route": "/api/live-state",
|
|
21
|
-
"/api/
|
|
22
|
-
"/api/projects/route": "/api/projects",
|
|
21
|
+
"/api/onboarding/route": "/api/onboarding",
|
|
23
22
|
"/api/recovery/route": "/api/recovery",
|
|
23
|
+
"/api/projects/route": "/api/projects",
|
|
24
|
+
"/api/preferences/route": "/api/preferences",
|
|
24
25
|
"/api/session/browser/route": "/api/session/browser",
|
|
25
|
-
"/api/onboarding/route": "/api/onboarding",
|
|
26
26
|
"/api/session/command/route": "/api/session/command",
|
|
27
|
-
"/api/shutdown/route": "/api/shutdown",
|
|
28
|
-
"/api/session/manage/route": "/api/session/manage",
|
|
29
|
-
"/api/session/events/route": "/api/session/events",
|
|
30
27
|
"/api/settings-data/route": "/api/settings-data",
|
|
28
|
+
"/api/files/route": "/api/files",
|
|
29
|
+
"/api/session/events/route": "/api/session/events",
|
|
30
|
+
"/api/shutdown/route": "/api/shutdown",
|
|
31
31
|
"/api/skill-health/route": "/api/skill-health",
|
|
32
|
-
"/api/terminal/input/route": "/api/terminal/input",
|
|
33
|
-
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
34
32
|
"/api/steer/route": "/api/steer",
|
|
35
33
|
"/api/switch-root/route": "/api/switch-root",
|
|
36
|
-
"/api/
|
|
34
|
+
"/api/session/manage/route": "/api/session/manage",
|
|
35
|
+
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
36
|
+
"/api/terminal/input/route": "/api/terminal/input",
|
|
37
37
|
"/api/terminal/upload/route": "/api/terminal/upload",
|
|
38
|
+
"/api/remote-questions/route": "/api/remote-questions",
|
|
39
|
+
"/api/visualizer/route": "/api/visualizer",
|
|
38
40
|
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
41
|
+
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
39
42
|
"/api/undo/route": "/api/undo",
|
|
40
|
-
"/api/files/route": "/api/files",
|
|
41
43
|
"/api/update/route": "/api/update",
|
|
42
|
-
"/api/visualizer/route": "/api/visualizer",
|
|
43
|
-
"/api/remote-questions/route": "/api/remote-questions",
|
|
44
44
|
"/page": "/"
|
|
45
45
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/oZMtyM-zfu6Inx-S59cOl/_buildManifest.js",
|
|
8
|
+
"static/oZMtyM-zfu6Inx-S59cOl/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
11
|
"static/chunks/webpack-9014b5adb127a98a.js",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"dynamicRoutes": {},
|
|
79
79
|
"notFoundRoutes": [],
|
|
80
80
|
"preview": {
|
|
81
|
-
"previewModeId": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "988eb3e1790351e2bd2ec81c15f3d6c3",
|
|
82
|
+
"previewModeSigningKey": "a1f6df1ac4ddc17f2977b92764b92762298f9c0d3ed3b89c9ffb1d89f41d1401",
|
|
83
|
+
"previewModeEncryptionKey": "9459e5b8b042ab6134b18c350221ed2d63d56f03c030f39bb0ab05349f6b0512"
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-9014b5adb127a98a.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--oZMtyM_zfu6Inx_S59cOl--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-9014b5adb127a98a.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-9014b5adb127a98a.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"oZMtyM-zfu6Inx-S59cOl\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
7:I[90484,[],"ViewportBoundary"]
|
|
7
7
|
9:I[90484,[],"MetadataBoundary"]
|
|
8
8
|
b:I[27123,[],""]
|
|
9
|
-
0:{"P":null,"b":"
|
|
9
|
+
0:{"P":null,"b":"oZMtyM-zfu6Inx-S59cOl","c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
|
|
10
10
|
8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
11
11
|
6:null
|
|
12
12
|
a:[]
|