@taskset/cli 3.0.3 → 5.1.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 (58) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +8 -3
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +686 -19
  5. package/docs/_meta.ts +8 -0
  6. package/docs/cli-reference.md +461 -0
  7. package/docs/configuration.md +61 -0
  8. package/docs/document-types.md +100 -0
  9. package/docs/getting-started.md +99 -0
  10. package/docs/index.md +37 -0
  11. package/docs/maintainers/_meta.ts +7 -0
  12. package/docs/maintainers/architecture/_meta.ts +5 -0
  13. package/docs/maintainers/architecture/decisions/0001-documentation-platform.md +70 -0
  14. package/docs/maintainers/architecture/decisions/0002-code-architecture.md +31 -0
  15. package/docs/maintainers/architecture/decisions/0003-snapshot-policy.md +31 -0
  16. package/docs/maintainers/architecture/decisions/_meta.ts +5 -0
  17. package/docs/maintainers/architecture/overview.md +111 -0
  18. package/docs/maintainers/architecture/synchronization.md +56 -0
  19. package/docs/maintainers/development/_meta.ts +6 -0
  20. package/docs/maintainers/development/contributing.md +59 -0
  21. package/docs/maintainers/development/documentation.md +69 -0
  22. package/docs/maintainers/development/engineering.md +59 -0
  23. package/docs/maintainers/development/testing.md +89 -0
  24. package/docs/maintainers/index.md +22 -0
  25. package/docs/maintainers/product/_meta.ts +3 -0
  26. package/docs/maintainers/product/vision.md +76 -0
  27. package/docs/maintainers/technology.md +55 -0
  28. package/docs/task-files.md +174 -0
  29. package/package.json +10 -8
  30. package/skills/taskset/SKILL.md +227 -0
  31. package/skills/taskset/references/changesets-examples.md +97 -0
  32. package/skills/taskset/references/document-modeling-examples.md +63 -0
  33. package/skills/taskset/references/monorepo-task-modeling.md +125 -0
  34. package/skills/taskset/references/task-modeling-examples.md +249 -0
  35. package/skills/taskset-implement/SKILL.md +234 -0
  36. package/skills/taskset-implement/agents/openai.yaml +4 -0
  37. package/skills/taskset-implement/references/architecture/client-and-server.md +69 -0
  38. package/skills/taskset-implement/references/architecture/documentation-and-generated.md +70 -0
  39. package/skills/taskset-implement/references/architecture/ownership-and-dependencies.md +107 -0
  40. package/skills/taskset-implement/references/architecture/product-and-source.md +80 -0
  41. package/skills/taskset-implement/references/architecture/storage-and-snapshots.md +45 -0
  42. package/skills/taskset-implement/references/architecture.md +34 -0
  43. package/skills/taskset-implement/references/conventions/backend-and-tooling.md +33 -0
  44. package/skills/taskset-implement/references/conventions/design.md +38 -0
  45. package/skills/taskset-implement/references/conventions/interfaces-and-ui.md +50 -0
  46. package/skills/taskset-implement/references/conventions/naming-and-packages.md +64 -0
  47. package/skills/taskset-implement/references/conventions/task-files.md +89 -0
  48. package/skills/taskset-implement/references/conventions/tests-and-docs.md +55 -0
  49. package/skills/taskset-implement/references/conventions/typescript-and-exports.md +41 -0
  50. package/skills/taskset-implement/references/conventions.md +40 -0
  51. package/skills/taskset-implement/references/release.md +135 -0
  52. package/skills/taskset-implement/references/workflows/dependencies-and-docs-site.md +54 -0
  53. package/skills/taskset-implement/references/workflows/environment-and-pnpm.md +108 -0
  54. package/skills/taskset-implement/references/workflows/persisted-data-and-git.md +30 -0
  55. package/skills/taskset-implement/references/workflows/validation.md +34 -0
  56. package/skills/taskset-implement/references/workflows/vitest-and-test-strategy.md +82 -0
  57. package/skills/taskset-implement/references/workflows.md +33 -0
  58. package/src/cli.ts +851 -17
