@ghostpaw/questlog 0.9.0 → 0.9.2

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/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  **Agent tasks as quests that finish only with a written outcome.**
8
8
 
9
9
  ```bash
10
- npm install @ghostpaw/questlog
10
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh
11
11
  ```
12
12
 
13
13
  A unified task and calendar model for Node.js, built on SQLite.
@@ -16,14 +16,15 @@ Questlog treats tasks, events, deadlines, recurring commitments, and loose intak
16
16
 
17
17
  ## MCP server
18
18
 
19
- Every client below starts the same stdio server: `npx -y @ghostpaw/questlog mcp`.
19
+ Every client below starts the same stdio server: `ghostpaw-questlog mcp`.
20
+ For npm-based environments, use `npx -y @ghostpaw/questlog mcp` (Node 24+).
20
21
  Data lives in `~/.ghostpaw/questlog.db` unless the `GHOSTPAW_QUESTLOG_DB`
21
22
  environment variable (absolute path) or `--db <path>` says otherwise.
22
23
 
23
24
  **Claude Code**
24
25
 
25
26
  ```bash
26
- claude mcp add ghostpaw-questlog -- npx -y @ghostpaw/questlog mcp
27
+ claude mcp add ghostpaw-questlog -- ghostpaw-questlog mcp
27
28
  ```
28
29
 
29
30
  or as a plugin, which also installs the skill:
@@ -37,8 +38,8 @@ or as a plugin, which also installs the skill:
37
38
 
38
39
  ```toml
39
40
  [mcp_servers.ghostpaw-questlog]
40
- command = "npx"
41
- args = ["-y", "@ghostpaw/questlog", "mcp"]
41
+ command = "ghostpaw-questlog"
42
+ args = ["mcp"]
42
43
  ```
43
44
 
44
45
  **Cursor** (`.cursor/mcp.json`), **Claude Desktop** (`claude_desktop_config.json`)
@@ -48,8 +49,8 @@ or a project `.mcp.json`:
48
49
  {
49
50
  "mcpServers": {
50
51
  "ghostpaw-questlog": {
51
- "command": "npx",
52
- "args": ["-y", "@ghostpaw/questlog", "mcp"]
52
+ "command": "ghostpaw-questlog",
53
+ "args": ["mcp"]
53
54
  }
54
55
  }
55
56
  }
@@ -65,10 +66,10 @@ initialize-based revisions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.
65
66
 
66
67
  ## CLI
67
68
 
