@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.
Files changed (125) hide show
  1. package/README.md +172 -0
  2. package/bin/autocode +2 -0
  3. package/dist/cli/commands/comment.d.ts +9 -0
  4. package/dist/cli/commands/comment.d.ts.map +1 -0
  5. package/dist/cli/commands/comment.js +37 -0
  6. package/dist/cli/commands/comment.js.map +1 -0
  7. package/dist/cli/commands/init.d.ts +9 -0
  8. package/dist/cli/commands/init.d.ts.map +1 -0
  9. package/dist/cli/commands/init.js +41 -0
  10. package/dist/cli/commands/init.js.map +1 -0
  11. package/dist/cli/commands/list.d.ts +9 -0
  12. package/dist/cli/commands/list.d.ts.map +1 -0
  13. package/dist/cli/commands/list.js +78 -0
  14. package/dist/cli/commands/list.js.map +1 -0
  15. package/dist/cli/commands/move.d.ts +9 -0
  16. package/dist/cli/commands/move.d.ts.map +1 -0
  17. package/dist/cli/commands/move.js +59 -0
  18. package/dist/cli/commands/move.js.map +1 -0
  19. package/dist/cli/commands/new.d.ts +9 -0
  20. package/dist/cli/commands/new.d.ts.map +1 -0
  21. package/dist/cli/commands/new.js +74 -0
  22. package/dist/cli/commands/new.js.map +1 -0
  23. package/dist/cli/commands/next.d.ts +9 -0
  24. package/dist/cli/commands/next.d.ts.map +1 -0
  25. package/dist/cli/commands/next.js +46 -0
  26. package/dist/cli/commands/next.js.map +1 -0
  27. package/dist/cli/commands/serve.d.ts +9 -0
  28. package/dist/cli/commands/serve.d.ts.map +1 -0
  29. package/dist/cli/commands/serve.js +55 -0
  30. package/dist/cli/commands/serve.js.map +1 -0
  31. package/dist/cli/commands/show.d.ts +9 -0
  32. package/dist/cli/commands/show.d.ts.map +1 -0
  33. package/dist/cli/commands/show.js +91 -0
  34. package/dist/cli/commands/show.js.map +1 -0
  35. package/dist/cli/parser.d.ts +13 -0
  36. package/dist/cli/parser.d.ts.map +1 -0
  37. package/dist/cli/parser.js +54 -0
  38. package/dist/cli/parser.js.map +1 -0
  39. package/dist/core/column.d.ts +53 -0
  40. package/dist/core/column.d.ts.map +1 -0
  41. package/dist/core/column.js +128 -0
  42. package/dist/core/column.js.map +1 -0
  43. package/dist/core/ticket.d.ts +50 -0
  44. package/dist/core/ticket.d.ts.map +1 -0
  45. package/dist/core/ticket.js +228 -0
  46. package/dist/core/ticket.js.map +1 -0
  47. package/dist/core/workflow.d.ts +66 -0
  48. package/dist/core/workflow.d.ts.map +1 -0
  49. package/dist/core/workflow.js +176 -0
  50. package/dist/core/workflow.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +9 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/server/api.d.ts +9 -0
  56. package/dist/server/api.d.ts.map +1 -0
  57. package/dist/server/api.js +313 -0
  58. package/dist/server/api.js.map +1 -0
  59. package/dist/server/dashboard.d.ts +8 -0
  60. package/dist/server/dashboard.d.ts.map +1 -0
  61. package/dist/server/dashboard.js +1865 -0
  62. package/dist/server/dashboard.js.map +1 -0
  63. package/dist/server/index.d.ts +8 -0
  64. package/dist/server/index.d.ts.map +1 -0
  65. package/dist/server/index.js +94 -0
  66. package/dist/server/index.js.map +1 -0
  67. package/dist/server/watcher.d.ts +13 -0
  68. package/dist/server/watcher.d.ts.map +1 -0
  69. package/dist/server/watcher.js +62 -0
  70. package/dist/server/watcher.js.map +1 -0
  71. package/dist/server/websocket.d.ts +26 -0
  72. package/dist/server/websocket.d.ts.map +1 -0
  73. package/dist/server/websocket.js +165 -0
  74. package/dist/server/websocket.js.map +1 -0
  75. package/dist/services/claude.d.ts +52 -0
  76. package/dist/services/claude.d.ts.map +1 -0
  77. package/dist/services/claude.js +304 -0
  78. package/dist/services/claude.js.map +1 -0
  79. package/dist/services/ticket-io.d.ts +76 -0
  80. package/dist/services/ticket-io.d.ts.map +1 -0
  81. package/dist/services/ticket-io.js +248 -0
  82. package/dist/services/ticket-io.js.map +1 -0
  83. package/dist/types/index.d.ts +79 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +5 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/utils/config.d.ts +93 -0
  88. package/dist/utils/config.d.ts.map +1 -0
  89. package/dist/utils/config.js +96 -0
  90. package/dist/utils/config.js.map +1 -0
  91. package/dist/utils/fs.d.ts +60 -0
  92. package/dist/utils/fs.d.ts.map +1 -0
  93. package/dist/utils/fs.js +129 -0
  94. package/dist/utils/fs.js.map +1 -0
  95. package/dist/utils/logger.d.ts +23 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +56 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/package.json +57 -0
  100. package/templates/columns/00_backlog.en.md +31 -0
  101. package/templates/columns/00_backlog.fr.md +31 -0
  102. package/templates/columns/01_ready.en.md +30 -0
  103. package/templates/columns/01_ready.fr.md +30 -0
  104. package/templates/columns/02_in-progress.en.md +30 -0
  105. package/templates/columns/02_in-progress.fr.md +30 -0
  106. package/templates/columns/03_review-best-practices.en.md +31 -0
  107. package/templates/columns/03_review-best-practices.fr.md +31 -0
  108. package/templates/columns/04_review-no-duplication.en.md +30 -0
  109. package/templates/columns/04_review-no-duplication.fr.md +30 -0
  110. package/templates/columns/05_review-consistency.en.md +31 -0
  111. package/templates/columns/05_review-consistency.fr.md +31 -0
  112. package/templates/columns/06_review-security.en.md +32 -0
  113. package/templates/columns/06_review-security.fr.md +32 -0
  114. package/templates/columns/07_testing-playwright.en.md +30 -0
  115. package/templates/columns/07_testing-playwright.fr.md +30 -0
  116. package/templates/columns/08_testing-cypress.en.md +31 -0
  117. package/templates/columns/08_testing-cypress.fr.md +31 -0
  118. package/templates/columns/09_update-docs.en.md +29 -0
  119. package/templates/columns/09_update-docs.fr.md +29 -0
  120. package/templates/columns/10_deploy-staging.en.md +29 -0
  121. package/templates/columns/10_deploy-staging.fr.md +29 -0
  122. package/templates/columns/11_validate-staging.en.md +32 -0
  123. package/templates/columns/11_validate-staging.fr.md +32 -0
  124. package/templates/columns/12_done.en.md +23 -0
  125. 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
