@ghostpaw/questlog 0.9.1 → 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.
@@ -1,17 +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
- No install? Use `npx -y @ghostpaw/questlog <command>`.
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
+
11
28
  `questlog` and `ghostpaw-questlog` are the same binary.
12
29
 
13
30
  - `questlog search <words>` before `add` to avoid duplicates.
14
- - `questlog add --title "..." --tag a,b --due tomorrow`
31
+ - `ghostpaw-questlog add "..." --tag a,b --due tomorrow`
15
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.
16
33
  - `questlog done <id> --outcome "..."`
17
34
  - `questlog search <words>`
@@ -29,7 +46,7 @@ Questlog manages local tasks, calendar commitments, and recurring work. Search b
29
46
 
30
47
  MCP: connect to ghostpaw-questlog, then call a tool by name with its JSON arguments.
31
48
 
32
- 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`.
33
50
 
34
51
  Inspect schemas with `ghostpaw-questlog describe <tool>`. Use `--db <path>` to select a database.
35
52
 
@@ -50,6 +67,10 @@ Read-only.
50
67
  | kinds | array | no | Optional entity kinds to search. |
51
68
  | mode | string | no | browse, identify_one. Whether to browse results normally or ask for clarification when several matches are found. |
52
69
 
70
+ ```sh
71
+ ghostpaw-questlog call search_questlog '{"query":"release"}'
72
+ ```
73
+
53
74
  ### review_questlog
54
75
 
55
76
  Review one operational questlog surface such as available quests, open rumors, blocked work, or due repeatable anchors.
@@ -64,8 +85,16 @@ Read-only.
64
85
  | --- | --- | --- | --- |
65
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. |
66
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. |
67
92
  | now | integer | no | Optional evaluation timestamp for time-sensitive views. |
68
93
 
94
+ ```sh
95
+ ghostpaw-questlog call review_questlog '{"view":"questlines"}'
96
+ ```
97
+
69
98
  ### inspect_questlog_item
70
99
 
71
100
  Inspect one specific questlog item in depth and return its richer structured detail and important related refs.
@@ -79,9 +108,15 @@ Read-only.
79
108
  | Parameter | Type | Required | Values / description |
80
109
  | --- | --- | --- | --- |
81
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. |
82
113
  | detailLevel | string | no | compact, full. How much detail to return. |
83
114
  | now | integer | no | Optional evaluation timestamp for time-sensitive detail. |
84
115
 
116
+ ```sh
117
+ ghostpaw-questlog call inspect_questlog_item '{"target":{"kind":"quest","id":1}}'
118
+ ```
119
+
85
120
  ### capture_rumor
86
121
 
87
122
  Capture uncertain incoming work as a rumor so it can be triaged later without prematurely turning it into committed execution.
@@ -98,6 +133,10 @@ Writes: writes_state.
98
133
  | details | string | no | Optional supporting context that explains why the rumor might matter. |
99
134
  | now | integer | no | Optional creation timestamp for the rumor. |
100
135
 
136
+ ```sh
137
+ ghostpaw-questlog call capture_rumor '{"title":"Review release notes"}'
138
+ ```
139
+
101
140
  ### shape_work
102
141
 
103
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.
@@ -114,7 +153,11 @@ Writes: writes_state.
114
153
  | questId | integer | no | Quest to attach or detach. |
115
154
  | questlineId | integer | no | Questline that should receive the quest. |
116
155
  | quest | object | no | |
156
+ | quest.title | string | yes | Title for the new quest. |
157
+ | quest.objective | string | yes | Objective for the new quest. |
117
158
  | questline | object | no | |
159
+ | questline.title | string | yes | Questline title. |
160
+ | questline.description | string | no | Optional questline description. |
118
161
  | rumorId | integer | no | Rumor to settle, dismiss, or reopen. |
119
162
  | dismissedAt | integer | no | Optional dismissal timestamp. |
120
163
  | settledAt | integer | no | Optional settlement timestamp. |
@@ -123,6 +166,12 @@ Writes: writes_state.
123
166
  | title | string | no | New title for the update_rumor action. |
124
167
  | details | string | no | New or enriched context text for the update_rumor action. |
125
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
+
126
175
  ### plan_quest
127
176
 
128
177
  Refine a quest by revising its objective before actual start or by changing its temporal planning fields.
@@ -146,6 +195,11 @@ Writes: writes_state.
146
195
  | estimateSeconds | integer | no | Optional active-effort estimate in seconds. |
147
196
  | now | integer | no | Optional update timestamp. |
148
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
+
149
203
  ### run_quest
150
204
 
151
205
  Run quest lifecycle actions such as starting, logging effort, finishing, abandoning, or abandoning and spawning follow-up quests atomically.
@@ -168,6 +222,12 @@ Writes: writes_state.
168
222
  | resolvedAt | integer | no | Optional resolved timestamp for finish or abandon actions. |
169
223
  | followups | array | no | Follow-up quests to create atomically. Required for abandon_and_spawn_followups. |
170
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
+
171
231
  ### organize_work
172
232
 
173
233
  Organize grouping and dependency structure by updating questlines or changing hard unlock prerequisites between concrete quests.
@@ -192,6 +252,12 @@ Writes: writes_state.
192
252
  | fromQuestIds | array | no | Full prerequisite quest id set. |
193
253
  | now | integer | no | Optional timestamp. |
194
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
+
195
261
  ### manage_repeatable
196
262
 
197
263
  Manage recurring work definitions by creating, updating, previewing, spawning, or archiving repeatable quests.
@@ -207,6 +273,10 @@ Writes: writes_state.
207
273
  | action | string | yes | archive, create, preview_due, spawn_due, update. Action to perform. |
208
274
  | repeatableQuestId | integer | no | Repeatable quest to archive or update. |
209
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. |
210
280
  | title | string | no | Optional new title for the update action. |
211
281
  | objective | string | no | Optional new objective for the update action. |
212
282
  | questlineId | integer | no | Optional new questline id. |
@@ -221,6 +291,12 @@ Writes: writes_state.
221
291
  | archivedAt | integer | no | Optional archive timestamp. |
222
292
  | now | integer | no | Evaluation or update timestamp. |
223
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
+
224
300
  ### tag_work
225
301
 
226
302
  Classify work by adding, removing, or replacing tags on quests and by replacing the future tag template set on repeatable quests.
@@ -235,9 +311,17 @@ Writes: writes_state.
235
311
  | --- | --- | --- | --- |
236
312
  | action | string | yes | add, remove, replace. Action to perform. |
237
313
  | target | object | yes | |
314
+ | target.id | integer | yes | Target entity id. |
315
+ | target.kind | string | yes | quest, repeatable_quest. Target kind. |
238
316
  | tagNames | array | yes | Tag names to add, remove, or replace. |
239
317
  | now | integer | no | Optional timestamp for the tag mutation. |
240
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
+
241
325
  ### reward_work
242
326
 
243
327
  Manage rewards by adding, updating, removing, or claiming quest rewards, or by replacing future reward templates on repeatable quests.
@@ -252,11 +336,22 @@ Writes: writes_state.
252
336
  | --- | --- | --- | --- |
253
337
  | action | string | yes | add, claim, remove, replace_repeatable_template, update. Action to perform. |
254
338
  | target | object | yes | |
339
+ | target.id | integer | yes | Target entity id. |
340
+ | target.kind | string | yes | quest, reward, repeatable_quest. Target kind. |
255
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. |
256
345
  | rewards | array | no | Full future reward template set. Required for replace_repeatable_template. |
257
346
  | claimedAt | integer | no | Optional claim timestamp. |
258
347
  | now | integer | no | Optional timestamp for removal or template replacement. |
259
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
+
260
355
  ### retire_work
261
356
 
262
357
  Hide an item from normal active operation without rewriting history by soft-deleting a rumor, quest, questline, or repeatable quest.
@@ -271,35 +366,41 @@ Writes: writes_state.
271
366
  | --- | --- | --- | --- |
272
367
  | action | string | yes | hide. The retirement action to perform. |
273
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. |
274
371
  | deletedAt | integer | no | Optional timestamp to record when the item became hidden. |
275
372
 
373
+ ```sh
374
+ ghostpaw-questlog call retire_work '{"action":"hide","target":{"kind":"quest","id":1}}'
375
+ ```
376
+
276
377
  ### Workflow guides
277
378
 
278
- - [archive-delete-and-prune](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.
279
- - [choose-work-shape](references/choose-work-shape.md): Choose the right structure for new work by separating uncertainty, one-shot execution, multi-step arcs, and recurring patterns.
280
- - [clarify-ambiguous-requests](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.
281
- - [close-work-and-claim-outcomes](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.
282
- - [create-concrete-quest](references/create-concrete-quest.md): Create real, bounded executable quests only when the objective is concrete enough to execute without interpretive guesswork.
283
- - [detect-slips-and-staleness](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.
284
- - [escalate-and-unblock](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.
285
- - [frame-initiative-questline](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.
286
- - [handle-exceptions-and-weird-cases](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.
287
- - [intake-triage](references/intake-triage.md): Triage new asks, ideas, and vague incoming work into the right next step without prematurely committing execution structure.
288
- - [maintain-clear-ownership](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.
289
- - [manage-approvals-and-promises](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.
290
- - [plan-successor-work](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.
291
- - [plan-time-correctly](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.
292
- - [prioritize-across-streams](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.
293
- - [protect-capacity-and-focus](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.
294
- - [recover-from-modeling-mistakes](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.
295
- - [report-status-and-manage-expectations](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.
296
- - [revise-or-reshape-commitment](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.
297
- - [run-operational-review](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.
298
- - [run-recurring-rhythms](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.
299
- - [search-and-retrieve-context](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.
300
- - [sequence-with-unlocks](references/sequence-with-unlocks.md): Model hard sequencing with unlocks between concrete quests so blocked and available work stay truthful and reviewable.
301
- - [settle-rumor-into-structure](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.
302
- - [tag-and-filter-portfolios](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](references/tag-and-filter-portfolios.md)): Use tags for cross-cutting classification and portfolio filtering without confusing tags for status, timing, or dependency modeling.
303
404
 
304
405
  ### Principles
305
406
 
@@ -307,3 +408,7 @@ Writes: writes_state.
307
408
  - Read before you prescribe.
308
409
  - Protect history when reality changes.
309
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,58 +0,0 @@
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.1";
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
- // src/surfaces/validate_input.ts
18
- function validateInput(schema, input, path = "$") {
19
- const errors = [];
20
- const matchesType = (type) => {
21
- switch (type) {
22
- case "object":
23
- return typeof input === "object" && input !== null && !Array.isArray(input);
24
- case "array":
25
- return Array.isArray(input);
26
- case "integer":
27
- return typeof input === "number" && Number.isInteger(input);
28
- case "number":
29
- return typeof input === "number" && Number.isFinite(input);
30
- case "null":
31
- return input === null;
32
- default:
33
- return typeof input === type;
34
- }
35
- };
36
- if (schema.type && !(Array.isArray(schema.type) ? schema.type : [schema.type]).some(matchesType)) {
37
- return [`${path}: expected ${String(schema.type)}`];
38
- }
39
- if (schema.enum && !schema.enum.some((value) => JSON.stringify(value) === JSON.stringify(input)))
40
- errors.push(`${path}: expected one of ${JSON.stringify(schema.enum)}`);
41
- if (schema.oneOf && !schema.oneOf.some((branch) => validateInput(branch, input, path).length === 0))
42
- errors.push(`${path}: must match at least one schema branch`);
43
- if (typeof input === "object" && input !== null && !Array.isArray(input)) {
44
- const record = input;
45
- for (const name of schema.required ?? [])
46
- if (!Object.hasOwn(record, name)) errors.push(`${path}.${name}: required`);
47
- for (const [name, property] of Object.entries(schema.properties ?? {}))
48
- if (Object.hasOwn(record, name))
49
- errors.push(...validateInput(property, record[name], `${path}.${name}`));
50
- }
51
- if (Array.isArray(input) && schema.items)
52
- input.forEach((value, index) => {
53
- errors.push(...validateInput(schema.items, value, `${path}[${index}]`));
54
- });
55
- return errors;
56
- }
57
-
58
- export { isErrorResult, questlogVersion, resolveQuestlogDbPath, validateInput };