Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ scripts/.pii-denylist
.beads-credential-key
.beads/proxieddb/
.beads-ats.env

# MCP publisher credentials (some publisher versions store login in CWD)
.mcpregistry_*
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@

# Changelog

## 0.15.0 - Reviewed writes and CLI state integrity

Pending release.

- **Restore preflight.** State exports carry per-file SHA-256 checksums. Import validates all recognized files, JSON/JSONL shapes, schema versions and supplied checksums before its first write; dry-run performs the same validation. Valid older bundles remain compatible.
- **Reviewed target checks.** Staged task writes capture a revision of the target's logical fields. Apply re-reads the target and refuses changed or unreadable state with exit 3, including title, body, tags, status and relationships. The check is optimistic: backend writes without native conditional-update support can still race after the read.
- **Exclusive review apply.** One process durably claims an approved task write before calling its adapter. Other apply processes cannot execute that item. A crashed claim stays `applying`; an uncertain failure stays `failed`, requiring backend inspection and a fresh proposal instead of automatic retry.
- **Argument contracts.** Known boolean flags preserve following positionals, `--flag=false` stays false, `--` preserves literal flag-shaped arguments, and known value flags reject missing values through the JSON error contract.
- **Approval payload binding.** Approval records a digest of the staged kind and payload. Modified payloads and older approvals without a digest cannot apply; stage and approve a fresh proposal.
- **Bounded diagnostics.** Doctor bounds import, auth, adapter-cache, vector and full retrieval probes with `--timeout-ms` (4 seconds per probe by default). Degraded retrieval reports warnings; timed-out commands flush their diagnostic document before exiting.
- **Strict read option.** `--require-complete` returns exit 2 for stale, degraded or explicitly incomplete read results while preserving stdout. Doctor uses the same option for warning-only reports; hard diagnostic failures remain exit 1. `--fresh` and `--no-cache` bypass corpus cache reads.
- **Source-scoped corpus cache.** The CLI tags its corpus cache with a digest of adapter identity, working directory and source configuration. Fresh, stale and delta paths reject other scopes. An untagged cache refreshes once; custom adapters can set `ATS_CACHE_NAMESPACE` for additional source identity.
- **Lock ownership.** State locks record PID and host. Age alone cannot reclaim a living local owner, and a holder's cleanup preserves a replacement lock. Old metadata-free locks retain stale recovery.


## 0.14.0 - Versioned context and reliable automation contracts

