tick-md 1.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.
- package/README.md +228 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +282 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +15 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +95 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/agent.d.ts +20 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +125 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/claim.d.ts +9 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +161 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/done.d.ts +9 -0
- package/dist/commands/done.d.ts.map +1 -0
- package/dist/commands/done.js +152 -0
- package/dist/commands/done.js.map +1 -0
- package/dist/commands/graph.d.ts +9 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +143 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +78 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +15 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +104 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +137 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +141 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/validate.d.ts +8 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +103 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +136 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parse.d.ts +6 -0
- package/dist/parser/parse.d.ts.map +1 -0
- package/dist/parser/parse.js +178 -0
- package/dist/parser/parse.js.map +1 -0
- package/dist/parser/serialize.d.ts +10 -0
- package/dist/parser/serialize.d.ts.map +1 -0
- package/dist/parser/serialize.js +122 -0
- package/dist/parser/serialize.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git.d.ts +54 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +192 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/lock.d.ts +47 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +128 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/validator.d.ts +17 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +188 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Tick CLI
|
|
2
|
+
|
|
3
|
+
The command-line interface for the Tick.md multi-agent coordination protocol.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g tick-md
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use without installing:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx tick-md init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Initialize a new Tick project
|
|
21
|
+
tick init
|
|
22
|
+
|
|
23
|
+
# Check project status
|
|
24
|
+
tick status
|
|
25
|
+
|
|
26
|
+
# Add a new task
|
|
27
|
+
tick add "Build authentication system" --priority high --tags backend,security
|
|
28
|
+
|
|
29
|
+
# Register as an agent
|
|
30
|
+
tick agent register @yourname --role engineer
|
|
31
|
+
|
|
32
|
+
# Claim a task
|
|
33
|
+
tick claim TASK-001 @yourname
|
|
34
|
+
|
|
35
|
+
# Update task status
|
|
36
|
+
tick done TASK-001 @yourname
|
|
37
|
+
|
|
38
|
+
# Sync to git
|
|
39
|
+
tick sync
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Development
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Install dependencies
|
|
46
|
+
npm install
|
|
47
|
+
|
|
48
|
+
# Build TypeScript
|
|
49
|
+
npm run build
|
|
50
|
+
|
|
51
|
+
# Run locally
|
|
52
|
+
node dist/cli.js init
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Architecture
|
|
56
|
+
|
|
57
|
+
### Parser (`src/parser/`)
|
|
58
|
+
|
|
59
|
+
- **parse.ts** - Reads TICK.md files into structured data
|
|
60
|
+
- Uses `gray-matter` for YAML frontmatter
|
|
61
|
+
- Custom parser for agent tables (Markdown tables)
|
|
62
|
+
- Custom parser for task blocks (YAML + Markdown)
|
|
63
|
+
|
|
64
|
+
- **serialize.ts** - Writes structured data back to TICK.md format
|
|
65
|
+
- Uses `yaml` library for proper multi-line YAML
|
|
66
|
+
- Generates compliant task blocks
|
|
67
|
+
- Template generation for new projects
|
|
68
|
+
|
|
69
|
+
### Commands (`src/commands/`)
|
|
70
|
+
|
|
71
|
+
- **init.ts** - Initialize new Tick projects
|
|
72
|
+
- **add.ts** - Create new tasks with auto-ID generation
|
|
73
|
+
- **claim.ts** - Claim and release tasks with locking
|
|
74
|
+
- **done.ts** - Complete tasks and add comments
|
|
75
|
+
- **status.ts** - Terminal UI with colored output
|
|
76
|
+
- **list.ts** - List tasks with filtering and JSON output
|
|
77
|
+
- **graph.ts** - Visualize task dependencies (ASCII/Mermaid)
|
|
78
|
+
- **watch.ts** - Real-time task monitoring
|
|
79
|
+
- **sync.ts** - Git integration with smart commit messages
|
|
80
|
+
- **validate.ts** - Comprehensive TICK.md validation
|
|
81
|
+
- **agent.ts** - Agent registration and listing
|
|
82
|
+
|
|
83
|
+
### Utils (`src/utils/`)
|
|
84
|
+
|
|
85
|
+
- **lock.ts** - Advisory file locking manager
|
|
86
|
+
- **git.ts** - Git operations (status, commit, push, pull)
|
|
87
|
+
- **validator.ts** - Validation logic with circular dependency detection
|
|
88
|
+
|
|
89
|
+
### Types (`src/types.ts`)
|
|
90
|
+
|
|
91
|
+
Full TypeScript definitions for:
|
|
92
|
+
- Tasks, Agents, History entries
|
|
93
|
+
- Project metadata
|
|
94
|
+
- Status, priority, trust level enums
|
|
95
|
+
|
|
96
|
+
## File Structure
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
cli/
|
|
100
|
+
├── src/
|
|
101
|
+
│ ├── parser/
|
|
102
|
+
│ │ ├── parse.ts # TICK.md → JavaScript objects
|
|
103
|
+
│ │ ├── serialize.ts # JavaScript objects → TICK.md
|
|
104
|
+
│ │ └── index.ts
|
|
105
|
+
│ ├── commands/
|
|
106
|
+
│ │ ├── init.ts # tick init
|
|
107
|
+
│ │ └── ... # Future commands
|
|
108
|
+
│ ├── types.ts # TypeScript types
|
|
109
|
+
│ ├── cli.ts # Main CLI entry
|
|
110
|
+
│ └── index.ts
|
|
111
|
+
├── dist/ # Compiled JavaScript
|
|
112
|
+
├── package.json
|
|
113
|
+
└── tsconfig.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Commands
|
|
117
|
+
|
|
118
|
+
### Core Workflow
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Initialize project
|
|
122
|
+
tick init [--name <name>] [--force]
|
|
123
|
+
|
|
124
|
+
# View project status
|
|
125
|
+
tick status
|
|
126
|
+
|
|
127
|
+
# List and filter tasks
|
|
128
|
+
tick list [--status <status>] [--priority <priority>] [--tag <tag>] [--json]
|
|
129
|
+
|
|
130
|
+
# Visualize dependencies
|
|
131
|
+
tick graph [--format ascii|mermaid] [--show-done]
|
|
132
|
+
|
|
133
|
+
# Watch for changes
|
|
134
|
+
tick watch [--interval <seconds>] [--filter <status>]
|
|
135
|
+
|
|
136
|
+
# Add tasks
|
|
137
|
+
tick add <title> [--priority <level>] [--tags <list>] [--assigned-to <agent>]
|
|
138
|
+
|
|
139
|
+
# Register agents
|
|
140
|
+
tick agent register <name> [--type human|bot] [--roles <list>] [--status <status>]
|
|
141
|
+
tick agent list [--status <filter>] [--type <filter>] [--verbose]
|
|
142
|
+
|
|
143
|
+
# Claim and work on tasks
|
|
144
|
+
tick claim <task-id> <agent>
|
|
145
|
+
tick release <task-id> <agent>
|
|
146
|
+
tick done <task-id> <agent>
|
|
147
|
+
tick comment <task-id> <agent> --note <text>
|
|
148
|
+
|
|
149
|
+
# Validation
|
|
150
|
+
tick validate [--verbose]
|
|
151
|
+
|
|
152
|
+
# Git sync
|
|
153
|
+
tick sync [--push] [--pull] [--message <text>] [--init]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Command Reference
|
|
157
|
+
|
|
158
|
+
| Command | Status | Description |
|
|
159
|
+
|---------|--------|-------------|
|
|
160
|
+
| `tick init` | ✅ | Initialize new Tick project |
|
|
161
|
+
| `tick status` | ✅ | Show project summary with progress |
|
|
162
|
+
| `tick list` | ✅ | List tasks with filters and JSON output |
|
|
163
|
+
| `tick graph` | ✅ | Visualize dependencies (ASCII/Mermaid) |
|
|
164
|
+
| `tick watch` | ✅ | Real-time task monitoring |
|
|
165
|
+
| `tick add` | ✅ | Create new tasks with metadata |
|
|
166
|
+
| `tick claim` | ✅ | Claim task for agent (sets in_progress) |
|
|
167
|
+
| `tick release` | ✅ | Release claimed task (back to todo) |
|
|
168
|
+
| `tick done` | ✅ | Mark task complete, unblock dependents |
|
|
169
|
+
| `tick comment` | ✅ | Add notes to task history |
|
|
170
|
+
| `tick sync` | ✅ | Commit TICK.md to git with smart messages |
|
|
171
|
+
| `tick validate` | ✅ | Validate TICK.md structure and references |
|
|
172
|
+
| `tick agent register` | ✅ | Register new agent (human or bot) |
|
|
173
|
+
| `tick agent list` | ✅ | List agents with filtering |
|
|
174
|
+
|
|
175
|
+
## Technical Decisions
|
|
176
|
+
|
|
177
|
+
### Parser Strategy: Hybrid
|
|
178
|
+
- **Frontmatter**: `gray-matter` (battle-tested, 13M weekly downloads)
|
|
179
|
+
- **Agent tables**: Custom Markdown table parser
|
|
180
|
+
- **Task blocks**: Custom YAML code block + description parser
|
|
181
|
+
|
|
182
|
+
### CLI Language: Node.js/TypeScript
|
|
183
|
+
- Matches frontend stack
|
|
184
|
+
- Easy npm distribution (`npx tick-md`)
|
|
185
|
+
- Shared types with dashboard
|
|
186
|
+
- Fast enough for file operations
|
|
187
|
+
|
|
188
|
+
### Locking: Optimistic + Advisory
|
|
189
|
+
- `.tick/lock` file provides advisory hint (PID, agent, timestamp)
|
|
190
|
+
- Git is source of truth for conflicts
|
|
191
|
+
- CLI warns on conflicts, shows diff
|
|
192
|
+
- Works offline (lock is local)
|
|
193
|
+
|
|
194
|
+
## Next Steps (Roadmap)
|
|
195
|
+
|
|
196
|
+
### ✅ Completed
|
|
197
|
+
|
|
198
|
+
1. **MCP Server** - Model Context Protocol integration ✅
|
|
199
|
+
- Enable AI agents to use tick commands
|
|
200
|
+
- Real-time collaboration between human and AI agents
|
|
201
|
+
|
|
202
|
+
2. **Watch Mode** - Real-time file monitoring ✅
|
|
203
|
+
- `tick watch` for live updates
|
|
204
|
+
- Auto-validation on changes
|
|
205
|
+
|
|
206
|
+
3. **Advanced Filtering** - Task discovery ✅
|
|
207
|
+
- `tick list --status todo --priority high`
|
|
208
|
+
- JSON output for scripting
|
|
209
|
+
|
|
210
|
+
4. **Dependency Visualization** ✅
|
|
211
|
+
- `tick graph` - ASCII dependency graph
|
|
212
|
+
- Mermaid flowchart output
|
|
213
|
+
|
|
214
|
+
### Planned Features
|
|
215
|
+
|
|
216
|
+
1. **Cloud Sync** - Optional hosted dashboard
|
|
217
|
+
- Push local TICK.md to cloud
|
|
218
|
+
- Web-based visualization
|
|
219
|
+
- Team collaboration
|
|
220
|
+
|
|
221
|
+
2. **Plugins & Extensions**
|
|
222
|
+
- Custom validators
|
|
223
|
+
- Task templates
|
|
224
|
+
- Webhook integrations
|
|
225
|
+
|
|
226
|
+
## License
|
|
227
|
+
|
|
228
|
+
MIT · Purple Horizons
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { initCommand } from "./commands/init.js";
|
|
5
|
+
import { addCommand } from "./commands/add.js";
|
|
6
|
+
import { claimCommand, releaseCommand } from "./commands/claim.js";
|
|
7
|
+
import { doneCommand, commentCommand } from "./commands/done.js";
|
|
8
|
+
import { statusCommand } from "./commands/status.js";
|
|
9
|
+
import { syncCommand } from "./commands/sync.js";
|
|
10
|
+
import { validateCommand } from "./commands/validate.js";
|
|
11
|
+
import { registerAgentCommand, listAgentsCommand } from "./commands/agent.js";
|
|
12
|
+
import { listCommand } from "./commands/list.js";
|
|
13
|
+
import { graphCommand } from "./commands/graph.js";
|
|
14
|
+
import { watchCommand } from "./commands/watch.js";
|
|
15
|
+
const program = new Command();
|
|
16
|
+
program
|
|
17
|
+
.name("tick")
|
|
18
|
+
.description("Multi-agent task coordination via Markdown")
|
|
19
|
+
.version("0.1.0");
|
|
20
|
+
// Init command
|
|
21
|
+
program
|
|
22
|
+
.command("init")
|
|
23
|
+
.description("Initialize a new Tick project")
|
|
24
|
+
.option("-n, --name <name>", "Project name")
|
|
25
|
+
.option("-f, --force", "Overwrite existing TICK.md")
|
|
26
|
+
.action(async (options) => {
|
|
27
|
+
try {
|
|
28
|
+
await initCommand({
|
|
29
|
+
projectName: options.name,
|
|
30
|
+
force: options.force,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error(chalk.red("Error:"), error.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// Status command
|
|
39
|
+
program
|
|
40
|
+
.command("status")
|
|
41
|
+
.description("Show project status and task summary")
|
|
42
|
+
.action(async () => {
|
|
43
|
+
try {
|
|
44
|
+
await statusCommand();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(chalk.red("Error:"), error.message);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// Add command
|
|
52
|
+
program
|
|
53
|
+
.command("add <title>")
|
|
54
|
+
.description("Create a new task")
|
|
55
|
+
.option("-p, --priority <priority>", "Priority (urgent|high|medium|low)", "medium")
|
|
56
|
+
.option("-t, --tags <tags>", "Comma-separated tags")
|
|
57
|
+
.option("-a, --assigned-to <agent>", "Assign to agent")
|
|
58
|
+
.option("-d, --description <text>", "Task description")
|
|
59
|
+
.option("--depends-on <tasks>", "Comma-separated task IDs this depends on")
|
|
60
|
+
.option("--blocks <tasks>", "Comma-separated task IDs this blocks")
|
|
61
|
+
.option("--estimated-hours <hours>", "Estimated hours to complete", parseFloat)
|
|
62
|
+
.action(async (title, options) => {
|
|
63
|
+
try {
|
|
64
|
+
await addCommand(title, {
|
|
65
|
+
priority: options.priority,
|
|
66
|
+
tags: options.tags ? options.tags.split(",").map((t) => t.trim()) : undefined,
|
|
67
|
+
assignedTo: options.assignedTo,
|
|
68
|
+
description: options.description,
|
|
69
|
+
dependsOn: options.dependsOn ? options.dependsOn.split(",").map((t) => t.trim()) : undefined,
|
|
70
|
+
blocks: options.blocks ? options.blocks.split(",").map((t) => t.trim()) : undefined,
|
|
71
|
+
estimatedHours: options.estimatedHours,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(chalk.red("Error:"), error.message);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Claim command
|
|
80
|
+
program
|
|
81
|
+
.command("claim <task-id> <agent>")
|
|
82
|
+
.description("Claim a task for an agent")
|
|
83
|
+
.action(async (taskId, agent) => {
|
|
84
|
+
try {
|
|
85
|
+
await claimCommand(taskId, agent);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error(chalk.red("Error:"), error.message);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// Release command
|
|
93
|
+
program
|
|
94
|
+
.command("release <task-id> <agent>")
|
|
95
|
+
.description("Release a claimed task")
|
|
96
|
+
.action(async (taskId, agent) => {
|
|
97
|
+
try {
|
|
98
|
+
await releaseCommand(taskId, agent);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(chalk.red("Error:"), error.message);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Done command
|
|
106
|
+
program
|
|
107
|
+
.command("done <task-id> <agent>")
|
|
108
|
+
.description("Mark a task as complete")
|
|
109
|
+
.action(async (taskId, agent) => {
|
|
110
|
+
try {
|
|
111
|
+
await doneCommand(taskId, agent);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(chalk.red("Error:"), error.message);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// Comment command
|
|
119
|
+
program
|
|
120
|
+
.command("comment <task-id> <agent>")
|
|
121
|
+
.description("Add a comment to a task")
|
|
122
|
+
.requiredOption("-n, --note <text>", "Comment text")
|
|
123
|
+
.action(async (taskId, agent, options) => {
|
|
124
|
+
try {
|
|
125
|
+
await commentCommand(taskId, agent, options.note);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(chalk.red("Error:"), error.message);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Sync command
|
|
133
|
+
program
|
|
134
|
+
.command("sync")
|
|
135
|
+
.description("Commit TICK.md changes to git")
|
|
136
|
+
.option("--push", "Push to remote after committing")
|
|
137
|
+
.option("--pull", "Pull from remote before committing")
|
|
138
|
+
.option("-m, --message <text>", "Custom commit message")
|
|
139
|
+
.option("--init", "Initialize git repo if not exists")
|
|
140
|
+
.option("--remote <name>", "Remote name (default: origin)", "origin")
|
|
141
|
+
.option("--branch <name>", "Branch name (default: current)")
|
|
142
|
+
.action(async (options) => {
|
|
143
|
+
try {
|
|
144
|
+
await syncCommand({
|
|
145
|
+
push: options.push,
|
|
146
|
+
pull: options.pull,
|
|
147
|
+
message: options.message,
|
|
148
|
+
init: options.init,
|
|
149
|
+
remote: options.remote,
|
|
150
|
+
branch: options.branch,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(chalk.red("Error:"), error.message);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
// Validate command
|
|
159
|
+
program
|
|
160
|
+
.command("validate")
|
|
161
|
+
.description("Validate TICK.md for errors and warnings")
|
|
162
|
+
.option("-v, --verbose", "Show detailed validation stats")
|
|
163
|
+
.action(async (options) => {
|
|
164
|
+
try {
|
|
165
|
+
await validateCommand({
|
|
166
|
+
verbose: options.verbose,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error(chalk.red("Error:"), error.message);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// Agent commands
|
|
175
|
+
const agent = program
|
|
176
|
+
.command("agent")
|
|
177
|
+
.description("Manage agents");
|
|
178
|
+
agent
|
|
179
|
+
.command("register <name>")
|
|
180
|
+
.description("Register a new agent")
|
|
181
|
+
.option("-t, --type <type>", "Agent type (human|bot)", "human")
|
|
182
|
+
.option("-r, --roles <roles>", "Comma-separated roles (e.g., developer,reviewer)", "developer")
|
|
183
|
+
.option("-s, --status <status>", "Initial status (working|idle|offline)", "idle")
|
|
184
|
+
.action(async (name, options) => {
|
|
185
|
+
try {
|
|
186
|
+
await registerAgentCommand(name, {
|
|
187
|
+
type: options.type,
|
|
188
|
+
roles: options.roles ? options.roles.split(",").map((r) => r.trim()) : undefined,
|
|
189
|
+
status: options.status,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error(chalk.red("Error:"), error.message);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
agent
|
|
198
|
+
.command("list")
|
|
199
|
+
.description("List all registered agents")
|
|
200
|
+
.option("-s, --status <status>", "Filter by status (working|idle|offline)")
|
|
201
|
+
.option("-t, --type <type>", "Filter by type (human|bot)")
|
|
202
|
+
.option("-v, --verbose", "Show detailed agent information")
|
|
203
|
+
.action(async (options) => {
|
|
204
|
+
try {
|
|
205
|
+
await listAgentsCommand({
|
|
206
|
+
status: options.status,
|
|
207
|
+
type: options.type,
|
|
208
|
+
verbose: options.verbose,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error(chalk.red("Error:"), error.message);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
// List command
|
|
217
|
+
program
|
|
218
|
+
.command("list")
|
|
219
|
+
.description("List tasks with filtering")
|
|
220
|
+
.option("-s, --status <status>", "Filter by status (todo|in_progress|blocked|done)")
|
|
221
|
+
.option("-p, --priority <priority>", "Filter by priority (urgent|high|medium|low)")
|
|
222
|
+
.option("-a, --assigned-to <agent>", "Filter by assigned agent")
|
|
223
|
+
.option("-c, --claimed-by <agent>", "Filter by claiming agent")
|
|
224
|
+
.option("-t, --tag <tag>", "Filter by tag")
|
|
225
|
+
.option("-b, --blocked", "Show only blocked tasks")
|
|
226
|
+
.option("--json", "Output as JSON")
|
|
227
|
+
.action(async (options) => {
|
|
228
|
+
try {
|
|
229
|
+
await listCommand({
|
|
230
|
+
status: options.status,
|
|
231
|
+
priority: options.priority,
|
|
232
|
+
assignedTo: options.assignedTo,
|
|
233
|
+
claimedBy: options.claimedBy,
|
|
234
|
+
tag: options.tag,
|
|
235
|
+
blocked: options.blocked,
|
|
236
|
+
json: options.json,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
console.error(chalk.red("Error:"), error.message);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// Graph command
|
|
245
|
+
program
|
|
246
|
+
.command("graph")
|
|
247
|
+
.description("Visualize task dependencies")
|
|
248
|
+
.option("-f, --format <format>", "Output format (ascii|mermaid)", "ascii")
|
|
249
|
+
.option("--show-done", "Include completed tasks")
|
|
250
|
+
.action(async (options) => {
|
|
251
|
+
try {
|
|
252
|
+
await graphCommand({
|
|
253
|
+
format: options.format,
|
|
254
|
+
showDone: options.showDone,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
console.error(chalk.red("Error:"), error.message);
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
// Watch command
|
|
263
|
+
program
|
|
264
|
+
.command("watch")
|
|
265
|
+
.description("Watch TICK.md for changes in real-time")
|
|
266
|
+
.option("-i, --interval <seconds>", "Polling interval in seconds", "5")
|
|
267
|
+
.option("-f, --filter <status>", "Filter by status (todo|in_progress|blocked|done)")
|
|
268
|
+
.action(async (options) => {
|
|
269
|
+
try {
|
|
270
|
+
await watchCommand({
|
|
271
|
+
interval: parseInt(options.interval),
|
|
272
|
+
filter: options.filter,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
console.error(chalk.red("Error:"), error.message);
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
// Parse arguments
|
|
281
|
+
program.parse();
|
|
282
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Priority } from "../types.js";
|
|
2
|
+
export interface AddOptions {
|
|
3
|
+
priority?: Priority;
|
|
4
|
+
tags?: string[];
|
|
5
|
+
assignedTo?: string;
|
|
6
|
+
dependsOn?: string[];
|
|
7
|
+
blocks?: string[];
|
|
8
|
+
description?: string;
|
|
9
|
+
estimatedHours?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Add a new task to TICK.md
|
|
13
|
+
*/
|
|
14
|
+
export declare function addCommand(title: string, options?: AddOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=add.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,QAAQ,EAAc,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAwEf"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { parseTickFile, serializeTickFile } from "../parser/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Add a new task to TICK.md
|
|
6
|
+
*/
|
|
7
|
+
export async function addCommand(title, options = {}) {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const tickPath = path.join(cwd, "TICK.md");
|
|
10
|
+
// Check if TICK.md exists
|
|
11
|
+
try {
|
|
12
|
+
await fs.access(tickPath);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error("TICK.md not found. Run 'tick init' first to create a project.");
|
|
16
|
+
}
|
|
17
|
+
// Read and parse TICK.md
|
|
18
|
+
const content = await fs.readFile(tickPath, "utf-8");
|
|
19
|
+
const tickFile = parseTickFile(content);
|
|
20
|
+
// Generate new task ID
|
|
21
|
+
const taskId = `${tickFile.meta.id_prefix}-${String(tickFile.meta.next_id).padStart(3, "0")}`;
|
|
22
|
+
// Get creator from git or environment
|
|
23
|
+
const creator = await getCreator();
|
|
24
|
+
// Create new task
|
|
25
|
+
const now = new Date().toISOString();
|
|
26
|
+
const newTask = {
|
|
27
|
+
id: taskId,
|
|
28
|
+
title,
|
|
29
|
+
status: "backlog",
|
|
30
|
+
priority: options.priority || "medium",
|
|
31
|
+
assigned_to: options.assignedTo || null,
|
|
32
|
+
claimed_by: null,
|
|
33
|
+
created_by: creator,
|
|
34
|
+
created_at: now,
|
|
35
|
+
updated_at: now,
|
|
36
|
+
tags: options.tags || [],
|
|
37
|
+
depends_on: options.dependsOn || [],
|
|
38
|
+
blocks: options.blocks || [],
|
|
39
|
+
estimated_hours: options.estimatedHours,
|
|
40
|
+
description: options.description || "",
|
|
41
|
+
history: [
|
|
42
|
+
{
|
|
43
|
+
ts: now,
|
|
44
|
+
who: creator,
|
|
45
|
+
action: "created",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
// Add task to file
|
|
50
|
+
tickFile.tasks.push(newTask);
|
|
51
|
+
// Increment next_id
|
|
52
|
+
tickFile.meta.next_id++;
|
|
53
|
+
tickFile.meta.updated = now;
|
|
54
|
+
// Serialize and write
|
|
55
|
+
const newContent = serializeTickFile(tickFile);
|
|
56
|
+
await fs.writeFile(tickPath, newContent);
|
|
57
|
+
console.log(`✓ Created ${taskId}: ${title}`);
|
|
58
|
+
console.log(` Priority: ${newTask.priority}`);
|
|
59
|
+
if (newTask.tags.length > 0) {
|
|
60
|
+
console.log(` Tags: ${newTask.tags.join(", ")}`);
|
|
61
|
+
}
|
|
62
|
+
if (newTask.assigned_to) {
|
|
63
|
+
console.log(` Assigned to: ${newTask.assigned_to}`);
|
|
64
|
+
}
|
|
65
|
+
console.log("");
|
|
66
|
+
console.log("Next steps:");
|
|
67
|
+
console.log(` Claim task: tick claim ${taskId} @yourname`);
|
|
68
|
+
console.log(` View tasks: tick status`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the creator name from git config or environment
|
|
72
|
+
*/
|
|
73
|
+
async function getCreator() {
|
|
74
|
+
// Try git config
|
|
75
|
+
try {
|
|
76
|
+
const { execSync } = await import("child_process");
|
|
77
|
+
const gitName = execSync("git config user.name", {
|
|
78
|
+
encoding: "utf-8",
|
|
79
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
80
|
+
}).trim();
|
|
81
|
+
if (gitName) {
|
|
82
|
+
return `@${gitName.toLowerCase().replace(/\s+/g, "-")}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Git not available or not configured
|
|
87
|
+
}
|
|
88
|
+
// Try environment variables
|
|
89
|
+
const envName = process.env.TICK_AGENT ||
|
|
90
|
+
process.env.USER ||
|
|
91
|
+
process.env.USERNAME ||
|
|
92
|
+
"unknown";
|
|
93
|
+
return `@${envName.toLowerCase()}`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAatE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,UAAsB,EAAE;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE3C,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAExC,uBAAuB;IACvB,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAE9F,sCAAsC;IACtC,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,kBAAkB;IAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAS;QACpB,EAAE,EAAE,MAAM;QACV,KAAK;QACL,MAAM,EAAE,SAAuB;QAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ;QACtC,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACvC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC5B,eAAe,EAAE,OAAO,CAAC,cAAc;QACvC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,OAAO,EAAE;YACP;gBACE,EAAE,EAAE,GAAG;gBACP,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,SAAS;aAClB;SACF;KACF,CAAC;IAEF,mBAAmB;IACnB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE7B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IAE5B,sBAAsB;IACtB,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,YAAY,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU;IACvB,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI;QAChB,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,SAAS,CAAC;IACZ,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentStatus, AgentType } from "../types.js";
|
|
2
|
+
export interface AgentRegisterOptions {
|
|
3
|
+
type?: AgentType;
|
|
4
|
+
roles?: string[];
|
|
5
|
+
status?: AgentStatus;
|
|
6
|
+
}
|
|
7
|
+
export interface AgentListOptions {
|
|
8
|
+
status?: AgentStatus;
|
|
9
|
+
type?: AgentType;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Register a new agent in TICK.md
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerAgentCommand(name: string, options?: AgentRegisterOptions): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* List all agents in TICK.md
|
|
18
|
+
*/
|
|
19
|
+
export declare function listAgentsCommand(options?: AgentListOptions): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAS,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FrF"}
|