@taskset/cli 4.0.0 → 6.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +23 -20
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +538 -71
  5. package/docs/_meta.ts +9 -0
  6. package/docs/agents/_meta.ts +5 -0
  7. package/docs/agents/commands.md +70 -0
  8. package/docs/agents/index.md +99 -0
  9. package/docs/agents/llms.txt +28 -0
  10. package/docs/agents/workflows.md +50 -0
  11. package/docs/cli-reference.md +461 -0
  12. package/docs/configuration.md +63 -0
  13. package/docs/document-types.md +103 -0
  14. package/docs/getting-started.md +106 -0
  15. package/docs/index.md +43 -0
  16. package/docs/maintainers/_meta.ts +7 -0
  17. package/docs/maintainers/architecture/_meta.ts +5 -0
  18. package/docs/maintainers/architecture/decisions/0001-documentation-platform.md +44 -0
  19. package/docs/maintainers/architecture/decisions/0002-code-architecture.md +31 -0
  20. package/docs/maintainers/architecture/decisions/0003-snapshot-policy.md +31 -0
  21. package/docs/maintainers/architecture/decisions/_meta.ts +5 -0
  22. package/docs/maintainers/architecture/overview.md +111 -0
  23. package/docs/maintainers/architecture/synchronization.md +56 -0
  24. package/docs/maintainers/development/_meta.ts +6 -0
  25. package/docs/maintainers/development/contributing.md +58 -0
  26. package/docs/maintainers/development/documentation.md +52 -0
  27. package/docs/maintainers/development/engineering.md +59 -0
  28. package/docs/maintainers/development/testing.md +89 -0
  29. package/docs/maintainers/index.md +20 -0
  30. package/docs/maintainers/product/_meta.ts +3 -0
  31. package/docs/maintainers/product/vision.md +68 -0
  32. package/docs/maintainers/technology.md +55 -0
  33. package/docs/task-files.md +180 -0
  34. package/package.json +8 -6
  35. package/skills/taskset/SKILL.md +240 -0
  36. package/skills/taskset/references/changesets-examples.md +97 -0
  37. package/skills/taskset/references/document-modeling-examples.md +63 -0
  38. package/skills/taskset/references/monorepo-task-modeling.md +125 -0
  39. package/skills/taskset/references/task-modeling-examples.md +249 -0
  40. package/skills/taskset-implement/SKILL.md +240 -0
  41. package/skills/taskset-implement/agents/openai.yaml +4 -0
  42. package/skills/taskset-implement/references/architecture/client-and-server.md +69 -0
  43. package/skills/taskset-implement/references/architecture/documentation-and-generated.md +72 -0
  44. package/skills/taskset-implement/references/architecture/ownership-and-dependencies.md +108 -0
  45. package/skills/taskset-implement/references/architecture/product-and-source.md +81 -0
  46. package/skills/taskset-implement/references/architecture/storage-and-snapshots.md +45 -0
  47. package/skills/taskset-implement/references/architecture.md +34 -0
  48. package/skills/taskset-implement/references/conventions/backend-and-tooling.md +33 -0
  49. package/skills/taskset-implement/references/conventions/design.md +38 -0
  50. package/skills/taskset-implement/references/conventions/interfaces-and-ui.md +50 -0
  51. package/skills/taskset-implement/references/conventions/naming-and-packages.md +64 -0
  52. package/skills/taskset-implement/references/conventions/task-files.md +94 -0
  53. package/skills/taskset-implement/references/conventions/tests-and-docs.md +55 -0
  54. package/skills/taskset-implement/references/conventions/typescript-and-exports.md +41 -0
  55. package/skills/taskset-implement/references/conventions.md +40 -0
  56. package/skills/taskset-implement/references/release.md +135 -0
  57. package/skills/taskset-implement/references/workflows/dependencies-and-docs-site.md +54 -0
  58. package/skills/taskset-implement/references/workflows/environment-and-pnpm.md +109 -0
  59. package/skills/taskset-implement/references/workflows/persisted-data-and-git.md +30 -0
  60. package/skills/taskset-implement/references/workflows/validation.md +34 -0
  61. package/skills/taskset-implement/references/workflows/vitest-and-test-strategy.md +82 -0
  62. package/skills/taskset-implement/references/workflows.md +33 -0
  63. package/src/cli.ts +640 -87
