Architecture docs for the open-tasks plugin covering the registry pattern dispatch design, operation set, error handling, data flow, and constraints. Includes four ADRs (registry pattern, no-cache policy, risk operation merge, frontmatter normalization). The depends_on/dependsOn compatibility issue in @alkdev/taskgraph is resolved in v0.0.2, so the dependency is bumped and the docs reflect the fix. AGENTS.md updated: canonical dependsOn field, dependents operation added, hooks clarification, field naming note.
6.4 KiB
AGENTS.md
Project
@alkdev/open-tasks — an OpenCode plugin that gives agents structured task management with graph analysis, decomposition guidance, and workflow cost estimation. Exposes a single tasks tool using a registry pattern (like open-memory and open-coordinator) to keep the agent's visible tool count minimal.
Part of the alk.dev trio:
- open-memory (
memory/memory_compact): session introspection, context awareness, history browsing - open-coordinator (
worktree): git worktree orchestration, session spawning, anomaly detection - open-tasks (
tasks): task graph management, dependency analysis, decomposition guidance
Repository
- Git:
git@git.alk.dev:alkdev/open-tasks.git - License: MIT OR Apache-2.0
- Runtime: Bun
- Language: TypeScript (strict, ESM, verbatimModuleSyntax)
- Linter: Biome (
bun run lint,bun run format) - Build:
bun run build→dist/(bun build + tsc declarations)
Commands
bun run build # bun build src/index.ts + tsc --emitDeclarationOnly
bun run typecheck # tsc --noEmit
bun run lint # biome check .
bun run format # biome format --write .
bun run test # bun test
Always run bun run typecheck and bun run lint after changes.
Architecture
Core Dependency: @alkdev/taskgraph
The graph operations, risk scoring, frontmatter parsing, and analysis functions come from @alkdev/taskgraph — a pure TypeScript library built on graphology. This plugin wraps that library in an OpenCode tool interface.
Key imports from @alkdev/taskgraph:
TaskGraph— primary graph data structure (construction, queries, mutation, export)parseTaskFile,parseTaskDirectory,parseFrontmatter,serializeFrontmatter— YAML frontmatter I/OcriticalPath,weightedCriticalPath,parallelGroups,bottlenecks— analysis functionsriskPath,riskDistribution,calculateTaskEv,workflowCost— risk & cost analysisshouldDecomposeTask— decomposition guidance- Categorical types:
TaskScope,TaskRisk,TaskImpact,TaskLevel,TaskPriority,TaskStatus
Plugin Design: Registry Pattern
Like open-memory, this plugin exposes one tool (tasks) with internal operation dispatch. This keeps the agent's visible tool count low.
tasks({tool: "help"}) → Show available operations
tasks({tool: "list"}) → List tasks in project
tasks({tool: "show", args: {id: "..."}}) → Show task details
tasks({tool: "deps", args: {id: "..."}}) → Show task prerequisites
tasks({tool: "dependents", args: {id: "..."}}) → Show tasks that depend on a task
tasks({tool: "validate"}) → Validate all task files
... etc
Source Structure
src/
├── index.ts # Plugin entry: tool registration (no hooks in v1)
├── tools.ts # Tool definitions (tasks router)
├── registry.ts # Operation registry pattern (dispatch by tool name)
├── operations/ # Individual operation implementations
│ ├── help.ts
│ ├── list.ts
│ ├── show.ts
│ ├── deps.ts
│ ├── validate.ts
│ └── ... (analysis operations)
└── formatting.ts # Output formatting helpers
Plugin Hooks
| Hook | Purpose |
|---|---|
| None initial — future: task status injection into system prompt, worktree-aware task context |
The tasks Tool
Single tool with {tool, args} dispatch. The help operation provides full reference with examples, following the pattern from open-memory's memory({tool: "help"}).
Operations map to @alkdev/taskgraph functions, reading tasks from the project's tasks/ directory and returning formatted output.
Local Development & Testing
OpenCode installs plugins from npm into ~/.cache/opencode/node_modules/. When doing local development, symlink your local repo:
Setup (one-time)
rm -rf ~/.cache/opencode/node_modules/@alkdev/open-tasks
ln -s /workspace/@alkdev/open-tasks ~/.cache/opencode/node_modules/@alkdev/open-tasks
Iteration loop
bun run build # rebuild dist/index.js
bun run typecheck # verify types
bun run lint # verify style
bun run test # run tests
After rebuilding, restart OpenCode to pick up the new build.
Also clear Bun's global cache
rm -rf ~/.bun/install/cache/@alkdev/open-tasks*
Key Conventions
- No comments unless requested
- ESM with
.jsextension in imports - Strict TypeScript with
verbatimModuleSyntax - Biome for linting and formatting
- Task files are the source of truth (markdown with YAML frontmatter)
- Single tool with registry dispatch — minimize agent context bloat
- Include a
helpoperation for discoverability
Relationship to Other Plugins
- open-memory (
memory,memory_compact): session history, context awareness — complementary - open-coordinator (
worktree): worktree orchestration — tasks drive what worktrees implement - taskgraph CLI (
taskgraph): Rust CLI for the same operations — this plugin is the TypeScript/OpenCode equivalent - @alkdev/taskgraph (npm): Core library this plugin wraps — all graph operations come from here
Task File Format
Tasks are markdown files in tasks/ with YAML frontmatter:
---
id: auth-setup
name: Setup Authentication
status: pending
dependsOn: []
scope: moderate
risk: medium
impact: component
level: implementation
---
## Description
Implement OAuth2 authentication with provider abstraction.
## Acceptance Criteria
- [ ] OAuth2 flow works with Google provider
- [ ] Tokens stored securely
## Notes
> Agent fills this during implementation.
## Summary
> Agent fills this on completion.
Note on field naming: The
@alkdev/taskgraphlibrary uses camelCase (dependsOn,scope,risk, etc.) in its schema. The Rust CLI historically used snake_case (depends_on). As of@alkdev/taskgraphv0.0.2, the parser accepts both forms — but camelCase is the canonical form for new files.
Build & Test Commands
bun run build # bun build src/index.ts + tsc declarations
bun run typecheck # tsc --noEmit
bun run lint # biome check .
bun run format # biome format --write .
bun run test # bun test
License
Dual-licensed under MIT OR Apache-2.0. Both license files must be present at repository root.