Files
open-tasks/AGENTS.md
glm-5.1 307b8a2b54 Add architecture specification and bump taskgraph to v0.0.2
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.
2026-04-28 09:29:26 +00:00

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 builddist/ (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/O
  • criticalPath, weightedCriticalPath, parallelGroups, bottlenecks — analysis functions
  • riskPath, riskDistribution, calculateTaskEv, workflowCost — risk & cost analysis
  • shouldDecomposeTask — 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 .js extension 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 help operation 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/taskgraph library uses camelCase (dependsOn, scope, risk, etc.) in its schema. The Rust CLI historically used snake_case (depends_on). As of @alkdev/taskgraph v0.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.