Repository navigation
[1.16.260719] — 2026-07-19
Added
devassets import --root <path>: batch-register every subdirectory as a project (onboarding an existing multi-project setup), with--dry-run,--no-scan,--type.devassets key-export/devassets key-restore: password-encrypted backup and recovery for the vault signature key. Previously, losingsignature.keymeant every stored secret was permanently unrecoverable with no way back.devassets_resolve_project(cwd)MCP tool: resolves a working directory to its registered project ID in one call, picking the most specific match when a parent and a nested project are both registered.assessApiKeyAge(written early in development, never called) is now wired intodoctor— flags vault secrets approaching or past rotation age.doctornow detects a key name duplicated across 2+ projects that should probably live in_globalinstead — the exact real-world mistake that drove the 1.15 release.scripts/check-docs-sync.mjs: a release-time check that README's command table, MCP tool list, and identity-provider table actually match the source, wired intoprepublishOnlyand CI.
Fixed
- Security: MCP
devassets_export's auto-generated output path could escape the working directory via a crafted environment value, and (once fixed) still didn't guard against a pre-existing symlink at the write target; cross-project secret fallback removed fromgetVaultSecretFallbackso a project can no longer silently receive another project's secret;.devassets.ymlroots:entries that escape the project directory (via../or a symlink) are rejected;devassets_add_projectblocks registering the home directory, including via a symlink to it; thegcloudprovider's credential-file reads are fenced to the project directory and symlink-safe; the publiccheck.ymlreusable workflow no longer interpolates${{ inputs.* }}directly into shell steps;export --encrypt/--encrypt-forvalidation is now consistent in both directions (either flag alone correctly triggers encryption; it can no longer silently fall back to plaintext). devassets runnever actually executed the target command. A Commander v12 argument-parsing assumption was wrong, so every invocation tried to spawn the project ID itself and failed with ENOENT. This path had zero test coverage until this release.payment_platformsstatus is now actually persisted aftercheck(previously computed live and discarded), and a subsequentscan/doctor --fixno longer resets it back tounconfigured.- Closed a TOCTOU window in signature-key/DB-file creation; schema migrations now run once instead of on every CLI invocation.
devassets run's audit log now reflects the child process's actual exit status instead of always recording success.- Removed the orphaned
ui/subproject (never had a working backend) and the owner's private multi-project catalog data that was being compiled into the published package — now an optional external override file, not shipped. - Fixed the actual root cause of npm being stuck on the broken
1.13.260619release for a month:.github/workflows/publish.ymlhad been drafted weeks earlier but never reached GitHub (blocked by a stale.gitignorerule left from an unrelated, since-resolved OAuth-scope workaround), and separately called a nonexistentbuild:allscript.
Why
A full audit pass (multi-dimensional review plus a strategic analysis pass) surfaced roughly twenty hardening items alongside several pre-existing infra issues; fixing them is what surfaced the devassets run bug and the broken publish pipeline. Before merging, two independent adversarial reviews were run against the full diff and both found real issues — including a systematic pattern where every path-boundary check added during this pass compared lexical paths instead of symlink-resolved ones, making all of them bypassable. src/utils/fs-safety.ts (new) centralizes the fix.