2026-03-10 22:28:37 -06:00
{
"name" : "gsd-pi" ,
2026-03-16 08:33:07 -06:00
"version" : "2.19.0" ,
2026-03-11 13:29:37 +04:00
"description" : "GSD — Get Shit Done coding agent" ,
2026-03-11 00:53:15 -06:00
"license" : "MIT" ,
2026-03-10 22:31:13 -06:00
"repository" : {
"type" : "git" ,
2026-03-14 14:59:02 -05:00
"url" : "https://github.com/gsd-build/gsd-2.git"
2026-03-10 22:31:13 -06:00
} ,
2026-03-14 14:59:02 -05:00
"homepage" : "https://github.com/gsd-build/gsd-2#readme" ,
2026-03-10 22:31:13 -06:00
"bugs" : {
2026-03-14 14:59:02 -05:00
"url" : "https://github.com/gsd-build/gsd-2/issues"
2026-03-10 22:31:13 -06:00
} ,
2026-03-10 22:28:37 -06:00
"type" : "module" ,
2026-03-12 21:55:17 -06:00
"workspaces" : [
"packages/*"
] ,
2026-03-10 22:28:37 -06:00
"bin" : {
2026-03-10 23:28:31 -06:00
"gsd" : "dist/loader.js" ,
"gsd-cli" : "dist/loader.js"
2026-03-10 22:28:37 -06:00
} ,
"files" : [
"dist" ,
2026-03-12 21:55:17 -06:00
"packages" ,
2026-03-10 22:28:37 -06:00
"pkg" ,
"src/resources" ,
"scripts/postinstall.js" ,
2026-03-14 10:04:12 -06:00
"scripts/link-workspace-packages.cjs" ,
2026-03-10 22:28:37 -06:00
"package.json" ,
"README.md"
] ,
"piConfig" : {
"name" : "gsd" ,
"configDir" : ".gsd"
} ,
"engines" : {
"node" : ">=20.6.0"
} ,
"scripts" : {
2026-03-12 21:55:17 -06:00
"build:pi-tui" : "npm run build -w @gsd/pi-tui" ,
"build:pi-ai" : "npm run build -w @gsd/pi-ai" ,
"build:pi-agent-core" : "npm run build -w @gsd/pi-agent-core" ,
"build:pi-coding-agent" : "npm run build -w @gsd/pi-coding-agent" ,
2026-03-13 14:05:41 -06:00
"build:native-pkg" : "npm run build -w @gsd/native" ,
"build:pi" : "npm run build:native-pkg && npm run build:pi-tui && npm run build:pi-ai && npm run build:pi-agent-core && npm run build:pi-coding-agent" ,
2026-03-14 13:36:32 -06:00
"build" : "npm run build:pi && tsc && npm run copy-resources && npm run copy-themes && npm run copy-export-html" ,
fix: read resources from dist/ to prevent branch-drift in npm-link setups (#314)
* fix: read resources from dist/ to prevent branch-drift in npm-link setups
initResources() reads extensions, prompts, skills, and agents from
src/resources/ — which points into the live working tree when gsd is
installed via npm link. Switching branches in the gsd repo changes
src/resources/ for ALL projects using gsd, causing stale or broken
extensions to be synced to ~/.gsd/agent/ on next launch.
Fix: the build step now copies src/resources/ to dist/resources/.
At runtime, resource-loader.ts and loader.ts prefer dist/resources/
(stable, set at build time) over src/resources/ (live working tree).
Fallback to src/resources/ is preserved for setups without a build.
Also adds npm run dev watch-resources watcher that syncs src/resources/
to dist/resources/ on file changes, running alongside tsc --watch.
* fix: cache prompt templates per session to prevent cross-session invalidation
When two gsd sessions run concurrently, the second session's
initResources() overwrites ~/.gsd/agent/ templates on disk. The first
session then reads a newer template that expects variables its in-memory
code doesn't know about, causing 'template declares {{X}} but no value
was provided' crashes that hang auto-mode indefinitely.
Fix: cache each template on first read. A running session uses the
template versions from when it first loaded them, immune to later
disk overwrites by other sessions.
2026-03-14 18:47:03 +01:00
"copy-resources" : "node -e \"const{cpSync,rmSync}=require('fs');rmSync('dist/resources',{recursive:true,force:true});cpSync('src/resources','dist/resources',{recursive:true,force:true})\"" ,
2026-03-12 21:55:17 -06:00
"copy-themes" : "node -e \"const{mkdirSync,cpSync}=require('fs');const{resolve}=require('path');const src=resolve(__dirname,'packages/pi-coding-agent/dist/modes/interactive/theme');mkdirSync('pkg/dist/modes/interactive/theme',{recursive:true});cpSync(src,'pkg/dist/modes/interactive/theme',{recursive:true})\"" ,
2026-03-14 13:36:32 -06:00
"copy-export-html" : "node -e \"const{mkdirSync,cpSync}=require('fs');const{resolve}=require('path');const src=resolve(__dirname,'packages/pi-coding-agent/dist/core/export-html');mkdirSync('pkg/dist/core/export-html',{recursive:true});cpSync(src,'pkg/dist/core/export-html',{recursive:true})\"" ,
feat: add GitHub Workflows skill with CI workflow and ci_monitor tool (#294)
* feat: add GitHub Workflows skill with CI workflow and ci_monitor tool
- Runs on push to main and feature branches
- Runs on pull requests to main
- Build + test pipeline using Node 22
Cross-platform CI monitoring tool for debugging GitHub Actions:
- `runs` - List recent workflow runs
- `watch` - Monitor running workflow
- `fail-fast` - Exit 1 on first failure (for scripts)
- `log-failed` - Show failed job logs
- `test-summary` - Extract test pass/fail counts
- `check-actions` - GraphQL query for action versions
- `grep` - Search logs with context
- `wait-for` - Block until deployment keyword appears
Pure Node.js - no shell interpolation, works on macOS/Windows/Linux.
Drift-immune skill that:
- Routes all CI operations through ci_monitor.cjs
- Fetches live docs from docs.github.com (no stale training data)
- Provides validation constraints (BEFORE/AFTER/EVIDENCE)
- Split tests into test:unit (141 tests, ~12s) and test:integration (5 tests)
- Fixed idle-recovery.test.ts for current implementation
- Removed AGENTS.md dead code from resource-loader.ts
- Moved npm run build out of tests (fixes ENOBUFS)
When CI fails, you need observable diagnostics:
- `gh run` output is not script-friendly
- ci_monitor.cjs provides structured output for automation
- The skill ensures AI uses the tool, not stale training data
* fix: resolve imports and path for current upstream version
- Updated imports from @mariozechner/pi-coding-agent to @gsd/pi-coding-agent
- Fixed integration test path calculation to use process.cwd()
- Kept test:unit and test:integration scripts
* fix: replace search provider preference instead of accumulating
AuthStorage.set() for api_key credentials appends to the existing list
rather than replacing. When setSearchProviderPreference was called twice
with different values, the second call appended the new value, leaving
the first value at index 0, which get() returned.
Fix: call auth.remove() before auth.set() to ensure only the latest
preference is stored.
https://claude.ai/code/session_01Qx7HRSDb117KzDZzdKk1KB
* fix: address all 10 open PR review comments
- package.json: run build before test:integration so a fresh checkout works
- pack-install.test.ts: replace execSync+shell redirects with execFileSync
argument arrays (portable, no shell parsing, paths with spaces safe)
- ci_monitor.test.ts: remove unconditional passed++ after assert; move
success message after the failed > 0 check so it only prints on success
- setup_gh.cjs: replace unzip/tar shell-outs with platform-specific
execFileSync calls (unzip on macOS, PowerShell Expand-Archive on Windows);
add compareVersions() for correct element-by-element semver comparison
- ci_monitor.cjs: add --repo/-R global option so repo is overrideable;
fix getLogs() to use gh run view --log --job instead of binary REST endpoint
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: make all changed files fully cross-platform (Windows/macOS/Linux)
- pack-install.test.ts: use tar npm package instead of tar CLI; resolve
gsd binary as gsd.cmd on Windows; skip shebang check on Windows
- setup_gh.cjs: use execFileSync for all binary invocations; replace
which with where on Windows; add Windows PATH guidance; filter preferred
install dirs by platform; unify ZIP extraction to use process.platform
consistently; escape single quotes in PowerShell Expand-Archive args
- ci_monitor.cjs: use path.join for .github/workflows paths; replace
all split('\n') with split(/\r?\n/) to handle Windows CRLF output
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* refactor: simplify and deduplicate changed files
- ci_monitor.cjs: memoize getRepo() so gh repo view subprocess runs at
most once per invocation instead of once per command call in watch loops
- pack-install.test.ts: extract packTarball() helper to eliminate
duplicate npm pack logic across two tests; remove unused contents variable
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* refactor: remove redundant existsSync before canWrite() in findInstallDir
canWrite() already returns false for non-existent directories, so the
pre-check was a TOCTOU-style redundancy with no behavioral value.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: replace tar npm package with Node built-ins (zlib + manual tar parsing)
tar is not in the dependency tree. listTarEntries() decompresses via
createGunzip() and parses the 512-byte tar block format directly,
reading name/prefix/type/size fields per POSIX ustar spec. No external
dependency required. Also fixes the broken tarball variable reference
left over from the packTarball() refactor.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* remove: drop setup_gh scripts in favour of ci_monitor
setup_gh.cjs and setup_gh.py were one-shot gh CLI installers.
ci_monitor.cjs covers the day-to-day CI use case and is the tool
the skill routes through. Environments that need gh installed can
use brew/winget/distro packages directly.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: run only unit tests in CI — integration tests cause ENOBUFS
The integration tests (npm pack → npm install → spawn node) exceed
the buffer limits of the CI runner environment. They are documented
as requiring a manual build+run step. CI now runs test:unit only.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: run all tests in CI without ENOBUFS
- ci.yml: run unit and integration as separate steps; build is already
its own step so test:integration doesn't need to rebuild
- package.json: remove npm run build from test:integration script
- pack-install.test.ts: npm install uses stdio:'ignore' to avoid
piping large output through Node buffers (root cause of ENOBUFS);
add early dist/ check with clear error message instead of rebuilding
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: resolve ENOBUFS and clean up setup_gh references
- pack-install.test.ts: derive tarball filename from package.json
instead of piping npm pack --json stdout; use stdio:ignore throughout
to avoid exhausting OS pipe buffers on CI runners
- SKILL.md: remove setup_gh install instructions; assume gh is
pre-installed via system package manager; point to ci_monitor.cjs
- github_project_setup.py: remove setup_gh.py reference from error message
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: address Copilot review comments on pack-install.test.ts
- listTarEntries: collect chunks in array, Buffer.concat once on end
instead of O(n²) repeated concat in data handler
- listTarEntries: attach error handler to createReadStream so read
errors reject the Promise instead of crashing the process
- npm pack: use stdio:['ignore','ignore','pipe'] to preserve stderr
for diagnostics while still avoiding ENOBUFS on stdout
- npm install: same — pipe stderr so failures include error output
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
---------
Co-authored-by: Claude <noreply@anthropic.com>
2026-03-14 00:31:17 -04:00
"test:unit" : "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts" ,
2026-03-16 13:25:52 -05:00
"test:coverage" : "c8 --reporter=text --reporter=lcov --exclude='src/resources/extensions/gsd/tests/**' --exclude='src/tests/**' --exclude='scripts/**' --exclude='native/**' --exclude='node_modules/**' --check-coverage --statements=40 --lines=40 --branches=0 --functions=0 node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts" ,
feat: add GitHub Workflows skill with CI workflow and ci_monitor tool (#294)
* feat: add GitHub Workflows skill with CI workflow and ci_monitor tool
- Runs on push to main and feature branches
- Runs on pull requests to main
- Build + test pipeline using Node 22
Cross-platform CI monitoring tool for debugging GitHub Actions:
- `runs` - List recent workflow runs
- `watch` - Monitor running workflow
- `fail-fast` - Exit 1 on first failure (for scripts)
- `log-failed` - Show failed job logs
- `test-summary` - Extract test pass/fail counts
- `check-actions` - GraphQL query for action versions
- `grep` - Search logs with context
- `wait-for` - Block until deployment keyword appears
Pure Node.js - no shell interpolation, works on macOS/Windows/Linux.
Drift-immune skill that:
- Routes all CI operations through ci_monitor.cjs
- Fetches live docs from docs.github.com (no stale training data)
- Provides validation constraints (BEFORE/AFTER/EVIDENCE)
- Split tests into test:unit (141 tests, ~12s) and test:integration (5 tests)
- Fixed idle-recovery.test.ts for current implementation
- Removed AGENTS.md dead code from resource-loader.ts
- Moved npm run build out of tests (fixes ENOBUFS)
When CI fails, you need observable diagnostics:
- `gh run` output is not script-friendly
- ci_monitor.cjs provides structured output for automation
- The skill ensures AI uses the tool, not stale training data
* fix: resolve imports and path for current upstream version
- Updated imports from @mariozechner/pi-coding-agent to @gsd/pi-coding-agent
- Fixed integration test path calculation to use process.cwd()
- Kept test:unit and test:integration scripts
* fix: replace search provider preference instead of accumulating
AuthStorage.set() for api_key credentials appends to the existing list
rather than replacing. When setSearchProviderPreference was called twice
with different values, the second call appended the new value, leaving
the first value at index 0, which get() returned.
Fix: call auth.remove() before auth.set() to ensure only the latest
preference is stored.
https://claude.ai/code/session_01Qx7HRSDb117KzDZzdKk1KB
* fix: address all 10 open PR review comments
- package.json: run build before test:integration so a fresh checkout works
- pack-install.test.ts: replace execSync+shell redirects with execFileSync
argument arrays (portable, no shell parsing, paths with spaces safe)
- ci_monitor.test.ts: remove unconditional passed++ after assert; move
success message after the failed > 0 check so it only prints on success
- setup_gh.cjs: replace unzip/tar shell-outs with platform-specific
execFileSync calls (unzip on macOS, PowerShell Expand-Archive on Windows);
add compareVersions() for correct element-by-element semver comparison
- ci_monitor.cjs: add --repo/-R global option so repo is overrideable;
fix getLogs() to use gh run view --log --job instead of binary REST endpoint
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: make all changed files fully cross-platform (Windows/macOS/Linux)
- pack-install.test.ts: use tar npm package instead of tar CLI; resolve
gsd binary as gsd.cmd on Windows; skip shebang check on Windows
- setup_gh.cjs: use execFileSync for all binary invocations; replace
which with where on Windows; add Windows PATH guidance; filter preferred
install dirs by platform; unify ZIP extraction to use process.platform
consistently; escape single quotes in PowerShell Expand-Archive args
- ci_monitor.cjs: use path.join for .github/workflows paths; replace
all split('\n') with split(/\r?\n/) to handle Windows CRLF output
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* refactor: simplify and deduplicate changed files
- ci_monitor.cjs: memoize getRepo() so gh repo view subprocess runs at
most once per invocation instead of once per command call in watch loops
- pack-install.test.ts: extract packTarball() helper to eliminate
duplicate npm pack logic across two tests; remove unused contents variable
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* refactor: remove redundant existsSync before canWrite() in findInstallDir
canWrite() already returns false for non-existent directories, so the
pre-check was a TOCTOU-style redundancy with no behavioral value.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: replace tar npm package with Node built-ins (zlib + manual tar parsing)
tar is not in the dependency tree. listTarEntries() decompresses via
createGunzip() and parses the 512-byte tar block format directly,
reading name/prefix/type/size fields per POSIX ustar spec. No external
dependency required. Also fixes the broken tarball variable reference
left over from the packTarball() refactor.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* remove: drop setup_gh scripts in favour of ci_monitor
setup_gh.cjs and setup_gh.py were one-shot gh CLI installers.
ci_monitor.cjs covers the day-to-day CI use case and is the tool
the skill routes through. Environments that need gh installed can
use brew/winget/distro packages directly.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: run only unit tests in CI — integration tests cause ENOBUFS
The integration tests (npm pack → npm install → spawn node) exceed
the buffer limits of the CI runner environment. They are documented
as requiring a manual build+run step. CI now runs test:unit only.
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: run all tests in CI without ENOBUFS
- ci.yml: run unit and integration as separate steps; build is already
its own step so test:integration doesn't need to rebuild
- package.json: remove npm run build from test:integration script
- pack-install.test.ts: npm install uses stdio:'ignore' to avoid
piping large output through Node buffers (root cause of ENOBUFS);
add early dist/ check with clear error message instead of rebuilding
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: resolve ENOBUFS and clean up setup_gh references
- pack-install.test.ts: derive tarball filename from package.json
instead of piping npm pack --json stdout; use stdio:ignore throughout
to avoid exhausting OS pipe buffers on CI runners
- SKILL.md: remove setup_gh install instructions; assume gh is
pre-installed via system package manager; point to ci_monitor.cjs
- github_project_setup.py: remove setup_gh.py reference from error message
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
* fix: address Copilot review comments on pack-install.test.ts
- listTarEntries: collect chunks in array, Buffer.concat once on end
instead of O(n²) repeated concat in data handler
- listTarEntries: attach error handler to createReadStream so read
errors reject the Promise instead of crashing the process
- npm pack: use stdio:['ignore','ignore','pipe'] to preserve stderr
for diagnostics while still avoiding ENOBUFS on stdout
- npm install: same — pipe stderr so failures include error output
https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM
---------
Co-authored-by: Claude <noreply@anthropic.com>
2026-03-14 00:31:17 -04:00
"test:integration" : "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*integration*.test.ts src/tests/integration/*.test.ts" ,
"test" : "npm run test:unit && npm run test:integration" ,
2026-03-13 00:56:23 -06:00
"test:browser-tools" : "node --test src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs" ,
2026-03-13 12:21:09 -06:00
"test:native" : "node --test packages/native/src/__tests__/grep.test.mjs" ,
"build:native" : "node native/scripts/build.js" ,
"build:native:dev" : "node native/scripts/build.js --dev" ,
fix: read resources from dist/ to prevent branch-drift in npm-link setups (#314)
* fix: read resources from dist/ to prevent branch-drift in npm-link setups
initResources() reads extensions, prompts, skills, and agents from
src/resources/ — which points into the live working tree when gsd is
installed via npm link. Switching branches in the gsd repo changes
src/resources/ for ALL projects using gsd, causing stale or broken
extensions to be synced to ~/.gsd/agent/ on next launch.
Fix: the build step now copies src/resources/ to dist/resources/.
At runtime, resource-loader.ts and loader.ts prefer dist/resources/
(stable, set at build time) over src/resources/ (live working tree).
Fallback to src/resources/ is preserved for setups without a build.
Also adds npm run dev watch-resources watcher that syncs src/resources/
to dist/resources/ on file changes, running alongside tsc --watch.
* fix: cache prompt templates per session to prevent cross-session invalidation
When two gsd sessions run concurrently, the second session's
initResources() overwrites ~/.gsd/agent/ templates on disk. The first
session then reads a newer template that expects variables its in-memory
code doesn't know about, causing 'template declares {{X}} but no value
was provided' crashes that hang auto-mode indefinitely.
Fix: cache each template on first read. A running session uses the
template versions from when it first loaded them, immune to later
disk overwrites by other sessions.
2026-03-14 18:47:03 +01:00
"dev" : "node scripts/dev.js" ,
2026-03-14 10:04:12 -06:00
"postinstall" : "node scripts/link-workspace-packages.cjs && node scripts/postinstall.js" ,
2026-03-11 13:34:03 -07:00
"pi:install-global" : "node scripts/install-pi-global.js" ,
"pi:uninstall-global" : "node scripts/uninstall-pi-global.js" ,
2026-03-11 09:07:17 +01:00
"sync-pkg-version" : "node scripts/sync-pkg-version.cjs" ,
2026-03-13 14:36:18 -06:00
"sync-platform-versions" : "node native/scripts/sync-platform-versions.cjs" ,
2026-03-14 10:04:12 -06:00
"validate-pack" : "bash scripts/validate-pack.sh" ,
2026-03-15 19:26:45 -06:00
"typecheck:extensions" : "tsc --noEmit --project tsconfig.extensions.json" ,
"prepublishOnly" : "npm run sync-pkg-version && npm run sync-platform-versions && git diff --exit-code || (echo 'ERROR: version sync changed files — commit them before publishing' && exit 1) && npm run build && npm run typecheck:extensions && npm run validate-pack"
2026-03-10 22:28:37 -06:00
} ,
"dependencies" : {
2026-03-14 11:16:14 -06:00
"@anthropic-ai/sdk" : "^0.73.0" ,
"@aws-sdk/client-bedrock-runtime" : "^3.983.0" ,
2026-03-12 09:18:13 -06:00
"@clack/prompts" : "^1.1.0" ,
2026-03-14 11:16:14 -06:00
"@google/genai" : "^1.40.0" ,
"@mariozechner/jiti" : "^2.6.2" ,
"@mistralai/mistralai" : "1.14.1" ,
"@silvia-odwyer/photon-node" : "^0.3.4" ,
"@sinclair/typebox" : "^0.34.41" ,
"@types/mime-types" : "^2.1.4" ,
"ajv" : "^8.17.1" ,
"ajv-formats" : "^3.0.1" ,
"chalk" : "^5.5.0" ,
"diff" : "^8.0.2" ,
"extract-zip" : "^2.0.1" ,
"file-type" : "^21.1.1" ,
"get-east-asian-width" : "^1.3.0" ,
"glob" : "^13.0.1" ,
"hosted-git-info" : "^9.0.2" ,
"ignore" : "^7.0.5" ,
"marked" : "^15.0.12" ,
"mime-types" : "^3.0.1" ,
"minimatch" : "^10.2.3" ,
"openai" : "6.26.0" ,
2026-03-12 09:18:13 -06:00
"picocolors" : "^1.1.1" ,
feat: TTSR + blob/artifact storage (ported from oh-my-pi)
* docs(M002): context, requirements, and roadmap
* feat: port TTSR and blob/artifact storage from oh-my-pi
Phase 1 — TTSR (Time Traveling Stream Rules):
- TtsrManager: regex-based stream monitoring with scope filtering,
repeat gating, and buffer isolation (picomatch replaces Bun.Glob)
- Rule loader: scans ~/.gsd/agent/rules/*.md and .gsd/rules/*.md
with YAML frontmatter parsing; project rules override global
- TTSR extension: wires into pi event lifecycle (session_start,
turn_start, message_update, turn_end, agent_end) to abort on
match and inject violation as system reminder via sendMessage
- Interrupt template for rule violation injection
Phase 2 — Blob/Artifact Storage:
- BlobStore: content-addressed storage at ~/.gsd/agent/blobs/ using
Node crypto (sha256), sync I/O, automatic deduplication
- ArtifactManager: session-scoped sequential artifact files stored
alongside session JSONL (lazy dir creation, resume-safe ID scan)
- Session manager integration: prepareForPersistence externalizes
images ≥1KB to blob store before JSONL write; resolveBlobRefs
rehydrates on session load; truncates strings >500KB
- Bash tool artifact spill: uses ArtifactManager instead of temp
files when available, includes artifact:// references in output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: harden blob store, TTSR manager, and dep classification
- Validate SHA-256 hex format in BlobStore.get/has/parseBlobRef to
prevent path traversal via crafted blob references
- Cap TTSR per-stream buffers at 512KB to prevent unbounded memory growth
- Move picomatch from devDependencies to dependencies (runtime import)
- Warn on invalid regex in TTSR rule conditions instead of silent skip
- Remove .gsd/ planning files that were force-added past .gitignore
- Add trailing newline to ttsr-interrupt.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add tests for blob store, artifact manager, TTSR manager, and rule loader
55 tests covering:
- BlobStore put/get/has, idempotency, path traversal rejection
- parseBlobRef/isBlobRef validation, externalize/resolve round-trips
- ArtifactManager sequential IDs, lazy dir creation, session resume
- TtsrManager rule matching, scope filtering, buffer isolation,
repeat gating, buffer size cap, injection persistence
- Rule loader frontmatter parsing, directory scanning, merge logic
Also fixes BlobStore constructor to avoid TS parameter property syntax
(incompatible with Node's strip-only TypeScript mode).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 08:43:56 -06:00
"picomatch" : "^4.0.3" ,
2026-03-12 23:49:36 -06:00
"playwright" : "^1.58.2" ,
2026-03-14 11:16:14 -06:00
"proper-lockfile" : "^4.1.2" ,
"proxy-agent" : "^6.5.0" ,
2026-03-14 10:45:52 -06:00
"sharp" : "^0.34.5" ,
2026-03-14 11:16:14 -06:00
"sql.js" : "^1.14.1" ,
"strip-ansi" : "^7.1.0" ,
"undici" : "^7.24.2" ,
"yaml" : "^2.8.2" ,
"zod-to-json-schema" : "^3.24.6"
2026-03-10 22:28:37 -06:00
} ,
"devDependencies" : {
"@types/node" : "^22.0.0" ,
feat: TTSR + blob/artifact storage (ported from oh-my-pi)
* docs(M002): context, requirements, and roadmap
* feat: port TTSR and blob/artifact storage from oh-my-pi
Phase 1 — TTSR (Time Traveling Stream Rules):
- TtsrManager: regex-based stream monitoring with scope filtering,
repeat gating, and buffer isolation (picomatch replaces Bun.Glob)
- Rule loader: scans ~/.gsd/agent/rules/*.md and .gsd/rules/*.md
with YAML frontmatter parsing; project rules override global
- TTSR extension: wires into pi event lifecycle (session_start,
turn_start, message_update, turn_end, agent_end) to abort on
match and inject violation as system reminder via sendMessage
- Interrupt template for rule violation injection
Phase 2 — Blob/Artifact Storage:
- BlobStore: content-addressed storage at ~/.gsd/agent/blobs/ using
Node crypto (sha256), sync I/O, automatic deduplication
- ArtifactManager: session-scoped sequential artifact files stored
alongside session JSONL (lazy dir creation, resume-safe ID scan)
- Session manager integration: prepareForPersistence externalizes
images ≥1KB to blob store before JSONL write; resolveBlobRefs
rehydrates on session load; truncates strings >500KB
- Bash tool artifact spill: uses ArtifactManager instead of temp
files when available, includes artifact:// references in output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: harden blob store, TTSR manager, and dep classification
- Validate SHA-256 hex format in BlobStore.get/has/parseBlobRef to
prevent path traversal via crafted blob references
- Cap TTSR per-stream buffers at 512KB to prevent unbounded memory growth
- Move picomatch from devDependencies to dependencies (runtime import)
- Warn on invalid regex in TTSR rule conditions instead of silent skip
- Remove .gsd/ planning files that were force-added past .gitignore
- Add trailing newline to ttsr-interrupt.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add tests for blob store, artifact manager, TTSR manager, and rule loader
55 tests covering:
- BlobStore put/get/has, idempotency, path traversal rejection
- parseBlobRef/isBlobRef validation, externalize/resolve round-trips
- ArtifactManager sequential IDs, lazy dir creation, session resume
- TtsrManager rule matching, scope filtering, buffer isolation,
repeat gating, buffer size cap, injection persistence
- Rule loader frontmatter parsing, directory scanning, merge logic
Also fixes BlobStore constructor to avoid TS parameter property syntax
(incompatible with Node's strip-only TypeScript mode).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 08:43:56 -06:00
"@types/picomatch" : "^4.0.2" ,
2026-03-16 13:25:52 -05:00
"c8" : "^11.0.0" ,
2026-03-13 00:56:23 -06:00
"jiti" : "^2.6.1" ,
2026-03-10 22:28:37 -06:00
"typescript" : "^5.4.0"
2026-03-10 23:28:31 -06:00
} ,
2026-03-13 14:48:14 +00:00
"optionalDependencies" : {
2026-03-13 19:20:44 -03:00
"@gsd-build/engine-darwin-arm64" : ">=2.10.2" ,
"@gsd-build/engine-darwin-x64" : ">=2.10.2" ,
"@gsd-build/engine-linux-arm64-gnu" : ">=2.10.2" ,
2026-03-16 13:25:52 -05:00
"@gsd-build/engine-linux-x64-gnu" : ">=2.10.2" ,
2026-03-13 19:20:44 -03:00
"@gsd-build/engine-win32-x64-msvc" : ">=2.10.2" ,
2026-03-14 11:16:14 -06:00
"fsevents" : "~2.3.3" ,
"koffi" : "^2.9.0"
2026-03-13 14:48:14 +00:00
} ,
2026-03-10 23:28:31 -06:00
"overrides" : {
"gaxios" : "7.1.4"
2026-03-10 22:28:37 -06:00
}
}