@@ -0,0 +1,89 @@
1
+ ---
2
+ title: Testing
3
+ description: Maintainer test strategy, Vitest usage, and pragmatic TDD guidance.
4
+ ---
5
+
6
+ # Testing
7
+
8
+ Taskset uses Vitest for TypeScript unit and integration tests. The root
9
+ configuration is shared by package-local suites. Turbo runs each owning
10
+ package's Vitest task and the root workspace architecture suite.
11
+ Vitest already provides the Vite-powered test pipeline; the Node library and
12
+ CLI packages use TypeScript directly for builds, so they do not need a separate
13
+ Vite build configuration.
14
+
15
+ ```bash
16
+ pnpm test
17
+ pnpm test:architecture
18
+ pnpm test:watch
19
+ pnpm check
20
+ ```
21
+
22
+ Use filtered package tests for focused work:
23
+
24
+ ```bash
25
+ pnpm --filter @taskset/core test
26
+ pnpm --filter @taskset/cli test
27
+ ```
28
+
29
+ Package-local test scripts are intentional. Turbo and filtered pnpm commands
30
+ execute scripts owned by each workspace; the root script cannot replace those
31
+ entrypoints. `test:architecture` names the separate root-only package-boundary
32
+ suite. There is no `transit` command in the repository.
33
+
34
+ ## TDD Policy
35
+
36
+ Prefer a red-green-refactor loop for:
37
+
38
+ - domain invariants
39
+ - parser and serializer behavior
40
+ - lifecycle transitions
41
+ - graph rules
42
+ - migrations
43
+ - bug fixes
44
+
45
+ Do not force test-first ceremony for documentation, formatting, generated
46
+ configuration, or exploratory spikes. Convert a successful spike into tested
47
+ production behavior before merging it.
48
+
49
+ ## Test Layers
50
+
51
+ ### Unit
52
+
53
+ Test pure schemas, value objects, state transitions, graph algorithms, filters,
54
+ and serialization rules.
55
+
56
+ ### Integration
57
+
58
+ Use temporary fixture repositories to test filesystem behavior, Git discovery,
59
+ atomic writes, path safety, monorepo discovery, and package impact.
60
+
61
+ ### Contract
62
+
63
+ Verify CLI exit codes and output, MCP schemas, package exports, and persisted
64
+ Markdown compatibility.
65
+
66
+ ### UI
67
+
68
+ Test feature behavior and accessibility in the owning interface. Add browser
69
+ projects only when UI packages exist.
70
+
71
+ ### End to end
72
+
73
+ Keep a small number of workflows that create a fixture repository and exercise
74
+ the public CLI or hosted interface. Do not duplicate every unit case at this
75
+ level.
76
+
77
+ ## Important Cases
78
+
79
+ - malformed YAML and unknown fields
80
+ - CRLF, Unicode, and empty Markdown bodies
81
+ - parse and serialize round trips
82
+ - duplicate IDs and branch-safe identity
83
+ - path traversal and symlink boundaries
84
+ - broken graph references and cycles
85
+ - interrupted writes and stale updates
86
+ - old-format fixtures and compatibility rollback behavior
87
+
88
+ Vitest code snapshots are acceptable for small stable serialized output or
89
+ diagnostics. They are unrelated to Taskset safety snapshots.
@@ -0,0 +1,22 @@
1
+ ---
2
+ title: Maintainers
3
+ description: Repository maintenance documentation for Taskset contributors.
4
+ ---
5
+
6
+ # Taskset Maintainer Documentation
7
+
8
+ This section contains repository maintenance material. It is intentionally
9
+ separate from the primary user guides while remaining available in the same
10
+ Nextra documentation site.
11
+
12
+ ## Contents
13
+
14
+ - `product/`: product direction and scope
15
+ - `architecture/`: system boundaries and accepted decisions
16
+ - `development/`: contribution, engineering, testing, and documentation
17
+ workflows
18
+ - `technology.md`: preferred frontend, backend, language, and database choices
19
+
20
+ Contributors should start with the root `CONTRIBUTING.md`, then read the
21
+ relevant maintainer document before changing architecture, tooling, or
22
+ repository workflows.
@@ -0,0 +1,3 @@
1
+ export default {
2
+ vision: 'Vision',
3
+ }
@@ -0,0 +1,76 @@
1
+ ---
2
+ title: Product Vision
3
+ description: Maintainer-facing product direction for Taskset.
4
+ ---
5
+
6
+ # Product Vision
7
+
8
+ ## Origin
9
+
10
+ Taskset began from a simple need: keep task context offline and inline with the
11
+ code so developers and AI assistants can understand work immediately without
12
+ switching to a disconnected project-management database.
13
+
14
+ ## Vision
15
+
16
+ Taskset aims to become the Git-native operating system for software delivery.
17
+
18
+ ## Mission
19
+
20
+ Store planning, execution, and project knowledge as human-readable repository
21
+ files, then provide focused interfaces over that shared task graph.
22
+
23
+ ## Product Goals
24
+
25
+ - Accelerate delivery by reducing context switching.
26
+ - Give developers immediate awareness of related tasks, dependencies, specs,
27
+ decisions, and releases.
28
+ - Give AI systems direct, structured, reviewable project context.
29
+ - Make monorepos, packages, applications, and code paths first-class.
30
+ - Let managers and stakeholders view repository-backed information without
31
+ creating another source of truth.
32
+
33
+ ## Principles
34
+
35
+ ### Offline first
36
+
37
+ Core workflows must work from a local repository without a network service.
38
+
39
+ ### Inline with code
40
+
41
+ Project context belongs beside the code it affects and travels with the
42
+ repository.
43
+
44
+ ### Human and AI readable
45
+
46
+ Markdown carries durable prose. Structured frontmatter carries data that tools
47
+ can validate and query.
48
+
49
+ ### Git native
50
+
51
+ Commits, branches, pull requests, diffs, and reviews are normal collaboration
52
+ mechanisms.
53
+
54
+ ### One source of truth
55
+
56
+ Every interface reads and changes the same canonical `.taskset/` files through
57
+ the same domain rules.
58
+
59
+ ### Developer first
60
+
61
+ Taskset proves developer workflows before broad enterprise planning features.
62
+
63
+ ## Near-Term Scope
64
+
65
+ The MVP should implement:
66
+
67
+ - repository initialization
68
+ - task creation, listing, display, editing, and removal
69
+ - lifecycle transitions
70
+ - deterministic Markdown parsing and serialization
71
+ - validation and repository diagnostics
72
+ - basic search and filtering
73
+ - dependency integrity
74
+
75
+ TUI, MCP, extension, Kanban, Office, and integrations follow after the file and
76
+ core contracts are reliable.
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Technology Preferences
3
+ description: Preferred frontend, backend, language, and database choices for Taskset.
4
+ ---
5
+
6
+ # Technology Preferences
7
+
8
+ These are defaults for new Taskset implementation work. They guide choices
9
+ when requirements do not demand a different tool; they are not a requirement
10
+ to install every library in every package.
11
+
12
+ ## Frontend
13
+
14
+ Use TypeScript and React for web interfaces. Prefer the TanStack ecosystem for
15
+ headless application behavior:
16
+
17
+ - TanStack Query for server-state fetching, caching, and mutations
18
+ - TanStack Form for complex validated forms
19
+ - TanStack Table for data grids and tabular state
20
+ - TanStack Hotkeys for keyboard command handling
21
+ - TanStack Pacer for debouncing, throttling, queuing, and rate control
22
+ - TanStack Virtual for large virtualized lists and grids
23
+ - TanStack DB when a client-side reactive data layer is justified
24
+ - TanStack Devtools and library-specific devtools during development
25
+
26
+ Adopt these tools by demonstrated feature need. Do not add speculative
27
+ dependencies to scaffolds or force TanStack abstractions around simple local
28
+ state.
29
+
30
+ ## Backend
31
+
32
+ Prefer TypeScript for services and hosted adapters.
33
+
34
+ - Start with a small framework-independent composition root where practical.
35
+ - Use NestJS when dependency injection, modules, guards, transport adapters, or
36
+ a larger service boundary justify the framework.
37
+ - In NestJS applications, prefer `class-transformer` and `class-validator` for
38
+ transport DTO transformation and validation.
39
+ - Prefer TypeORM when a relational object mapper is appropriate.
40
+ - Keep Taskset domain rules in `@taskset/core`; server frameworks own transport,
41
+ authentication, persistence adapters, and process lifecycle.
42
+
43
+ Use Rust for components where systems-level performance, memory control,
44
+ portability, concurrency, or a standalone native executable provides a clear
45
+ advantage. Keep language boundaries explicit and narrow.
46
+
47
+ ## Databases
48
+
49
+ - Prefer MariaDB for smaller conventional hosted applications.
50
+ - Prefer PostgreSQL for larger systems, advanced relational workloads, and
51
+ features that benefit from its ecosystem.
52
+ - Do not introduce a database as an authority for canonical Taskset entities;
53
+ `.taskset/` Markdown remains the product source of truth.
54
+ - Document schema ownership, migrations, backup, and consistency behavior
55
+ before adding a database-backed adapter.
@@ -0,0 +1,174 @@
1
+ ---
2
+ title: Task Files
3
+ description: The canonical Markdown representation for Taskset work items.
4
+ ---
5
+
6
+ # Task Files
7
+
8
+ Task files live under `.taskset/tasks/`. YAML frontmatter owns structured
9
+ metadata and the Markdown body owns durable human context.
10
+
11
+ ```markdown
12
+ ---
13
+ id: 0000001-add-task-validation
14
+ title: Add task validation
15
+ status: doing
16
+ priority: high
17
+ order: 10
18
+ owner: platform
19
+ assignees:
20
+ - maintainer
21
+ reviewers:
22
+ - reviewer
23
+ team: core
24
+ estimate: 90
25
+ effort: 3
26
+ risk: high
27
+ dueDate: 2026-06-30
28
+ createdAt: 2026-06-12
29
+ updatedAt: 2026-06-12 09:30 UTC
30
+ labels:
31
+ - core
32
+ dependsOn: []
33
+ related: []
34
+ duplicates: []
35
+ files:
36
+ - packages/core/src/tasks/taskFile.ts
37
+ directories:
38
+ - packages/core
39
+ projects:
40
+ - taskset
41
+ ---
42
+
43
+ # Context
44
+
45
+ Explain why the task exists.
46
+ ```
47
+
48
+ ## Canonical Data
49
+
50
+ Required fields are `id`, `title`, `status`, `createdAt`, and `updatedAt`.
51
+ Task IDs are immutable seven-digit sequences plus a lowercase title slug, such
52
+ as `0000001-add-task-validation`. The sequence prevents title collisions while
53
+ the slug keeps filenames recognizable.
54
+
55
+ Task files use one strict versionless metadata shape. Optional fields:
56
+
57
+ - Planning: `priority`, `order`, `estimate` in integer minutes, `effort` as a
58
+ finite nonnegative number, `risk`, and `dueDate`
59
+ - People: `owner`, `assignees`, `reviewers`, and `team`
60
+ - Relationships: `dependsOn`, `related`, `duplicates`, and `parent`
61
+ - Scope: `labels`, `files`, `directories`, and `projects`
62
+
63
+ People and project values are trimmed free-form strings. Arrays must not
64
+ contain duplicates. Paths are normalized repository-relative POSIX paths.
65
+ Dates use `YYYY-MM-DD` or `YYYY-MM-DD HH:mm UTC`; documented legacy
66
+ millisecond ISO UTC timestamps remain readable.
67
+
68
+ Unknown fields, invalid enum values, self-links, duplicate list values, path
69
+ traversal, and an `updatedAt` earlier than `createdAt` are rejected.
70
+
71
+ `order` is the optional user-controlled sequence. Lower order values sort
72
+ first. Missing values sort after ordered tasks, and duplicate order values fall
73
+ back to deterministic task ID ordering.
74
+
75
+ ## Compatibility Cutover
76
+
77
+ Legacy `TS-` ULIDs remain readable so a repository can migrate safely. Run
78
+ `taskset task migrate-ids` once to atomically rename task files and rewrite all
79
+ `dependsOn`, `related`, `duplicates`, and `parent` references. The command
80
+ prints the old-to-new mapping for updating references outside `.taskset/`.
81
+
82
+ Task metadata is versionless. Versioned task frontmatter is invalid input and
83
+ fails with a schema diagnostic rather than being silently rewritten.
84
+ Repositories created with earlier Taskset releases must convert task files by
85
+ removing only the legacy version field from task frontmatter while preserving
86
+ all other metadata and Markdown body content. Take a Git commit or
87
+ `taskset snapshot create` checkpoint before converting existing repositories.
88
+
89
+ ## Relationships
90
+
91
+ `dependsOn`, `related`, `duplicates`, and `parent` are canonical. Taskset
92
+ derives:
93
+
94
+ - `blockedBy`: direct dependencies
95
+ - `blocks`: direct inverse dependencies
96
+ - `children`: direct inverse parents
97
+ - `subtasks`: all transitive descendants
98
+
99
+ Use `--include-derived` with task list or JSON task show output. Derived values
100
+ are never written to canonical Markdown. The graph validates missing targets,
101
+ self-links, dependency cycles, and parent cycles.
102
+
103
+ ## Writes And Lifecycle
104
+
105
+ Taskset serializes fields deterministically, normalizes line endings to LF,
106
+ preserves the Markdown body, and emits one final newline. Canonical mutations
107
+ use failure-safe file operations.
108
+
109
+ Allowed lifecycle transitions are:
110
+
111
+ - `todo` to `doing`, `blocked`, or `canceled`
112
+ - `doing` to `todo`, `blocked`, `done`, or `canceled`
113
+ - `blocked` to `todo`, `doing`, or `canceled`
114
+ - `done` and `canceled` are terminal
115
+
116
+ Deletion is rejected while another task has an inbound canonical relationship
117
+ to the target. `--remove-dependencies` repairs those references and removes the
118
+ target in one transaction.
119
+
120
+ ## Queries And Derived State
121
+
122
+ `task list` supports metadata, relationship, planning range, timestamp range,
123
+ text, file, and directory filters. Numeric and timestamp ranges are inclusive:
124
+
125
+ ```bash
126
+ taskset task list --file packages/core --impact --json
127
+ taskset task list --sort order
128
+ taskset task list --estimate-min 30 --estimate-max 120 --risk high
129
+ taskset task list --duplicate 0000001-add-task-validation
130
+ ```
131
+
132
+ Repeated enum, person, project, file, and directory values use OR within the
133
+ same option. Repeated labels require every requested label. Different filter
134
+ categories compose with AND. For example, two `--file` values match either
135
+ path, while adding `--owner` requires both the path match and owner match.
136
+ `--file` is the unified containment query over task files and task directories;
137
+ `--directory` matches only canonical directory metadata. All path inputs are
138
+ normalized relative to the repository before matching.
139
+
140
+ Planning filters are `--estimate-min`, `--estimate-max`, `--effort-min`, and
141
+ `--effort-max`. Timestamp filters are `--due-before`, `--due-after`,
142
+ `--created-before`, `--created-after`, `--updated-before`, and
143
+ `--updated-after`. Title and Markdown body use case-insensitive `--search`;
144
+ every whitespace-separated search term must occur somewhere in those fields,
145
+ but terms need not be adjacent or ordered. Exact task IDs use `task show` or
146
+ relationship filters rather than a redundant list ID filter.
147
+
148
+ With `--impact`, every direct filter is applied first, then the graph adds tasks
149
+ that transitively depend on those direct matches. JSON output uses
150
+ `{ "direct": [...], "impacted": [...] }`; `--include-derived` adds relationship
151
+ projections to records in both groups.
152
+
153
+ `.taskset/cache/` and each entity folder's `.generated/` directory are disposable.
154
+ Generated metadata
155
+ indexes are deterministic projections for supported non-ID task metadata fields
156
+ and refresh on a best-effort basis after canonical mutations. Date and
157
+ timestamp metadata is grouped by calendar date only. Generated filenames remain
158
+ human-readable: spaces are preserved and path separators are displayed with
159
+ `∕` instead of URL-encoded text. Generated views sort tasks by `order` when
160
+ present and display ordered rows with the order value.
161
+
162
+ ## Snapshots
163
+
164
+ Git remains the normal history. `.taskset/snapshots/` contains immutable,
165
+ non-authoritative safety checkpoints:
166
+
167
+ ```bash
168
+ taskset snapshot create
169
+ taskset snapshot list
170
+ taskset snapshot restore <snapshot-id>
171
+ taskset snapshot restore <snapshot-id> --apply
172
+ ```
173
+
174
+ Restore previews by default and requires `--apply` to mutate canonical tasks.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@taskset/cli",
3
3
  "type": "module",