+ ![AutoCode Landing Page](https://evkoh.gitlab.io/autocode/screenshots/landing.png)
11
+
12
+ ### Dashboard
13
+ ![AutoCode Dashboard](https://evkoh.gitlab.io/autocode/screenshots/dashboard.png)
14
+
15
+ ### Ticket Modal
16
+ ![AutoCode Ticket Modal](https://evkoh.gitlab.io/autocode/screenshots/ticket-modal.png)
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,2 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/index.js');
@@ -0,0 +1,9 @@
1
+ /**
2
+ * comment command - Add comment to ticket
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the comment command
7
+ */
8
+ export declare function commentCommand(): Command;
9
+ //# sourceMappingURL=comment.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * init command - Initialize project structure
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the init command
7
+ */
8
+ export declare function initCommand(): Command;
9
+ //# sourceMappingURL=init.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * list command - List tickets
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the list command
7
+ */
8
+ export declare function listCommand(): Command;
9
+ //# sourceMappingURL=list.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * move command - Move ticket to a different column
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the move command
7
+ */
8
+ export declare function moveCommand(): Command;
9
+ //# sourceMappingURL=move.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * new command - Create a new ticket
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the new command
7
+ */
8
+ export declare function newCommand(): Command;
9
+ //# sourceMappingURL=new.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * next command - Advance ticket to next column
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the next command
7
+ */
8
+ export declare function nextCommand(): Command;
9
+ //# sourceMappingURL=next.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * serve command - Start web dashboard server
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the serve command
7
+ */
8
+ export declare function serveCommand(): Command;
9
+ //# sourceMappingURL=serve.d.ts.map
@@ -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"}