@taskset/cli 4.0.0 → 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.
- package/CHANGELOG.md +22 -0
- package/README.md +6 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +510 -63
- package/docs/_meta.ts +8 -0
- package/docs/cli-reference.md +461 -0
- package/docs/configuration.md +61 -0
- package/docs/document-types.md +100 -0
- package/docs/getting-started.md +99 -0
- package/docs/index.md +37 -0
- package/docs/maintainers/_meta.ts +7 -0
- package/docs/maintainers/architecture/_meta.ts +5 -0
- package/docs/maintainers/architecture/decisions/0001-documentation-platform.md +70 -0
- package/docs/maintainers/architecture/decisions/0002-code-architecture.md +31 -0
- package/docs/maintainers/architecture/decisions/0003-snapshot-policy.md +31 -0
- package/docs/maintainers/architecture/decisions/_meta.ts +5 -0
- package/docs/maintainers/architecture/overview.md +111 -0
- package/docs/maintainers/architecture/synchronization.md +56 -0
- package/docs/maintainers/development/_meta.ts +6 -0
- package/docs/maintainers/development/contributing.md +59 -0
- package/docs/maintainers/development/documentation.md +69 -0
- package/docs/maintainers/development/engineering.md +59 -0
- package/docs/maintainers/development/testing.md +89 -0
- package/docs/maintainers/index.md +22 -0
- package/docs/maintainers/product/_meta.ts +3 -0
- package/docs/maintainers/product/vision.md +76 -0
- package/docs/maintainers/technology.md +55 -0
- package/docs/task-files.md +174 -0
- package/package.json +7 -5
- package/skills/taskset/SKILL.md +227 -0
- package/skills/taskset/references/changesets-examples.md +97 -0
- package/skills/taskset/references/document-modeling-examples.md +63 -0
- package/skills/taskset/references/monorepo-task-modeling.md +125 -0
- package/skills/taskset/references/task-modeling-examples.md +249 -0
- package/skills/taskset-implement/SKILL.md +234 -0
- package/skills/taskset-implement/agents/openai.yaml +4 -0
- package/skills/taskset-implement/references/architecture/client-and-server.md +69 -0
- package/skills/taskset-implement/references/architecture/documentation-and-generated.md +70 -0
- package/skills/taskset-implement/references/architecture/ownership-and-dependencies.md +107 -0
- package/skills/taskset-implement/references/architecture/product-and-source.md +80 -0
- package/skills/taskset-implement/references/architecture/storage-and-snapshots.md +45 -0
- package/skills/taskset-implement/references/architecture.md +34 -0
- package/skills/taskset-implement/references/conventions/backend-and-tooling.md +33 -0
- package/skills/taskset-implement/references/conventions/design.md +38 -0
- package/skills/taskset-implement/references/conventions/interfaces-and-ui.md +50 -0
- package/skills/taskset-implement/references/conventions/naming-and-packages.md +64 -0
- package/skills/taskset-implement/references/conventions/task-files.md +89 -0
- package/skills/taskset-implement/references/conventions/tests-and-docs.md +55 -0
- package/skills/taskset-implement/references/conventions/typescript-and-exports.md +41 -0
- package/skills/taskset-implement/references/conventions.md +40 -0
- package/skills/taskset-implement/references/release.md +135 -0
- package/skills/taskset-implement/references/workflows/dependencies-and-docs-site.md +54 -0
- package/skills/taskset-implement/references/workflows/environment-and-pnpm.md +108 -0
- package/skills/taskset-implement/references/workflows/persisted-data-and-git.md +30 -0
- package/skills/taskset-implement/references/workflows/validation.md +34 -0
- package/skills/taskset-implement/references/workflows/vitest-and-test-strategy.md +82 -0
- package/skills/taskset-implement/references/workflows.md +33 -0
- package/src/cli.ts +611 -77
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Ownership And Dependencies
|
|
2
|
+
|
|
3
|
+
Repository ownership, package identity, dependency flow, and core runtime ownership.
|
|
4
|
+
|
|
5
|
+
## Repository Ownership
|
|
6
|
+
|
|
7
|
+
| Path | Ownership |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `packages/contracts/` | Shared entity schemas, enums, DTOs, configuration types, and integration contracts; package `@taskset/contracts` |
|
|
10
|
+
| `packages/utils/` | Reusable domain-light date, filesystem, path, Markdown, and frontmatter primitives; package `@taskset/utils` |
|
|
11
|
+
| `packages/core/` | Entity operations, parsing orchestration, validation, storage, indexing, graph rules, search, filtering, project discovery, and impact analysis; package `@taskset/core` |
|
|
12
|
+
| `packages/cli/` | Command-line adapter over core; package `@taskset/cli` |
|
|
13
|
+
| `packages/tui/` | Keyboard-driven terminal interface over core; package `@taskset/tui` |
|
|
14
|
+
| `packages/mcp/` | MCP tools and context bundles over core; package `@taskset/mcp` |
|
|
15
|
+
| `packages/kanban/` | Web Kanban interface and board-specific presentation; package `@taskset/kanban` |
|
|
16
|
+
| `packages/extension/` | VS Code integration, explorers, hovers, code lenses, and editor commands; package `@taskset/extension` |
|
|
17
|
+
| `packages/configs/` | Shared TypeScript and tool configuration; package `@taskset/configs` |
|
|
18
|
+
| `apps/office/` | Stakeholder dashboards, roadmaps, reports, and planning views; package `@taskset/office` |
|
|
19
|
+
| `apps/www/` | Marketing site, public documentation, guides, and examples; package `@taskset/www` |
|
|
20
|
+
| `docs/` | First-party repository and product documentation |
|
|
21
|
+
| `skills/` | Agent-facing repository standards and workflows |
|
|
22
|
+
|
|
23
|
+
Directory names and manifest package names must agree. Duplicate workspace
|
|
24
|
+
package names are invalid. Treat a mismatch such as a `packages/core` manifest
|
|
25
|
+
named `@taskset/cli` as a scaffold defect to fix, not an established identity.
|
|
26
|
+
Every package and app has a `README.md` describing its purpose, owned behavior,
|
|
27
|
+
and current implementation status.
|
|
28
|
+
|
|
29
|
+
The publishable npm runtime is `@taskset/cli` and its dependency chain:
|
|
30
|
+
`@taskset/core`, `@taskset/contracts`, and `@taskset/utils`. Other workspace
|
|
31
|
+
packages and apps remain private until they have an intentional public
|
|
32
|
+
contract. Recursive publication must preserve this runtime dependency closure.
|
|
33
|
+
|
|
34
|
+
Do not add a top-level owner when an existing package or app already fits.
|
|
35
|
+
Within an owning package, prefer responsibility-based names such as `config.ts`
|
|
36
|
+
and `Config` over product-prefixed names such as `tasksetConfig.ts` and
|
|
37
|
+
`TasksetConfig`. Reserve the Taskset name for public identity and protocol
|
|
38
|
+
surfaces such as package names, the CLI command, `taskset.config.ts`, and
|
|
39
|
+
`.taskset/`.
|
|
40
|
+
|
|
41
|
+
Taskset dogfoods these boundaries. The root workspace installs core and CLI,
|
|
42
|
+
loads `taskset.config.ts`, and stores its own planned work in `.taskset/tasks/`.
|
|
43
|
+
|
|
44
|
+
## Dependency Flow
|
|
45
|
+
|
|
46
|
+
The intended dependency direction is:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
configs
|
|
50
|
+
|
|
51
|
+
contracts utils
|
|
52
|
+
\ /
|
|
53
|
+
core
|
|
54
|
+
|
|
|
55
|
+
cli tui mcp extension kanban office
|
|
56
|
+
|
|
57
|
+
www (product documentation and marketing; no domain authority)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Rules:
|
|
61
|
+
|
|
62
|
+
- `contracts` must not depend on core or a client package.
|
|
63
|
+
- `utils` must not depend on core or a client package.
|
|
64
|
+
- `core` may depend on contracts and utils.
|
|
65
|
+
- Product interfaces may depend on core and contracts.
|
|
66
|
+
- A client package must not become the domain API for another client.
|
|
67
|
+
- Apps may consume packages; shared packages must not depend on apps.
|
|
68
|
+
- Keep framework-specific DTOs and view models in the owning interface unless
|
|
69
|
+
they are stable cross-interface contracts.
|
|
70
|
+
- Import workspace code through manifest exports and declare it with
|
|
71
|
+
`workspace:*`.
|
|
72
|
+
|
|
73
|
+
If a browser or editor runtime cannot access the filesystem directly, introduce
|
|
74
|
+
a thin host adapter that delegates to core. Do not move domain rules into the
|
|
75
|
+
transport layer.
|
|
76
|
+
|
|
77
|
+
## Core Runtime Flow
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
CLI / TUI / MCP / Extension / Kanban / Office
|
|
81
|
+
|
|
|
82
|
+
@taskset/core API
|
|
83
|
+
|
|
|
84
|
+
parse -> validate -> operate -> serialize
|
|
85
|
+
|
|
|
86
|
+
canonical .taskset/ Markdown
|
|
87
|
+
|
|
|
88
|
+
derived index / graph / generated views
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Core owns behavior such as:
|
|
92
|
+
|
|
93
|
+
- repository discovery and configuration loading
|
|
94
|
+
- configuration validation and task creation defaults
|
|
95
|
+
- entity parsing and validation
|
|
96
|
+
- deterministic serialization
|
|
97
|
+
- atomic create, update, move, and delete operations
|
|
98
|
+
- status and lifecycle transitions
|
|
99
|
+
- search and filtering
|
|
100
|
+
- dependency and relationship graph construction
|
|
101
|
+
- cycle and broken-reference detection
|
|
102
|
+
- monorepo project and package discovery
|
|
103
|
+
- code-path relationships and impact analysis
|
|
104
|
+
- immutable snapshots, schema migrations, and generated metadata views
|
|
105
|
+
|
|
106
|
+
Interfaces own input, rendering, transport, and user interaction. They call core
|
|
107
|
+
operations rather than reproducing these rules.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Product And Source
|
|
2
|
+
|
|
3
|
+
Product direction and the canonical source-of-truth model.
|
|
4
|
+
|
|
5
|
+
## Product Direction
|
|
6
|
+
|
|
7
|
+
Taskset began as an offline, inline, AI-friendly, human-readable task manager
|
|
8
|
+
designed to accelerate software delivery and give development teams immediate
|
|
9
|
+
awareness of the work surrounding their code.
|
|
10
|
+
|
|
11
|
+
It grows from that core into a Git-native software delivery platform. Tasks,
|
|
12
|
+
stories, flows, decisions, research, runbooks, and related project knowledge
|
|
13
|
+
live beside the code as human-readable Markdown.
|
|
14
|
+
|
|
15
|
+
Vision: become the Git-native operating system for software delivery.
|
|
16
|
+
|
|
17
|
+
Mission: let developers, AI systems, and stakeholders work through different
|
|
18
|
+
interfaces without creating a second source of truth outside the repository.
|
|
19
|
+
|
|
20
|
+
Design for:
|
|
21
|
+
|
|
22
|
+
- Markdown that remains useful without Taskset installed
|
|
23
|
+
- Git history, branches, pull requests, and reviews as native workflows
|
|
24
|
+
- deterministic machine-readable metadata with human-authored prose
|
|
25
|
+
- monorepos and code-to-work relationships as first-class concepts
|
|
26
|
+
- one domain engine shared by CLI, TUI, MCP, extension, web, and dashboards
|
|
27
|
+
- local-first operation without preventing explicit hosted adapters
|
|
28
|
+
- immediate team and AI awareness without a mandatory hosted service
|
|
29
|
+
- replaceable indexes and generated views
|
|
30
|
+
- explicit compatibility work that does not silently corrupt existing
|
|
31
|
+
repositories
|
|
32
|
+
|
|
33
|
+
Near-term work should keep the task and supporting-document workflows coherent
|
|
34
|
+
before inventing additional entity kinds or investing heavily in new interfaces.
|
|
35
|
+
|
|
36
|
+
## Source-of-Truth Model
|
|
37
|
+
|
|
38
|
+
Canonical project state lives under `.taskset/`.
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
.taskset/
|
|
42
|
+
├── tasks/
|
|
43
|
+
│ └── .generated/ # disposable task metadata indexes
|
|
44
|
+
├── stories/
|
|
45
|
+
│ └── .generated/
|
|
46
|
+
├── flows/
|
|
47
|
+
│ └── .generated/
|
|
48
|
+
├── decisions/
|
|
49
|
+
│ └── .generated/
|
|
50
|
+
├── research/
|
|
51
|
+
│ └── .generated/
|
|
52
|
+
├── runbooks/
|
|
53
|
+
│ └── .generated/
|
|
54
|
+
├── snapshots/
|
|
55
|
+
└── cache/
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Rules:
|
|
59
|
+
|
|
60
|
+
- Entity Markdown files are authoritative persisted state.
|
|
61
|
+
- `taskset.config.ts` is the discoverable repository usage configuration. It
|
|
62
|
+
controls validated behavior and defaults, not canonical entity state.
|
|
63
|
+
- YAML frontmatter contains structured metadata. Markdown bodies contain
|
|
64
|
+
durable human context.
|
|
65
|
+
- Do not store the same field independently in frontmatter and body.
|
|
66
|
+
- Each entity folder owns its disposable `.generated/` indexes. `.taskset/cache/`
|
|
67
|
+
is also disposable. Neither is required to recover canonical state.
|
|
68
|
+
- `snapshots/` contains immutable, non-authoritative safety checkpoints for
|
|
69
|
+
migrations and explicit restore workflows.
|
|
70
|
+
- An in-memory index or optional on-disk cache may accelerate reads, but it must
|
|
71
|
+
be rebuildable from canonical files.
|
|
72
|
+
- Do not introduce SQLite, a remote service, browser storage, editor global
|
|
73
|
+
state, or another hidden store as an undeclared authority.
|
|
74
|
+
- Git is the versioning and collaboration layer around the files. Do not assume
|
|
75
|
+
it provides database transactions or conflict-free identifiers.
|
|
76
|
+
- Repository discovery walks upward for exactly `taskset.config.ts`; canonical
|
|
77
|
+
storage remains fixed under `.taskset/`.
|
|
78
|
+
|
|
79
|
+
Any persisted format change must define validation, compatibility, migration,
|
|
80
|
+
and failure behavior before implementation.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Storage And Snapshots
|
|
2
|
+
|
|
3
|
+
Storage, graph, and snapshot rules for canonical repository data.
|
|
4
|
+
|
|
5
|
+
## Storage and Graph Rules
|
|
6
|
+
|
|
7
|
+
- Parse frontmatter with a YAML parser and Markdown with a structured parser
|
|
8
|
+
where structure matters. Do not parse entity files with ad hoc regular
|
|
9
|
+
expressions.
|
|
10
|
+
- Normalize stored code references to repository-relative POSIX paths.
|
|
11
|
+
- Reject paths that escape the repository or `.taskset/` ownership boundary.
|
|
12
|
+
- Keep IDs immutable. Do not adopt sequential IDs without a documented
|
|
13
|
+
branch-collision strategy.
|
|
14
|
+
- Store one canonical direction for inverse relationships unless the schema
|
|
15
|
+
explicitly defines otherwise. Derive `blocks` from `dependsOn`, for example,
|
|
16
|
+
rather than allowing silent divergence.
|
|
17
|
+
- Detect duplicate IDs, missing targets, invalid transitions, and dependency
|
|
18
|
+
cycles with actionable diagnostics.
|
|
19
|
+
- Preserve meaningful Markdown content during metadata edits.
|
|
20
|
+
- Never silently discard unknown or invalid data. Reject it or preserve it
|
|
21
|
+
according to an explicit schema policy.
|
|
22
|
+
- Write through temporary files and atomic replacement where the platform
|
|
23
|
+
permits it. A failed update must not leave a truncated entity.
|
|
24
|
+
- Make ordering deterministic where order has no domain meaning.
|
|
25
|
+
|
|
26
|
+
## Snapshot Policy
|
|
27
|
+
|
|
28
|
+
Git commits and branches are the normal history and rollback mechanism. Do not
|
|
29
|
+
duplicate that history in a Taskset-owned snapshot database.
|
|
30
|
+
|
|
31
|
+
The explicit snapshot capability is a safety mechanism for uncommitted state
|
|
32
|
+
before migrations, restore operations, imports, repairs, or bulk mutation:
|
|
33
|
+
|
|
34
|
+
- snapshots are user-invoked or created immediately before a destructive
|
|
35
|
+
operation
|
|
36
|
+
- snapshots are immutable, timestamped, and content-addressable where practical
|
|
37
|
+
- snapshots contain canonical Taskset files and enough metadata to explain why
|
|
38
|
+
they exist
|
|
39
|
+
- snapshots are non-authoritative and may be deleted without changing current
|
|
40
|
+
project state
|
|
41
|
+
- restore is explicit and conflict-aware
|
|
42
|
+
- snapshots do not replace Git commits, reflogs, or normal backups
|
|
43
|
+
|
|
44
|
+
Snapshot restore previews by default. Restore requires `--apply` and atomically
|
|
45
|
+
reconciles canonical task files.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
Use this file as the routing map for architecture standards. Load only the
|
|
4
|
+
topic file needed for the change, then load additional files when the work
|
|
5
|
+
crosses that boundary.
|
|
6
|
+
|
|
7
|
+
## Routing
|
|
8
|
+
|
|
9
|
+
- [product-and-source.md](architecture/product-and-source.md): product
|
|
10
|
+
direction, `.taskset/` source-of-truth rules, generated/cache authority, and
|
|
11
|
+
persisted format compatibility requirements
|
|
12
|
+
- [ownership-and-dependencies.md](architecture/ownership-and-dependencies.md):
|
|
13
|
+
repository ownership, package identity, dependency flow, public runtime
|
|
14
|
+
package set, and core/interface ownership
|
|
15
|
+
- [client-and-server.md](architecture/client-and-server.md): feature-based
|
|
16
|
+
clients, DDD-lite modular core/server architecture, and server composition
|
|
17
|
+
boundaries
|
|
18
|
+
- [storage-and-snapshots.md](architecture/storage-and-snapshots.md): storage,
|
|
19
|
+
graph, canonical relationship, atomic write, and snapshot rules
|
|
20
|
+
- [documentation-and-generated.md](architecture/documentation-and-generated.md):
|
|
21
|
+
documentation architecture, website content ownership, integrations, and
|
|
22
|
+
generated-source handling
|
|
23
|
+
|
|
24
|
+
## Loading Guidance
|
|
25
|
+
|
|
26
|
+
- For package boundaries, dependency direction, or public package behavior, load
|
|
27
|
+
`ownership-and-dependencies.md`.
|
|
28
|
+
- For `.taskset/` persistence, schema compatibility, generated views, snapshots,
|
|
29
|
+
or filesystem mutation, load `product-and-source.md` plus
|
|
30
|
+
`storage-and-snapshots.md`.
|
|
31
|
+
- For UI, CLI, MCP, extension, Kanban, Office, core, or server architecture,
|
|
32
|
+
load `ownership-and-dependencies.md` plus `client-and-server.md`.
|
|
33
|
+
- For documentation routes, website content, blog ownership, or generated
|
|
34
|
+
outputs, load `documentation-and-generated.md`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Backend And Tooling
|
|
2
|
+
|
|
3
|
+
Backend technology choices plus shell and automation conventions.
|
|
4
|
+
|
|
5
|
+
## Backend Technology
|
|
6
|
+
|
|
7
|
+
- Prefer TypeScript for services and hosted adapters.
|
|
8
|
+
- Use NestJS when modules, dependency injection, guards, transport adapters, or
|
|
9
|
+
service scale justify it; do not add NestJS to a small composition root by
|
|
10
|
+
default.
|
|
11
|
+
- With NestJS, prefer `class-transformer` and `class-validator` at transport DTO
|
|
12
|
+
boundaries.
|
|
13
|
+
- Prefer TypeORM when an object-relational mapper is appropriate.
|
|
14
|
+
- Use Rust for native executables or components with a concrete need for
|
|
15
|
+
systems performance, memory control, portability, or concurrency.
|
|
16
|
+
- Prefer MariaDB for smaller hosted applications and PostgreSQL for larger or
|
|
17
|
+
more advanced relational workloads.
|
|
18
|
+
- Keep database schemas, migrations, backup, and consistency behavior explicit.
|
|
19
|
+
- No server or database replaces `.taskset/` Markdown as canonical Taskset
|
|
20
|
+
state.
|
|
21
|
+
|
|
22
|
+
## Shell and Tooling
|
|
23
|
+
|
|
24
|
+
- Start Bash scripts with `set -euo pipefail`.
|
|
25
|
+
- Derive `repo_root` from the script location.
|
|
26
|
+
- Quote paths and variable expansions.
|
|
27
|
+
- Validate prerequisites before mutation.
|
|
28
|
+
- Make setup and generation idempotent.
|
|
29
|
+
- Use temporary directories and traps for cleanup.
|
|
30
|
+
- Print concise, prefixed, actionable errors.
|
|
31
|
+
- Keep automation with its owning package or a focused tooling directory when
|
|
32
|
+
one is introduced.
|
|
33
|
+
- Do not add root scripts that duplicate package-manager or Turbo behavior.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Design Conventions
|
|
2
|
+
|
|
3
|
+
General design principles for Taskset implementation work.
|
|
4
|
+
|
|
5
|
+
## General Design
|
|
6
|
+
|
|
7
|
+
- Apply SOLID as design heuristics, especially SRP, OCP, LSP, and DIP. Preserve
|
|
8
|
+
separation of concerns, encapsulation, high cohesion, low coupling,
|
|
9
|
+
testability, and inward dependency flow without creating ceremonial layers.
|
|
10
|
+
- Prefer clean architecture boundaries and pragmatic DDD where domain behavior
|
|
11
|
+
benefits from explicit modules, entities, value objects, use cases, and
|
|
12
|
+
ports. Use feature-based architecture for user-facing and interaction
|
|
13
|
+
surfaces.
|
|
14
|
+
- Prefer object-oriented design for stateful domain models, lifecycle-rich
|
|
15
|
+
entities, polymorphic adapters, and dependency-injected boundaries. Prefer
|
|
16
|
+
focused functions for stateless parsing, validation, serialization, and data
|
|
17
|
+
transformation. Do not convert code to classes for style alone.
|
|
18
|
+
- Use in-process domain events when several independent reactions or clear
|
|
19
|
+
temporal decoupling justify them. Do not add an event bus, message broker, or
|
|
20
|
+
distributed event architecture without a measured product need.
|
|
21
|
+
- Reuse before adding. Extend the existing source of truth when the concept
|
|
22
|
+
already exists.
|
|
23
|
+
- Prefer explicit data flow, typed state, discriminated variants, and
|
|
24
|
+
structured errors over string coordination.
|
|
25
|
+
- Keep functions and modules focused. Split by responsibility, not arbitrary
|
|
26
|
+
line count.
|
|
27
|
+
- Separate pure parsing, validation, graph, and query logic from filesystem
|
|
28
|
+
effects where practical.
|
|
29
|
+
- Fail with actionable diagnostics for invalid persisted state or destructive
|
|
30
|
+
operations.
|
|
31
|
+
- Comment format constraints and non-obvious tradeoffs. Do not narrate obvious
|
|
32
|
+
code.
|
|
33
|
+
- Add focused TSDoc to non-obvious public APIs and short orienting comments
|
|
34
|
+
around complex algorithms, transactions, migrations, synchronization, and
|
|
35
|
+
validation. Do not document obvious assignments or straightforward control
|
|
36
|
+
flow.
|
|
37
|
+
- Keep diffs narrow. Do not combine behavior changes with unrelated renaming or
|
|
38
|
+
cleanup.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Interfaces And UI
|
|
2
|
+
|
|
3
|
+
CLI, interface, UI, and frontend organization rules.
|
|
4
|
+
|
|
5
|
+
## CLI and Interface Behavior
|
|
6
|
+
|
|
7
|
+
- Keep CLI commands thin: parse arguments, call core, render results, map errors
|
|
8
|
+
to exit codes.
|
|
9
|
+
- Current CLI commands are `taskset init`, `taskset config`, `taskset doctor`,
|
|
10
|
+
`taskset generate`, `taskset snapshot create`, `list`, `restore`, and
|
|
11
|
+
`taskset task create`, `list`, `show`, `update`, `status`, and `delete`.
|
|
12
|
+
- Reserve stdout for requested output and stderr for diagnostics.
|
|
13
|
+
- Avoid interactive prompts when flags or stdin make automation possible.
|
|
14
|
+
- Provide deterministic structured output before integrations depend on parsing
|
|
15
|
+
decorative terminal text.
|
|
16
|
+
- Keep TUI keyboard behavior and state in TUI, not core.
|
|
17
|
+
- Keep MCP tool schemas close to MCP adapters while reusing domain schemas.
|
|
18
|
+
- Keep extension commands and VS Code lifecycle behavior in the extension.
|
|
19
|
+
- Keep filtering and graph semantics in core; clients may own only view-specific
|
|
20
|
+
sorting, grouping, and layout.
|
|
21
|
+
|
|
22
|
+
## UI Organization
|
|
23
|
+
|
|
24
|
+
Use TypeScript and React for web interfaces. Prefer TanStack's headless
|
|
25
|
+
ecosystem when the feature needs the corresponding capability:
|
|
26
|
+
|
|
27
|
+
- Query for server state and mutations
|
|
28
|
+
- Form for complex validated forms
|
|
29
|
+
- Table for tabular state
|
|
30
|
+
- Hotkeys for keyboard commands
|
|
31
|
+
- Pacer for debounce, throttle, queue, and rate-control behavior
|
|
32
|
+
- Virtual for large virtualized collections
|
|
33
|
+
- DB for a justified client-side reactive data layer
|
|
34
|
+
- Devtools and library-specific devtools during development
|
|
35
|
+
|
|
36
|
+
Adopt each package by demonstrated need. Do not install the full ecosystem in
|
|
37
|
+
every app, use a large abstraction for trivial local state, or hide domain
|
|
38
|
+
rules in client caches. Review maturity and API stability before using alpha or
|
|
39
|
+
beta packages on critical paths.
|
|
40
|
+
|
|
41
|
+
For Kanban and Office:
|
|
42
|
+
|
|
43
|
+
- Organize by product feature, then colocate components, hooks, tests, and styles.
|
|
44
|
+
- Keep server or host communication behind typed adapters.
|
|
45
|
+
- Represent loading, empty, invalid-repository, stale, conflict, and error states
|
|
46
|
+
explicitly.
|
|
47
|
+
- Preserve keyboard, focus, labels, roles, and screen-reader behavior.
|
|
48
|
+
- Share UI through a dedicated package only after more than one surface needs a
|
|
49
|
+
stable visual contract.
|
|
50
|
+
- Do not put React stores or UI dependencies in `@taskset/utils`.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Naming And Packages
|
|
2
|
+
|
|
3
|
+
Naming, package identity, command naming, and configuration identity.
|
|
4
|
+
|
|
5
|
+
## Naming and Package Identity
|
|
6
|
+
|
|
7
|
+
- Directories: lowercase; use kebab-case for multiword names.
|
|
8
|
+
- TypeScript modules: camelCase when named after behavior, kebab-case when the
|
|
9
|
+
local feature already uses it. Stay consistent within an owner.
|
|
10
|
+
- React components and providers: `PascalCase.tsx`.
|
|
11
|
+
- Hooks: `useThing.ts`; exported function `useThing`.
|
|
12
|
+
- Variables and functions: `camelCase`.
|
|
13
|
+
- Types, interfaces, classes, components, and schemas: `PascalCase`.
|
|
14
|
+
- Stable protocol and schema constants: `UPPER_SNAKE_CASE`.
|
|
15
|
+
- Colocated tests: source filename plus `.test.ts` or `.test.tsx`.
|
|
16
|
+
- Integration and E2E specs: descriptive kebab-case ending in `.spec.ts`.
|
|
17
|
+
- Shell scripts: kebab-case.
|
|
18
|
+
- Name files and symbols for their responsibility inside the owning package.
|
|
19
|
+
Prefer `config.ts`, `Config`, and `Repository` over names prefixed with the
|
|
20
|
+
product or package name.
|
|
21
|
+
- Keep the product name only where it is part of a public identity or protocol,
|
|
22
|
+
such as `taskset.config.ts`, `.taskset/`, the `taskset` command, package
|
|
23
|
+
names, and user-facing prose.
|
|
24
|
+
|
|
25
|
+
Canonical workspace identities:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
@taskset/configs
|
|
29
|
+
@taskset/contracts
|
|
30
|
+
@taskset/utils
|
|
31
|
+
@taskset/core
|
|
32
|
+
@taskset/cli
|
|
33
|
+
@taskset/tui
|
|
34
|
+
@taskset/mcp
|
|
35
|
+
@taskset/kanban
|
|
36
|
+
@taskset/extension
|
|
37
|
+
@taskset/office
|
|
38
|
+
@taskset/www
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`@taskset/cli`, `@taskset/core`, `@taskset/contracts`, and `@taskset/utils` are
|
|
42
|
+
public npm packages. The remaining workspace identities are private until their
|
|
43
|
+
owning interfaces are ready for independent release. Use `@taskset/cli` in
|
|
44
|
+
installation and configuration examples. Use the other public package names
|
|
45
|
+
when consumers intentionally use their lower-level APIs.
|
|
46
|
+
|
|
47
|
+
Use the exact current manifest name in dependencies, filters, and Changesets.
|
|
48
|
+
Package directories and names must agree. Fix duplicate or misplaced identities
|
|
49
|
+
instead of documenting aliases for accidental scaffold state.
|
|
50
|
+
|
|
51
|
+
Command names use lowercase kebab-case:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
taskset task list --file packages/core --impact
|
|
55
|
+
taskset context-bundle
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The root usage configuration is exactly `taskset.config.ts`. Export a
|
|
59
|
+
versionless object, preferably through `defineConfig` from `@taskset/core`.
|
|
60
|
+
Keep configuration fields behavioral; never use config to redirect canonical
|
|
61
|
+
entity storage outside `.taskset/`.
|
|
62
|
+
|
|
63
|
+
Entity field names use `camelCase`. Status, priority, and type values use stable
|
|
64
|
+
lowercase tokens such as `doing`, `high`, and `feature`.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Task File Conventions
|
|
2
|
+
|
|
3
|
+
Canonical Taskset entity metadata and Markdown file rules.
|
|
4
|
+
|
|
5
|
+
## Taskset Entity Files
|
|
6
|
+
|
|
7
|
+
Use YAML frontmatter for machine metadata and Markdown for human context:
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
---
|
|
11
|
+
id: 0000001-add-task-validation
|
|
12
|
+
title: Add task validation
|
|
13
|
+
status: doing
|
|
14
|
+
priority: high
|
|
15
|
+
order: 10
|
|
16
|
+
createdAt: 2026-06-12
|
|
17
|
+
updatedAt: 2026-06-12 09:30 UTC
|
|
18
|
+
labels:
|
|
19
|
+
- core
|
|
20
|
+
dependsOn: []
|
|
21
|
+
files:
|
|
22
|
+
- packages/core/src/tasks/validateTask.ts
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Context
|
|
26
|
+
|
|
27
|
+
Describe why the work exists.
|
|
28
|
+
|
|
29
|
+
# Acceptance Criteria
|
|
30
|
+
|
|
31
|
+
- [ ] Invalid statuses produce an actionable diagnostic.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Rules:
|
|
35
|
+
|
|
36
|
+
- Require `id`, `title`, `status`, `createdAt`, and `updatedAt`.
|
|
37
|
+
- Read and serialize one strict versionless task shape. Reject legacy
|
|
38
|
+
versioned task frontmatter instead of silently migrating or repairing it.
|
|
39
|
+
- Accept people, planning, canonical relationship, path, and project metadata
|
|
40
|
+
only through the shared strict schema.
|
|
41
|
+
- Use `todo`, `doing`, `blocked`, `done`, and `canceled` for task status.
|
|
42
|
+
- Use `low`, `medium`, `high`, and `urgent` for task priority.
|
|
43
|
+
- Priority is the sole measure of task importance. Do not add a second,
|
|
44
|
+
overlapping importance field.
|
|
45
|
+
- `order` is the sole user-controlled sequence field. It is an optional finite
|
|
46
|
+
nonnegative number. Lower values sort first, missing values sort after
|
|
47
|
+
ordered tasks, and duplicate values fall back to task ID ordering.
|
|
48
|
+
- Repository configuration may select and order the active values from that
|
|
49
|
+
vocabulary. Defaults and task creation must respect the configured list.
|
|
50
|
+
- Define one canonical representation for each field.
|
|
51
|
+
- Use repository-relative POSIX paths in persisted metadata.
|
|
52
|
+
- Serialize new timestamps as `YYYY-MM-DD` or `YYYY-MM-DD HH:mm UTC`. Continue
|
|
53
|
+
reading the documented legacy ISO 8601 UTC form until a compatibility change
|
|
54
|
+
explicitly removes it.
|
|
55
|
+
- Keep IDs immutable and compare them exactly.
|
|
56
|
+
- Format new task IDs as a seven-digit sequence plus a lowercase title slug.
|
|
57
|
+
Keep legacy `TS-` ULIDs readable only so `task migrate-ids` can rewrite them
|
|
58
|
+
and all canonical relationships atomically.
|
|
59
|
+
- Preserve user-authored body text and meaningful list order.
|
|
60
|
+
- Use stable key ordering and one final newline in generated output.
|
|
61
|
+
- Generated metadata indexes cover supported non-ID metadata fields, group
|
|
62
|
+
timestamp values by calendar date, and keep generated filenames readable
|
|
63
|
+
instead of URL-encoding spaces or path separators.
|
|
64
|
+
- Omit absent optional fields consistently; do not alternate between missing,
|
|
65
|
+
empty, and `null` without schema meaning.
|
|
66
|
+
- Validate enum values, dates, paths, IDs, and relationship targets centrally.
|
|
67
|
+
- Validate normalized CLI arguments and public core inputs with Zod schemas.
|
|
68
|
+
Keep `parseArgs` limited to tokenization and use `superRefine` for
|
|
69
|
+
cross-option rules.
|
|
70
|
+
- Do not infer `updatedAt` or lifecycle timestamps differently in each client.
|
|
71
|
+
- Do not write derived inverse relationships into files unless the schema makes
|
|
72
|
+
them independently authoritative.
|
|
73
|
+
- Keep `dependsOn`, `related`, `duplicates`, and `parent` canonical. Derive
|
|
74
|
+
`blockedBy`, `blocks`, `children`, and `subtasks`.
|
|
75
|
+
- Treat schema additions, removals, defaults, and coercions as compatibility
|
|
76
|
+
decisions.
|
|
77
|
+
- Reject unknown fields, duplicate list values, self-dependencies,
|
|
78
|
+
non-normalized paths, and an `updatedAt` value earlier than `createdAt`.
|
|
79
|
+
- Never silently repair a file during a read. `doctor` may propose or perform
|
|
80
|
+
explicit fixes with user-visible output.
|
|
81
|
+
|
|
82
|
+
Keep schemas and static contracts in `@taskset/contracts`. Keep parsing
|
|
83
|
+
orchestration, defaults, transitions, validation policy, and migrations in
|
|
84
|
+
`@taskset/core`. Keep generic YAML/Markdown mechanics in `@taskset/utils` only
|
|
85
|
+
when they are not Taskset-specific.
|
|
86
|
+
|
|
87
|
+
Put generic date, time, and mathematical operations in `@taskset/utils` when
|
|
88
|
+
they have no task-domain policy. Prefer names such as `parseDate` over
|
|
89
|
+
task-specific wrappers such as `parseTaskDate`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Tests And Documentation
|
|
2
|
+
|
|
3
|
+
Testing and documentation conventions.
|
|
4
|
+
|
|
5
|
+
## Tests and Documentation
|
|
6
|
+
|
|
7
|
+
- Use Vitest as the default TypeScript unit and integration test runner.
|
|
8
|
+
- Use explicit imports from `vitest`; do not enable test globals repository-wide.
|
|
9
|
+
- Prefer test-first development for domain rules, parser behavior, lifecycle
|
|
10
|
+
transitions, graph invariants, migrations, and bug regressions.
|
|
11
|
+
- Do not force test-first ceremony for documentation, formatting, generated
|
|
12
|
+
configuration, or short-lived exploratory work.
|
|
13
|
+
- Add regression coverage for bug fixes.
|
|
14
|
+
- Test behavior and boundary contracts, not implementation trivia.
|
|
15
|
+
- Use temporary directories for filesystem tests.
|
|
16
|
+
- Use fixture repositories for Git, monorepo discovery, and path-impact tests.
|
|
17
|
+
- Cover CRLF/LF, Unicode, empty bodies, malformed YAML, duplicate IDs, broken
|
|
18
|
+
links, cycles, and interrupted writes where relevant.
|
|
19
|
+
- Verify parse/serialize round trips without losing Markdown.
|
|
20
|
+
- Keep unit tests deterministic and independent of user Git configuration,
|
|
21
|
+
network services, wall-clock time, and the actual repository.
|
|
22
|
+
- Mark integration prerequisites explicitly.
|
|
23
|
+
- Use current paths and package names in documentation.
|
|
24
|
+
- Keep user documentation in `docs/`; `apps/www` renders it.
|
|
25
|
+
- Publish `docs/` and `skills/` with `@taskset/cli` so installed consumers can
|
|
26
|
+
load the same guidance from `node_modules/@taskset/cli/docs` and
|
|
27
|
+
`node_modules/@taskset/cli/skills`. The CLI build copies those trees; do not
|
|
28
|
+
hand-edit the copies under `packages/cli/`.
|
|
29
|
+
- Keep chronological release and project posts in `apps/www/posts/`; require
|
|
30
|
+
`title`, `description`, and `date` frontmatter and register each route in the
|
|
31
|
+
website's post registry.
|
|
32
|
+
- Keep contributor, architecture, ADR, testing, and technology documentation
|
|
33
|
+
in `docs/maintainers/`.
|
|
34
|
+
- Render maintainer documentation through the website's dedicated
|
|
35
|
+
`/maintainers` route and keep it out of the primary usage-docs navigation.
|
|
36
|
+
- Keep a concise `README.md` in each package and app describing ownership,
|
|
37
|
+
dependencies, and current contents.
|
|
38
|
+
- Keep the root `README.md` focused on installing, configuring, and using
|
|
39
|
+
Taskset. Keep detailed repository work under `docs/maintainers/`; root
|
|
40
|
+
community files may provide short discovery links to that canonical guidance.
|
|
41
|
+
- Write user docs for newcomers first through short examples and plain
|
|
42
|
+
language, then provide precise contracts and edge cases for advanced users.
|
|
43
|
+
Simplicity must not come from hiding important constraints.
|
|
44
|
+
- Prefer `.md` for content. Use `.mdx` only when interactive React content is
|
|
45
|
+
required.
|
|
46
|
+
- Include `title` and `description` frontmatter on pages rendered by the docs
|
|
47
|
+
site.
|
|
48
|
+
- Keep product plans distinct from executable specifications.
|
|
49
|
+
- Update docs when commands, persisted formats, or public package contracts
|
|
50
|
+
change.
|
|
51
|
+
- Update `skills/taskset-implement/` in the same change when these repository standards
|
|
52
|
+
or workflows change.
|
|
53
|
+
- When a workspace task finishes, update its canonical Taskset task through the
|
|
54
|
+
CLI when supported, then update affected user docs, maintainer docs, tests,
|
|
55
|
+
and standards before declaring the work complete.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# TypeScript And Exports
|
|
2
|
+
|
|
3
|
+
TypeScript, formatting, import, export, and package-boundary rules.
|
|
4
|
+
|
|
5
|
+
## TypeScript and Exports
|
|
6
|
+
|
|
7
|
+
Root `biome.json` controls formatting:
|
|
8
|
+
|
|
9
|
+
- tabs
|
|
10
|
+
- 100-column target
|
|
11
|
+
- single quotes
|
|
12
|
+
- no semicolons
|
|
13
|
+
- trailing commas
|
|
14
|
+
- bracket spacing
|
|
15
|
+
|
|
16
|
+
Follow these rules:
|
|
17
|
+
|
|
18
|
+
- Keep strict TypeScript enabled.
|
|
19
|
+
- Use `unknown` at filesystem, YAML, JSON, Git, process, and network boundaries,
|
|
20
|
+
then validate and narrow it.
|
|
21
|
+
- Avoid `any`; contain unavoidable casts at the boundary.
|
|
22
|
+
- Use `import type` or inline type imports for type-only dependencies.
|
|
23
|
+
- Prefer extensionless package imports. Use `.ts` or `.tsx` for relative source
|
|
24
|
+
imports; TypeScript rewrites them to `.js` during emit. Write `.js` in source
|
|
25
|
+
only when a runtime or external contract requires it.
|
|
26
|
+
- Prefer named exports and explicit package entrypoints.
|
|
27
|
+
- Declare every imported package in the importing package's `package.json`.
|
|
28
|
+
- Use `workspace:*` for internal dependencies.
|
|
29
|
+
- Import shared code through package exports such as `@taskset/core` or an
|
|
30
|
+
explicit subpath. Never import a sibling package's `src/`.
|
|
31
|
+
- Do not use TypeScript `paths` to imitate package exports or reach another
|
|
32
|
+
package's `node_modules`.
|
|
33
|
+
- Keep public data immutable where mutation is not part of the contract.
|
|
34
|
+
- Represent expected failures with typed errors or result variants. Include the
|
|
35
|
+
entity path, field, and remediation when useful.
|
|
36
|
+
- Do not leak a CLI parser, UI framework, MCP SDK, or filesystem library type
|
|
37
|
+
into domain contracts.
|
|
38
|
+
|
|
39
|
+
Shared configuration is consumed through `@taskset/configs` exports. Extend
|
|
40
|
+
those exports when a preset is genuinely reusable; keep app-specific settings
|
|
41
|
+
with the app.
|