4
4
  "private": false,
5
- "version": "3.0.3",
5
+ "version": "5.1.0",
6
6
  "description": "The scriptable command-line interface for Taskset.",
7
7
  "license": "MIT",
8
8
  "author": {
@@ -23,6 +23,8 @@
23
23
  "dist",
24
24
  "src",
25
25
  "!src/**/*.test.ts",
26
+ "docs",
27
+ "skills",
26
28
  "README.md",
27
29
  "CHANGELOG.md"
28
30
  ],
@@ -43,19 +45,19 @@
43
45
  "node": ">=24.16.0"
44
46
  },
45
47
  "dependencies": {
46
- "zod": "4.5.4",
47
- "@taskset/core": "3.0.2",
48
- "@taskset/contracts": "3.0.0"
48
+ "zod": "4.6.5",
49
+ "@taskset/contracts": "5.0.0",
50
+ "@taskset/core": "5.0.0"
49
51
  },
50
52
  "devDependencies": {
51
- "@types/node": "^26.4.1",
53
+ "@types/node": "^26.6.3",
52
54
  "typescript": "^7.0.2",
53
- "vitest": "^5.0.0",
55
+ "vitest": "^5.0.2",
54
56
  "@taskset/configs": "0.1.1"
55
57
  },
56
58
  "scripts": {
57
- "build": "pnpm clean && tsc",
58
- "clean": "node --eval \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"",
59
+ "build": "pnpm clean && tsc && node ./scripts/copy-package-assets.mjs",
60
+ "clean": "node --eval \"import { rmSync } from 'node:fs'; for (const name of ['dist', 'docs', 'skills']) rmSync(name, { recursive: true, force: true })\"",
59
61
  "test": "vitest run --root ../.. packages/cli/src",
60
62
  "test:watch": "vitest --root ../.. packages/cli/src"
61
63
  }