prjct-cli 2.39.0 → 2.41.0
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/CHANGELOG.md +27 -9
- package/README.md +7 -4
- package/dist/bin/prjct-core.mjs +372 -363
- package/dist/daemon/entry.mjs +288 -254
- package/dist/mcp/server.mjs +176 -175
- package/dist/templates.json +1 -1
- package/package.json +1 -1
- package/templates/antigravity/SKILL.md +1 -0
- package/templates/codex/SKILL.md +1 -0
- package/templates/global/ANTIGRAVITY.md +1 -0
- package/templates/global/CURSOR.mdc +1 -0
- package/templates/global/GEMINI.md +1 -0
- package/templates/global/WINDSURF.md +1 -0
- package/templates/skills/prjct/SKILL.md +13 -18
package/CHANGELOG.md
CHANGED
|
@@ -2,16 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## [2.41.0] - 2026-06-09
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **Daemon could serve output from an outdated build (the recurring "stale daemon" trap).** Two compounding defects: staleness was detected *after* the daemon decided to serve, so the request that first observed a new build/install was still answered by the old code; and on refusal the client printed `Daemon restarting — retry the command` and exited 1, so the command never ran (1st call stale → 2nd fails → 3rd fresh). Now staleness is detected *before* serving, the daemon refuses cleanly with a `retry` signal (the request never executes → zero side effects), and **both `bin/prjct.ts` and the daemon shim** (`scripts/build.js` → `dist/bin/prjct.mjs`, what users actually run) transparently fall through to direct in-process execution on the fresh code — no error, no manual re-run. Hooks degrade to the fail-soft `{}` no-op. The global-install version-drift check is now time-throttled (1s) instead of every-10-commands (which could leak up to 9 stale responses). Closes the "stale daemon caches old hook code" gotcha.
|
|
9
|
-
- **`prjct embeddings test` no longer truncates its failure** to 65 chars (`embeddings endpoi…`). It now prints the full endpoint response plus an actionable hint (401 → base-url/key mismatch, 404 → wrong route, network → unreachable) — the one command meant to diagnose connectivity stopped hiding the diagnosis.
|
|
10
|
-
- **Embeddings test isolation:** `global-config` resolves its directory lazily from `PRJCT_CLI_HOME`, so config/embeddings tests no longer read the developer's real `~/.prjct-cli`.
|
|
7
|
+
Memory recall + apply-loop: prjct now *applies* what it learns at the moment it matters, not just on demand — and the knowledge survives model updates.
|
|
11
8
|
|
|
12
9
|
### Added
|
|
13
|
-
-
|
|
14
|
-
-
|
|
10
|
+
- **`prjct search "<query>"`** — first-class memory recall verb over the blended BM25 + semantic + recency pipeline (`prjct search mem_1234` resolves an entry by id). Before this, `prjct search "x"` was an unknown verb that fell through the GTD auto-route and silently *captured* the query to the inbox instead of searching.
|
|
11
|
+
- **`prjct forget <id>`** — the delete half of `remember`. Hard-deletes the source event and drops the FTS mirror + any embedding, so an entry can't resurface lexically or semantically; regenerates the vault. Accepts `mem_1234`, `mem-1234`, or a bare `1234`. (`projectMemory.forget()` existed but had no CLI verb — `prjct remember forget <id>` used to just create a junk `type:forget` entry.)
|
|
12
|
+
- **Apply-loop push hooks (Claude).** Anticipation was pull-only (`prjct guard` / the `prjct_guard` MCP tool), which depends on the agent *remembering* to ask — and a freshly-updated model starts with that instinct reset and zero conversation context. Now Claude also gets two targeted pushes (both fire regardless of model = update-proof): a `PreToolUse(Edit|Write)` hook surfaces a file's preventive memory (gotchas/anti-patterns) the moment it's edited, and `SessionStart` injects a compact knowledge digest (top traps + decisions in force + a `developer.md` pointer) on cold start. Pull stays for non-Claude agents. The digest only injects on cold-start sources (`startup`/`clear`/`compact`), never the warm-prefix reusers (`resume`/subagent/cwd-change), so the prompt-cache-stability contract is preserved.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- **Slimmed the always-on prjct skill** to curb Opus 4.8 over-routing: a DIRECT-by-default gate, heavy quality workflows (`review`/`qa`/`security`/`investigate`/`audit`) moved out of the lean body into `workflows.md`, and an explicit subagent model-downgrade policy.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- **Tests no longer write vaults into the real `~/Documents/prjct/`.** `getWikiPath` resolved the vault root off `os.homedir()` with no override, so any test that made a tmp project and triggered vault generation left an orphan `~/Documents/prjct/<tmp-slug>/` behind (hundreds accumulated). New `getVaultRoot()` honors `PRJCT_VAULT_ROOT` (mirrors `PRJCT_OBSIDIAN_CONFIG_DIR`); the global test preload sandboxes it to a throwaway temp dir, removed on exit.
|
|
19
|
+
|
|
20
|
+
## [2.40.0] - 2026-06-02
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
- per-worktree active tasks — multi-agent runtime (#413)
|
|
25
|
+
|
|
26
|
+
**Multi-agent: per-worktree active tasks.** prjct's single-`currentTask` runtime now supports several AI agents working concurrently, each in its own git worktree, without clobbering a shared task. A deterministic `workspaceId` (derived from the git worktree root) keys each task into the existing `activeTasks[]` layer; the main worktree keeps the singular `currentTask` path, so single-agent use is unchanged. The single-task gate is now evaluated **per workspace** (a task in worktree A no longer blocks worktree B; a second task in the *same* worktree still gates), atomic inside the SQLite compare-and-set updater. Wiring lives at one choke point — `task-service` (`startTask`/`setTaskStatus`/`resolveActiveTask`/`completeActiveTask`) — inherited by the CLI, the MCP `prjct_task_*` tools, and `prjct ship`. Every read path (`prjct task`/`status` no-arg, `prjct remember` attribution, the session hooks, `prjct_task_status`, `prjct_workflow_status`) now resolves the **current worktree's** task and renders a workspace label (`shortId · branch`) plus a multi-workspace list, so it's always clear which worktree a task belongs to. Pause/resume **per worktree** is a planned follow-up (a child-worktree `prjct status paused` returns an explicit "unsupported" rather than a silent no-op); `done`/`ship` isolate correctly today.
|
|
15
27
|
|
|
16
28
|
## [2.39.0] - 2026-06-02
|
|
17
29
|
|
|
@@ -19,6 +31,14 @@ The long-lived daemon no longer serves stale code, and embeddings reach any prov
|
|
|
19
31
|
|
|
20
32
|
- zero-config embeddings (any provider) + fix daemon never serves stale code (#412)
|
|
21
33
|
|
|
34
|
+
### Fixed
|
|
35
|
+
- **Daemon could serve output from an outdated build (the recurring "stale daemon" trap).** Two compounding defects: staleness was detected *after* the daemon decided to serve, so the request that first observed a new build/install was still answered by the old code; and on refusal the client printed `Daemon restarting — retry the command` and exited 1, so the command never ran (1st call stale → 2nd fails → 3rd fresh). Now staleness is detected *before* serving, the daemon refuses cleanly with a `retry` signal (the request never executes → zero side effects), and **both `bin/prjct.ts` and the daemon shim** (`scripts/build.js` → `dist/bin/prjct.mjs`, what users actually run) transparently fall through to direct in-process execution on the fresh code — no error, no manual re-run. Hooks degrade to the fail-soft `{}` no-op. The global-install version-drift check is now time-throttled (1s) instead of every-10-commands (which could leak up to 9 stale responses). Closes the "stale daemon caches old hook code" gotcha.
|
|
36
|
+
- **`prjct embeddings test` no longer truncates its failure** to 65 chars (`embeddings endpoi…`). It now prints the full endpoint response plus an actionable hint (401 → base-url/key mismatch, 404 → wrong route, network → unreachable) — the one command meant to diagnose connectivity stopped hiding the diagnosis.
|
|
37
|
+
- **Embeddings test isolation:** `global-config` resolves its directory lazily from `PRJCT_CLI_HOME`, so config/embeddings tests no longer read the developer's real `~/.prjct-cli`.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- **Zero-config embeddings setup — paste just the key.** `prjct embeddings set --key <k>` now infers the base URL from the key's prefix (`sk-or-…` → OpenRouter, `sk-…` → OpenAI, `pa-…` → Voyage; `sk-ant-`/Groq/unknown → keep default), so `--base-url` is optional for known providers. An explicit `--base-url` still wins, and detection re-fires when you switch keys. `set` is now partial-update friendly too: `set --key …` keeps your existing model/base URL instead of resetting them.
|
|
41
|
+
- **Embeddings support ANY OpenAI-compatible provider, including non-Bearer ones.** Already worked with OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio, … via `--base-url` + `--model` + `--key`; now providers that deviate from `Authorization: Bearer` are covered too — e.g. **Azure OpenAI** (`api-key` header + `api-version` query) and custom gateways. New `prjct embeddings set` flags: `--auth-header <h>`, `--auth-scheme <s|none>` (`none` = raw key), `--headers "k=v,…"`, `--query <qs>`. Default stays `Bearer`/`authorization`, so existing providers are unchanged. Vector dimensionality is detected from the response (no hardcoded size).
|
|
22
42
|
|
|
23
43
|
## [2.38.1] - 2026-06-02
|
|
24
44
|
|
|
@@ -26,14 +46,12 @@ The long-lived daemon no longer serves stale code, and embeddings reach any prov
|
|
|
26
46
|
|
|
27
47
|
- slim always-on skill description (2.38.1) (#411)
|
|
28
48
|
|
|
29
|
-
|
|
30
49
|
## [2.38.0] - 2026-06-01
|
|
31
50
|
|
|
32
51
|
### Features
|
|
33
52
|
|
|
34
53
|
- PULL-only prompt hook + MCP task write-path (2.38.0) (#410)
|
|
35
54
|
|
|
36
|
-
|
|
37
55
|
## [2.37.6] - 2026-06-01
|
|
38
56
|
|
|
39
57
|
Code-health pass (clean-code batch from the optimization audit).
|
package/README.md
CHANGED
|
@@ -201,6 +201,8 @@ Cursor / Windsurf use the same commands with a `/` prefix: `/capture`, `/task`,
|
|
|
201
201
|
| `prjct status <value>` | Inline status change on the active task (`done`, `paused`, `active`, …). |
|
|
202
202
|
| `prjct tag <k:v>` | Tag the active task (`type:bug`, `domain:auth`, …). |
|
|
203
203
|
| `prjct remember <type> "<content>"` | Persist a memory entry (decision, learning, gotcha, …). |
|
|
204
|
+
| `prjct forget <id>` | Delete a memory entry by id (`prjct forget mem_1234`) — the delete half of `remember`. |
|
|
205
|
+
| `prjct search "<query>"` | Search project memory — blended BM25 + semantic + recency recall (`prjct search mem_1234` resolves an entry by id). |
|
|
204
206
|
| `prjct embeddings <set\|status\|test\|clear>` | Configure the global BYOT embeddings provider — any OpenAI-compatible API (OpenAI, OpenRouter, Ollama, Azure, …), one secure key, all projects. |
|
|
205
207
|
| `prjct ship [name]` | Run the project's ship workflow (commit, push, PR, persist). |
|
|
206
208
|
| `prjct sync` | Re-index files, git co-change, imports; refresh project analysis. |
|
|
@@ -239,16 +241,17 @@ Slots ship **empty** — the human or the agent fills them on demand.
|
|
|
239
241
|
|
|
240
242
|
## Hooks (opt-in)
|
|
241
243
|
|
|
242
|
-
`prjct install` writes
|
|
244
|
+
`prjct install` writes 8 passive hooks to `~/.claude/settings.json`. They inject `additionalContext`; none block by default.
|
|
243
245
|
|
|
244
246
|
| Event | Injects |
|
|
245
247
|
|---|---|
|
|
246
|
-
| `SessionStart` | Persona
|
|
247
|
-
| `UserPromptSubmit` |
|
|
248
|
+
| `SessionStart` | Persona; on cold start (startup/clear/compact) also the knowledge digest — top traps + decisions in force, so a freshly-updated model starts grounded. Regenerates vault from DB |
|
|
249
|
+
| `UserPromptSubmit` | Active project state (task, branch, inbox) |
|
|
248
250
|
| `PreToolUse` (Bash git commit) | Anti-patterns tagged with touched files |
|
|
251
|
+
| `PreToolUse` (Edit/Write) | The file's preventive memory (gotchas/anti-patterns) right before you edit it — pushes what `prjct guard` makes pull |
|
|
249
252
|
| `PostToolUse` (Edit/Write) | Silently annotates `files_touched` on active task |
|
|
250
253
|
| `Stop` | Async prompt: "learn anything reusable?"; ingests captured/ then regenerates vault |
|
|
251
|
-
| `SubagentStart` | Persona
|
|
254
|
+
| `SubagentStart` | Persona for fresh-brain subagents (cache-stable, digest-free) |
|
|
252
255
|
| `CwdChanged` | Re-contextualizes on project switch |
|
|
253
256
|
|
|
254
257
|
Remove with `prjct claude uninstall` (hooks only) or `prjct uninstall` (everything).
|