@@ -0,0 +1,461 @@
1
+ ---
2
+ title: Look up Taskset CLI commands
3
+ description: Complete reference for the taskset command-line interface.
4
+ contentType: Reference
5
+ navLabel: CLI Reference
6
+ ---
7
+
8
+ # Look up Taskset CLI commands
9
+
10
+ The `taskset` command is a thin adapter over `@taskset/core` for the full Taskset surface: stories, flows, research, decisions, runbooks, and tasks. It parses arguments, validates options, calls core operations, and renders human or JSON output.
11
+
12
+ Invoke it with `npx @taskset/cli`, `pnpm dlx @taskset/cli`, `yarn dlx @taskset/cli`, `bunx @taskset/cli`, a project binary, or a global install. Examples below use `taskset` directly.
13
+
14
+ ## Common Behavior
15
+
16
+ ```bash
17
+ taskset help
18
+ taskset --help
19
+ taskset -h
20
+ ```
21
+
22
+ Running without a command also prints usage. These help paths exit with code
23
+ `0`.
24
+
25
+ Most repository commands accept:
26
+
27
+ | Option | Description |
28
+ | --- | --- |
29
+ | `--cwd <path>` | Resolve repository discovery from another working directory. |
30
+ | `--json` | Emit structured JSON instead of human-readable text where supported. |
31
+
32
+ Stdout is reserved for requested output. Diagnostics, validation failures, and
33
+ best-effort generated-view refresh warnings are written to stderr.
34
+
35
+ Exit codes:
36
+
37
+ | Code | Meaning |
38
+ | --- | --- |
39
+ | `0` | Command succeeded. |
40
+ | `1` | Repository or domain operation failed, such as invalid task state or delete blockers. |
41
+ | `2` | CLI usage, argument validation, path normalization, or parse validation failed. |
42
+
43
+ ## Repository Commands
44
+
45
+ ### `init`
46
+
47
+ ```bash
48
+ taskset init [--config] [--cwd <path>]
49
+ ```
50
+
51
+ Initializes a Taskset repository. The command resolves a root from an existing `.taskset/`, Git or workspace markers, or the working directory, then creates `.taskset/` task and document directories plus `.taskset/.gitignore` when they do not already exist. Pass `--config` to also write optional `taskset.config.ts`.
52
+
53
+ Human output:
54
+
55
+ ```text
56
+ Initialized Taskset in <root-directory>
57
+ ```
58
+
59
+ ### `config`
60
+
61
+ ```bash
62
+ taskset config [--json] [--cwd <path>]
63
+ ```
64
+
65
+ Discovers the nearest `.taskset/` directory by walking upward from the working directory. Optional `taskset.config.ts` at that root overlays defaults when present.
66
+
67
+ Human output is the config file path when a config exists, or `defaults (<root-directory>)` when it does not. JSON output contains:
68
+
69
+ ```json
70
+ {
71
+ "rootDirectory": "...",
72
+ "configPath": "...",
73
+ "hasConfig": false,
74
+ "dataDirectory": "...",
75
+ "config": {}
76
+ }
77
+ ```
78
+
79
+ ### `doctor`
80
+
81
+ ```bash
82
+ taskset doctor [--json] [--cwd <path>]
83
+ ```
84
+
85
+ Validates the repository without modifying files. It scans canonical task
86
+ metadata, paths, and graph relationships.
87
+
88
+ Human success output:
89
+
90
+ ```text
91
+ Taskset repository is valid (<count> tasks)
92
+ ```
93
+
94
+ Human failure output is tab-separated:
95
+
96
+ ```text
97
+ <code> <path-or-> <message> <remediation>
98
+ ```
99
+
100
+ JSON output is the full doctor result, including `valid`, `taskCount`, and
101
+ diagnostics.
102
+
103
+ ### `generate`
104
+
105
+ ```bash
106
+ taskset generate [--json] [--cwd <path>]
107
+ ```
108
+
109
+ Rebuilds disposable generated views under each entity folder's `.generated/`
110
+ directory (for example `.taskset/tasks/.generated/` and
111
+ `.taskset/stories/.generated/`). Removes any legacy `.taskset/generated/` tree.
112
+
113
+ Human output:
114
+
115
+ ```text
116
+ Generated <count> views in <directory>
117
+ ```
118
+
119
+ JSON output is the generated-views result with the target directory and written
120
+ files.
121
+
122
+ ## Snapshot Commands
123
+
124
+ Snapshots are non-authoritative safety checkpoints under `.taskset/snapshots/`.
125
+ Git remains the normal history and collaboration mechanism.
126
+
127
+ ### `snapshot create`
128
+
129
+ ```bash
130
+ taskset snapshot create [--json] [--cwd <path>]
131
+ ```
132
+
133
+ Creates an immutable archive of canonical task files.
134
+
135
+ Human output is the snapshot ID. JSON output is the snapshot manifest.
136
+
137
+ ### `snapshot list`
138
+
139
+ ```bash
140
+ taskset snapshot list [--json] [--cwd <path>]
141
+ ```
142
+
143
+ Lists available snapshots.
144
+
145
+ Human output is tab-separated:
146
+
147
+ ```text
148
+ <snapshot-id> <created-at> <file-count>
149
+ ```
150
+
151
+ JSON output is an array of snapshot manifests.
152
+
153
+ ### `snapshot restore`
154
+
155
+ ```bash
156
+ taskset snapshot restore <snapshot-id> [--apply] [--json] [--cwd <path>]
157
+ ```
158
+
159
+ Previews or restores canonical task files from a snapshot. The default is a dry
160
+ run. Use `--apply` to mutate task files.
161
+
162
+ Human output:
163
+
164
+ ```text
165
+ Would restore <count> task files from <snapshot-id>
166
+ Restored <count> task files from <snapshot-id>
167
+ ```
168
+
169
+ JSON output is the restore result, including `applied` and `changes`.
170
+
171
+ ## Task Metadata Options
172
+
173
+ `task create` and `task update` accept the same metadata options unless noted.
174
+ Array options are repeatable.
175
+
176
+ | Option | Field | Notes |
177
+ | --- | --- | --- |
178
+ | `--title <title>` | `title` | Required for create, optional for update. |
179
+ | `--status <status>` | `status` | One of `todo`, `doing`, `blocked`, `done`, `canceled`. |
180
+ | `--priority <priority>` | `priority` | One of `low`, `medium`, `high`, `urgent`. |
181
+ | `--order <number>` | `order` | Nonnegative finite number. Lower values sort first. |
182
+ | `--label <label>` | `labels` | Repeatable. |
183
+ | `--depends-on <task-id>` | `dependsOn` | Repeatable. |
184
+ | `--file <path>` | `files` | Repeatable; normalized to a repository-relative POSIX path. |
185
+ | `--owner <owner>` | `owner` | Trimmed string. |
186
+ | `--assignee <assignee>` | `assignees` | Repeatable. |
187
+ | `--reviewer <reviewer>` | `reviewers` | Repeatable. |
188
+ | `--team <team>` | `team` | Trimmed string. |
189
+ | `--estimate <minutes>` | `estimate` | Nonnegative integer. |
190
+ | `--effort <value>` | `effort` | Nonnegative finite number. |
191
+ | `--risk <risk>` | `risk` | One of `low`, `medium`, `high`. |
192
+ | `--due-date <date>` | `dueDate` | `YYYY-MM-DD` or `YYYY-MM-DD HH:mm UTC`. |
193
+ | `--related <task-id>` | `related` | Repeatable. |
194
+ | `--duplicate <task-id>` | `duplicates` | Repeatable. |
195
+ | `--parent <task-id>` | `parent` | Single task ID. |
196
+ | `--directory <path>` | `directories` | Repeatable; normalized to a repository-relative POSIX path. |
197
+ | `--project <project>` | `projects` | Repeatable. |
198
+ | `--body <markdown>` | body | Replaces the Markdown body. |
199
+ | `--json` | output | Emit a task record as JSON. |
200
+ | `--cwd <path>` | discovery | Resolve repository discovery from another directory. |
201
+
202
+ ## Task Commands
203
+
204
+ ### `task create`
205
+
206
+ ```bash
207
+ taskset task create --title <title> [metadata options] [--json] [--cwd <path>]
208
+ ```
209
+
210
+ Creates a versionless task file using repository defaults for omitted
211
+ configured fields.
212
+
213
+ Human output is the task ID. JSON output is a task record containing
214
+ `relativePath` and metadata fields.
215
+
216
+ ### `task list`
217
+
218
+ ```bash
219
+ taskset task list [query options] [--json] [--cwd <path>]
220
+ ```
221
+
222
+ Lists tasks using metadata, relationship, planning, timestamp, text, path, and
223
+ impact filters.
224
+
225
+ Filter options:
226
+
227
+ | Option | Description |
228
+ | --- | --- |
229
+ | `--status <status>` | Repeatable; OR within statuses. |
230
+ | `--priority <priority>` | Repeatable; OR within priorities. |
231
+ | `--label <label>` | Repeatable; every requested label must be present. |
232
+ | `--owner <owner>` | Repeatable; OR within owners. |
233
+ | `--assignee <assignee>` | Repeatable; OR within assignees. |
234
+ | `--reviewer <reviewer>` | Repeatable; OR within reviewers. |
235
+ | `--team <team>` | Repeatable; OR within teams. |
236
+ | `--risk <risk>` | Repeatable; OR within risks. |
237
+ | `--project <project>` | Repeatable; OR within projects. |
238
+ | `--depends-on <task-id>` | Match a direct dependency. |
239
+ | `--related <task-id>` | Match a related task. |
240
+ | `--duplicate <task-id>` | Match a duplicate task relationship. |
241
+ | `--parent <task-id>` | Match a direct parent. |
242
+ | `--file <path>` | Repeatable; unified containment query over `files` and `directories`. |
243
+ | `--directory <path>` | Repeatable; containment query over `directories` only. |
244
+ | `--estimate-min <minutes>` | Inclusive minimum estimate. |
245
+ | `--estimate-max <minutes>` | Inclusive maximum estimate. |
246
+ | `--effort-min <value>` | Inclusive minimum effort. |
247
+ | `--effort-max <value>` | Inclusive maximum effort. |
248
+ | `--due-before <date>` | Inclusive due-date upper bound. |
249
+ | `--due-after <date>` | Inclusive due-date lower bound. |
250
+ | `--created-before <date>` | Inclusive created-at upper bound. |
251
+ | `--created-after <date>` | Inclusive created-at lower bound. |
252
+ | `--updated-before <date>` | Inclusive updated-at upper bound. |
253
+ | `--updated-after <date>` | Inclusive updated-at lower bound. |
254
+ | `--search <text>` | Search task title and Markdown body; every whitespace-separated term must match. |
255
+ | `--sort <key>` | Sort key. |
256
+ | `--direction <asc|desc>` | Sort direction. |
257
+ | `--impact` | Add tasks that transitively depend on direct matches. |
258
+ | `--include-derived` | Include derived relationship projections in JSON output. |
259
+
260
+ Sort keys are `id`, `title`, `status`, `priority`, `order`, `owner`, `team`,
261
+ `estimate`, `effort`, `risk`, `dueDate`, `createdAt`, and `updatedAt`. With
262
+ `--sort order`, tasks without `order` sort after ordered tasks; duplicate
263
+ values fall back to task ID ordering.
264
+
265
+ Different filter categories compose with AND. Repeated enum, person, project,
266
+ file, and directory values use OR within their category. Repeated labels are
267
+ stricter and require all requested labels.
268
+
269
+ Search is Unicode-normalized and case-insensitive. Its terms may occur in any
270
+ order or location across the combined title and Markdown body, so
271
+ `--search "cache invalidation"` does not require that exact phrase.
272
+
273
+ Without `--impact`, human output is:
274
+
275
+ ```text
276
+ <task-id> <status> <title>
277
+ ```
278
+
279
+ With `--impact`, human output prefixes direct and impacted rows:
280
+
281
+ ```text
282
+ direct <task-id> <status> <title>
283
+ impact <task-id> <status> <title>
284
+ ```
285
+
286
+ JSON output without `--impact` is an array of task records. JSON output with
287
+ `--impact` is:
288
+
289
+ ```json
290
+ {
291
+ "direct": [],
292
+ "impacted": []
293
+ }
294
+ ```
295
+
296
+ Use `--include-derived` to include `blockedBy`, `blocks`, `children`, and
297
+ `subtasks` projections in each JSON record.
298
+
299
+ ### `task show`
300
+
301
+ ```bash
302
+ taskset task show <task-id> [--include-derived] [--json] [--cwd <path>]
303
+ ```
304
+
305
+ Shows one task by ID.
306
+
307
+ Human output is the serialized task Markdown. JSON output contains:
308
+
309
+ ```json
310
+ {
311
+ "relativePath": ".taskset/tasks/0000001-short-title-a1b2c3.md",
312
+ "metadata": {},
313
+ "body": "...",
314
+ "derived": {}
315
+ }
316
+ ```
317
+
318
+ The `derived` property is present only with `--include-derived`.
319
+
320
+ ### `task update`
321
+
322
+ ```bash
323
+ taskset task update <task-id> [metadata options] [clear options] [--json] [--cwd <path>]
324
+ ```
325
+
326
+ Updates one task. At least one non-control option is required. A field cannot
327
+ be set and cleared in the same command.
328
+
329
+ Clear options:
330
+
331
+ | Option | Effect |
332
+ | --- | --- |
333
+ | `--clear-priority` | Remove `priority`. |
334
+ | `--clear-order` | Remove `order`. |
335
+ | `--clear-labels` | Replace `labels` with an empty list. |
336
+ | `--clear-dependencies` | Replace `dependsOn` with an empty list. |
337
+ | `--clear-files` | Replace `files` with an empty list. |
338
+ | `--clear-owner` | Remove `owner`. |
339
+ | `--clear-assignees` | Replace `assignees` with an empty list. |
340
+ | `--clear-reviewers` | Replace `reviewers` with an empty list. |
341
+ | `--clear-team` | Remove `team`. |
342
+ | `--clear-estimate` | Remove `estimate`. |
343
+ | `--clear-effort` | Remove `effort`. |
344
+ | `--clear-risk` | Remove `risk`. |
345
+ | `--clear-due-date` | Remove `dueDate`. |
346
+ | `--clear-related` | Replace `related` with an empty list. |
347
+ | `--clear-duplicates` | Replace `duplicates` with an empty list. |
348
+ | `--clear-parent` | Remove `parent`. |
349
+ | `--clear-directories` | Replace `directories` with an empty list. |
350
+ | `--clear-projects` | Replace `projects` with an empty list. |
351
+
352
+ Human output is the task ID. JSON output is the updated task record.
353
+
354
+ ### `task status`
355
+
356
+ ```bash
357
+ taskset task status <task-id> <status> [--json] [--cwd <path>]
358
+ ```
359
+
360
+ Updates only task status and enforces lifecycle transition rules. `done` and
361
+ `canceled` are terminal states.
362
+
363
+ Human output is the task ID. JSON output is the updated task record.
364
+
365
+ ### `task delete`
366
+
367
+ ```bash
368
+ taskset task delete <task-id> [--remove-dependencies] [--json] [--cwd <path>]
369
+ ```
370
+
371
+ Deletes one task. By default, deletion is blocked while another task has an
372
+ inbound canonical dependency on the target. Use `--remove-dependencies` to
373
+ remove those inbound references and delete the target in one mutation.
374
+
375
+ Human output is the deleted task ID. JSON output contains `deleted: true`
376
+ alongside the deleted task record.
377
+
378
+ ### `task migrate-ids`
379
+
380
+ ```bash
381
+ taskset task migrate-ids [--json] [--cwd <path>]
382
+ ```
383
+
384
+ Atomically converts legacy `TS-` and sequential task IDs to immutable short hex
385
+ IDs, normalizes filenames to `{sequence}-{slug}-{id}.md`, repairs duplicate
386
+ sequence prefixes by `createdAt`, and rewrites canonical relationships plus
387
+ references in repository text files. Dependencies, Git internals, build output,
388
+ caches, generated views, indexes, and snapshots are excluded. Human output is a
389
+ tab-separated old-to-new mapping; JSON emits the same mapping as objects.
390
+
391
+ ### `sync`
392
+
393
+ ```bash
394
+ taskset sync [--concurrency <count>] [--json] [--cwd <path>]
395
+ ```
396
+
397
+ Ensures every canonical document directory exists under `.taskset`, migrates
398
+ legacy task and document IDs to short hex IDs, normalizes filenames, repairs
399
+ duplicate sequence prefixes by `createdAt`, rewrites repository text
400
+ references, and rebuilds generated views. Progress counts and percentages are
401
+ sent to stderr.
402
+
403
+ ## Document Commands
404
+
405
+ `document` may be shortened to `doc`. Supported types are `story`, `flow`,
406
+ `decision`, `research`, and `runbook`; `adr` and `dr` alias `decision`.
407
+
408
+ ```bash
409
+ taskset document create <type> --title <title> [metadata options]
410
+ taskset document import <markdown-path> [--type <type>] [--title <title>] [--move]
411
+ taskset document batch <manifest.json> [--concurrency <count>] [--json]
412
+ taskset document list [type] [query options]
413
+ taskset document show <document-id> [--type <type>] [--include-derived] [--json]
414
+ taskset document update <document-id> [metadata options] [--type <type>]
415
+ taskset document status <document-id> <status> [--type <type>] [--json]
416
+ taskset document delete <document-id> [--type <type>] [--remove-dependencies] [--json]
417
+ ```
418
+
419
+ Create uses the type-specific template unless `--body` is supplied and accepts
420
+ the same metadata options as `task create`. Import preserves the Markdown body
421
+ and infers type from a recognized parent directory when possible. It copies by
422
+ default; `--move` deletes the source only after the canonical document is
423
+ written successfully.
424
+
425
+ List, show, update, status, and delete mirror the task commands, including
426
+ search, filters, sort, impact, derived relationships, clear flags, and
427
+ guarded deletion. Document statuses are `draft`, `ready`, `active`, `accepted`,
428
+ `superseded`, and `archived`.
429
+
430
+ Batch manifests contain an array of `create`, `import`, `update`, and `export`
431
+ operations. Work is paced with bounded concurrency, results preserve manifest
432
+ order, progress is sent to stderr, and `--json` reserves stdout for the result
433
+ array. See [Document Types](document-types.md#batch-workflows) for a complete
434
+ manifest example.
435
+
436
+ ## Generated-View Warnings
437
+
438
+ Task and document creation, update, status changes, deletion, and snapshot
439
+ restore mutate canonical Markdown first and then refresh disposable generated
440
+ views. If that refresh fails after the canonical mutation succeeds, the command
441
+ still succeeds and writes a stderr warning:
442
+
443
+ ```text
444
+ warning: <message>
445
+ ```
446
+
447
+ Run `taskset generate` later to rebuild generated views explicitly.
448
+
449
+ ## Compatibility Notes
450
+
451
+ `tasks-for-file` was removed. Use:
452
+
453
+ ```bash
454
+ taskset task list --file <path> --impact
455
+ ```
456
+
457
+ Task files are versionless. Frontmatter that still contains a legacy version
458
+ field is invalid and must be converted by removing that field while preserving
459
+ the rest of the task metadata and Markdown body. Snapshot restore previews by
460
+ default; pass `--apply` only when the displayed plan is the mutation you intend
461
+ to commit.
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: Configure Taskset defaults
3
+ description: Optionally add taskset.config.ts to overlay defaults and vocabulary on a `.taskset/` repository.
4
+ contentType: How-to
5
+ navLabel: Configuration
6
+ ---
7
+
8
+ # Configure Taskset defaults
9
+
10
+ Taskset repositories are identified by a `.taskset/` directory. `taskset.config.ts` is optional. When the file is absent, built-in statuses, priorities, and creation defaults apply.
11
+
12
+ ## When to add a config file
13
+
14
+ Add `taskset.config.ts` when you need at least one of these:
15
+
16
+ - A repository `project.name`
17
+ - Different task creation defaults
18
+ - A reduced or reordered status or priority vocabulary
19
+
20
+ Create one during init:
21
+
22
+ ```bash
23
+ taskset init --config
24
+ ```
25
+
26
+ Or author the file beside `.taskset/`:
27
+
28
+ ```typescript
29
+ import { defineConfig } from '@taskset/cli'
30
+
31
+ export default defineConfig({
32
+ project: {
33
+ name: 'taskset',
34
+ },
35
+ tasks: {
36
+ defaults: {
37
+ status: 'todo',
38
+ priority: 'medium',
39
+ labels: ['taskset'],
40
+ },
41
+ statuses: ['todo', 'doing', 'blocked', 'done', 'canceled'],
42
+ priorities: ['low', 'medium', 'high', 'urgent'],
43
+ },
44
+ })
45
+ ```
46
+
47
+ ## Contract
48
+
49
+ - `project.name` is optional repository metadata
50
+ - `tasks.defaults.status`, `priority`, and `labels` are optional creation defaults
51
+ - `tasks.statuses` selects and orders the active status vocabulary from Taskset’s canonical values
52
+ - `tasks.priorities` selects and orders the active priority vocabulary from Taskset’s canonical values
53
+ - `urgent` is the highest supported priority
54
+ - Unknown fields, invalid enum values, empty names, and duplicate default labels or vocabulary values are rejected
55
+ - The config file is trusted project TypeScript and may use erasable syntax supported by your Node version
56
+
57
+ The config identifies behavior. It is not task storage. Canonical task state remains under `.taskset/tasks/`.
58
+
59
+ ## Discovery
60
+
61
+ Commands started in nested directories walk upward until they find `.taskset/`. If `taskset.config.ts` exists at that root, Taskset loads and validates it. Otherwise it uses built-in defaults.
62
+
63
+ Use `taskset config --json` to inspect the discovered root, whether a config file is present, and the resolved defaults.
@@ -0,0 +1,103 @@
1
+ ---
2
+ title: Choose a Taskset document type
3
+ description: Canonical stories, flows, decisions, research, and runbooks.
4
+ contentType: Conceptual
5
+ navLabel: Document Types
6
+ ---
7
+
8
+ # Choose a Taskset document type
9
+
10
+ Documents are how Taskset keeps product and engineering memory: what to build, what you learned, what you decided, and how to recover. Use them when the material should outlive a single task. Each type has strict common frontmatter and a body template suited to its purpose. Documents share planning, people, path, and relationship fields with tasks, and use document-specific statuses.
11
+
12
+ | Type | Directory | Template focus |
13
+ | --- | --- | --- |
14
+ | `story` | `.taskset/stories/` | user outcome and acceptance criteria |
15
+ | `flow` | `.taskset/flows/` | preconditions, journey, variants, checks |
16
+ | `decision` (`adr`, `dr`) | `.taskset/decisions/` | context, decision, alternatives, consequences |
17
+ | `research` | `.taskset/research/` | question, sources, findings, recommendation |
18
+ | `runbook` | `.taskset/runbooks/` | symptoms, checks, actions, rollback, escalation |
19
+
20
+ Create a document from its template:
21
+
22
+ ```bash
23
+ taskset document create story --title "Member signs in via SSO"
24
+ taskset document create flow --title "Recover a delayed deposit"
25
+ taskset document create adr --title "Use transactional outbox"
26
+ taskset document create research --title "Evaluate queue providers" --related your_task_id_here
27
+ taskset document create runbook --title "Recover consumer lag"
28
+ ```
29
+
30
+ Document IDs are immutable 5-6 character lowercase hex values. Filenames keep a
31
+ per-type display sequence and title slug, for example
32
+ `.taskset/flows/0000001-member-signs-in-via-sso-a1b2c3.md`. Agents and commands
33
+ reference the short `id`. Disposable metadata indexes for that kind live beside
34
+ the files in `.taskset/flows/.generated/`.
35
+
36
+ ## Query And Mutation
37
+
38
+ Documents support the same command surface as tasks:
39
+
40
+ ```bash
41
+ taskset document list research --search "queue" --owner platform --impact
42
+ taskset document show <document-id> --type research --include-derived --json
43
+ taskset document update <document-id> --status ready --label infra --file packages/core
44
+ taskset document status <document-id> accepted --type decision
45
+ taskset document delete <document-id> --remove-dependencies
46
+ ```
47
+
48
+ Statuses are `draft`, `ready`, `active`, `accepted`, `superseded`, and
49
+ `archived`. `--related` may point at tasks or documents. `--depends-on` and
50
+ `--parent` must resolve to other Taskset documents.
51
+
52
+ ## Import Existing Markdown
53
+
54
+ Use `document import` when a repository already has material under paths such
55
+ as `docs/stories`, `docs/flows`, `docs/adr`, `docs/research`, or
56
+ `docs/runbooks`:
57
+
58
+ ```bash
59
+ taskset document import docs/flows/0001-sign-in.md
60
+ taskset document import docs/architecture/use-postgres.md --type decision
61
+ taskset document import docs/runbooks/consumer-lag.md --move
62
+ ```
63
+
64
+ The type is inferred from recognized parent directory names when `--type` is
65
+ omitted. `adr`, `dr`, `decision`, and `decisions` all normalize to `decision`.
66
+ The first H1 supplies the title unless `--title` is passed. Existing
67
+ frontmatter is replaced with Taskset's canonical metadata while the Markdown
68
+ body is preserved. Import copies by default; `--move` removes the source only
69
+ after the canonical file has been written successfully.
70
+
71
+ Use `document list [type]`, `document show <id>`, and `--json` for inspection
72
+ and automation. Sequences are per type, so pass `--type` to `document show`
73
+ when the same ID exists in more than one kind.
74
+
75
+ ## Batch Workflows
76
+
77
+ Use a JSON manifest when an agent or migration needs to create, import, update,
78
+ or export many documents. Operations run through a bounded TanStack Pacer queue;
79
+ progress such as `3/8 (38%)` is written to stderr, while `--json` keeps stdout
80
+ safe for automation.
81
+
82
+ ```json
83
+ [
84
+ { "action": "create", "input": { "type": "story", "title": "Member upgrades" } },
85
+ { "action": "import", "sourcePath": "docs/flows/checkout.md", "options": { "type": "flow" } },
86
+ { "action": "update", "id": "a1b2c3", "type": "story", "input": { "status": "ready" } },
87
+ { "action": "export", "id": "a1b2c3", "type": "story", "targetPath": "exports/member-upgrades.md" }
88
+ ]
89
+ ```
90
+
91
+ ```bash
92
+ taskset document batch taskset-documents.json --concurrency 4 --json
93
+ taskset sync --concurrency 8
94
+ ```
95
+
96
+ `taskset sync` creates missing document-kind directories inside `.taskset`,
97
+ migrates legacy task and document IDs to short hex IDs, normalizes
98
+ `{sequence}-{slug}-{id}.md` filenames, repairs duplicate sequence prefixes by
99
+ `createdAt`, rewrites repository text references, refreshes data `.gitignore`
100
+ rules for scoped `.generated/` directories, removes legacy global
101
+ `.taskset/generated/`, and rebuilds generated views. Build outputs,
102
+ dependencies, caches, snapshots, and Git internals are excluded from reference
103
+ rewriting.