projectkeeper 0.0.0-stage → 1.0.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 +56 -0
- package/LICENSE +21 -0
- package/README.md +283 -2
- package/README.zh-CN.md +285 -0
- package/THIRD_PARTY_NOTICES.md +53 -0
- package/bin/pk.mjs +6 -0
- package/bin/postinstall.mjs +5 -0
- package/bin/strip-types.mjs +28 -0
- package/package.json +68 -4
- package/patches/README.md +111 -0
- package/patches/pi-ai-0.85.0.ts +122 -0
- package/patches/pi-ai-0.87.1.ts +122 -0
- package/scripts/apply-pi-streaming-patch.ts +86 -0
- package/skills/clerk/coverage/SKILL.md +35 -0
- package/skills/clerk/cross-check/SKILL.md +118 -0
- package/skills/clerk/deepen-dispatch/SKILL.md +69 -0
- package/skills/clerk/lane-follow-up/SKILL.md +94 -0
- package/skills/clerk/lane-plan/SKILL.md +107 -0
- package/skills/clerk/lane-slot/SKILL.md +113 -0
- package/skills/clerk/lane-topic/SKILL.md +116 -0
- package/skills/clerk/orientation/SKILL.md +160 -0
- package/skills/clerk/reconcile/SKILL.md +77 -0
- package/skills/clerk/skeleton-dispatch/SKILL.md +43 -0
- package/skills/clerk/spot-check/SKILL.md +52 -0
- package/skills/clerk/synthesis/SKILL.md +65 -0
- package/skills/table-follow-up/SKILL.md +42 -0
- package/src/cli.ts +319 -0
- package/src/codemap/README.md +13 -0
- package/src/codemap/engines.ts +102 -0
- package/src/codemap/facts.ts +504 -0
- package/src/context/agent-entry.ts +232 -0
- package/src/context/ask.ts +97 -0
- package/src/context/assemble.ts +1058 -0
- package/src/context/code-source.ts +103 -0
- package/src/context/k-briefs.ts +114 -0
- package/src/context/lineage.ts +100 -0
- package/src/context/object-brief.ts +300 -0
- package/src/context/owner-words.ts +191 -0
- package/src/context/pack-fixture.ts +342 -0
- package/src/context/project-rules.ts +160 -0
- package/src/intake/intake.ts +392 -0
- package/src/intake/material-rules.ts +166 -0
- package/src/intake/removal.ts +316 -0
- package/src/intake/skipped.ts +72 -0
- package/src/keeper/adjustment.ts +565 -0
- package/src/keeper/bounds/boundary.ts +509 -0
- package/src/keeper/bounds/command.ts +1665 -0
- package/src/keeper/bounds/paths.ts +164 -0
- package/src/keeper/bounds/reads.ts +718 -0
- package/src/keeper/bounds/shell-write-guard.ts +521 -0
- package/src/keeper/capabilities.ts +136 -0
- package/src/keeper/clerk-steps.ts +151 -0
- package/src/keeper/clerk-tools.ts +1424 -0
- package/src/keeper/conversation.ts +253 -0
- package/src/keeper/evidence.ts +662 -0
- package/src/keeper/fake-provider.ts +132 -0
- package/src/keeper/held.ts +15 -0
- package/src/keeper/history-tools.ts +163 -0
- package/src/keeper/jobs/answering.ts +53 -0
- package/src/keeper/key-check.ts +105 -0
- package/src/keeper/ledger-tools.ts +295 -0
- package/src/keeper/link-check.ts +185 -0
- package/src/keeper/merge.ts +260 -0
- package/src/keeper/note-origin.ts +56 -0
- package/src/keeper/numbers-check.ts +102 -0
- package/src/keeper/open-in-pi.ts +57 -0
- package/src/keeper/organize/absence.ts +266 -0
- package/src/keeper/organize/carried-on.ts +214 -0
- package/src/keeper/organize/clerk-coverage.ts +293 -0
- package/src/keeper/organize/clerk-prompts.ts +132 -0
- package/src/keeper/organize/clerk.ts +1395 -0
- package/src/keeper/organize/coverage-gate.ts +19 -0
- package/src/keeper/organize/coverage-tools.ts +765 -0
- package/src/keeper/organize/entries.ts +153 -0
- package/src/keeper/organize/entry-gate.ts +289 -0
- package/src/keeper/organize/fill-tools.ts +718 -0
- package/src/keeper/organize/follow-up.ts +280 -0
- package/src/keeper/organize/generation-check.ts +504 -0
- package/src/keeper/organize/graph.ts +230 -0
- package/src/keeper/organize/lane-tools.ts +289 -0
- package/src/keeper/organize/looked-tools.ts +54 -0
- package/src/keeper/organize/materials.ts +243 -0
- package/src/keeper/organize/owner-lines.ts +493 -0
- package/src/keeper/organize/place-tools.ts +216 -0
- package/src/keeper/organize/placement-inference.ts +1045 -0
- package/src/keeper/organize/placement-time.ts +320 -0
- package/src/keeper/organize/placing.ts +821 -0
- package/src/keeper/organize/positioning.ts +33 -0
- package/src/keeper/organize/readiness.ts +47 -0
- package/src/keeper/organize/reading.ts +401 -0
- package/src/keeper/organize/round-blocks.ts +65 -0
- package/src/keeper/organize/round-news.ts +164 -0
- package/src/keeper/organize/round-open.ts +586 -0
- package/src/keeper/organize/schedule-state.ts +39 -0
- package/src/keeper/organize/schedule.ts +137 -0
- package/src/keeper/organize/service.ts +409 -0
- package/src/keeper/organize/skills.ts +116 -0
- package/src/keeper/organize/slots.ts +85 -0
- package/src/keeper/organize/stage-gate.ts +175 -0
- package/src/keeper/organize/stage-tools.ts +471 -0
- package/src/keeper/organize/standing-notes.ts +141 -0
- package/src/keeper/organize/table-follow-up.ts +330 -0
- package/src/keeper/organize/takeover-clerk.ts +832 -0
- package/src/keeper/organize/takeover-state.ts +103 -0
- package/src/keeper/organize/takeover.ts +216 -0
- package/src/keeper/organize/update-pending.ts +535 -0
- package/src/keeper/organize/workbench-placement.ts +92 -0
- package/src/keeper/own-keys.ts +114 -0
- package/src/keeper/owner-text.ts +165 -0
- package/src/keeper/project-folder.ts +334 -0
- package/src/keeper/prompts.ts +101 -0
- package/src/keeper/references.ts +177 -0
- package/src/keeper/relook/compose.ts +120 -0
- package/src/keeper/relook/prompts.ts +36 -0
- package/src/keeper/roles.ts +259 -0
- package/src/keeper/round-tools.ts +227 -0
- package/src/keeper/route.ts +148 -0
- package/src/keeper/rules.ts +97 -0
- package/src/keeper/runtime.ts +1858 -0
- package/src/keeper/scope-tools.ts +194 -0
- package/src/keeper/sendback-text.ts +83 -0
- package/src/keeper/step-timing.ts +207 -0
- package/src/keeper/testing/clerk-script.ts +212 -0
- package/src/keeper/testing/streaming-arguments.ts +57 -0
- package/src/keeper/tools.ts +2340 -0
- package/src/keeper/utterance-tools.ts +64 -0
- package/src/keeper/verbatim.ts +397 -0
- package/src/ledger/adapters.ts +186 -0
- package/src/ledger/arrangements.ts +257 -0
- package/src/ledger/blame.ts +58 -0
- package/src/ledger/code-engine-child.ts +69 -0
- package/src/ledger/code-engine.ts +548 -0
- package/src/ledger/code.ts +607 -0
- package/src/ledger/docs.ts +294 -0
- package/src/ledger/git-read.ts +321 -0
- package/src/ledger/index.ts +1850 -0
- package/src/ledger/item-range.ts +16 -0
- package/src/ledger/lines.ts +328 -0
- package/src/ledger/numbering.ts +269 -0
- package/src/ledger/ranges.ts +74 -0
- package/src/ledger/rebuild-worker.ts +15 -0
- package/src/ledger/rebuild.ts +387 -0
- package/src/ledger/repo-scan.ts +181 -0
- package/src/ledger/schema.ts +450 -0
- package/src/ledger/sessions.ts +134 -0
- package/src/ledger/text-scan.ts +466 -0
- package/src/ledger/time.ts +185 -0
- package/src/ledger/ts-symbols.ts +180 -0
- package/src/ledger/views.ts +377 -0
- package/src/mcp/server.ts +127 -0
- package/src/mcp/tools.ts +187 -0
- package/src/model/ids.ts +23 -0
- package/src/model/k-types.ts +912 -0
- package/src/model/time.ts +85 -0
- package/src/model/types.ts +1382 -0
- package/src/model/views-k.ts +707 -0
- package/src/model/vocab.ts +269 -0
- package/src/process/analysis.ts +79 -0
- package/src/process/breakpoint-candidates.ts +383 -0
- package/src/process/breakpoints.ts +746 -0
- package/src/process/claim-check.ts +295 -0
- package/src/process/delivery-links.ts +52 -0
- package/src/process/facts.ts +487 -0
- package/src/process/generations.ts +138 -0
- package/src/process/index.ts +243 -0
- package/src/process/integration.ts +128 -0
- package/src/process/placement.ts +107 -0
- package/src/process/plan.ts +276 -0
- package/src/process/sendbacks.ts +244 -0
- package/src/process/text.ts +185 -0
- package/src/process/units.ts +543 -0
- package/src/process/unnumbered.ts +431 -0
- package/src/process/work.ts +884 -0
- package/src/scope/candidates.ts +86 -0
- package/src/scope/decisions.ts +229 -0
- package/src/scope/discover.ts +741 -0
- package/src/scope/ignore.ts +126 -0
- package/src/scope/ignored-place.ts +93 -0
- package/src/scope/skip.ts +161 -0
- package/src/scope/toolchain.ts +180 -0
- package/src/scope/worktree.ts +187 -0
- package/src/server/api.ts +549 -0
- package/src/server/app.ts +595 -0
- package/src/server/drafts-api.ts +170 -0
- package/src/server/folders-api.ts +243 -0
- package/src/server/graph-view.ts +639 -0
- package/src/server/http.ts +224 -0
- package/src/server/k-agent-api.ts +56 -0
- package/src/server/k-rounds-d99.ts +91 -0
- package/src/server/k-views.ts +405 -0
- package/src/server/keeper-page.ts +446 -0
- package/src/server/keys-api.ts +239 -0
- package/src/server/project-folder-api.ts +104 -0
- package/src/server/vendor.ts +14 -0
- package/src/server/workbench-content.ts +561 -0
- package/src/sources/anchor.ts +129 -0
- package/src/sources/files.ts +267 -0
- package/src/sources/gitobs.ts +41 -0
- package/src/sources/history.ts +231 -0
- package/src/sources/scan-worker.ts +10 -0
- package/src/sources/sessions/locate.ts +292 -0
- package/src/sources/sessions/read.ts +346 -0
- package/src/sources/sessions/scope.ts +42 -0
- package/src/sources/sessions/utterances.ts +223 -0
- package/src/sources/watch.ts +215 -0
- package/src/store/json-file.ts +50 -0
- package/src/store/paths.ts +39 -0
- package/src/store/project-store.ts +295 -0
- package/src/store/versions.ts +172 -0
- package/src/store/workspace.ts +216 -0
- package/src/table/check.ts +333 -0
- package/src/table/follow-up-tools.ts +30 -0
- package/src/table/follow-up.ts +344 -0
- package/src/table/import.ts +610 -0
- package/src/table/project-home.ts +61 -0
- package/src/table/sessions.ts +168 -0
- package/src/table/takeover.ts +483 -0
- package/src/util/git-check.ts +29 -0
- package/src/util/git.ts +411 -0
- package/src/util/own-ts.ts +15 -0
- package/src/util/paths.ts +225 -0
- package/template/FILLING-IN.md +148 -0
- package/template/examples/papertrail.json +747 -0
- package/template/projectkeeper.schema.json +1001 -0
- package/ui/app.js +1135 -0
- package/ui/failures.js +82 -0
- package/ui/flyout.js +120 -0
- package/ui/folder-chooser.js +264 -0
- package/ui/glossary.js +156 -0
- package/ui/graph-fit.js +157 -0
- package/ui/graph-material.js +61 -0
- package/ui/graph-palette.js +109 -0
- package/ui/graph-tools.js +62 -0
- package/ui/graph.js +1712 -0
- package/ui/index.html +31 -0
- package/ui/k/code-view.js +230 -0
- package/ui/k/draft-view.js +93 -0
- package/ui/k/k-views.css +224 -0
- package/ui/k/round-tree.js +450 -0
- package/ui/k/scope-k.js +159 -0
- package/ui/k-data.js +118 -0
- package/ui/k-fold.js +106 -0
- package/ui/k-process.css +302 -0
- package/ui/k-process.js +934 -0
- package/ui/keeper-activity.js +175 -0
- package/ui/keeper-view.js +801 -0
- package/ui/keeper.css +101 -0
- package/ui/key-order.js +62 -0
- package/ui/list-fold.js +67 -0
- package/ui/markdown.d.ts +21 -0
- package/ui/markdown.js +472 -0
- package/ui/placement.d.ts +92 -0
- package/ui/placement.js +445 -0
- package/ui/popover-place.d.ts +16 -0
- package/ui/popover-place.js +89 -0
- package/ui/popover.js +198 -0
- package/ui/project-folder.js +37 -0
- package/ui/shell-state.js +40 -0
- package/ui/strip-rows.js +171 -0
- package/ui/styles.css +492 -0
- package/ui/theme-pick.js +36 -0
- package/ui/theme.js +74 -0
- package/ui/themes/LICENSE.md +13 -0
- package/ui/themes/README.md +44 -0
- package/ui/themes/TOKENS.md +291 -0
- package/ui/themes/a1/board.css +1557 -0
- package/ui/themes/a1/pk.css +392 -0
- package/ui/themes/b1/board.css +1163 -0
- package/ui/themes/b1/pk.css +218 -0
- package/ui/themes/d2/board.css +518 -0
- package/ui/themes/d2/pk.css +243 -0
- package/ui/themes/guard.css +73 -0
- package/ui/themes/i1/board.css +776 -0
- package/ui/themes/i1/pk.css +223 -0
- package/ui/themes/manifest.json +13 -0
- package/ui/views.js +2796 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
What changed for someone who uses ProjectKeeper, newest first. Versions follow [Semantic Versioning](https://semver.org/).
|
|
4
|
+
|
|
5
|
+
## 1.0.0 — first release (2026-10-14)
|
|
6
|
+
|
|
7
|
+
What it includes:
|
|
8
|
+
|
|
9
|
+
**The workbench** — a local web page at `127.0.0.1`.
|
|
10
|
+
|
|
11
|
+
- **Project graph**, in three faces: `Graph` (a story map: the owner's words, product and goals on top, areas across, plans down, each piece of work in its cell, earlier plans rolled up), `List` (area by area, what was planned beside what happened) and `Code` (which code belongs to which product area, who built it, whether the current plan uses it).
|
|
12
|
+
- **Each piece of work with its steps** — planned, dispatched, delivered, checked, fixed, merged — and the commits, reports and verdicts behind each.
|
|
13
|
+
- **Breakpoints and send-backs**: where a step should be and has no trace, and what should go back to the work or the plan, with text to copy for an agent.
|
|
14
|
+
- **Notes log**: the Keeper's notes to the owner, those for decision with options.
|
|
15
|
+
- **Change log**, **Agent context**, **Project scope**, and a bilingual **Vocabulary**.
|
|
16
|
+
- **Keeper** pages: the takeover with three depths, the daily schedule, model provider and keys, a model for each step, backup keys, the project-folder authorization, usage by round and model, and every round as a tree of its steps.
|
|
17
|
+
- A conversation with the Keeper (`Ask Keeper`).
|
|
18
|
+
- A folder chooser where a location is typed (`Add project`, a scope item's path): `Browse…` lists folders to walk and pick from, with repositories and worktrees marked; a typed or pasted path works as before.
|
|
19
|
+
- Answers only at its own local address and, in a browser, only to its own pages: another site's page open in the same browser can neither read the workbench nor post to it.
|
|
20
|
+
- Four themes.
|
|
21
|
+
|
|
22
|
+
**The Keeper** — the resident agent.
|
|
23
|
+
|
|
24
|
+
- A **takeover** in two rounds: a first usable picture, then a deepening at the depth chosen (`Full`, `Focused`, `First picture only`).
|
|
25
|
+
- **Daily upkeep** on a schedule the owner sets, or on `Follow up`.
|
|
26
|
+
- A **ledger** built by a program, without a model: commits, document versions, numbering, verdicts, code structure, sessions.
|
|
27
|
+
- Each round: session drafts, a main agent that sends sub-agents by question, a synthesis in a session of its own, an independent spot check, and the program's own checks.
|
|
28
|
+
- Reads Claude Code and Codex session logs, git repositories and worktrees, and plain folders.
|
|
29
|
+
- Reads a project without changing it; one folder of its own inside the project only with the owner's authorization, given and withdrawn on the Keeper page (`Project folder`).
|
|
30
|
+
|
|
31
|
+
**For agents** — the `pk` command: `context`, `get`, `options`, `ask`, `help`.
|
|
32
|
+
|
|
33
|
+
- `pk mcp`: the same reading commands and the table check as a local MCP server, for clients that take their tools over MCP; configurations for Claude Code, Codex and Cursor in [docs/pk.md](docs/pk.md#as-an-mcp-server).
|
|
34
|
+
|
|
35
|
+
**The table** — a takeover any agent can do (`template/`): the agent reads the project in its own way and fills one JSON table, `projectkeeper/project.json`. `pk check` checks it: the shape, the ids, and every source against the project, quotes word for word. `pk import` takes it in as the project's picture, drawn by the same Graph, List and Code views. `pk sessions` writes the session material the table quotes the owner from — every owner message of the project's agent sessions, after the agent's answer it replies to — into ProjectKeeper's own folder for the project, never into the project.
|
|
36
|
+
|
|
37
|
+
A project taken over by the table is followed up by carrying the same table on. This happens when you press Follow up, on the daily schedule, or on Continuous. The Keeper gets a brief of what changed since the table's `asOf`: the commits, the documents they changed, and your new messages in the sessions. It edits a copy of the table and hands it in. The table is taken in only when it passes the same check as `pk check`; a table with any problem goes back to the Keeper with the list. A table kept in ProjectKeeper's own folder keeps a git history of its versions there. Such a project never runs the takeover's rounds.
|
|
38
|
+
|
|
39
|
+
**Models** — bring your own key, through pi. Run so far on DeepSeek and Zhipu GLM.
|
|
40
|
+
|
|
41
|
+
**The demo** — `npm run demo`: an invented project, already organized, with no key and no network.
|
|
42
|
+
|
|
43
|
+
**Systems** — Windows and macOS.
|
|
44
|
+
|
|
45
|
+
- On macOS: a project's sessions are looked for where Claude Code and Codex keep them on a Mac; a file named in another case, or in the other Unicode form of an accented, Korean or Japanese character, is the same file; the Keeper's shell is `/bin/bash`, and its check knows paths that start at `/` and macOS's own tools (AppleScript, the clipboard, the keychain and a Spotlight search of the whole machine are refused); `Open in pi` opens Terminal; a location can be typed with `~`.
|
|
46
|
+
- On macOS and Linux the saved keys are readable by their owner alone.
|
|
47
|
+
- The workbench says at its start when git is missing or too old.
|
|
48
|
+
|
|
49
|
+
Known limits:
|
|
50
|
+
|
|
51
|
+
- Linux is not supported yet. On macOS the test suite passes on GitHub's runners, and ProjectKeeper has not yet had daily use there.
|
|
52
|
+
- On a Mac volume formatted case-sensitive, two names that differ only in case are taken for one.
|
|
53
|
+
- A project whose own path is longer than 246 characters is read without its git history, and one longer than 251 cannot be organized: git and the Keeper cannot work in a directory that deep on Windows. Files deep inside a project are fine.
|
|
54
|
+
- The picture has errors, and differs from run to run on the same project. See [docs/cost-and-quality.md](docs/cost-and-quality.md).
|
|
55
|
+
- The workbench opens only as `127.0.0.1`, `localhost` or `[::1]` with its port, not under a hosts-file alias or behind a proxy: there it answers `403`.
|
|
56
|
+
- Not published to npm; run from a clone.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ProjectKeeper contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,284 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ProjectKeeper
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**AI writes code faster every week. Do you still know whether what it built is what you wanted?**
|
|
4
|
+
|
|
5
|
+
ProjectKeeper puts what you asked for, the decisions you changed and the work the AI actually finished on one map, shows you where they part, and lets the next agent pick up where the last one stopped — even on a project left half-done. Your own agent takes the project over by reading it as it is and filling in one table; from then on a resident agent keeps the map current every day.
|
|
6
|
+
|
|
7
|
+
- **Anchored to what you said.** Your words are kept verbatim, with the session they were said in. Where a document has drifted from them, where something you wanted was dropped along the way, or where work grew that you never asked for, ProjectKeeper tells you.
|
|
8
|
+
- **A half-done project, ready to hand over.** Point it at the folder: documents, git history, code and agent sessions become one picture, and one command gives the next agent the context for the work it picks up.
|
|
9
|
+
|
|
10
|
+
English · [简体中文](README.zh-CN.md)
|
|
11
|
+
|
|
12
|
+
[](LICENSE)
|
|
13
|
+

|
|
14
|
+
[](https://github.com/feiyanglyy-stack/ProjectKeeper/actions/workflows/ci.yml)
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
*One real project on one screen: what the owner asked for, the goals and product areas, two earlier plans, and the current plan's work. Every object opens to its sources.*
|
|
20
|
+
|
|
21
|
+
## Why
|
|
22
|
+
|
|
23
|
+
Let AI build a piece of software for long enough and you end up here: the conversations pile up, the plan keeps changing, and the agents have been swapped several times. Every agent says its task is done, yet nobody can say in full what was asked for at first, what changed later, and what was finally built. The answers exist — in documents, commit messages and session logs nobody will read again.
|
|
24
|
+
|
|
25
|
+
ProjectKeeper works like a project's archivist. It does not write code for the agents; it lines up every request, every change and the work actually finished. Where they do not match, it tells you; when the agent changes, it hands the whole story to the next one.
|
|
26
|
+
|
|
27
|
+
It is not too late to bring it in halfway: it goes through the sessions, documents and commits already there, and tells you what each version of the requirements was, what it was changed to, and which version is the one built. All of it happens on your machine.
|
|
28
|
+
|
|
29
|
+
## What you get
|
|
30
|
+
|
|
31
|
+
- **The whole project on one map.** What you said you wanted, the goals, the product areas, the plans, and each piece of work in its place.
|
|
32
|
+
- **What really happened to each piece of work.** Its steps — dispatched, delivered, reviewed, fixed, merged — each with the commit, report or verdict it rests on, and marked `Inferred` where the Keeper inferred it.
|
|
33
|
+
- **Where a decision came from.** Your own words, quoted verbatim with the session they were said in, and the documents and commits that carried the decision on.
|
|
34
|
+
- **What became of old plans.** Every item of an earlier plan with what happened to it: carried on, moved, deferred or dropped.
|
|
35
|
+
- **What needs you.** Notes that ask for your decision and give options, and send-backs — a review that failed and nobody picked up — ready to copy to an agent.
|
|
36
|
+
- **The right context for the next agent.** One command gives an agent the pack for a work item: what it serves, how it got here, your project's rules, where the code is.
|
|
37
|
+
|
|
38
|
+
And it stays current: after the takeover, a round runs on the schedule you set, or when you press `Follow up`.
|
|
39
|
+
|
|
40
|
+
## After one pass
|
|
41
|
+
|
|
42
|
+
The first pass reads the documents, the git history, the code structure and your agent sessions, and fills three views.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
*Graph: your words and the product on top, goals and areas across, earlier plans rolled up, the current plan's work in its cells.*
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
*List: one area opened. What was planned is on the left; what actually happened is on the right — in progress, merged in which commit, delivered with no check recorded.*
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
*Code: which code belongs to which product area, which pieces of work built it, how many tests it has, and whether the current plan still uses it.*
|
|
55
|
+
|
|
56
|
+
**Measured:** this pass took about 50 minutes and about 11 CNY (about $1.5) on DeepSeek. The project is ProjectKeeper's own working repository: about 1,000 files of documents and code (some 470 Markdown documents and 400 source files, about 217,000 lines), about 750 commits and 22 agent sessions.
|
|
57
|
+
|
|
58
|
+
## After a deepening
|
|
59
|
+
|
|
60
|
+
A deepening digs the history by question and checks its own work. On the same project it took another 71 minutes.
|
|
61
|
+
|
|
62
|
+

|
|
63
|
+
|
|
64
|
+
*A piece of work with its steps under it — checked, dispatched, delivered, merged — and beside it the code it changed and the commits and review verdicts it came through.*
|
|
65
|
+
|
|
66
|
+

|
|
67
|
+
|
|
68
|
+
*Where a decision came from: an area's requirements, designs and decisions in one list, and for the one you click, when it was made and the commits that carried it.*
|
|
69
|
+
|
|
70
|
+

|
|
71
|
+
|
|
72
|
+
*What became of an old plan: every item of an earlier generation, struck through, with the current item that carried it on.*
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
*A note that needs you: the question, the Keeper's view, why it matters, three options with what follows from each, and the facts with their sources.*
|
|
77
|
+
|
|
78
|
+

|
|
79
|
+
|
|
80
|
+
*What each round used and which model carried which steps. The dollar figure is an estimate at list prices; the bill for this run was lower (see [What a run costs](#what-a-run-costs)).*
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+
*From the map to one piece of work, to what happened to it, to the code it changed.*
|
|
85
|
+
|
|
86
|
+
## See it without a key
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
npm run demo
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
This builds an invented project — Papertrail, a one-person read-later list — already organized, and serves it at `http://127.0.0.1:4880/`. No key, no model, no network; the Keeper's answers in the demo are canned. Everything it writes goes into one folder in your temporary directory.
|
|
93
|
+
|
|
94
|
+
## Four looks
|
|
95
|
+
|
|
96
|
+
The workbench comes in four themes; switch with `Theme` in the top bar. Here is the demo project in each.
|
|
97
|
+
|
|
98
|
+
<table>
|
|
99
|
+
<tr>
|
|
100
|
+
<td width="50%"><img src="docs/images/theme-a1-walnut-workshop.png" alt="The demo project's Graph in the Walnut Workshop theme"><br><b>Walnut Workshop</b> — the default</td>
|
|
101
|
+
<td width="50%"><img src="docs/images/theme-b1-peacock-and-brass.png" alt="The demo project's Graph in the Peacock & Brass theme"><br><b>Peacock & Brass</b></td>
|
|
102
|
+
</tr>
|
|
103
|
+
<tr>
|
|
104
|
+
<td width="50%"><img src="docs/images/theme-d2-warm-clay.png" alt="The demo project's Graph in the Warm Clay theme"><br><b>Warm Clay</b></td>
|
|
105
|
+
<td width="50%"><img src="docs/images/theme-i1-task-console.png" alt="The demo project's Graph in the Task Console theme"><br><b>Task Console</b></td>
|
|
106
|
+
</tr>
|
|
107
|
+
</table>
|
|
108
|
+
|
|
109
|
+
`Factory` in the same list is the plain built-in look, without a theme.
|
|
110
|
+
|
|
111
|
+
## Quick start
|
|
112
|
+
|
|
113
|
+
You need Node.js 24 or later, and git, on Windows or macOS. On a Mac, git comes with the Xcode command line tools (`xcode-select --install`), and Homebrew's `node` is a newer Node than the 24 this is tested on: [what a Mac needs](docs/getting-started.md#on-a-mac).
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
git clone https://github.com/feiyanglyy-stack/ProjectKeeper.git && cd ProjectKeeper
|
|
117
|
+
npm ci
|
|
118
|
+
npm start
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Or from npm, without a clone: `npm install -g projectkeeper`, then `projectkeeper serve`; where this page says `npx pk`, use `projectkeeper`.
|
|
122
|
+
|
|
123
|
+
Then take your project over, in one of two ways.
|
|
124
|
+
|
|
125
|
+
**With your own agent (recommended).** Claude Code, Codex or any agent you use reads the project and fills in the table:
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
npx pk takeover --project <your project folder> --prepare
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This sets up three folders, each with its instructions, in ProjectKeeper's own folder, never in your project:
|
|
132
|
+
- one for the agent that reads your words in your past sessions;
|
|
133
|
+
- one for the agent that reads a copy of the project;
|
|
134
|
+
- one for the main agent that merges the two.
|
|
135
|
+
|
|
136
|
+
Run the three steps with your agent, then `pk import`, as printed, takes the table in. With Codex, `--run codex` in place of `--prepare` runs the three steps by themselves and takes the table in when it checks clean. Open `http://127.0.0.1:4870/` to see it. How the agents fill the table: [the template](template/FILLING-IN.md).
|
|
137
|
+
|
|
138
|
+
**With the Keeper and your key.** Open `http://127.0.0.1:4870/`, then four clicks:
|
|
139
|
+
|
|
140
|
+
1. **Add project** — a name and the folder of your project, typed or picked with `Browse…`. Nothing runs yet.
|
|
141
|
+
2. **Add a key** — on the Keeper page that opens, under `Model provider`: choose the provider, paste the key, `Save`.
|
|
142
|
+
3. **Choose a depth** — `Full`, `Focused` or `First picture only`.
|
|
143
|
+
4. **Start.**
|
|
144
|
+
|
|
145
|
+
The first picture comes first; the deepening follows if you chose one. Details: [Getting started](docs/getting-started.md).
|
|
146
|
+
|
|
147
|
+
Either way, add a key for the daily upkeep: the Keeper uses it to carry the picture on as the project changes.
|
|
148
|
+
|
|
149
|
+
## Models and keys
|
|
150
|
+
|
|
151
|
+
You bring your own key. The model library underneath ([pi](https://github.com/earendil-works/pi)) lists some forty providers; the ones actually run so far are **DeepSeek** (`deepseek-v4-pro`, `deepseek-flash`) and **Zhipu GLM** (`glm-5.3`, `glm-5.3-flash`). A key you save stays on your machine, in ProjectKeeper's own folder, and is never shown again. Each step of a round can run on its own model, and backup keys take over when one runs out of quota: [Models and keys](docs/models-and-keys.md).
|
|
152
|
+
|
|
153
|
+
**Subscriptions:** a Claude Pro or Max subscription cannot run the Keeper, because Anthropic allows that login only in Claude Code and on claude.ai; use an API key from the Claude Console. ChatGPT (Codex), Kimi Coding and GitHub Copilot subscriptions connect through pi's login, and none of them has been tested yet: [Subscriptions](docs/models-and-keys.md#subscriptions).
|
|
154
|
+
|
|
155
|
+
## What a run costs
|
|
156
|
+
|
|
157
|
+
**A takeover by your own agent** runs on that agent's subscription. On ProjectKeeper's own working repository, Codex took the three steps in about 27 minutes:
|
|
158
|
+
- the reader of the owner's words and the reader of the project ran side by side, in about 18 minutes;
|
|
159
|
+
- then the main agent took 8 minutes.
|
|
160
|
+
|
|
161
|
+
The table it filled has 75 things the owner wanted, 33 decisions plus 7 boundaries, 36 pieces of work and 18 places where the owner and the project part ways.
|
|
162
|
+
|
|
163
|
+
**A daily follow-up** runs on your key, and runs no model on a day with nothing new.
|
|
164
|
+
|
|
165
|
+
**A takeover by the Keeper** (the first pass and a full deepening) of the same project, measured four times:
|
|
166
|
+
|
|
167
|
+
| Models | Time | Cost |
|
|
168
|
+
|---|---|---|
|
|
169
|
+
| DeepSeek: flash for everything, pro for the final check | 126 min | 29 CNY billed (about $4) |
|
|
170
|
+
| DeepSeek: pro as main agent and for the deepening's sub-agents, flash for the rest | 122 min | 57 CNY billed (about $8) |
|
|
171
|
+
| Zhipu GLM-5.3 as main agent, GLM-5.3-flash for the rest | 198 min | $19 at list price |
|
|
172
|
+
| Zhipu GLM-5.3 for everything | 200 min | $67 at list price |
|
|
173
|
+
|
|
174
|
+
These are four runs on one project: a loose comparison, not a benchmark. The program changed between the runs (the GLM runs are the older ones), and the main agent of the all-flash run had read the previous run's list of faults in the project it was organizing.
|
|
175
|
+
|
|
176
|
+
- **The first pass alone** on DeepSeek: about 50 minutes and about 11 CNY with pro as main agent, or about 10 CNY all on flash.
|
|
177
|
+
- **GLM on a Coding Plan subscription** costs far less than the list price. In the maintainer's own terms: a GLM-5.3 first pass is about half of a junior team seat's 5-hour quota, a deepening about one 5-hour quota, a daily follow-up barely moves the quota, and an all-flash run about a third of one 5-hour quota.
|
|
178
|
+
- **The Usage page is an estimate.** It applies a list-price table to the recorded tokens; on the DeepSeek run with pro it showed $14.48 where the account was charged 57 CNY.
|
|
179
|
+
|
|
180
|
+
What each run got right and what it missed: [Cost and quality](docs/cost-and-quality.md).
|
|
181
|
+
|
|
182
|
+
## What it does not do, and privacy
|
|
183
|
+
|
|
184
|
+
- **It does not change your project's files.** It writes to its own home folder (`~/.projectkeeper`). Inside your project it writes one folder of its own, and only after you authorize it.
|
|
185
|
+
- **It listens on `127.0.0.1` only.** No account, and no telemetry of its own.
|
|
186
|
+
- **What leaves your machine** is what goes to the model provider you chose: prompts that contain text from your project — documents, code, commit messages, and what you said in your agent sessions.
|
|
187
|
+
- **It does not write code, run your tests or manage tickets.** It reads, and tells you what it found, with the source of each statement.
|
|
188
|
+
|
|
189
|
+
More in [Privacy](docs/privacy.md).
|
|
190
|
+
|
|
191
|
+
## For your agents: `pk`
|
|
192
|
+
|
|
193
|
+
Agents read the same picture through a command while the workbench is running. Two real outputs from the demo project, shortened where `…` stands:
|
|
194
|
+
|
|
195
|
+
```text
|
|
196
|
+
$ pk context --work T-18
|
|
197
|
+
# Context for Incoming agent · Work: T-18 Search index incremental rebuild 增量重建 · Kind: Implement
|
|
198
|
+
…
|
|
199
|
+
## Owner's words
|
|
200
|
+
What the owner said that this work traces up to, word for word:
|
|
201
|
+
- `ow_save_fast` · the owner, 2026-09-09 [1]:
|
|
202
|
+
“Saving has to be faster than deciding where it goes”
|
|
203
|
+
…
|
|
204
|
+
## Open problems
|
|
205
|
+
- The receipt claims a one-minute background refresh; the code does not have it.
|
|
206
|
+
- Is the one-minute refresh claim measured anywhere?
|
|
207
|
+
…
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
$ pk get sb_search_refresh
|
|
212
|
+
# Send-back · sb_search_refresh
|
|
213
|
+
Where: Search index incremental rebuild 增量重建 (thread_search_index)
|
|
214
|
+
What: Batch 2 says the index refreshes every minute; the review could not confirm it from the code, and batch 2 was signed off anyway.
|
|
215
|
+
Send back to: Work · Reopen T-18: make the index refresh in the background, or correct the receipt.
|
|
216
|
+
Status: Suggested · Open
|
|
217
|
+
…
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
For clients that take their tools over MCP (Claude Desktop, Cursor and others), `pk mcp` serves the same commands as a local MCP server: [As an MCP server](docs/pk.md#as-an-mcp-server).
|
|
221
|
+
|
|
222
|
+
All of it, and how to run these against the demo: [The `pk` command](docs/pk.md).
|
|
223
|
+
|
|
224
|
+
## How it works
|
|
225
|
+
|
|
226
|
+
```mermaid
|
|
227
|
+
flowchart LR
|
|
228
|
+
subgraph P["Your project, read as it is"]
|
|
229
|
+
D["Documents and plans"]
|
|
230
|
+
G["Git history"]
|
|
231
|
+
C["Code"]
|
|
232
|
+
S["Agent sessions"]
|
|
233
|
+
end
|
|
234
|
+
subgraph T["Takeover, by your own agent"]
|
|
235
|
+
O["Your words, from the sessions"]
|
|
236
|
+
R["The project, from a copy"]
|
|
237
|
+
M["Main agent: merges, notes where they part"]
|
|
238
|
+
O --> M
|
|
239
|
+
R --> M
|
|
240
|
+
end
|
|
241
|
+
subgraph K["ProjectKeeper, on your machine"]
|
|
242
|
+
L["Ledger: a program records what exists and when"]
|
|
243
|
+
C2["pk check, pk import: the table against the project"]
|
|
244
|
+
U["Daily upkeep: the Keeper carries the table on"]
|
|
245
|
+
end
|
|
246
|
+
P --> L
|
|
247
|
+
P --> T
|
|
248
|
+
M --> C2
|
|
249
|
+
C2 --> U
|
|
250
|
+
K --> W["The workbench in your browser"]
|
|
251
|
+
K --> A["pk, for your agents"]
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
A program records what exists and when, without a model: every commit, document version, number and session. Your own agent then reads the project in its own way and fills in one table. The program checks the table against the project — every id, every source, every quote word for word — and draws it. From then on the Keeper carries the same table on as the project changes, through the same check. What a program can count or check, the program does; the models' attention goes to judgement.
|
|
255
|
+
|
|
256
|
+
The Keeper can also take a project over itself, in rounds, with your key. More: [How the Keeper works](docs/how-the-keeper-works.md).
|
|
257
|
+
|
|
258
|
+
## How it compares
|
|
259
|
+
|
|
260
|
+
Tools that draw a graph of code structure, such as Understand-Anything, show how the code hangs together; ProjectKeeper's map is of intent and work — what was wanted, planned and done — with the code attached to the product areas it serves. Session-memory tools such as claude-mem capture what agents do from the day you install them; ProjectKeeper takes over what already exists, history included. Spec and task tools such as OpenSpec or Backlog.md work when you and your agents write in their format; ProjectKeeper asks you to write nothing new. It reads what the project already has and keeps it for a person to browse and for agents to query.
|
|
261
|
+
|
|
262
|
+
## Status and limits
|
|
263
|
+
|
|
264
|
+
- **v1.0.** It makes mistakes, and it differs from run to run; every statement links to its source so you can check it. The measured runs, and what each missed, are in [Cost and quality](docs/cost-and-quality.md).
|
|
265
|
+
- **Windows and macOS.** ProjectKeeper was built on Windows and is used there every day. It runs on macOS too: its test suite passes there on GitHub's runners, but it has not yet had daily use on a Mac, so expect rough edges — a report of what it did on yours is welcome. Linux is not supported yet.
|
|
266
|
+
- **Names on a Mac.** Two names that differ only in case, or only in the Unicode form of an accented, Korean or Japanese character, are one name to ProjectKeeper, as they are to a Mac's usual volume. On a volume formatted case-sensitive, two files named that way would be taken for one.
|
|
267
|
+
- **A project at a very long path.** Files deep inside a project are read at any length. The project's own path is limited on Windows, and neither git's long-path setting nor Windows' own lifts the limit: at more than 246 characters git cannot open the repository (the files are read without their history, and `Project scope` says so), and at more than 251 the Keeper cannot work in the directory. Move such a project to a shorter path.
|
|
268
|
+
- **It reads sessions from Claude Code and Codex.** Other agents' sessions are not read yet.
|
|
269
|
+
- **The interface is English; the content is in your project's language.** The screenshots are from a Chinese-language project.
|
|
270
|
+
- **The name.** ProjectKeeper was developed under the working name ContextKeeper, and the screenshots show it organizing its own project, which carries that name.
|
|
271
|
+
|
|
272
|
+
## Documentation
|
|
273
|
+
|
|
274
|
+
[Getting started](docs/getting-started.md) · [Concepts](docs/concepts.md) · [Models and keys](docs/models-and-keys.md) · [How the Keeper works](docs/how-the-keeper-works.md) · [Cost and quality](docs/cost-and-quality.md) · [The `pk` command](docs/pk.md) · [Privacy](docs/privacy.md) · [FAQ](docs/faq.md) · [Architecture](docs/architecture.md)
|
|
275
|
+
|
|
276
|
+
## Contributing
|
|
277
|
+
|
|
278
|
+
Issues and pull requests are welcome: [CONTRIBUTING.md](CONTRIBUTING.md). Changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
279
|
+
|
|
280
|
+
## Licence
|
|
281
|
+
|
|
282
|
+
MIT — see [LICENSE](LICENSE). The themes under `ui/themes/` are not covered by it: [ui/themes/LICENSE.md](ui/themes/LICENSE.md). Third-party material: [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
|
283
|
+
|
|
284
|
+
Built with [Claude Code](https://claude.com/claude-code).
|