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
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../projectkeeper.schema.json",
|
|
3
|
+
"format": "projectkeeper.table/1",
|
|
4
|
+
"project": {
|
|
5
|
+
"name": "Papertrail",
|
|
6
|
+
"asOf": {
|
|
7
|
+
"date": "2026-09-20",
|
|
8
|
+
"repos": [
|
|
9
|
+
{
|
|
10
|
+
"path": ".",
|
|
11
|
+
"commit": "a1b2c3d"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"filledBy": {
|
|
16
|
+
"agent": "Example, written by hand for the template (commit numbers are placeholders)",
|
|
17
|
+
"at": "2026-10-13",
|
|
18
|
+
"read": "README, AGENTS.md, docs/PRODUCT.md, PLAN.md, TASKS.md and DECISIONS.md in full; the receipts and the reader design; the five source files; the git log. Then the three owner conversations in the session material."
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"ownerWants": [
|
|
22
|
+
{
|
|
23
|
+
"id": "W1",
|
|
24
|
+
"want": "Saving a page must be quicker than deciding where it goes.",
|
|
25
|
+
"kind": "Product",
|
|
26
|
+
"status": "Current",
|
|
27
|
+
"said": [
|
|
28
|
+
{
|
|
29
|
+
"session": "claude:sess_fixture_own1",
|
|
30
|
+
"message": 2,
|
|
31
|
+
"quote": "Saving has to be faster than deciding where it goes."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"reflectedIn": [
|
|
35
|
+
"G1",
|
|
36
|
+
"A1",
|
|
37
|
+
"REQ-C1"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "W2",
|
|
42
|
+
"want": "No accounts, ever.",
|
|
43
|
+
"kind": "Product",
|
|
44
|
+
"status": "Current",
|
|
45
|
+
"said": [
|
|
46
|
+
{
|
|
47
|
+
"session": "claude:sess_fixture_own1",
|
|
48
|
+
"message": 4,
|
|
49
|
+
"quote": "If it needs an account, it is dead to me."
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"reflectedIn": [
|
|
53
|
+
"DEC-1"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "W3",
|
|
58
|
+
"want": "Search answers within a second, and comes before other polish.",
|
|
59
|
+
"kind": "Product",
|
|
60
|
+
"status": "Current",
|
|
61
|
+
"said": [
|
|
62
|
+
{
|
|
63
|
+
"session": "claude:sess_fixture_own2",
|
|
64
|
+
"message": 3,
|
|
65
|
+
"quote": "搜索要在一秒内出结果,不然我不会用。"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"session": "claude:sess_fixture_own2",
|
|
69
|
+
"message": 9,
|
|
70
|
+
"quote": "可以,先做搜索。"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"reflectedIn": [
|
|
74
|
+
"A3",
|
|
75
|
+
"REQ-S1",
|
|
76
|
+
"T-18"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "W4",
|
|
81
|
+
"want": "Tags grow by themselves; the owner never maintains a tag system.",
|
|
82
|
+
"kind": "Product",
|
|
83
|
+
"status": "Current",
|
|
84
|
+
"said": [
|
|
85
|
+
{
|
|
86
|
+
"session": "claude:sess_fixture_own2",
|
|
87
|
+
"message": 5,
|
|
88
|
+
"quote": "我不想维护标签体系,它自己长出来。"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"reflectedIn": [
|
|
92
|
+
"A5",
|
|
93
|
+
"REQ-T1"
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "W5",
|
|
98
|
+
"want": "Sharing waits; nobody has asked for it.",
|
|
99
|
+
"kind": "Product",
|
|
100
|
+
"status": "Current",
|
|
101
|
+
"said": [
|
|
102
|
+
{
|
|
103
|
+
"session": "claude:sess_fixture_own3",
|
|
104
|
+
"message": 6,
|
|
105
|
+
"quote": "Sharing is a nice-to-have; nobody asked for it."
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
"reflectedIn": [
|
|
109
|
+
"A6"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "W6",
|
|
114
|
+
"want": "Task numbers follow docs/TASKS.md.",
|
|
115
|
+
"kind": "Way of working",
|
|
116
|
+
"status": "Current",
|
|
117
|
+
"said": [
|
|
118
|
+
{
|
|
119
|
+
"session": "claude:sess_fixture_own3",
|
|
120
|
+
"message": 10,
|
|
121
|
+
"quote": "对,编号以 TASKS.md 为准。"
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"reflectedIn": []
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"product": {
|
|
128
|
+
"id": "Papertrail",
|
|
129
|
+
"name": "Papertrail",
|
|
130
|
+
"forWhom": "One person keeping their own read-later list.",
|
|
131
|
+
"summary": "A one-person read-later list. Save a page in one motion, read it offline, find it again with one query. The list belongs to the owner: plain files, export anytime.",
|
|
132
|
+
"sources": [
|
|
133
|
+
{
|
|
134
|
+
"file": "README.md",
|
|
135
|
+
"lines": "1-7"
|
|
136
|
+
}
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
"goals": [
|
|
140
|
+
{
|
|
141
|
+
"id": "G1",
|
|
142
|
+
"name": "Save in one motion, find in one query",
|
|
143
|
+
"summary": "Saving and finding cost one action each.",
|
|
144
|
+
"status": "Current",
|
|
145
|
+
"sources": [
|
|
146
|
+
{
|
|
147
|
+
"file": "docs/PRODUCT.md",
|
|
148
|
+
"lines": "5",
|
|
149
|
+
"quote": "G1 · Save in one motion, find in one query."
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "G2",
|
|
155
|
+
"name": "Read anywhere, offline first",
|
|
156
|
+
"summary": "Every saved page reads without a connection.",
|
|
157
|
+
"status": "Current",
|
|
158
|
+
"sources": [
|
|
159
|
+
{
|
|
160
|
+
"file": "docs/PRODUCT.md",
|
|
161
|
+
"lines": "5",
|
|
162
|
+
"quote": "G2 · Read anywhere, offline first."
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"id": "G3",
|
|
168
|
+
"name": "数据永远属于自己",
|
|
169
|
+
"summary": "Plain files, exportable, no account.",
|
|
170
|
+
"status": "Current",
|
|
171
|
+
"sources": [
|
|
172
|
+
{
|
|
173
|
+
"file": "docs/PRODUCT.md",
|
|
174
|
+
"lines": "5",
|
|
175
|
+
"quote": "G3 · 数据永远属于自己."
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"areas": [
|
|
181
|
+
{
|
|
182
|
+
"id": "A1",
|
|
183
|
+
"name": "Capture 快速收藏",
|
|
184
|
+
"summary": "One shortcut, no dialog.",
|
|
185
|
+
"status": "Current",
|
|
186
|
+
"goals": [
|
|
187
|
+
"G1"
|
|
188
|
+
],
|
|
189
|
+
"sources": [
|
|
190
|
+
{
|
|
191
|
+
"file": "docs/PRODUCT.md",
|
|
192
|
+
"lines": "9"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"id": "A2",
|
|
198
|
+
"name": "Reading 阅读体验",
|
|
199
|
+
"summary": "Offline, calm typography.",
|
|
200
|
+
"status": "Current",
|
|
201
|
+
"goals": [
|
|
202
|
+
"G2"
|
|
203
|
+
],
|
|
204
|
+
"sources": [
|
|
205
|
+
{
|
|
206
|
+
"file": "docs/PRODUCT.md",
|
|
207
|
+
"lines": "10"
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"id": "A3",
|
|
213
|
+
"name": "Search 搜索与找回",
|
|
214
|
+
"summary": "Full text, under a second.",
|
|
215
|
+
"status": "Current",
|
|
216
|
+
"goals": [
|
|
217
|
+
"G1"
|
|
218
|
+
],
|
|
219
|
+
"sources": [
|
|
220
|
+
{
|
|
221
|
+
"file": "docs/PRODUCT.md",
|
|
222
|
+
"lines": "11"
|
|
223
|
+
}
|
|
224
|
+
]
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"id": "A4",
|
|
228
|
+
"name": "Sync 同步",
|
|
229
|
+
"summary": "Deferred until after v1.",
|
|
230
|
+
"status": "Deferred",
|
|
231
|
+
"why": "Deferred until after v1.",
|
|
232
|
+
"goals": [
|
|
233
|
+
"G2"
|
|
234
|
+
],
|
|
235
|
+
"sources": [
|
|
236
|
+
{
|
|
237
|
+
"file": "docs/PRODUCT.md",
|
|
238
|
+
"lines": "12"
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"id": "A5",
|
|
244
|
+
"name": "Tags 标签与整理",
|
|
245
|
+
"summary": "Tags suggest themselves.",
|
|
246
|
+
"status": "Current",
|
|
247
|
+
"goals": [
|
|
248
|
+
"G1"
|
|
249
|
+
],
|
|
250
|
+
"sources": [
|
|
251
|
+
{
|
|
252
|
+
"file": "docs/PRODUCT.md",
|
|
253
|
+
"lines": "13"
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"id": "A6",
|
|
259
|
+
"name": "Sharing 分享",
|
|
260
|
+
"summary": "Proposed, not scheduled.",
|
|
261
|
+
"status": "Proposed",
|
|
262
|
+
"sources": [
|
|
263
|
+
{
|
|
264
|
+
"file": "docs/PRODUCT.md",
|
|
265
|
+
"lines": "14"
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"id": "A7",
|
|
271
|
+
"name": "Import & export 导入导出",
|
|
272
|
+
"summary": "Plain text only.",
|
|
273
|
+
"status": "Current",
|
|
274
|
+
"goals": [
|
|
275
|
+
"G3"
|
|
276
|
+
],
|
|
277
|
+
"sources": [
|
|
278
|
+
{
|
|
279
|
+
"file": "docs/PRODUCT.md",
|
|
280
|
+
"lines": "15"
|
|
281
|
+
}
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
"requirements": [
|
|
286
|
+
{
|
|
287
|
+
"id": "REQ-C1",
|
|
288
|
+
"name": "One shortcut saves the current page",
|
|
289
|
+
"summary": "A global shortcut saves the current page without a dialog.",
|
|
290
|
+
"status": "Current",
|
|
291
|
+
"place": {
|
|
292
|
+
"area": "A1"
|
|
293
|
+
},
|
|
294
|
+
"sources": [
|
|
295
|
+
{
|
|
296
|
+
"file": "docs/PRODUCT.md",
|
|
297
|
+
"lines": "9"
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"id": "REQ-S1",
|
|
303
|
+
"name": "Search returns in under one second for 5,000 items",
|
|
304
|
+
"summary": "Search answers within a second over 5,000 saved pages.",
|
|
305
|
+
"status": "Current",
|
|
306
|
+
"place": {
|
|
307
|
+
"area": "A3"
|
|
308
|
+
},
|
|
309
|
+
"sources": [
|
|
310
|
+
{
|
|
311
|
+
"file": "docs/PRODUCT.md",
|
|
312
|
+
"lines": "11"
|
|
313
|
+
}
|
|
314
|
+
]
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"id": "REQ-T1",
|
|
318
|
+
"name": "Tags suggest themselves",
|
|
319
|
+
"summary": "Tags are suggested from the text; nobody maintains a tag system.",
|
|
320
|
+
"status": "Current",
|
|
321
|
+
"place": {
|
|
322
|
+
"area": "A5"
|
|
323
|
+
},
|
|
324
|
+
"sources": [
|
|
325
|
+
{
|
|
326
|
+
"file": "docs/PRODUCT.md",
|
|
327
|
+
"lines": "13"
|
|
328
|
+
}
|
|
329
|
+
]
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
"designs": [
|
|
333
|
+
{
|
|
334
|
+
"id": "Reader layout v2",
|
|
335
|
+
"name": "Reader layout v2 阅读版式",
|
|
336
|
+
"summary": "Single column, 68 characters per line, system fonts only.",
|
|
337
|
+
"status": "Current",
|
|
338
|
+
"place": {
|
|
339
|
+
"area": "A2"
|
|
340
|
+
},
|
|
341
|
+
"sources": [
|
|
342
|
+
{
|
|
343
|
+
"file": "docs/design/reader-layout.md",
|
|
344
|
+
"lines": "1-3"
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
}
|
|
348
|
+
],
|
|
349
|
+
"decisions": [
|
|
350
|
+
{
|
|
351
|
+
"id": "DEC-1",
|
|
352
|
+
"name": "No accounts 不做账号",
|
|
353
|
+
"summary": "No accounts; the list is local files.",
|
|
354
|
+
"status": "Current",
|
|
355
|
+
"place": {
|
|
356
|
+
"wholeProduct": "It decides how every part stores the list."
|
|
357
|
+
},
|
|
358
|
+
"sources": [
|
|
359
|
+
{
|
|
360
|
+
"file": "docs/DECISIONS.md",
|
|
361
|
+
"lines": "3"
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"id": "DEC-2",
|
|
367
|
+
"name": "搜索取代标签浏览器",
|
|
368
|
+
"summary": "Full-text search replaces the tag browser.",
|
|
369
|
+
"status": "Current",
|
|
370
|
+
"place": {
|
|
371
|
+
"area": "A3"
|
|
372
|
+
},
|
|
373
|
+
"sources": [
|
|
374
|
+
{
|
|
375
|
+
"file": "docs/DECISIONS.md",
|
|
376
|
+
"lines": "4"
|
|
377
|
+
}
|
|
378
|
+
]
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"id": "DEC-3",
|
|
382
|
+
"name": "Export is a folder of Markdown files",
|
|
383
|
+
"summary": "Export writes a folder of Markdown files.",
|
|
384
|
+
"status": "Current",
|
|
385
|
+
"place": {
|
|
386
|
+
"area": "A7"
|
|
387
|
+
},
|
|
388
|
+
"sources": [
|
|
389
|
+
{
|
|
390
|
+
"file": "docs/DECISIONS.md",
|
|
391
|
+
"lines": "5"
|
|
392
|
+
}
|
|
393
|
+
]
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"id": "DEC-5",
|
|
397
|
+
"name": "Word counts are part of the search index",
|
|
398
|
+
"summary": "Word counts were indexed.",
|
|
399
|
+
"status": "Replaced",
|
|
400
|
+
"replacedBy": "DEC-6",
|
|
401
|
+
"why": "DEC-6 took it back.",
|
|
402
|
+
"place": {
|
|
403
|
+
"area": "A3"
|
|
404
|
+
},
|
|
405
|
+
"sources": [
|
|
406
|
+
{
|
|
407
|
+
"file": "docs/DECISIONS.md",
|
|
408
|
+
"lines": "6"
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"id": "DEC-6",
|
|
414
|
+
"name": "Word counts stay out of the search index",
|
|
415
|
+
"summary": "Word counts stay out of the search index.",
|
|
416
|
+
"status": "Current",
|
|
417
|
+
"place": {
|
|
418
|
+
"area": "A3"
|
|
419
|
+
},
|
|
420
|
+
"sources": [
|
|
421
|
+
{
|
|
422
|
+
"file": "docs/DECISIONS.md",
|
|
423
|
+
"lines": "7"
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"id": "B-1",
|
|
429
|
+
"name": "v1 不做任何社交功能",
|
|
430
|
+
"summary": "v1 has no social features.",
|
|
431
|
+
"status": "Current",
|
|
432
|
+
"boundary": true,
|
|
433
|
+
"place": {
|
|
434
|
+
"area": "A6"
|
|
435
|
+
},
|
|
436
|
+
"sources": [
|
|
437
|
+
{
|
|
438
|
+
"file": "docs/PRODUCT.md",
|
|
439
|
+
"lines": "19"
|
|
440
|
+
}
|
|
441
|
+
]
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"id": "B-2",
|
|
445
|
+
"name": "No server of our own in v1",
|
|
446
|
+
"summary": "v1 runs without a server of its own.",
|
|
447
|
+
"status": "Current",
|
|
448
|
+
"boundary": true,
|
|
449
|
+
"place": {
|
|
450
|
+
"area": "A4"
|
|
451
|
+
},
|
|
452
|
+
"sources": [
|
|
453
|
+
{
|
|
454
|
+
"file": "docs/PRODUCT.md",
|
|
455
|
+
"lines": "19"
|
|
456
|
+
}
|
|
457
|
+
]
|
|
458
|
+
}
|
|
459
|
+
],
|
|
460
|
+
"plans": [
|
|
461
|
+
{
|
|
462
|
+
"id": "PLAN-1",
|
|
463
|
+
"name": "v1 milestone: save, read, find",
|
|
464
|
+
"summary": "Capture, reader and first search.",
|
|
465
|
+
"status": "Current",
|
|
466
|
+
"sources": [
|
|
467
|
+
{
|
|
468
|
+
"file": "docs/PLAN.md",
|
|
469
|
+
"lines": "3-5"
|
|
470
|
+
}
|
|
471
|
+
]
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"id": "PLAN-2",
|
|
475
|
+
"name": "秋季打磨:搜索、导出与中文体验",
|
|
476
|
+
"summary": "Chinese tokenization, export attachments, search filters.",
|
|
477
|
+
"status": "Current",
|
|
478
|
+
"sources": [
|
|
479
|
+
{
|
|
480
|
+
"file": "docs/PLAN.md",
|
|
481
|
+
"lines": "7-9"
|
|
482
|
+
}
|
|
483
|
+
]
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
"id": "PLAN-3",
|
|
487
|
+
"name": "Sync evaluation 同步评估",
|
|
488
|
+
"summary": "Evaluate sync after the owner reviews v1.",
|
|
489
|
+
"status": "Deferred",
|
|
490
|
+
"why": "Deferred until the owner reviews v1.",
|
|
491
|
+
"sources": [
|
|
492
|
+
{
|
|
493
|
+
"file": "docs/PLAN.md",
|
|
494
|
+
"lines": "11-13"
|
|
495
|
+
}
|
|
496
|
+
]
|
|
497
|
+
}
|
|
498
|
+
],
|
|
499
|
+
"work": [
|
|
500
|
+
{
|
|
501
|
+
"id": "T-1",
|
|
502
|
+
"name": "Global hotkey capture",
|
|
503
|
+
"summary": "One shortcut saves the page.",
|
|
504
|
+
"plan": "PLAN-1",
|
|
505
|
+
"area": "A1",
|
|
506
|
+
"implements": [
|
|
507
|
+
"REQ-C1"
|
|
508
|
+
],
|
|
509
|
+
"status": "Current",
|
|
510
|
+
"progress": "Done",
|
|
511
|
+
"sources": [
|
|
512
|
+
{
|
|
513
|
+
"file": "docs/TASKS.md",
|
|
514
|
+
"lines": "5"
|
|
515
|
+
}
|
|
516
|
+
]
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
"id": "T-2",
|
|
520
|
+
"name": "Save with note field",
|
|
521
|
+
"summary": "A note saves together with the page.",
|
|
522
|
+
"plan": "PLAN-1",
|
|
523
|
+
"area": "A1",
|
|
524
|
+
"status": "Current",
|
|
525
|
+
"progress": "Done",
|
|
526
|
+
"sources": [
|
|
527
|
+
{
|
|
528
|
+
"file": "docs/TASKS.md",
|
|
529
|
+
"lines": "6"
|
|
530
|
+
}
|
|
531
|
+
]
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
"id": "T-15",
|
|
535
|
+
"name": "SQLite FTS index",
|
|
536
|
+
"summary": "Full-text search over title and body.",
|
|
537
|
+
"plan": "PLAN-1",
|
|
538
|
+
"area": "A3",
|
|
539
|
+
"status": "Current",
|
|
540
|
+
"progress": "Done",
|
|
541
|
+
"sources": [
|
|
542
|
+
{
|
|
543
|
+
"file": "docs/TASKS.md",
|
|
544
|
+
"lines": "9"
|
|
545
|
+
}
|
|
546
|
+
]
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"id": "T-24",
|
|
550
|
+
"name": "Tag browser v1",
|
|
551
|
+
"summary": "Browse saved pages by tag.",
|
|
552
|
+
"plan": "PLAN-1",
|
|
553
|
+
"area": "A3",
|
|
554
|
+
"alsoAreas": [
|
|
555
|
+
"A5"
|
|
556
|
+
],
|
|
557
|
+
"status": "Replaced",
|
|
558
|
+
"replacedBy": "T-18",
|
|
559
|
+
"progress": "On hold",
|
|
560
|
+
"sources": [
|
|
561
|
+
{
|
|
562
|
+
"file": "docs/TASKS.md",
|
|
563
|
+
"lines": "12",
|
|
564
|
+
"quote": "replaced by T-18"
|
|
565
|
+
}
|
|
566
|
+
]
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
"id": "T-18",
|
|
570
|
+
"name": "Search index incremental rebuild",
|
|
571
|
+
"summary": "The index refreshes without a full rebuild.",
|
|
572
|
+
"plan": "PLAN-2",
|
|
573
|
+
"area": "A3",
|
|
574
|
+
"implements": [
|
|
575
|
+
"REQ-S1"
|
|
576
|
+
],
|
|
577
|
+
"status": "Current",
|
|
578
|
+
"progress": "In progress",
|
|
579
|
+
"open": "The receipt says it refreshes every minute; the code has no background refresh.",
|
|
580
|
+
"sources": [
|
|
581
|
+
{
|
|
582
|
+
"file": "docs/TASKS.md",
|
|
583
|
+
"lines": "10"
|
|
584
|
+
}
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"id": "T-19",
|
|
589
|
+
"name": "中文分词接入",
|
|
590
|
+
"summary": "Chinese text matches by word, not by character.",
|
|
591
|
+
"plan": "PLAN-2",
|
|
592
|
+
"area": "A3",
|
|
593
|
+
"status": "Current",
|
|
594
|
+
"progress": "In progress",
|
|
595
|
+
"sources": [
|
|
596
|
+
{
|
|
597
|
+
"file": "docs/TASKS.md",
|
|
598
|
+
"lines": "11"
|
|
599
|
+
}
|
|
600
|
+
]
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"id": "T-25",
|
|
604
|
+
"name": "Sync protocol spike",
|
|
605
|
+
"summary": "Try a sync protocol between two machines.",
|
|
606
|
+
"plan": "PLAN-3",
|
|
607
|
+
"area": "A4",
|
|
608
|
+
"status": "Deferred",
|
|
609
|
+
"why": "Waits for PLAN-3.",
|
|
610
|
+
"progress": "Planned",
|
|
611
|
+
"sources": [
|
|
612
|
+
{
|
|
613
|
+
"file": "docs/TASKS.md",
|
|
614
|
+
"lines": "13"
|
|
615
|
+
}
|
|
616
|
+
]
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"id": "T-31",
|
|
620
|
+
"name": "Markdown export",
|
|
621
|
+
"summary": "Export a folder of Markdown files.",
|
|
622
|
+
"plan": "PLAN-2",
|
|
623
|
+
"area": "A7",
|
|
624
|
+
"implements": [
|
|
625
|
+
"DEC-3"
|
|
626
|
+
],
|
|
627
|
+
"status": "Current",
|
|
628
|
+
"progress": "Done",
|
|
629
|
+
"sources": [
|
|
630
|
+
{
|
|
631
|
+
"file": "docs/TASKS.md",
|
|
632
|
+
"lines": "14"
|
|
633
|
+
}
|
|
634
|
+
]
|
|
635
|
+
}
|
|
636
|
+
],
|
|
637
|
+
"code": [
|
|
638
|
+
{
|
|
639
|
+
"id": "capture",
|
|
640
|
+
"name": "Capture",
|
|
641
|
+
"summary": "The global shortcut and the save path.",
|
|
642
|
+
"area": "A1",
|
|
643
|
+
"paths": [
|
|
644
|
+
"src/capture.ts"
|
|
645
|
+
]
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"id": "reader",
|
|
649
|
+
"name": "Reader",
|
|
650
|
+
"summary": "Offline reading with system fonts.",
|
|
651
|
+
"area": "A2",
|
|
652
|
+
"paths": [
|
|
653
|
+
"src/reader.ts"
|
|
654
|
+
]
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"id": "search",
|
|
658
|
+
"name": "Search",
|
|
659
|
+
"summary": "SQLite FTS5; rebuilds when the app opens.",
|
|
660
|
+
"area": "A3",
|
|
661
|
+
"paths": [
|
|
662
|
+
"src/search.ts"
|
|
663
|
+
]
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"id": "sync",
|
|
667
|
+
"name": "Sync",
|
|
668
|
+
"summary": "A placeholder; nothing runs.",
|
|
669
|
+
"area": "A4",
|
|
670
|
+
"paths": [
|
|
671
|
+
"src/sync.ts"
|
|
672
|
+
],
|
|
673
|
+
"anomalies": [
|
|
674
|
+
{
|
|
675
|
+
"kind": "Looks residual, is live",
|
|
676
|
+
"text": "Sync is deferred, yet the file still ships with the app.",
|
|
677
|
+
"sources": [
|
|
678
|
+
{
|
|
679
|
+
"file": "src/sync.ts",
|
|
680
|
+
"lines": "1"
|
|
681
|
+
}
|
|
682
|
+
]
|
|
683
|
+
}
|
|
684
|
+
]
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"id": "export",
|
|
688
|
+
"name": "Export",
|
|
689
|
+
"summary": "A folder of Markdown files; attachments still to do.",
|
|
690
|
+
"area": "A7",
|
|
691
|
+
"paths": [
|
|
692
|
+
"src/export.ts"
|
|
693
|
+
]
|
|
694
|
+
}
|
|
695
|
+
],
|
|
696
|
+
"notes": [
|
|
697
|
+
{
|
|
698
|
+
"id": "N-1",
|
|
699
|
+
"title": "Batch 2 says the index refreshes every minute; the code does not.",
|
|
700
|
+
"kind": "Anomaly",
|
|
701
|
+
"ask": "For your decision",
|
|
702
|
+
"on": [
|
|
703
|
+
"T-18"
|
|
704
|
+
],
|
|
705
|
+
"text": "The receipt for batch 2 claims a background refresh every minute and was signed off. src/search.ts says the index rebuilds only when the app opens. Search speed is what the owner cares about most (W3).",
|
|
706
|
+
"options": [
|
|
707
|
+
{
|
|
708
|
+
"choice": "Reopen T-18 to build the background refresh",
|
|
709
|
+
"consequence": "Search stays fresh while the app is open; one more task in PLAN-2."
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
"choice": "Correct the receipt",
|
|
713
|
+
"consequence": "The record matches the code; the index stays stale until the app restarts."
|
|
714
|
+
}
|
|
715
|
+
],
|
|
716
|
+
"sources": [
|
|
717
|
+
{
|
|
718
|
+
"file": "docs/receipts/batch-2.md",
|
|
719
|
+
"lines": "5",
|
|
720
|
+
"quote": "The search index now refreshes itself every minute in the background."
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"file": "src/search.ts",
|
|
724
|
+
"lines": "1"
|
|
725
|
+
}
|
|
726
|
+
],
|
|
727
|
+
"by": "Project"
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"id": "N-2",
|
|
731
|
+
"title": "Numbering by TASKS.md is the owner's rule, but no document says so.",
|
|
732
|
+
"kind": "Owner and project differ",
|
|
733
|
+
"ask": "For information",
|
|
734
|
+
"on": [
|
|
735
|
+
"W6"
|
|
736
|
+
],
|
|
737
|
+
"text": "The owner confirmed that task numbers follow docs/TASKS.md. AGENTS.md says every task gets the next number there, but not that TASKS.md wins when numbers disagree.",
|
|
738
|
+
"sources": [
|
|
739
|
+
{
|
|
740
|
+
"file": "AGENTS.md",
|
|
741
|
+
"lines": "3"
|
|
742
|
+
}
|
|
743
|
+
],
|
|
744
|
+
"by": "Main agent"
|
|
745
|
+
}
|
|
746
|
+
]
|
|
747
|
+
}
|