Released 2026-09-17.
Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,20 @@ npm run prove:beads
npm run prove:progress
```

Reviewed task writes bind approval to the exact staged payload and check the
current task revision before applying. Only one process can claim an item.
Inspect `ats review list --all` after an interrupted apply: `applying` or `failed`
items require checking the backend before staging a fresh proposal. Older
approvals without payload digests must also be staged and approved again.

For automation that requires a complete read, use
`ats find QUERY --require-complete --fresh --json`. Stale, degraded or explicitly
incomplete results keep their JSON output and exit 2; ordinary reads preserve
their existing permissive exit behavior. Doctor supports the same strict option and bounds
each probe: `ats doctor --timeout-ms 1000 --require-complete --json`.
State import validates recognized file contents and any supplied checksums even
with `--dry-run`, before writing any file.

## Use it from any MCP client (Claude Code, Claude Desktop, Cursor, Windsurf, OpenCode)

[`@reneza/ats-mcp`](packages/mcp) exposes the active adapter as a tool set spanning retrieval, CRUD, and execution context (`find`, `get_task`, `create_task`, `set_task_intent`, `add_task_link`, `resolve_task_links`, `context_for_task`, `record_action`, `undo_write`, `poll_task_events`, and more). For Claude Code this provides persistent context between sessions without replacing the task system as the source of truth; optional caches and vector indexes remain derived retrieval state.
Expand Down
41 changes: 41 additions & 0 deletions docs/releasing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Releasing ATS

ATS is a JavaScript npm-workspaces monorepo. Publish its public npm packages,
the existing MCP server manifest, and one matching GitHub Release. The private
workspace is excluded. There is no Python distribution.

Before publishing, the release PR must be reviewed and accepted at its final
commit. Merge the reviewed commit, then use a clean checkout of that merged
revision. A changed PR needs another review. No registry publication belongs
in the PR CI job.

```sh
npm ci
npm test
npm run check:publish
npm run check:release
mcp-publisher validate server.json
```

Check npm credentials with `npm whoami`. Publish core first, then the public
adapters, then CLI and MCP; consumers must not receive a package whose required
ATS dependency version is missing from npm. Use `npm publish --access public
--workspace PACKAGE_NAME` for each public workspace. Skip already-published
versions only after confirming the registry artifact matches the intended
release; npm package versions are immutable.

After all public packages are available, install the released CLI in a clean
directory and smoke-test `ats --version`, adapter configuration, `find`, and
`doctor`. Initialize the published MCP server over stdio and list its tools.
Check that `server.json` pins the published MCP package version and that the
package's `mcpName` matches the registry namespace.

Authenticate the MCP publisher with `mcp-publisher login github` if necessary,
then run `mcp-publisher publish server.json`. Verify the exact version in the
registry before creating the matching `vVERSION` GitHub Release from the merged
commit. Use the current changelog entry for its release notes. If publishing
stops partway, record the successful packages and resume from the remaining
ones; never mark the release complete while a required destination is missing.

Authentication details are documented by [npm](https://docs.npmjs.com/trusted-publishers/)
and the [MCP registry](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/cli/commands.md).
15 changes: 14 additions & 1 deletion docs/state-integrity.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,20 @@ whether the state they received is complete.
- `ats batch --journal` records each item outcome, so a stopped batch resumes
by stable item id. Partial failure exits 5 and keeps successful item results.
- `ats state doctor` checks local schemas and permissions without rewriting
files; `ats state import --dry-run` previews its local write set.
files; `ats state import --dry-run` validates its contents and previews its local write set.
- State imports validate every recognized file before writing; exported SHA-256
checksums detect changed content. This is preflight validation, not a cross-file
transaction: a later filesystem failure may still leave a partial restore.
- Reviewed task writes bind approval to a payload digest and claim each item
before an external call. Target revisions are checked immediately before apply.
Backend-native compare-and-swap is required to eliminate the remaining race
between that read and the backend write.
- `--require-complete` keeps read output but exits 2 for stale, degraded or
explicitly incomplete results. Default read exits remain permissive.
- CLI corpus caches are scoped to adapter, working directory and configuration.
Library callers using the cache directly can supply a `scope`; custom CLI
adapters can set `ATS_CACHE_NAMESPACE` when their source identity is otherwise
outside the standard configuration.
- JSON errors use stable categories (`validation`, `precondition`,
`authentication`, `timeout`, `transport`, `internal`) and say whether a
retry can help. Exit 3 is a failed write precondition, 5 a partial batch, and
Expand Down
60 changes: 30 additions & 30 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentic-task-system",
"version": "0.14.0",
"version": "0.15.0",
"private": true,
"type": "module",
"description": "Your task manager is the best agent memory you're not using. Agent-native context layer over your existing task app, with hybrid retrieval (RRF) and pluggable storage adapters.",
Expand All @@ -18,7 +18,8 @@
"prove:beads": "node examples/beads/prove.mjs --json",
"prove:progress": "node packages/core/bench/progress.js --episodes=packages/core/bench/data/progress-episodes.jsonl --format=json",
"test:fast": "node --test --test-timeout=30000 packages/core/test/*.test.js packages/mcp/test/*.test.js packages/cli/test/*.test.js packages/adapter-airtable/test/*.test.js packages/adapter-beads/test/*.test.js packages/adapter-composite/test/*.test.js packages/adapter-github/test/*.test.js packages/adapter-google/test/*.test.js packages/adapter-notion/test/*.test.js packages/adapter-obsidian/test/*.test.js packages/adapter-okf/test/*.test.js packages/adapter-taskmaster/test/*.test.js packages/adapter-ticktick/test/*.test.js packages/adapter-ticktick-cache/test/*.test.js",
"test": "npm run lint && npm run check:pii && npm run check:claims && npm run test:fast && npm run prove:intent -- --json && npm run prove:taskmaster && npm run prove:beads && npm run prove:progress"
"test": "npm run lint && npm run check:pii && npm run check:claims && npm run test:fast && npm run prove:intent -- --json && npm run prove:taskmaster && npm run prove:beads && npm run prove:progress",
"check:release": "node scripts/check-release.mjs"
},
"license": "MIT",
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-airtable/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-airtable",
"version": "0.14.0",
"version": "0.15.0",
"description": "Airtable adapter for Agentic Task System. Expose any Airtable base as agent-queryable records through ATS retrieval, RRF fusion, and MCP — a table is a project, a record is a task. Adapter, not migration.",
"type": "module",
"main": "index.js",
Expand All @@ -12,7 +12,7 @@
"test": "node --test"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"dependencies": {},
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-beads/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-beads",
"version": "0.14.0",
"version": "0.15.0",
"description": "Beads adapter for Agentic Task System using the official bd JSON CLI over repository-local Dolt state.",
"type": "module",
"main": "index.js",
Expand All @@ -13,7 +13,7 @@
"prepublishOnly": "node ../../scripts/check-no-pii.mjs --self"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"repository": {
"type": "git",
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-composite/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-composite",
"version": "0.14.0",
"version": "0.15.0",
"description": "Cross-source adapter for the Agentic Task System. Query GitHub + Notion + TickTick + any ATS backends as ONE fused corpus: a single `ats find` returns one RRF-ranked list across all of them, each result tagged with its backend. The thing a single-vendor MCP server can't do.",
"type": "module",
"main": "index.js",
Expand All @@ -12,7 +12,7 @@
"test": "node --test"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"dependencies": {},
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-github/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-github",
"version": "0.14.0",
"version": "0.15.0",
"description": "GitHub Issues adapter for Agentic Task System. Expose any repository's issues as agent-queryable tasks through ATS retrieval, RRF fusion, and MCP — a repo is a project, an issue is a task. Adapter, not migration.",
"type": "module",
"main": "index.js",
Expand All @@ -12,7 +12,7 @@
"test": "node --test"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"dependencies": {},
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-google/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-google",
"version": "0.14.0",
"version": "0.15.0",
"description": "Google Workspace adapter for Agentic Task System. Pull Google Sheets, Docs, and Slides into ATS retrieval and MCP as a read-only corpus, authed as a dedicated share-scoped user. Adapter, not migration.",
"type": "module",
"main": "index.js",
Expand All @@ -12,7 +12,7 @@
"test": "node --test"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"dependencies": {},
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-notion/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@reneza/ats-adapter-notion",
"version": "0.14.0",
"version": "0.15.0",
"description": "Notion adapter for Agentic Task System. Expose any Notion database as agent-queryable pages through ATS retrieval, RRF fusion, and MCP — a database is a project, a page is a task. Adapter, not migration.",
"type": "module",
"main": "index.js",
Expand All @@ -12,7 +12,7 @@
"test": "node --test"
},
"peerDependencies": {
"@reneza/ats-core": "^0.14.0"
"@reneza/ats-core": "^0.15.0"
},
"dependencies": {},
"repository": {
Expand Down
Loading
Loading