68
- Install globally for `questlog` (`ghostpaw-questlog` is the same binary): `npm i -g @ghostpaw/questlog`.
69
+ Install the [release binary](#install) for `ghostpaw-questlog` (`questlog` is an alias).
69
70
 
70
71
  ```bash
71
- questlog add --title "Review release notes" --tag release --due 2030-01-02
72
+ questlog add "Review release notes" --tag release --due 2030-01-02
72
73
  questlog list --limit 10
73
74
  questlog search release notes --limit 5
74
75
  questlog show 1
@@ -114,32 +115,58 @@ an installation hint on older Node versions, including for help and version.
114
115
  Copy `skills/questlog/` into your agent's skills folder, or print it:
115
116
 
116
117
  ```bash
117
- npx -y @ghostpaw/questlog skill > SKILL.md
118
+ ghostpaw-questlog skill > SKILL.md
118
119
  ```
119
120
 
120
121
  ## Install
121
122
 
122
- The [npm package](https://www.npmjs.com/package/@ghostpaw/questlog) requires Node 24+:
123
+ ### Release binary (default)
124
+
125
+ Each line downloads the latest release asset, checks it against the release’s SHA256SUMS and installs it on the PATH (~/.local/bin on Linux/macOS; the Windows script adds its folder to the user PATH).
126
+
127
+ linux-x64:
123
128
 
124
129
  ```sh
125
- npm install -g @ghostpaw/questlog
126
- npx -y @ghostpaw/questlog --help
130
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh -s -- --target linux-x64 && export PATH="$HOME/.local/bin:$PATH"
131
+ ```
132
+
133
+ linux-arm64:
134
+
135
+ ```sh
136
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh -s -- --target linux-arm64 && export PATH="$HOME/.local/bin:$PATH"
127
137
  ```
128
138
 
129
- As a library dependency: `npm install @ghostpaw/questlog`. It uses the built-in
130
- `node:sqlite` module, so there are no runtime dependencies.
139
+ darwin-arm64:
131
140
 
132
- Standalone binaries are available from [GitHub Releases](https://github.com/GhostPawJS/questlog/releases)
133
- for linux-x64, linux-arm64, darwin-arm64, darwin-x64 and windows-x64.
141
+ ```sh
142
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh -s -- --target darwin-arm64 && export PATH="$HOME/.local/bin:$PATH"
143
+ ```
144
+
145
+ darwin-x64:
134
146
 
135
147
  ```sh
136
- curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh
148
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh -s -- --target darwin-x64 && export PATH="$HOME/.local/bin:$PATH"
137
149
  ```
138
150
 
151
+ windows-x64 (PowerShell):
152
+
139
153
  ```powershell
140
154
  irm https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.ps1 | iex
141
155
  ```
142
156
 
157
+ ```text
158
+ $ ghostpaw-questlog --version
159
+ questlog 0.9.2 (binary, linux-x64)
160
+ ```
161
+
162
+ Standalone binaries are available from [GitHub Releases](https://github.com/GhostPawJS/questlog/releases).
163
+
164
+ A session with the 0.9.1 linux-x64 binary against a fresh database:
165
+
166
+ ![questlog 0.9.1: --version, three add calls, list, search, done with an outcome, and show](https://raw.githubusercontent.com/GhostPawJS/questlog/main/docs/assets/cli.png)
167
+
168
+ The same session as an [animated GIF](https://raw.githubusercontent.com/GhostPawJS/questlog/main/docs/assets/cli.gif).
169
+
143
170
  Other release installers:
144
171
 
145
172
  ```sh
@@ -193,6 +220,27 @@ download on macOS, remove quarantine with
193
220
  Linux binaries require glibc 2.28+; use npx on Alpine.
194
221
  See the [binary build workflow](.github/workflows/release-binaries.yml).
195
222
 
223
+ ### npx / npm (for npm-based environments)
224
+
225
+ The [npm package](https://www.npmjs.com/package/@ghostpaw/questlog) requires Node 24+:
226
+
227
+ ```sh
228
+ npx -y @ghostpaw/questlog --help
229
+ npm install -g @ghostpaw/questlog
230
+ ```
231
+
232
+ ### Library (for harnesses embedding it in code)
233
+
234
+ ```sh
235
+ npm install @ghostpaw/questlog
236
+ ```
237
+
238
+ ```ts
239
+ import { initQuestlogTables, read, write } from '@ghostpaw/questlog';
240
+ ```
241
+
242
+ See [library usage](#quick-start). The library uses built-in `node:sqlite` with zero runtime dependencies.
243
+
196
244
  ## Quick Start
197
245
 
198
246
  ```ts
package/SKILL.md CHANGED
@@ -1,15 +1,34 @@
1
1
  ---
2
2
  name: questlog
3
- description: "Manage local tasks, calendar commitments, and recurring work. Use when planning, executing, reviewing, or organizing work."
3
+ description: "Use the release binary ghostpaw-questlog to manage local tasks, calendar commitments, and recurring work. Use when planning, executing, reviewing, or organizing work."
4
4
  license: "MIT"
5
- compatibility: "Node.js 24 or newer. MCP stdio or ghostpaw-questlog CLI."
5
+ compatibility: "Release binary ghostpaw-questlog (no runtime needed); MCP stdio via ghostpaw-questlog mcp."
6
6
  ---
7
7
 
8
8
  # questlog
9
9
 
10
+ ## Install
11
+
12
+ Linux/macOS:
13
+
14
+ ```sh
15
+ curl -fsSL https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.sh | sh
16
+ ```
17
+
18
+ Installs `~/.local/bin/ghostpaw-questlog` after checking SHA256SUMS.
19
+
20
+ Windows x64 (PowerShell):
21
+
22
+ ```powershell
23
+ irm https://raw.githubusercontent.com/GhostPawJS/questlog/main/install.ps1 | iex
24
+ ```
25
+
26
+ Run tools as `ghostpaw-questlog ...`; use `~/.local/bin/ghostpaw-questlog` if it is not on PATH.
27
+
10
28
  `questlog` and `ghostpaw-questlog` are the same binary.
11
29
 
12
- - `questlog add --title "..." --tag a,b --due tomorrow`
30
+ - `questlog search <words>` before `add` to avoid duplicates.
31
+ - `ghostpaw-questlog add "..." --tag a,b --due tomorrow`
13
32
  - `questlog list [--view <view>]`: questlines, quests.active, quests.available, quests.blocked, quests.deferred, quests.due_soon, quests.in_progress, quests.missed_scheduled, quests.open, quests.overdue, quests.resolved, quests.scheduled_for_day, quests.scheduled_now, repeatables.due_anchors, rumors.
14
33
  - `questlog done <id> --outcome "..."`
15
34
  - `questlog search <words>`
@@ -27,7 +46,7 @@ Questlog manages local tasks, calendar commitments, and recurring work. Search b
27
46
 
28
47
  MCP: connect to ghostpaw-questlog, then call a tool by name with its JSON arguments.
29
48
 
30
- CLI: `ghostpaw-questlog call <tool> '<JSON object>'` or `ghostpaw-questlog <tool> --parameter value` (without a global install: `npx -y @ghostpaw/questlog <tool> ...`).
49
+ CLI: `ghostpaw-questlog call <tool> '<JSON object>'` or `ghostpaw-questlog <tool> --parameter value`.
31
50
 
32
51
  Inspect schemas with `ghostpaw-questlog describe <tool>`. Use `--db <path>` to select a database.
33
52
 
@@ -48,6 +67,10 @@ Read-only.
48
67
  | kinds | array | no | Optional entity kinds to search. |
49
68
  | mode | string | no | browse, identify_one. Whether to browse results normally or ask for clarification when several matches are found. |
50
69
 
70
+ ```sh
71
+ ghostpaw-questlog call search_questlog '{"query":"release"}'
72
+ ```
73
+
51
74
  ### review_questlog
52
75
 
53
76
  Review one operational questlog surface such as available quests, open rumors, blocked work, or due repeatable anchors.
@@ -62,8 +85,16 @@ Read-only.
62
85
  | --- | --- | --- | --- |
63
86
  | view | string | yes | questlines, quests.active, quests.available, quests.blocked, quests.deferred, quests.due_soon, quests.in_progress, quests.missed_scheduled, quests.open, quests.overdue, quests.resolved, quests.scheduled_for_day, quests.scheduled_now, repeatables.due_anchors, rumors. Which operational review surface to return. |
64
87
  | filters | object | no | Optional filters for supported review surfaces. |
88
+ | filters.questlineId | integer | no | Optional questline id used by quest views. |
89
+ | filters.tagNames | array | no | Optional tag names used by quest views. |
90
+ | filters.includeDeleted | boolean | no | Whether deleted quests should be included in quest views. |
91
+ | filters.dayAt | integer | no | UTC timestamp within the day to review for scheduled-for-day. |
65
92
  | now | integer | no | Optional evaluation timestamp for time-sensitive views. |
66
93
 
94
+ ```sh
95
+ ghostpaw-questlog call review_questlog '{"view":"questlines"}'
96
+ ```
97
+
67
98
  ### inspect_questlog_item
68
99
 
69
100
  Inspect one specific questlog item in depth and return its richer structured detail and important related refs.
@@ -77,9 +108,15 @@ Read-only.
77
108
  | Parameter | Type | Required | Values / description |
78
109
  | --- | --- | --- | --- |
79
110
  | target | object | yes | The specific item to inspect. |
111
+ | target.kind | string | yes | quest, questline, repeatable_quest, rumor. The kind of item to inspect. |
112
+ | target.id | integer | yes | The numeric id of the item to inspect. |
80
113
  | detailLevel | string | no | compact, full. How much detail to return. |
81
114
  | now | integer | no | Optional evaluation timestamp for time-sensitive detail. |
82
115
 
116
+ ```sh
117
+ ghostpaw-questlog call inspect_questlog_item '{"target":{"kind":"quest","id":1}}'
118
+ ```
119
+
83
120
  ### capture_rumor
84
121
 
85
122
  Capture uncertain incoming work as a rumor so it can be triaged later without prematurely turning it into committed execution.
@@ -96,6 +133,10 @@ Writes: writes_state.
96
133
  | details | string | no | Optional supporting context that explains why the rumor might matter. |
97
134
  | now | integer | no | Optional creation timestamp for the rumor. |
98
135
 
136
+ ```sh
137
+ ghostpaw-questlog call capture_rumor '{"title":"Review release notes"}'
138
+ ```
139
+
99
140
  ### shape_work
100
141
 
101
142
  Create a quest (with timing, tags, and objective in one call), create a questline, settle a rumor into concrete work, or manage quest-questline membership. Use create_quest for clear commitments — include tags and timing directly to avoid follow-up calls.
@@ -112,7 +153,11 @@ Writes: writes_state.
112
153
  | questId | integer | no | Quest to attach or detach. |
113
154
  | questlineId | integer | no | Questline that should receive the quest. |
114
155
  | quest | object | no | |
156
+ | quest.title | string | yes | Title for the new quest. |
157
+ | quest.objective | string | yes | Objective for the new quest. |
115
158
  | questline | object | no | |
159
+ | questline.title | string | yes | Questline title. |
160
+ | questline.description | string | no | Optional questline description. |
116
161
  | rumorId | integer | no | Rumor to settle, dismiss, or reopen. |
117
162
  | dismissedAt | integer | no | Optional dismissal timestamp. |
118
163
  | settledAt | integer | no | Optional settlement timestamp. |
@@ -121,6 +166,12 @@ Writes: writes_state.
121
166
  | title | string | no | New title for the update_rumor action. |
122
167
  | details | string | no | New or enriched context text for the update_rumor action. |
123
168
 
169
+ ```sh
170
+ ghostpaw-questlog call shape_work '{"action":"attach_quest_to_questline","questId":1,"questlineId":1}'
171
+ ghostpaw-questlog call shape_work '{"action":"create_quest","quest":{"title":"Review release notes","objective":"Check changes against the release"}}'
172
+ ghostpaw-questlog call shape_work '{"action":"create_questline","questline":{"title":"Review release notes"}}'
173
+ ```
174
+
124
175
  ### plan_quest
125
176
 
126
177
  Refine a quest by revising its objective before actual start or by changing its temporal planning fields.
@@ -144,6 +195,11 @@ Writes: writes_state.
144
195
  | estimateSeconds | integer | no | Optional active-effort estimate in seconds. |
145
196
  | now | integer | no | Optional update timestamp. |
146
197
 
198
+ ```sh
199
+ ghostpaw-questlog call plan_quest '{"action":"revise_objective","questId":1,"objective":"Check changes against the release"}'
200
+ ghostpaw-questlog call plan_quest '{"action":"set_time","questId":1}'
201
+ ```
202
+
147
203
  ### run_quest
148
204
 
149
205
  Run quest lifecycle actions such as starting, logging effort, finishing, abandoning, or abandoning and spawning follow-up quests atomically.
@@ -166,6 +222,12 @@ Writes: writes_state.
166
222
  | resolvedAt | integer | no | Optional resolved timestamp for finish or abandon actions. |
167
223
  | followups | array | no | Follow-up quests to create atomically. Required for abandon_and_spawn_followups. |
168
224
 
225
+ ```sh
226
+ ghostpaw-questlog call run_quest '{"action":"start","questId":1}'
227
+ ghostpaw-questlog call run_quest '{"action":"log_effort","questId":1,"effortSeconds":1}'
228
+ ghostpaw-questlog call run_quest '{"action":"finish","questId":1,"outcome":"release"}'
229
+ ```
230
+
169
231
  ### organize_work
170
232
 
171
233
  Organize grouping and dependency structure by updating questlines or changing hard unlock prerequisites between concrete quests.
@@ -190,6 +252,12 @@ Writes: writes_state.
190
252
  | fromQuestIds | array | no | Full prerequisite quest id set. |
191
253
  | now | integer | no | Optional timestamp. |
192
254
 
255
+ ```sh
256
+ ghostpaw-questlog call organize_work '{"action":"add_unlock","fromQuestId":1,"toQuestId":2}'
257
+ ghostpaw-questlog call organize_work '{"action":"archive_questline","questlineId":1}'
258
+ ghostpaw-questlog call organize_work '{"action":"remove_unlock","fromQuestId":1,"toQuestId":2}'
259
+ ```
260
+
193
261
  ### manage_repeatable
194
262
 
195
263
  Manage recurring work definitions by creating, updating, previewing, spawning, or archiving repeatable quests.
@@ -205,6 +273,10 @@ Writes: writes_state.
205
273
  | action | string | yes | archive, create, preview_due, spawn_due, update. Action to perform. |
206
274
  | repeatableQuestId | integer | no | Repeatable quest to archive or update. |
207
275
  | repeatableQuest | object | no | |
276
+ | repeatableQuest.title | string | yes | Title for the new repeatable quest. |
277
+ | repeatableQuest.objective | string | yes | Objective for the new repeatable quest. |
278
+ | repeatableQuest.rrule | string | yes | RRULE describing recurrence. |
279
+ | repeatableQuest.anchorAt | integer | yes | Recurrence anchor timestamp. |
208
280
  | title | string | no | Optional new title for the update action. |
209
281
  | objective | string | no | Optional new objective for the update action. |
210
282
  | questlineId | integer | no | Optional new questline id. |
@@ -219,6 +291,12 @@ Writes: writes_state.
219
291
  | archivedAt | integer | no | Optional archive timestamp. |
220
292
  | now | integer | no | Evaluation or update timestamp. |
221
293
 
294
+ ```sh
295
+ ghostpaw-questlog call manage_repeatable '{"action":"archive","repeatableQuestId":1}'
296
+ ghostpaw-questlog call manage_repeatable '{"action":"create","repeatableQuest":{"title":"Review release notes","objective":"Check changes against the release","rrule":"FREQ=WEEKLY","anchorAt":1800000000000}}'
297
+ ghostpaw-questlog call manage_repeatable '{"action":"preview_due"}'
298
+ ```
299
+
222
300
  ### tag_work
223
301
 
224
302
  Classify work by adding, removing, or replacing tags on quests and by replacing the future tag template set on repeatable quests.
@@ -233,9 +311,17 @@ Writes: writes_state.
233
311
  | --- | --- | --- | --- |
234
312
  | action | string | yes | add, remove, replace. Action to perform. |
235
313
  | target | object | yes | |
314
+ | target.id | integer | yes | Target entity id. |
315
+ | target.kind | string | yes | quest, repeatable_quest. Target kind. |
236
316
  | tagNames | array | yes | Tag names to add, remove, or replace. |
237
317
  | now | integer | no | Optional timestamp for the tag mutation. |
238
318
 
319
+ ```sh
320
+ ghostpaw-questlog call tag_work '{"action":"add","target":{"id":1,"kind":"quest"},"tagNames":["release"]}'
321
+ ghostpaw-questlog call tag_work '{"action":"remove","target":{"id":1,"kind":"quest"},"tagNames":["release"]}'
322
+ ghostpaw-questlog call tag_work '{"action":"replace","target":{"id":1,"kind":"quest"},"tagNames":["release"]}'
323
+ ```
324
+
239
325
  ### reward_work
240
326
 
241
327
  Manage rewards by adding, updating, removing, or claiming quest rewards, or by replacing future reward templates on repeatable quests.
@@ -250,11 +336,22 @@ Writes: writes_state.
250
336
  | --- | --- | --- | --- |
251
337
  | action | string | yes | add, claim, remove, replace_repeatable_template, update. Action to perform. |
252
338
  | target | object | yes | |
339
+ | target.id | integer | yes | Target entity id. |
340
+ | target.kind | string | yes | quest, reward, repeatable_quest. Target kind. |
253
341
  | reward | object | no | |
342
+ | reward.kind | string | yes | Reward kind. |
343
+ | reward.name | string | yes | Reward name. |
344
+ | reward.now | integer | no | Optional update timestamp for the update action. |
254
345
  | rewards | array | no | Full future reward template set. Required for replace_repeatable_template. |
255
346
  | claimedAt | integer | no | Optional claim timestamp. |
256
347
  | now | integer | no | Optional timestamp for removal or template replacement. |
257
348
 
349
+ ```sh
350
+ ghostpaw-questlog call reward_work '{"action":"add","target":{"id":1,"kind":"quest"},"reward":{"kind":"release","name":"release"}}'
351
+ ghostpaw-questlog call reward_work '{"action":"claim","target":{"id":1,"kind":"quest"}}'
352
+ ghostpaw-questlog call reward_work '{"action":"remove","target":{"id":1,"kind":"quest"}}'
353
+ ```
354
+
258
355
  ### retire_work
259
356
 
260
357
  Hide an item from normal active operation without rewriting history by soft-deleting a rumor, quest, questline, or repeatable quest.
@@ -269,35 +366,41 @@ Writes: writes_state.
269
366
  | --- | --- | --- | --- |
270
367
  | action | string | yes | hide. The retirement action to perform. |
271
368
  | target | object | yes | The target to hide. |
369
+ | target.kind | string | yes | quest, questline, repeatable_quest, rumor. The kind of item to hide. |
370
+ | target.id | integer | yes | The numeric id of the item to hide. |
272
371
  | deletedAt | integer | no | Optional timestamp to record when the item became hidden. |
273
372
 
373
+ ```sh
374
+ ghostpaw-questlog call retire_work '{"action":"hide","target":{"kind":"quest","id":1}}'
375
+ ```
376
+
274
377
  ### Workflow guides
275
378
 
276
- - [archive-delete-and-prune](skills/questlog/references/archive-delete-and-prune.md): Choose the right retirement action for each kind of work so history stays honest and hiding does not get confused with archival or terminal execution truth.
277
- - [choose-work-shape](skills/questlog/references/choose-work-shape.md): Choose the right structure for new work by separating uncertainty, one-shot execution, multi-step arcs, and recurring patterns.
278
- - [clarify-ambiguous-requests](skills/questlog/references/clarify-ambiguous-requests.md): Treat ambiguity as a real state, capture uncertainty honestly, and only commit work structure once the next executable shape is clear.
279
- - [close-work-and-claim-outcomes](skills/questlog/references/close-work-and-claim-outcomes.md): Close work with the correct terminal lifecycle action, then handle any concrete reward claim as a separate explicit step.
280
- - [create-concrete-quest](skills/questlog/references/create-concrete-quest.md): Create real, bounded executable quests only when the objective is concrete enough to execute without interpretive guesswork.
281
- - [detect-slips-and-staleness](skills/questlog/references/detect-slips-and-staleness.md): Detect work that is slipping or going stale by reading overdue, deferred, in-progress, and related operational views before choosing one recovery move.
282
- - [escalate-and-unblock](skills/questlog/references/escalate-and-unblock.md): Diagnose blockers honestly, then remove or realign hard gates when the model is wrong instead of treating every delay as generic escalation theater.
283
- - [frame-initiative-questline](skills/questlog/references/frame-initiative-questline.md): Use questlines for shared initiative context, then attach concrete quests and maintain the structure without confusing one quest with one arc.
284
- - [handle-exceptions-and-weird-cases](skills/questlog/references/handle-exceptions-and-weird-cases.md): Handle weird cases by diagnosing the actual tool outcome, routing into clarification or recovery when needed, and refusing to fake a clean normal-state story.
285
- - [intake-triage](skills/questlog/references/intake-triage.md): Triage new asks, ideas, and vague incoming work into the right next step without prematurely committing execution structure.
286
- - [maintain-clear-ownership](skills/questlog/references/maintain-clear-ownership.md): Keep ownership explicit through quest content and classification because Questlog does not provide a separate assignee field or ownership tool.
287
- - [manage-approvals-and-promises](skills/questlog/references/manage-approvals-and-promises.md): Treat approvals and commitments as modeled work with timing and dependencies instead of burying them as vague narrative promises.
288
- - [plan-successor-work](skills/questlog/references/plan-successor-work.md): Create explicit successor work after closure by spawning follow-ups or shaping new work, while keeping uncertain next steps in intake instead of faking certainty.
289
- - [plan-time-correctly](skills/questlog/references/plan-time-correctly.md): Use quest planning fields honestly so availability, due pressure, and schedule intent stay meaningful instead of getting collapsed into one generic date.
290
- - [prioritize-across-streams](skills/questlog/references/prioritize-across-streams.md): Prioritize across competing work streams by reading real candidate sets, distinguishing available from blocked work, and then reflecting the choice in planning.
291
- - [protect-capacity-and-focus](skills/questlog/references/protect-capacity-and-focus.md): Protect capacity and focus by reading the real in-progress and scheduled-now load, then using planning to rebalance instead of silently overcommitting.
292
- - [recover-from-modeling-mistakes](skills/questlog/references/recover-from-modeling-mistakes.md): Recover from modeling mistakes by diagnosing the exact current state first, then applying the smallest honest corrective tool instead of rewriting history blindly.
293
- - [report-status-and-manage-expectations](skills/questlog/references/report-status-and-manage-expectations.md): Build status reporting from the real questlog state, separating available, blocked, in-progress, slipping, and resolved work without relying on memory.
294
- - [revise-or-reshape-commitment](skills/questlog/references/revise-or-reshape-commitment.md): Revise a quest objective before execution starts, but reshape commitments honestly with lifecycle tools once real execution history exists.
295
- - [run-operational-review](skills/questlog/references/run-operational-review.md): Drive daily or weekly operational review from structured list views, then move from diagnosis into actual planning or execution changes.
296
- - [run-recurring-rhythms](skills/questlog/references/run-recurring-rhythms.md): Model recurring work as repeatable definitions that spawn fresh concrete quests over time instead of living forever as one immortal task.
297
- - [search-and-retrieve-context](skills/questlog/references/search-and-retrieve-context.md): Find relevant questlog context quickly, then switch from discovery to exact inspection without confusing free-text search with structured review surfaces.
298
- - [sequence-with-unlocks](skills/questlog/references/sequence-with-unlocks.md): Model hard sequencing with unlocks between concrete quests so blocked and available work stay truthful and reviewable.
299
- - [settle-rumor-into-structure](skills/questlog/references/settle-rumor-into-structure.md): Turn a ready rumor into committed quest or questline structure without losing provenance or pretending vague intake is settled.
300
- - [tag-and-filter-portfolios](skills/questlog/references/tag-and-filter-portfolios.md): Use tags for cross-cutting classification and portfolio filtering without confusing tags for status, timing, or dependency modeling.
379
+ - `ghostpaw-questlog skill archive-delete-and-prune` ([archive-delete-and-prune](skills/questlog/references/archive-delete-and-prune.md)): Choose the right retirement action for each kind of work so history stays honest and hiding does not get confused with archival or terminal execution truth.
380
+ - `ghostpaw-questlog skill choose-work-shape` ([choose-work-shape](skills/questlog/references/choose-work-shape.md)): Choose the right structure for new work by separating uncertainty, one-shot execution, multi-step arcs, and recurring patterns.
381
+ - `ghostpaw-questlog skill clarify-ambiguous-requests` ([clarify-ambiguous-requests](skills/questlog/references/clarify-ambiguous-requests.md)): Treat ambiguity as a real state, capture uncertainty honestly, and only commit work structure once the next executable shape is clear.
382
+ - `ghostpaw-questlog skill close-work-and-claim-outcomes` ([close-work-and-claim-outcomes](skills/questlog/references/close-work-and-claim-outcomes.md)): Close work with the correct terminal lifecycle action, then handle any concrete reward claim as a separate explicit step.
383
+ - `ghostpaw-questlog skill create-concrete-quest` ([create-concrete-quest](skills/questlog/references/create-concrete-quest.md)): Create real, bounded executable quests only when the objective is concrete enough to execute without interpretive guesswork.
384
+ - `ghostpaw-questlog skill detect-slips-and-staleness` ([detect-slips-and-staleness](skills/questlog/references/detect-slips-and-staleness.md)): Detect work that is slipping or going stale by reading overdue, deferred, in-progress, and related operational views before choosing one recovery move.
385
+ - `ghostpaw-questlog skill escalate-and-unblock` ([escalate-and-unblock](skills/questlog/references/escalate-and-unblock.md)): Diagnose blockers honestly, then remove or realign hard gates when the model is wrong instead of treating every delay as generic escalation theater.
386
+ - `ghostpaw-questlog skill frame-initiative-questline` ([frame-initiative-questline](skills/questlog/references/frame-initiative-questline.md)): Use questlines for shared initiative context, then attach concrete quests and maintain the structure without confusing one quest with one arc.
387
+ - `ghostpaw-questlog skill handle-exceptions-and-weird-cases` ([handle-exceptions-and-weird-cases](skills/questlog/references/handle-exceptions-and-weird-cases.md)): Handle weird cases by diagnosing the actual tool outcome, routing into clarification or recovery when needed, and refusing to fake a clean normal-state story.
388
+ - `ghostpaw-questlog skill intake-triage` ([intake-triage](skills/questlog/references/intake-triage.md)): Triage new asks, ideas, and vague incoming work into the right next step without prematurely committing execution structure.
389
+ - `ghostpaw-questlog skill maintain-clear-ownership` ([maintain-clear-ownership](skills/questlog/references/maintain-clear-ownership.md)): Keep ownership explicit through quest content and classification because Questlog does not provide a separate assignee field or ownership tool.
390
+ - `ghostpaw-questlog skill manage-approvals-and-promises` ([manage-approvals-and-promises](skills/questlog/references/manage-approvals-and-promises.md)): Treat approvals and commitments as modeled work with timing and dependencies instead of burying them as vague narrative promises.
391
+ - `ghostpaw-questlog skill plan-successor-work` ([plan-successor-work](skills/questlog/references/plan-successor-work.md)): Create explicit successor work after closure by spawning follow-ups or shaping new work, while keeping uncertain next steps in intake instead of faking certainty.
392
+ - `ghostpaw-questlog skill plan-time-correctly` ([plan-time-correctly](skills/questlog/references/plan-time-correctly.md)): Use quest planning fields honestly so availability, due pressure, and schedule intent stay meaningful instead of getting collapsed into one generic date.
393
+ - `ghostpaw-questlog skill prioritize-across-streams` ([prioritize-across-streams](skills/questlog/references/prioritize-across-streams.md)): Prioritize across competing work streams by reading real candidate sets, distinguishing available from blocked work, and then reflecting the choice in planning.
394
+ - `ghostpaw-questlog skill protect-capacity-and-focus` ([protect-capacity-and-focus](skills/questlog/references/protect-capacity-and-focus.md)): Protect capacity and focus by reading the real in-progress and scheduled-now load, then using planning to rebalance instead of silently overcommitting.
395
+ - `ghostpaw-questlog skill recover-from-modeling-mistakes` ([recover-from-modeling-mistakes](skills/questlog/references/recover-from-modeling-mistakes.md)): Recover from modeling mistakes by diagnosing the exact current state first, then applying the smallest honest corrective tool instead of rewriting history blindly.
396
+ - `ghostpaw-questlog skill report-status-and-manage-expectations` ([report-status-and-manage-expectations](skills/questlog/references/report-status-and-manage-expectations.md)): Build status reporting from the real questlog state, separating available, blocked, in-progress, slipping, and resolved work without relying on memory.
397
+ - `ghostpaw-questlog skill revise-or-reshape-commitment` ([revise-or-reshape-commitment](skills/questlog/references/revise-or-reshape-commitment.md)): Revise a quest objective before execution starts, but reshape commitments honestly with lifecycle tools once real execution history exists.
398
+ - `ghostpaw-questlog skill run-operational-review` ([run-operational-review](skills/questlog/references/run-operational-review.md)): Drive daily or weekly operational review from structured list views, then move from diagnosis into actual planning or execution changes.
399
+ - `ghostpaw-questlog skill run-recurring-rhythms` ([run-recurring-rhythms](skills/questlog/references/run-recurring-rhythms.md)): Model recurring work as repeatable definitions that spawn fresh concrete quests over time instead of living forever as one immortal task.
400
+ - `ghostpaw-questlog skill search-and-retrieve-context` ([search-and-retrieve-context](skills/questlog/references/search-and-retrieve-context.md)): Find relevant questlog context quickly, then switch from discovery to exact inspection without confusing free-text search with structured review surfaces.
401
+ - `ghostpaw-questlog skill sequence-with-unlocks` ([sequence-with-unlocks](skills/questlog/references/sequence-with-unlocks.md)): Model hard sequencing with unlocks between concrete quests so blocked and available work stay truthful and reviewable.
402
+ - `ghostpaw-questlog skill settle-rumor-into-structure` ([settle-rumor-into-structure](skills/questlog/references/settle-rumor-into-structure.md)): Turn a ready rumor into committed quest or questline structure without losing provenance or pretending vague intake is settled.
403
+ - `ghostpaw-questlog skill tag-and-filter-portfolios` ([tag-and-filter-portfolios](skills/questlog/references/tag-and-filter-portfolios.md)): Use tags for cross-cutting classification and portfolio filtering without confusing tags for status, timing, or dependency modeling.
301
404
 
302
405
  ### Principles
303
406
 
@@ -305,3 +408,7 @@ Writes: writes_state.
305
408
  - Read before you prescribe.
306
409
  - Protect history when reality changes.
307
410
  - Close the last mile, not just the main work.
411
+
412
+ ## Without the binary
413
+
414
+ Use `npx -y @ghostpaw/questlog ...` in npm-based environments (Node 24+). Harnesses that embed it in code can import `@ghostpaw/questlog` as a library.
@@ -1,7 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { questlogMcpInstructions } from './chunk-SVWAEAKC.js';
3
- import { reviewQuestlogTool, questlogSurfaceTools } from './chunk-3Y5F3SMB.js';
4
-
5
2
  // src/skills/skill_types.ts
6
3
  function defineQuestlogSkill(skill) {
7
4
  return skill;
@@ -756,52 +753,4 @@ var questlogSkills = [
756
753
  tagAndFilterPortfoliosSkill
757
754
  ];
758
755
 
759
- // src/soul.ts
760
- var questlogSoulTraits = [
761
- {
762
- principle: "Store the least committed truth first.",
763
- provenance: "The worst downstream errors usually start upstream: vague asks are turned into quests, soft ideas become fake deadlines, and half-understood work is treated as fully shaped. Using rumors and clarification before commitment keeps uncertainty where it belongs."
764
- },
765
- {
766
- principle: "Read before you prescribe.",
767
- provenance: "Many management mistakes are category mistakes: blocked work gets treated as available, missed schedule as overdue, or resolved work as fully closed when follow-through still remains. Reading the derived state first prevents confident but wrong interventions."
768
- },
769
- {
770
- principle: "Protect history when reality changes.",
771
- provenance: "Once execution starts, rewriting a quest into a different commitment destroys the meaning of the record. Honest finishes, abandonments, and follow-up quests preserve what actually happened and keep later review, planning, and reporting trustworthy."
772
- },
773
- {
774
- principle: "Close the last mile, not just the main work.",
775
- provenance: "Operational debt often hides in almost-done states: work finished but not claimed, reported, handed off, reviewed, or retired. Treating closure as a real phase prevents stale rewards, lingering initiatives, and misleading progress signals."
776
- }
777
- ];
778
-
779
- // src/surface/questlog_skill_spec.ts
780
- var questlogSkillSpec = {
781
- name: "questlog",
782
- cheatSheet: [
783
- "`questlog` and `ghostpaw-questlog` are the same binary.",
784
- "",
785
- '- `questlog add --title "..." --tag a,b --due tomorrow`',
786
- `- \`questlog list [--view <view>]\`: ${reviewQuestlogTool.inputSchema.properties?.view?.enum?.join(", ")}.`,
787
- '- `questlog done <id> --outcome "..."`',
788
- "- `questlog search <words>`",
789
- "- `questlog show <id>`",
790
- "- Use `--json` on any plain command.",
791
- "- Exit codes: 0 ok / 1 error / 2 usage / 3 needs input.",
792
- "- Database: `~/.ghostpaw/questlog.db`; override with `--db` or `GHOSTPAW_QUESTLOG_DB`.",
793
- "- Use one database per agent or project."
794
- ].join("\n"),
795
- description: "Manage local tasks, calendar commitments, and recurring work. Use when planning, executing, reviewing, or organizing work.",
796
- license: "MIT",
797
- compatibility: "Node.js 24 or newer. MCP stdio or ghostpaw-questlog CLI.",
798
- bin: "ghostpaw-questlog",
799
- packageName: "@ghostpaw/questlog",
800
- server: "ghostpaw-questlog",
801
- about: questlogMcpInstructions,
802
- tools: questlogSurfaceTools,
803
- workflows: questlogSkills,
804
- principles: questlogSoulTraits.map((trait) => trait.principle)
805
- };
806
-
807
- export { questlogSkillSpec };
756
+ export { questlogSkills };
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+
5
+ function resolveQuestlogDbPath(options = {}) {
6
+ return options.flag ?? ((options.env ?? process.env).GHOSTPAW_QUESTLOG_DB || join(homedir(), ".ghostpaw", "questlog.db"));
7
+ }
8
+
9
+ // src/version.ts
10
+ var questlogVersion = "0.9.2";
11
+
12
+ // src/surfaces/surface_types.ts
13
+ function isErrorResult(result) {
14
+ return typeof result === "object" && result !== null && "ok" in result && result.ok === false;
15
+ }
16
+
17
+ export { isErrorResult, questlogVersion, resolveQuestlogDbPath };
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ // src/surfaces/schema_actions.ts
3
+ var requirements = /* @__PURE__ */ new WeakMap();
4
+ function registerSchemaActions(schema, actions) {
5
+ requirements.set(schema, actions);
6
+ }
7
+ function requiredForAction(schema, action) {
8
+ return requirements.get(schema)?.[String(action)] ?? [];
9
+ }
10
+
11
+ // src/surfaces/schema_examples.ts
12
+ function minimalInput(schema, action, name = "") {
13
+ const constant = "const" in schema ? schema.const : void 0;
14
+ if (constant !== void 0) return constant;
15
+ if (schema.enum)
16
+ return action !== void 0 && schema.enum.includes(action) ? action : schema.enum[0];
17
+ const branch = schema.oneOf?.[0];
18
+ if (schema.type === "object" || schema.properties) {
19
+ action ??= schema.properties?.action?.enum?.[0];
20
+ const properties = { ...schema.properties, ...branch?.properties };
21
+ return Object.fromEntries(
22
+ [
23
+ .../* @__PURE__ */ new Set([
24
+ ...schema.required ?? [],
25
+ ...requiredForAction(schema, action),
26
+ ...schema.properties?.outcome && ["finish", "abandon", "abandon_and_spawn_followups"].includes(String(action)) ? ["outcome"] : [],
27
+ ...branch?.required ?? []
28
+ ])
29
+ ].map((key) => [
30
+ key,
31
+ minimalInput(properties[key] ?? {}, key === "action" ? action : void 0, key)
32
+ ])
33
+ );
34
+ }
35
+ if (branch) return minimalInput(branch, action, name);
36
+ if (schema.type === "array") return [minimalInput(schema.items ?? {}, void 0, name)];
37
+ if (schema.type === "integer" || schema.type === "number")
38
+ return name === "anchorAt" ? 18e11 : name === "toQuestId" ? 2 : 1;
39
+ if (schema.type === "boolean") return false;
40
+ if (schema.type === "null") return null;
41
+ if (name === "rrule") return "FREQ=WEEKLY";
42
+ if (name === "title") return "Review release notes";
43
+ if (name === "objective") return "Check changes against the release";
44
+ return "release";
45
+ }
46
+
47
+ export { minimalInput, registerSchemaActions, requiredForAction };