@autocode-cli/autocode 0.0.22
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 +172 -0
- package/bin/autocode +2 -0
- package/dist/cli/commands/comment.d.ts +9 -0
- package/dist/cli/commands/comment.d.ts.map +1 -0
- package/dist/cli/commands/comment.js +37 -0
- package/dist/cli/commands/comment.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +41 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +9 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +78 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/move.d.ts +9 -0
- package/dist/cli/commands/move.d.ts.map +1 -0
- package/dist/cli/commands/move.js +59 -0
- package/dist/cli/commands/move.js.map +1 -0
- package/dist/cli/commands/new.d.ts +9 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/new.js +74 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/next.d.ts +9 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +46 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +55 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/show.d.ts +9 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +91 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/parser.d.ts +13 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +54 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/core/column.d.ts +53 -0
- package/dist/core/column.d.ts.map +1 -0
- package/dist/core/column.js +128 -0
- package/dist/core/column.js.map +1 -0
- package/dist/core/ticket.d.ts +50 -0
- package/dist/core/ticket.d.ts.map +1 -0
- package/dist/core/ticket.js +228 -0
- package/dist/core/ticket.js.map +1 -0
- package/dist/core/workflow.d.ts +66 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +176 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/server/api.d.ts +9 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +313 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/dashboard.d.ts +8 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +1865 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +94 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/watcher.d.ts +13 -0
- package/dist/server/watcher.d.ts.map +1 -0
- package/dist/server/watcher.js +62 -0
- package/dist/server/watcher.js.map +1 -0
- package/dist/server/websocket.d.ts +26 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +165 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/services/claude.d.ts +52 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +304 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/ticket-io.d.ts +76 -0
- package/dist/services/ticket-io.d.ts.map +1 -0
- package/dist/services/ticket-io.js +248 -0
- package/dist/services/ticket-io.js.map +1 -0
- package/dist/types/index.d.ts +79 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +93 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +96 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +60 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +129 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +57 -0
- package/templates/columns/00_backlog.en.md +31 -0
- package/templates/columns/00_backlog.fr.md +31 -0
- package/templates/columns/01_ready.en.md +30 -0
- package/templates/columns/01_ready.fr.md +30 -0
- package/templates/columns/02_in-progress.en.md +30 -0
- package/templates/columns/02_in-progress.fr.md +30 -0
- package/templates/columns/03_review-best-practices.en.md +31 -0
- package/templates/columns/03_review-best-practices.fr.md +31 -0
- package/templates/columns/04_review-no-duplication.en.md +30 -0
- package/templates/columns/04_review-no-duplication.fr.md +30 -0
- package/templates/columns/05_review-consistency.en.md +31 -0
- package/templates/columns/05_review-consistency.fr.md +31 -0
- package/templates/columns/06_review-security.en.md +32 -0
- package/templates/columns/06_review-security.fr.md +32 -0
- package/templates/columns/07_testing-playwright.en.md +30 -0
- package/templates/columns/07_testing-playwright.fr.md +30 -0
- package/templates/columns/08_testing-cypress.en.md +31 -0
- package/templates/columns/08_testing-cypress.fr.md +31 -0
- package/templates/columns/09_update-docs.en.md +29 -0
- package/templates/columns/09_update-docs.fr.md +29 -0
- package/templates/columns/10_deploy-staging.en.md +29 -0
- package/templates/columns/10_deploy-staging.fr.md +29 -0
- package/templates/columns/11_validate-staging.en.md +32 -0
- package/templates/columns/11_validate-staging.fr.md +32 -0
- package/templates/columns/12_done.en.md +23 -0
- package/templates/columns/12_done.fr.md +23 -0
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# AutoCode CLI
|
|
2
|
+
|
|
3
|
+
Filesystem-based ticket management system with web dashboard.
|
|
4
|
+
|
|
5
|
+
**[Live Demo](https://evkoh.gitlab.io/autocode/)** | **[Interactive Kanban Demo](https://evkoh.gitlab.io/autocode/demo.html)**
|
|
6
|
+
|
|
7
|
+
## Screenshots
|
|
8
|
+
|
|
9
|
+
### Landing Page
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
### Dashboard
|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
### Ticket Modal
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g @autocode-cli/autocode
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Initialize project structure
|
|
28
|
+
autocode init
|
|
29
|
+
|
|
30
|
+
# Create a new ticket
|
|
31
|
+
autocode new "Implement user authentication" -p P1
|
|
32
|
+
|
|
33
|
+
# List all tickets
|
|
34
|
+
autocode list
|
|
35
|
+
|
|
36
|
+
# Show ticket details
|
|
37
|
+
autocode show AC-000001
|
|
38
|
+
|
|
39
|
+
# Move ticket to next column
|
|
40
|
+
autocode next AC-000001
|
|
41
|
+
|
|
42
|
+
# Start web dashboard
|
|
43
|
+
autocode serve
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Commands
|
|
47
|
+
|
|
48
|
+
| Command | Description |
|
|
49
|
+
|---------|-------------|
|
|
50
|
+
| `init` | Initialize autocode project structure |
|
|
51
|
+
| `new <title>` | Create a new ticket |
|
|
52
|
+
| `list` | List all tickets |
|
|
53
|
+
| `show <key>` | Show ticket details |
|
|
54
|
+
| `move <key> <column>` | Move ticket to specific column |
|
|
55
|
+
| `next <key>` | Advance ticket to next column |
|
|
56
|
+
| `comment <key> <text>` | Add comment to ticket |
|
|
57
|
+
| `serve` | Start web dashboard |
|
|
58
|
+
|
|
59
|
+
## Options
|
|
60
|
+
|
|
61
|
+
### new
|
|
62
|
+
- `-p, --priority <P0-P3>` - Set priority (default: P2)
|
|
63
|
+
- `-l, --labels <labels>` - Comma-separated labels
|
|
64
|
+
- `-d, --description <desc>` - Description
|
|
65
|
+
- `-s, --semver <type>` - Semver type (major/minor/patch/none)
|
|
66
|
+
|
|
67
|
+
### list
|
|
68
|
+
- `-c, --column <column>` - Filter by column
|
|
69
|
+
- `-p, --priority <priority>` - Filter by priority
|
|
70
|
+
- `-l, --label <label>` - Filter by label
|
|
71
|
+
- `--json` - Output as JSON
|
|
72
|
+
|
|
73
|
+
### serve
|
|
74
|
+
- `-p, --port <port>` - Server port (default: 3333)
|
|
75
|
+
|
|
76
|
+
## Workflow Columns
|
|
77
|
+
|
|
78
|
+
The default workflow includes 13 columns:
|
|
79
|
+
|
|
80
|
+
0. **Backlog** - New tickets waiting to be prioritized
|
|
81
|
+
1. **Ready** - Tickets ready to start
|
|
82
|
+
2. **In Progress** - Currently being worked on
|
|
83
|
+
3. **Review** - Code review
|
|
84
|
+
4. **Testing** - QA testing
|
|
85
|
+
5. **Staging** - Deployed to staging
|
|
86
|
+
6. **Approval** - Awaiting approval
|
|
87
|
+
7. **Release Prep** - Preparing for release
|
|
88
|
+
8. **Deploying** - Being deployed
|
|
89
|
+
9. **Monitoring** - Post-deployment monitoring
|
|
90
|
+
10. **Documentation** - Documentation updates
|
|
91
|
+
11. **Closing** - Final checks
|
|
92
|
+
12. **Done** - Completed
|
|
93
|
+
|
|
94
|
+
## Project Structure
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
autodoc/
|
|
98
|
+
├── .seq # Ticket sequence counter
|
|
99
|
+
├── 00_backlog/
|
|
100
|
+
│ ├── ACTION.en.md # Column instructions (English)
|
|
101
|
+
│ └── tickets/
|
|
102
|
+
│ └── AC-000001__ticket_title/
|
|
103
|
+
│ └── issue.md # Ticket content
|
|
104
|
+
├── 01_ready/
|
|
105
|
+
│ └── ...
|
|
106
|
+
└── ...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Ticket Format
|
|
110
|
+
|
|
111
|
+
Tickets are stored as Markdown files with YAML front matter:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
---
|
|
115
|
+
key: "AC-000001"
|
|
116
|
+
title: "Implement feature X"
|
|
117
|
+
status: "In Progress"
|
|
118
|
+
column_slug: "02_in_progress"
|
|
119
|
+
priority: "P1"
|
|
120
|
+
labels: ["feature", "backend"]
|
|
121
|
+
description: "..."
|
|
122
|
+
acceptance_criteria:
|
|
123
|
+
- "Criterion 1"
|
|
124
|
+
- "Criterion 2"
|
|
125
|
+
semver: "minor"
|
|
126
|
+
comments:
|
|
127
|
+
- text: "```markdown\nComment content\n```"
|
|
128
|
+
column: "In Progress"
|
|
129
|
+
created_at: "2024-01-15T10:00:00Z"
|
|
130
|
+
history:
|
|
131
|
+
- at: "2024-01-15T10:00:00Z"
|
|
132
|
+
action: "created"
|
|
133
|
+
from: null
|
|
134
|
+
to: "Backlog"
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
# Ticket Title
|
|
138
|
+
|
|
139
|
+
## Context
|
|
140
|
+
|
|
141
|
+
Additional context here...
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## API Endpoints
|
|
145
|
+
|
|
146
|
+
When running `autocode serve`:
|
|
147
|
+
|
|
148
|
+
| Method | Endpoint | Description |
|
|
149
|
+
|--------|----------|-------------|
|
|
150
|
+
| GET | `/api/tickets` | List all tickets |
|
|
151
|
+
| GET | `/api/tickets/:key` | Get ticket details |
|
|
152
|
+
| POST | `/api/tickets` | Create new ticket |
|
|
153
|
+
| PATCH | `/api/tickets/:key` | Update ticket |
|
|
154
|
+
| POST | `/api/tickets/:key/comments` | Add comment |
|
|
155
|
+
| POST | `/api/tickets/:key/move` | Move to column |
|
|
156
|
+
| POST | `/api/tickets/:key/next` | Advance to next column |
|
|
157
|
+
| GET | `/api/columns` | List all columns |
|
|
158
|
+
| GET | `/api/summary` | Get workflow summary |
|
|
159
|
+
|
|
160
|
+
## Environment Variables
|
|
161
|
+
|
|
162
|
+
| Variable | Description | Default |
|
|
163
|
+
|----------|-------------|---------|
|
|
164
|
+
| `AUTOCODE_ROOT` | Root directory for tickets | `autodoc` |
|
|
165
|
+
| `AUTOCODE_LANG` | Language (en/fr) | `en` |
|
|
166
|
+
| `AUTOCODE_PORT` | Dashboard port | `3333` |
|
|
167
|
+
| `AUTOCODE_CLAUDE` | Enable Claude integration | `true` |
|
|
168
|
+
| `AUTOCODE_CLAUDE_TIMEOUT` | Claude timeout (ms) | `900000` |
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
MIT
|
package/bin/autocode
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CA8BxC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* comment command - Add comment to ticket
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { addComment, getTicket } from '../../core/ticket.js';
|
|
6
|
+
import { getConfig } from '../../utils/config.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create the comment command
|
|
10
|
+
*/
|
|
11
|
+
export function commentCommand() {
|
|
12
|
+
const cmd = new Command('comment');
|
|
13
|
+
cmd
|
|
14
|
+
.description('Add a comment to a ticket')
|
|
15
|
+
.argument('<key>', 'Ticket key (e.g., AC-000001)')
|
|
16
|
+
.argument('<text>', 'Comment text')
|
|
17
|
+
.action((key, text) => {
|
|
18
|
+
const config = getConfig();
|
|
19
|
+
// Get current ticket
|
|
20
|
+
const ticket = getTicket(config.root, key);
|
|
21
|
+
if (!ticket) {
|
|
22
|
+
logger.error(`Ticket '${key}' not found`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Add comment
|
|
26
|
+
const updated = addComment(config.root, key, text);
|
|
27
|
+
if (!updated) {
|
|
28
|
+
logger.error(`Failed to add comment to ticket '${key}'`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
logger.success(`Added comment to ${logger.bold(key)}`);
|
|
32
|
+
logger.row('Column', ticket.status);
|
|
33
|
+
logger.row('Comments', String(updated.comments.length));
|
|
34
|
+
});
|
|
35
|
+
return cmd;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../../src/cli/commands/comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnC,GAAG;SACA,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,OAAO,EAAE,8BAA8B,CAAC;SACjD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,qBAAqB;QACrB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,cAAc;QACd,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,GAAG,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAoCrC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init command - Initialize project structure
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { ensureColumnStructure, copyActionTemplates } from '../../core/column.js';
|
|
7
|
+
import { DEFAULT_ROOT } from '../../utils/config.js';
|
|
8
|
+
import { ensureDir, pathExists, writeFileSafe } from '../../utils/fs.js';
|
|
9
|
+
import { logger } from '../../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create the init command
|
|
12
|
+
*/
|
|
13
|
+
export function initCommand() {
|
|
14
|
+
const cmd = new Command('init');
|
|
15
|
+
cmd
|
|
16
|
+
.description('Initialize autocode project structure')
|
|
17
|
+
.option('-d, --dir <path>', 'Root directory', DEFAULT_ROOT)
|
|
18
|
+
.option('-l, --lang <lang>', 'Language (en/fr)', 'en')
|
|
19
|
+
.action((options) => {
|
|
20
|
+
const rootDir = options.dir;
|
|
21
|
+
if (pathExists(rootDir)) {
|
|
22
|
+
logger.warn(`Directory '${rootDir}' already exists`);
|
|
23
|
+
}
|
|
24
|
+
logger.info(`Initializing autocode in ${rootDir}...`);
|
|
25
|
+
// Create root directory
|
|
26
|
+
ensureDir(rootDir);
|
|
27
|
+
// Create column structure
|
|
28
|
+
ensureColumnStructure(rootDir);
|
|
29
|
+
// Create .seq file
|
|
30
|
+
const seqFile = join(rootDir, '.seq');
|
|
31
|
+
if (!pathExists(seqFile)) {
|
|
32
|
+
writeFileSafe(seqFile, '0');
|
|
33
|
+
}
|
|
34
|
+
// Copy ACTION.md templates for each column
|
|
35
|
+
copyActionTemplates(rootDir, options.lang);
|
|
36
|
+
logger.success(`Autocode initialized in ${rootDir}`);
|
|
37
|
+
logger.info('Run `autocode new "Your ticket title"` to create your first ticket');
|
|
38
|
+
});
|
|
39
|
+
return cmd;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAa,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,IAAI,CAAC;SACrD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;QAE5B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,kBAAkB,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,KAAK,CAAC,CAAC;QAEtD,wBAAwB;QACxB,SAAS,CAAC,OAAO,CAAC,CAAC;QAEnB,0BAA0B;QAC1B,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAE/B,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,2CAA2C;QAC3C,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAgB,CAAC,CAAC;QAEvD,MAAM,CAAC,OAAO,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CA+DrC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list command - List tickets
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { listTickets, listTicketsInColumn } from '../../core/ticket.js';
|
|
6
|
+
import { getColumnBySlug, getColumnByName } from '../../core/column.js';
|
|
7
|
+
import { getConfig } from '../../utils/config.js';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create the list command
|
|
11
|
+
*/
|
|
12
|
+
export function listCommand() {
|
|
13
|
+
const cmd = new Command('list');
|
|
14
|
+
cmd
|
|
15
|
+
.description('List tickets')
|
|
16
|
+
.option('-c, --column <column>', 'Filter by column (name or slug)')
|
|
17
|
+
.option('-p, --priority <priority>', 'Filter by priority (P0-P3)')
|
|
18
|
+
.option('-l, --label <label>', 'Filter by label')
|
|
19
|
+
.option('--json', 'Output as JSON')
|
|
20
|
+
.action((options) => {
|
|
21
|
+
const config = getConfig();
|
|
22
|
+
let tickets;
|
|
23
|
+
// Get tickets
|
|
24
|
+
if (options.column) {
|
|
25
|
+
const column = getColumnBySlug(options.column) || getColumnByName(options.column);
|
|
26
|
+
if (!column) {
|
|
27
|
+
logger.error(`Column '${options.column}' not found`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
tickets = listTicketsInColumn(config.root, column.slug);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
tickets = listTickets(config.root);
|
|
34
|
+
}
|
|
35
|
+
// Apply filters
|
|
36
|
+
if (options.priority) {
|
|
37
|
+
const p = options.priority.toUpperCase();
|
|
38
|
+
tickets = tickets.filter(t => t.priority === p);
|
|
39
|
+
}
|
|
40
|
+
if (options.label) {
|
|
41
|
+
tickets = tickets.filter(t => t.labels.includes(options.label));
|
|
42
|
+
}
|
|
43
|
+
// Sort by priority then by key
|
|
44
|
+
tickets.sort((a, b) => {
|
|
45
|
+
const priorityOrder = { P0: 0, P1: 1, P2: 2, P3: 3 };
|
|
46
|
+
const pDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
47
|
+
if (pDiff !== 0)
|
|
48
|
+
return pDiff;
|
|
49
|
+
return a.key.localeCompare(b.key);
|
|
50
|
+
});
|
|
51
|
+
// Output
|
|
52
|
+
if (options.json) {
|
|
53
|
+
console.log(JSON.stringify(tickets, null, 2));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (tickets.length === 0) {
|
|
57
|
+
logger.info('No tickets found');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
logger.info(`Found ${tickets.length} ticket(s)`);
|
|
61
|
+
logger.separator();
|
|
62
|
+
for (const ticket of tickets) {
|
|
63
|
+
printTicketSummary(ticket);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return cmd;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Print a single ticket summary line
|
|
70
|
+
*/
|
|
71
|
+
function printTicketSummary(ticket) {
|
|
72
|
+
const key = logger.cyan(ticket.key);
|
|
73
|
+
const priority = logger.priority(ticket.priority);
|
|
74
|
+
const title = ticket.title.substring(0, 50) + (ticket.title.length > 50 ? '...' : '');
|
|
75
|
+
const status = logger.dim(`[${ticket.status}]`);
|
|
76
|
+
console.log(`${key} ${priority} ${title} ${status}`);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/move.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAoDrC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* move command - Move ticket to a different column
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { moveTicket, getTicket } from '../../core/ticket.js';
|
|
6
|
+
import { getColumnByName, getColumnBySlug, getColumns } from '../../core/column.js';
|
|
7
|
+
import { validateTransition } from '../../core/workflow.js';
|
|
8
|
+
import { getConfig } from '../../utils/config.js';
|
|
9
|
+
import { logger } from '../../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create the move command
|
|
12
|
+
*/
|
|
13
|
+
export function moveCommand() {
|
|
14
|
+
const cmd = new Command('move');
|
|
15
|
+
cmd
|
|
16
|
+
.description('Move ticket to a different column')
|
|
17
|
+
.argument('<key>', 'Ticket key (e.g., AC-000001)')
|
|
18
|
+
.argument('<column>', 'Target column (name or slug)')
|
|
19
|
+
.option('-f, --force', 'Force move (skip validation)')
|
|
20
|
+
.action((key, column, options) => {
|
|
21
|
+
const config = getConfig();
|
|
22
|
+
// Get current ticket
|
|
23
|
+
const ticket = getTicket(config.root, key);
|
|
24
|
+
if (!ticket) {
|
|
25
|
+
logger.error(`Ticket '${key}' not found`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Resolve target column
|
|
29
|
+
const targetColumn = getColumnByName(column) || getColumnBySlug(column);
|
|
30
|
+
if (!targetColumn) {
|
|
31
|
+
logger.error(`Column '${column}' not found`);
|
|
32
|
+
logger.info('Available columns:');
|
|
33
|
+
for (const col of getColumns()) {
|
|
34
|
+
console.log(` - ${col.name} (${col.slug})`);
|
|
35
|
+
}
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Validate transition
|
|
39
|
+
if (!options.force) {
|
|
40
|
+
const validation = validateTransition(ticket.column_slug, targetColumn.slug);
|
|
41
|
+
if (!validation.valid) {
|
|
42
|
+
logger.error(validation.reason || 'Invalid transition');
|
|
43
|
+
logger.info('Use --force to override');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Perform move
|
|
48
|
+
const updated = moveTicket(config.root, key, targetColumn.name, options.force);
|
|
49
|
+
if (!updated) {
|
|
50
|
+
logger.error(`Failed to move ticket '${key}'`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
logger.success(`Moved ${logger.bold(key)} to ${logger.cyan(targetColumn.name)}`);
|
|
54
|
+
logger.row('From', ticket.status);
|
|
55
|
+
logger.row('To', updated.status);
|
|
56
|
+
});
|
|
57
|
+
return cmd;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.js","sourceRoot":"","sources":["../../../src/cli/commands/move.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CA8CpC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* new command - Create a new ticket
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { createTicket } from '../../core/ticket.js';
|
|
6
|
+
import { getConfig } from '../../utils/config.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create the new command
|
|
10
|
+
*/
|
|
11
|
+
export function newCommand() {
|
|
12
|
+
const cmd = new Command('new');
|
|
13
|
+
cmd
|
|
14
|
+
.description('Create a new ticket')
|
|
15
|
+
.argument('<title>', 'Ticket title')
|
|
16
|
+
.argument('[description]', 'Ticket description')
|
|
17
|
+
.option('-p, --priority <priority>', 'Priority (P0-P3)', 'P2')
|
|
18
|
+
.option('-l, --labels <labels>', 'Comma-separated labels')
|
|
19
|
+
.option('-a, --acceptance <criteria>', 'Comma-separated acceptance criteria')
|
|
20
|
+
.option('-s, --semver <type>', 'Semver type (major/minor/patch/none)', 'patch')
|
|
21
|
+
.action((title, description, options) => {
|
|
22
|
+
const config = getConfig();
|
|
23
|
+
const priority = validatePriority(options.priority);
|
|
24
|
+
const semver = validateSemver(options.semver);
|
|
25
|
+
const labels = options.labels ? options.labels.split(',').map((l) => l.trim()) : [];
|
|
26
|
+
const acceptanceCriteria = options.acceptance ? options.acceptance.split(',').map((c) => c.trim()) : [];
|
|
27
|
+
const ticket = createTicket(config.root, {
|
|
28
|
+
title,
|
|
29
|
+
priority,
|
|
30
|
+
labels,
|
|
31
|
+
description: description || '',
|
|
32
|
+
acceptance_criteria: acceptanceCriteria,
|
|
33
|
+
semver,
|
|
34
|
+
});
|
|
35
|
+
logger.success(`Created ticket ${logger.bold(ticket.key)}`);
|
|
36
|
+
logger.row('Title', ticket.title);
|
|
37
|
+
logger.row('Priority', logger.priority(ticket.priority));
|
|
38
|
+
logger.row('Status', ticket.status);
|
|
39
|
+
if (labels.length > 0) {
|
|
40
|
+
logger.row('Labels', labels.join(', '));
|
|
41
|
+
}
|
|
42
|
+
if (acceptanceCriteria.length > 0) {
|
|
43
|
+
logger.row('Acceptance', acceptanceCriteria.length + ' criteria');
|
|
44
|
+
}
|
|
45
|
+
logger.blank();
|
|
46
|
+
logger.info(`View with: autocode show ${ticket.key}`);
|
|
47
|
+
});
|
|
48
|
+
return cmd;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate priority input
|
|
52
|
+
*/
|
|
53
|
+
function validatePriority(input) {
|
|
54
|
+
const valid = ['P0', 'P1', 'P2', 'P3'];
|
|
55
|
+
const upper = input.toUpperCase();
|
|
56
|
+
if (valid.includes(upper)) {
|
|
57
|
+
return upper;
|
|
58
|
+
}
|
|
59
|
+
logger.warn(`Invalid priority '${input}', using P2`);
|
|
60
|
+
return 'P2';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validate semver input
|
|
64
|
+
*/
|
|
65
|
+
function validateSemver(input) {
|
|
66
|
+
const valid = ['major', 'minor', 'patch', 'none'];
|
|
67
|
+
const lower = input.toLowerCase();
|
|
68
|
+
if (valid.includes(lower)) {
|
|
69
|
+
return lower;
|
|
70
|
+
}
|
|
71
|
+
logger.warn(`Invalid semver '${input}', using patch`);
|
|
72
|
+
return 'patch';
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAwCrC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* next command - Advance ticket to next column
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { nextTicket, getTicket } from '../../core/ticket.js';
|
|
6
|
+
import { canAdvance, isComplete } from '../../core/workflow.js';
|
|
7
|
+
import { getConfig } from '../../utils/config.js';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create the next command
|
|
11
|
+
*/
|
|
12
|
+
export function nextCommand() {
|
|
13
|
+
const cmd = new Command('next');
|
|
14
|
+
cmd
|
|
15
|
+
.description('Advance ticket to next column')
|
|
16
|
+
.argument('<key>', 'Ticket key (e.g., AC-000001)')
|
|
17
|
+
.action((key) => {
|
|
18
|
+
const config = getConfig();
|
|
19
|
+
// Get current ticket
|
|
20
|
+
const ticket = getTicket(config.root, key);
|
|
21
|
+
if (!ticket) {
|
|
22
|
+
logger.error(`Ticket '${key}' not found`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Check if can advance
|
|
26
|
+
if (isComplete(ticket)) {
|
|
27
|
+
logger.warn(`Ticket '${key}' is already complete`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!canAdvance(ticket)) {
|
|
31
|
+
logger.error(`Ticket '${key}' cannot advance`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Perform advance
|
|
35
|
+
const updated = nextTicket(config.root, key);
|
|
36
|
+
if (!updated) {
|
|
37
|
+
logger.error(`Failed to advance ticket '${key}'`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
logger.success(`Advanced ${logger.bold(key)}`);
|
|
41
|
+
logger.row('From', ticket.status);
|
|
42
|
+
logger.row('To', updated.status);
|
|
43
|
+
});
|
|
44
|
+
return cmd;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=next.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,+BAA+B,CAAC;SAC5C,QAAQ,CAAC,OAAO,EAAE,8BAA8B,CAAC;SACjD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,qBAAqB;QACrB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,uBAAuB,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,kBAAkB,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAkDtC"}
|