@qelos/aidev 0.1.2 → 0.1.4

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 (52) hide show
  1. package/.env.aidev.example +13 -1
  2. package/README.md +9 -2
  3. package/aidev.log +139 -0
  4. package/dist/__tests__/init.test.js +8 -0
  5. package/dist/__tests__/init.test.js.map +1 -1
  6. package/dist/__tests__/permissions.test.d.ts +2 -0
  7. package/dist/__tests__/permissions.test.d.ts.map +1 -0
  8. package/dist/__tests__/permissions.test.js +151 -0
  9. package/dist/__tests__/permissions.test.js.map +1 -0
  10. package/dist/ai/cursor.d.ts.map +1 -1
  11. package/dist/ai/cursor.js +7 -4
  12. package/dist/ai/cursor.js.map +1 -1
  13. package/dist/ai/index.d.ts.map +1 -1
  14. package/dist/ai/index.js +2 -0
  15. package/dist/ai/index.js.map +1 -1
  16. package/dist/ai/windsurf.d.ts +7 -0
  17. package/dist/ai/windsurf.d.ts.map +1 -0
  18. package/dist/ai/windsurf.js +36 -0
  19. package/dist/ai/windsurf.js.map +1 -0
  20. package/dist/cli.js +7 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/init.d.ts +8 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +72 -17
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/run.d.ts.map +1 -1
  27. package/dist/commands/run.js +19 -15
  28. package/dist/commands/run.js.map +1 -1
  29. package/dist/commands/schedule.d.ts +1 -0
  30. package/dist/commands/schedule.d.ts.map +1 -1
  31. package/dist/commands/schedule.js +107 -8
  32. package/dist/commands/schedule.js.map +1 -1
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +16 -6
  35. package/dist/config.js.map +1 -1
  36. package/dist/permissions.d.ts +19 -0
  37. package/dist/permissions.d.ts.map +1 -0
  38. package/dist/permissions.js +180 -0
  39. package/dist/permissions.js.map +1 -0
  40. package/dist/providers/clickup.d.ts.map +1 -1
  41. package/dist/providers/clickup.js +34 -12
  42. package/dist/providers/clickup.js.map +1 -1
  43. package/dist/providers/index.d.ts.map +1 -1
  44. package/dist/providers/index.js +2 -1
  45. package/dist/providers/index.js.map +1 -1
  46. package/dist/providers/jira.d.ts +18 -0
  47. package/dist/providers/jira.d.ts.map +1 -0
  48. package/dist/providers/jira.js +101 -0
  49. package/dist/providers/jira.js.map +1 -0
  50. package/dist/types.d.ts +8 -1
  51. package/dist/types.d.ts.map +1 -1
  52. package/package.json +2 -2
@@ -1,16 +1,28 @@
1
+ # PROVIDER: clickup | jira
1
2
  PROVIDER=clickup
3
+
4
+ # ── ClickUp (when PROVIDER=clickup) ──────────────────────────
2
5
  CLICKUP_API_KEY=
3
6
  CLICKUP_TEAM_ID=
4
7
  CLICKUP_TAG=
5
8
  CLICKUP_PENDING_STATUS=pending
6
9
  CLICKUP_IN_REVIEW_STATUS=review
7
10
 
11
+ # ── Jira (when PROVIDER=jira) ─────────────────────────────────
12
+ # JIRA_BASE_URL=https://mycompany.atlassian.net
13
+ # JIRA_EMAIL=you@example.com
14
+ # JIRA_API_TOKEN=
15
+ # JIRA_PROJECT=PROJ
16
+ # JIRA_LABEL=
17
+ # JIRA_PENDING_STATUS=To Do
18
+ # JIRA_IN_REVIEW_STATUS=In Review
19
+
8
20
  ASSIGNEE_TAG=
9
21
  GIT_REMOTE=origin
10
22
  GITHUB_BASE_BRANCH=main
11
23
  GITHUB_REPO=
12
24
 
13
- # Agents to use, in fallback order (comma-separated: claude, cursor)
25
+ # Agents to use, in fallback order (comma-separated: claude, cursor, windsurf)
14
26
  AGENTS=claude,cursor
15
27
 
16
28
  # DEV_NOTES_MODE: smart (only ask when unclear) | always (ask before every task)
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **aidev** turns your ClickUp tasks into merged code — automatically.
8
8
 
9
- It polls your task manager, checks whether tasks are clear, runs Claude or Cursor to implement them, pushes a branch, and moves the task to review. All without touching your keyboard.
9
+ It polls your task manager, checks whether tasks are clear, runs Claude, Cursor, or Windsurf to implement them, pushes a branch, and moves the task to review. All without touching your keyboard.
10
10
 
11
11
  ```
12
12
  ClickUp task → AI implements → git push → "in review"
@@ -142,6 +142,7 @@ aidev supports multiple AI agents with automatic fallback. The first available a
142
142
  |---|---|
143
143
  | `claude` | [Claude CLI](https://github.com/anthropics/claude-code) installed and authenticated |
144
144
  | `cursor` | [Cursor](https://cursor.sh) installed with Agent mode |
145
+ | `windsurf` | [Windsurf](https://windsurf.com) installed with CLI available in PATH |
145
146
 
146
147
  **Configure agent order in `.env.aidev`:**
147
148
 
@@ -154,6 +155,12 @@ AGENTS=cursor
154
155
 
155
156
  # Cursor first (useful when working locally with a monitor)
156
157
  AGENTS=cursor,claude
158
+
159
+ # All three: Claude first, then Windsurf, then Cursor
160
+ AGENTS=claude,windsurf,cursor
161
+
162
+ # Windsurf only
163
+ AGENTS=windsurf
157
164
  ```
158
165
 
159
166
  ---
@@ -224,7 +231,7 @@ ANSI colour codes are stripped so the file stays readable in any editor or `tail
224
231
  | Provider | Status |
225
232
  |---|---|
226
233
  | ClickUp | ✅ Implemented |
227
- | Jira | 🔜 Stub — contributions welcome |
234
+ | Jira | Implemented |
228
235
  | Notion | 🔜 Stub — contributions welcome |
229
236
  | Trello | 🔜 Stub — contributions welcome |
230
237
 
package/aidev.log ADDED
@@ -0,0 +1,139 @@
1
+ 2026-03-06T21:14:42.459Z [info] Current schedule for /Users/davidmeirlevy/dev/qelos/aidev:
2
+
3
+ ────────────────────────────────────────────────────────────
4
+ 2026-03-06T21:15:07.974Z [run] started
5
+ ────────────────────────────────────────────────────────────
6
+ 2026-03-06T21:15:07.977Z [info] Fetching tasks (filter: all)...
7
+ 2026-03-06T21:15:08.345Z [info] Found 0 tagged task(s)
8
+ 2026-03-06T21:15:08.346Z [success] Done. Processed: 0, Skipped: 0
9
+
10
+ ────────────────────────────────────────────────────────────
11
+ 2026-03-06T21:16:24.483Z [run] started
12
+ ────────────────────────────────────────────────────────────
13
+ 2026-03-06T21:16:24.487Z [info] Fetching tasks (filter: open)...
14
+ 2026-03-06T21:16:24.740Z [info] Found 0 tagged task(s)
15
+ 2026-03-06T21:16:24.741Z [success] Done. Processed: 0, Skipped: 0
16
+
17
+ ────────────────────────────────────────────────────────────
18
+ 2026-03-06T21:18:37.924Z [run] started
19
+ ────────────────────────────────────────────────────────────
20
+ 2026-03-06T21:18:37.928Z [info] Fetching tasks (filter: all)...
21
+ 2026-03-06T21:18:38.452Z [info] Found 1 tagged task(s)
22
+ 2026-03-06T21:18:38.453Z [task] [86c8nt813] "add support in jira" (status: open)
23
+ 2026-03-06T21:18:40.278Z [info] Running Cursor Agent...
24
+ 2026-03-06T21:18:41.896Z [info] Implementing task: add support in jira
25
+ 2026-03-06T21:18:46.761Z [info] Running cursor...
26
+ 2026-03-06T21:18:46.761Z [info] Running Cursor Agent...
27
+ 2026-03-06T21:18:47.941Z [warn] AI runner produced no file changes
28
+ 2026-03-06T21:18:48.281Z [success] Done. Processed: 1, Skipped: 0
29
+ 2026-03-06T21:27:22.697Z [info] Scheduled aidev jobs:
30
+ 2026-03-06T21:27:30.944Z [success] Removed schedule for /Users/davidmeirlevy/dev/qelos/aidev
31
+
32
+ ────────────────────────────────────────────────────────────
33
+ 2026-03-06T21:28:04.192Z [run] started
34
+ ────────────────────────────────────────────────────────────
35
+ 2026-03-06T21:28:04.193Z [info] Fetching tasks (filter: all)...
36
+ 2026-03-06T21:28:04.585Z [info] Found 0 tagged task(s)
37
+ 2026-03-06T21:28:04.585Z [success] Done. Processed: 0, Skipped: 0
38
+
39
+ ────────────────────────────────────────────────────────────
40
+ 2026-03-06T21:28:18.615Z [run] started
41
+ ────────────────────────────────────────────────────────────
42
+ 2026-03-06T21:28:18.616Z [info] Fetching tasks (filter: all)...
43
+ 2026-03-06T21:28:18.968Z [info] Found 1 tagged task(s)
44
+ 2026-03-06T21:28:18.969Z [task] [86c8nt813] "add support in jira" (status: open)
45
+ 2026-03-06T21:28:20.776Z [info] Running Cursor Agent...
46
+ 2026-03-06T21:28:22.010Z [info] Implementing task: add support in jira
47
+ 2026-03-06T21:28:26.672Z [info] Running cursor...
48
+ 2026-03-06T21:28:26.673Z [info] Running Cursor Agent...
49
+ 2026-03-06T21:28:30.671Z [success] Task implemented: branch 86c8nt813/add-support-in-jira pushed
50
+ 2026-03-06T21:28:30.672Z [success] Done. Processed: 1, Skipped: 0
51
+
52
+ ────────────────────────────────────────────────────────────
53
+ 2026-03-06T21:32:15.245Z [run] started
54
+ ────────────────────────────────────────────────────────────
55
+ 2026-03-06T21:32:15.246Z [info] Fetching tasks (filter: all)...
56
+ 2026-03-06T21:32:15.656Z [info] Found 1 tagged task(s)
57
+ 2026-03-06T21:32:15.657Z [task] [86c8nt813] "add support in jira" (status: open)
58
+ 2026-03-06T21:32:17.392Z [success] Done. Processed: 0, Skipped: 1
59
+
60
+ ────────────────────────────────────────────────────────────
61
+ 2026-03-06T21:32:52.675Z [run] started
62
+ ────────────────────────────────────────────────────────────
63
+ 2026-03-06T21:32:52.676Z [info] Fetching tasks (filter: all)...
64
+ 2026-03-06T21:32:53.225Z [info] Found 1 tagged task(s)
65
+ 2026-03-06T21:32:53.226Z [task] [86c8nt813] "add support in jira" (status: open)
66
+ 2026-03-06T21:32:54.967Z [success] Done. Processed: 0, Skipped: 1
67
+
68
+ ────────────────────────────────────────────────────────────
69
+ 2026-03-06T21:35:57.432Z [run] started
70
+ ────────────────────────────────────────────────────────────
71
+ 2026-03-06T21:35:57.433Z [info] Fetching tasks (filter: all)...
72
+ 2026-03-06T21:35:58.108Z [info] Found 1 tagged task(s)
73
+ 2026-03-06T21:35:58.109Z [task] [86c8nt813] "add support in jira" (status: open)
74
+ 2026-03-06T21:35:59.928Z [info] Running Cursor Agent...
75
+ 2026-03-06T21:36:01.088Z [info] Implementing task: add support in jira
76
+ 2026-03-06T21:36:06.405Z [info] Running cursor...
77
+ 2026-03-06T21:36:06.406Z [info] Running Cursor Agent...
78
+ 2026-03-06T21:36:07.575Z [warn] cursor produced no file changes — trying next runner
79
+ 2026-03-06T21:36:07.576Z [info] Running claude...
80
+ 2026-03-06T21:36:07.576Z [info] Running Claude CLI...
81
+ 2026-03-06T21:39:03.133Z [success] Task implemented: branch 86c8nt813/add-support-in-jira pushed
82
+ 2026-03-06T21:39:03.135Z [success] Done. Processed: 1, Skipped: 0
83
+
84
+ ────────────────────────────────────────────────────────────
85
+ 2026-03-06T21:43:29.757Z [run] started
86
+ ────────────────────────────────────────────────────────────
87
+ 2026-03-06T21:43:29.761Z [info] Fetching tasks (filter: all)...
88
+ 2026-03-06T21:43:30.188Z [info] Found 0 tagged task(s)
89
+ 2026-03-06T21:43:30.189Z [success] Done. Processed: 0, Skipped: 0
90
+ 2026-03-06T21:44:53.140Z [warn] No aidev schedules found
91
+ 2026-03-06T21:44:53.140Z [info] Use "aidev schedule set" to configure one.
92
+ 2026-03-06T21:45:08.973Z [success] Cron schedule set: */15 * * * *
93
+ 2026-03-06T21:45:08.974Z [info] Entry: */15 * * * * cd /Users/davidmeirlevy/dev/qelos/aidev && /Users/davidmeirlevy/.nvm/versions/node/v22.14.0/bin/aidev run # aidev-cwd:/Users/davidmeirlevy/dev/qelos/aidev
94
+ 2026-03-06T21:45:15.349Z [info] Scheduled aidev jobs:
95
+
96
+ ────────────────────────────────────────────────────────────
97
+ 2026-03-06T21:47:27.535Z [run] started
98
+ ────────────────────────────────────────────────────────────
99
+ 2026-03-06T21:47:27.539Z [info] Fetching tasks (filter: all)...
100
+ 2026-03-06T21:47:27.945Z [info] Found 1 tagged task(s)
101
+ 2026-03-06T21:47:27.946Z [task] [86c8ntef5] "validate claude and cursor permissions on init" (status: open)
102
+ 2026-03-06T21:47:29.692Z [info] Running Cursor Agent...
103
+ 2026-03-06T21:47:52.926Z [info] Posted clarification question, set status to pending
104
+ 2026-03-06T21:47:52.927Z [success] Done. Processed: 0, Skipped: 1
105
+
106
+ ────────────────────────────────────────────────────────────
107
+ 2026-03-06T21:49:48.085Z [run] started
108
+ ────────────────────────────────────────────────────────────
109
+ 2026-03-06T21:49:48.089Z [info] Fetching tasks (filter: all)...
110
+ 2026-03-06T21:49:48.557Z [info] Found 2 tagged task(s)
111
+ 2026-03-06T21:49:48.558Z [task] [86c8ntepp] "add support in windsurf as agent" (status: open)
112
+ 2026-03-06T21:49:50.309Z [info] Running Cursor Agent...
113
+ 2026-03-06T21:50:06.631Z [info] Posted clarification question, set status to pending
114
+ 2026-03-06T21:50:06.631Z [task] [86c8ntef5] "validate claude and cursor permissions on init" (status: pending)
115
+ 2026-03-06T21:50:08.595Z [info] Pending task has a human reply — proceeding
116
+ 2026-03-06T21:50:08.596Z [info] Implementing task: validate claude and cursor permissions on init
117
+ 2026-03-06T21:50:13.541Z [info] Running cursor...
118
+ 2026-03-06T21:50:13.541Z [info] Running Cursor Agent...
119
+ 2026-03-06T21:56:08.701Z [error] TypeError: fetch failed
120
+
121
+ ────────────────────────────────────────────────────────────
122
+ 2026-03-06T21:57:49.637Z [run] started
123
+ ────────────────────────────────────────────────────────────
124
+ 2026-03-06T21:57:49.640Z [info] Fetching tasks (filter: all)...
125
+ 2026-03-06T21:57:49.985Z [info] Found 3 tagged task(s)
126
+ 2026-03-06T21:57:49.986Z [task] [86c8ntgm6] "bugfix: fetch failed" (status: open)
127
+ 2026-03-06T21:57:51.779Z [info] Running Cursor Agent...
128
+ 2026-03-06T21:58:52.412Z [info] Implementing task: bugfix: fetch failed
129
+ 2026-03-06T21:58:57.071Z [info] Running cursor...
130
+ 2026-03-06T21:58:57.072Z [info] Running Cursor Agent...
131
+ 2026-03-06T22:01:35.561Z [success] Task implemented: branch 86c8ntgm6/bugfix-fetch-failed pushed
132
+ 2026-03-06T22:01:35.562Z [task] [86c8ntepp] "add support in windsurf as agent" (status: pending)
133
+ 2026-03-06T22:01:37.528Z [info] Pending task has a human reply — proceeding
134
+ 2026-03-06T22:01:37.529Z [info] Implementing task: add support in windsurf as agent
135
+ 2026-03-06T22:01:42.489Z [info] Running cursor...
136
+ 2026-03-06T22:01:42.490Z [info] Running Cursor Agent...
137
+ 2026-03-06T22:04:35.403Z [success] Task implemented: branch 86c8ntepp/add-support-in-windsurf-as-agent pushed
138
+ 2026-03-06T22:04:35.404Z [task] [86c8ntef5] "validate claude and cursor permissions on init" (status: in progress)
139
+ 2026-03-06T22:04:37.127Z [success] Done. Processed: 2, Skipped: 1
@@ -65,11 +65,19 @@ const init_1 = require("../commands/init");
65
65
  });
66
66
  // ─── renderEnv ───────────────────────────────────────────────────────────────
67
67
  const baseAnswers = {
68
+ provider: 'clickup',
68
69
  clickupApiKey: 'pk_abc123',
69
70
  clickupTeamId: 'team_456',
70
71
  clickupTag: 'myproject',
71
72
  clickupPendingStatus: 'pending',
72
73
  clickupInReviewStatus: 'review',
74
+ jiraBaseUrl: '',
75
+ jiraEmail: '',
76
+ jiraApiToken: '',
77
+ jiraProject: '',
78
+ jiraLabel: '',
79
+ jiraPendingStatus: '',
80
+ jiraInReviewStatus: '',
73
81
  assigneeTag: '',
74
82
  gitRemote: 'origin',
75
83
  githubBaseBranch: 'main',
@@ -1 +1 @@
1
- {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/permissions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const strict_1 = __importDefault(require("node:assert/strict"));
41
+ const fs = __importStar(require("node:fs"));
42
+ const os = __importStar(require("node:os"));
43
+ const path = __importStar(require("node:path"));
44
+ const permissions_1 = require("../permissions");
45
+ // ─── permissionCovers ─────────────────────────────────────────────────────
46
+ (0, node_test_1.describe)('permissionCovers', () => {
47
+ (0, node_test_1.it)('exact match returns true', () => {
48
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(git:*)', 'Bash(git:*)'), true);
49
+ });
50
+ (0, node_test_1.it)('broader command covers narrower one', () => {
51
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(npm:*)', 'Bash(npm install:*)'), true);
52
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(npm:*)', 'Bash(npm run:*)'), true);
53
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(npm:*)', 'Bash(npm test:*)'), true);
54
+ });
55
+ (0, node_test_1.it)('narrower command does not cover broader one', () => {
56
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(npm install:*)', 'Bash(npm:*)'), false);
57
+ });
58
+ (0, node_test_1.it)('wildcard * covers everything', () => {
59
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(*)', 'Bash(git:*)'), true);
60
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(*)', 'Bash(npm:*)'), true);
61
+ });
62
+ (0, node_test_1.it)('different tools do not cover each other', () => {
63
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Read', 'Write'), false);
64
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(git:*)', 'Edit'), false);
65
+ });
66
+ (0, node_test_1.it)('different tool types return false', () => {
67
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(git:*)', 'Bash(npm:*)'), false);
68
+ });
69
+ (0, node_test_1.it)('similar prefix without word boundary returns false', () => {
70
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Bash(npm:*)', 'Bash(npx:*)'), false);
71
+ });
72
+ (0, node_test_1.it)('simple tool names match exactly', () => {
73
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Read', 'Read'), true);
74
+ strict_1.default.equal((0, permissions_1.permissionCovers)('Write', 'Write'), true);
75
+ });
76
+ });
77
+ // ─── getMissingPermissions ────────────────────────────────────────────────
78
+ (0, node_test_1.describe)('getMissingPermissions', () => {
79
+ (0, node_test_1.it)('returns all when nothing is allowed', () => {
80
+ const required = ['Bash(git:*)', 'Bash(npm:*)'];
81
+ const missing = (0, permissions_1.getMissingPermissions)(required, []);
82
+ strict_1.default.deepEqual(missing, required);
83
+ });
84
+ (0, node_test_1.it)('returns empty when all are covered', () => {
85
+ const required = ['Bash(git:*)', 'Bash(npm:*)'];
86
+ const missing = (0, permissions_1.getMissingPermissions)(required, ['Bash(git:*)', 'Bash(npm:*)']);
87
+ strict_1.default.deepEqual(missing, []);
88
+ });
89
+ (0, node_test_1.it)('returns only the missing ones', () => {
90
+ const required = ['Bash(git:*)', 'Bash(npm:*)', 'Bash(node:*)'];
91
+ const missing = (0, permissions_1.getMissingPermissions)(required, ['Bash(git:*)', 'Bash(node:*)']);
92
+ strict_1.default.deepEqual(missing, ['Bash(npm:*)']);
93
+ });
94
+ (0, node_test_1.it)('recognises broader existing permissions', () => {
95
+ const required = ['Bash(npm install:*)', 'Bash(npm run:*)'];
96
+ const missing = (0, permissions_1.getMissingPermissions)(required, ['Bash(npm:*)']);
97
+ strict_1.default.deepEqual(missing, []);
98
+ });
99
+ (0, node_test_1.it)('does not accept narrower existing as coverage for broader required', () => {
100
+ const required = ['Bash(npm:*)'];
101
+ const missing = (0, permissions_1.getMissingPermissions)(required, ['Bash(npm install:*)', 'Bash(npm run:*)']);
102
+ strict_1.default.deepEqual(missing, ['Bash(npm:*)']);
103
+ });
104
+ });
105
+ // ─── readClaudeSettings ──────────────────────────────────────────────────
106
+ function withTmpDir(fn) {
107
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'aidev-perm-test-'));
108
+ try {
109
+ fn(dir);
110
+ }
111
+ finally {
112
+ fs.rmSync(dir, { recursive: true, force: true });
113
+ }
114
+ }
115
+ (0, node_test_1.describe)('readClaudeSettings', () => {
116
+ (0, node_test_1.it)('returns empty when no settings files exist', () => {
117
+ withTmpDir((dir) => {
118
+ const settings = (0, permissions_1.readClaudeSettings)(dir);
119
+ strict_1.default.deepEqual(settings, {});
120
+ });
121
+ });
122
+ (0, node_test_1.it)('reads from .claude/settings.local.json', () => {
123
+ withTmpDir((dir) => {
124
+ const claudeDir = path.join(dir, '.claude');
125
+ fs.mkdirSync(claudeDir);
126
+ fs.writeFileSync(path.join(claudeDir, 'settings.local.json'), JSON.stringify({ permissions: { allow: ['Bash(git:*)'] } }), 'utf8');
127
+ const settings = (0, permissions_1.readClaudeSettings)(dir);
128
+ strict_1.default.deepEqual(settings.permissions?.allow, ['Bash(git:*)']);
129
+ });
130
+ });
131
+ (0, node_test_1.it)('merges project and local settings', () => {
132
+ withTmpDir((dir) => {
133
+ const claudeDir = path.join(dir, '.claude');
134
+ fs.mkdirSync(claudeDir);
135
+ fs.writeFileSync(path.join(claudeDir, 'settings.json'), JSON.stringify({ permissions: { allow: ['Bash(git:*)'] } }), 'utf8');
136
+ fs.writeFileSync(path.join(claudeDir, 'settings.local.json'), JSON.stringify({ permissions: { allow: ['Bash(npm:*)'] } }), 'utf8');
137
+ const settings = (0, permissions_1.readClaudeSettings)(dir);
138
+ strict_1.default.deepEqual(settings.permissions?.allow, ['Bash(git:*)', 'Bash(npm:*)']);
139
+ });
140
+ });
141
+ (0, node_test_1.it)('handles malformed JSON gracefully', () => {
142
+ withTmpDir((dir) => {
143
+ const claudeDir = path.join(dir, '.claude');
144
+ fs.mkdirSync(claudeDir);
145
+ fs.writeFileSync(path.join(claudeDir, 'settings.local.json'), '{bad json', 'utf8');
146
+ const settings = (0, permissions_1.readClaudeSettings)(dir);
147
+ strict_1.default.deepEqual(settings, {});
148
+ });
149
+ });
150
+ });
151
+ //# sourceMappingURL=permissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.test.js","sourceRoot":"","sources":["../../src/__tests__/permissions.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/ai/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI/C,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,YAAY;IAEzB,WAAW,IAAI,OAAO;IAIhB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAsBhE"}
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/ai/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI/C,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,YAAY;IAEzB,WAAW,IAAI,OAAO;IAIhB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA4BhE"}
package/dist/ai/cursor.js CHANGED
@@ -9,22 +9,25 @@ class CursorRunner {
9
9
  this.name = 'cursor';
10
10
  }
11
11
  isAvailable() {
12
- return (0, platform_1.commandExists)('cursor');
12
+ return (0, platform_1.commandExists)('agent');
13
13
  }
14
14
  async run(prompt, notes) {
15
15
  const fullPrompt = notes ? `${prompt}\n\nAdditional context:\n${notes}` : prompt;
16
16
  logger_1.logger.info('Running Cursor Agent...');
17
17
  logger_1.logger.debug(`Prompt: ${fullPrompt.slice(0, 200)}...`);
18
- const result = (0, node_child_process_1.spawnSync)('cursor', ['--agent', fullPrompt], {
18
+ const cwd = process.cwd();
19
+ const result = (0, node_child_process_1.spawnSync)('agent', ['--print', '--force', '--trust', '--workspace', cwd, fullPrompt], {
19
20
  encoding: 'utf8',
20
21
  timeout: 10 * 60 * 1000,
21
- cwd: process.cwd(),
22
+ cwd,
22
23
  });
23
24
  const success = result.status === 0;
24
25
  const output = result.stdout || '';
25
26
  const error = result.stderr || '';
26
27
  if (!success) {
27
- logger_1.logger.warn(`Cursor exited with status ${result.status}`);
28
+ logger_1.logger.warn(`Cursor Agent exited with status ${result.status}`);
29
+ if (error)
30
+ logger_1.logger.debug(`stderr: ${error.slice(0, 300)}`);
28
31
  }
29
32
  return { success, output, error };
30
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/ai/cursor.ts"],"names":[],"mappings":";;;AAAA,2DAA+C;AAE/C,sCAAmC;AACnC,0CAA4C;AAE5C,MAAa,YAAY;IAAzB;QACW,SAAI,GAAG,QAAQ,CAAC;IA4B3B,CAAC;IA1BC,WAAW;QACT,OAAO,IAAA,wBAAa,EAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,KAAc;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjF,eAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACvC,eAAM,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;YAC1D,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACvB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AA7BD,oCA6BC"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/ai/cursor.ts"],"names":[],"mappings":";;;AAAA,2DAA+C;AAE/C,sCAAmC;AACnC,0CAA4C;AAE5C,MAAa,YAAY;IAAzB;QACW,SAAI,GAAG,QAAQ,CAAC;IAkC3B,CAAC;IAhCC,WAAW;QACT,OAAO,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,KAAc;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjF,eAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACvC,eAAM,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,OAAO,EACP,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,CAAC,EACjE;YACE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACvB,GAAG;SACJ,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,IAAI,KAAK;gBAAE,eAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AAnCD,oCAmCC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AASlC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAExD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAWlC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAExD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/dist/ai/index.js CHANGED
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createRunners = createRunners;
4
4
  const claude_1 = require("./claude");
5
5
  const cursor_1 = require("./cursor");
6
+ const windsurf_1 = require("./windsurf");
6
7
  const registry = {
7
8
  claude: new claude_1.ClaudeRunner(),
8
9
  cursor: new cursor_1.CursorRunner(),
10
+ windsurf: new windsurf_1.WindsurfRunner(),
9
11
  };
10
12
  function createRunners(config) {
11
13
  return config.agents.map((name) => registry[name]);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":";;AAUA,sCAEC;AAVD,qCAAwC;AACxC,qCAAwC;AAExC,MAAM,QAAQ,GAA6B;IACzC,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,MAAM,EAAE,IAAI,qBAAY,EAAE;CAC3B,CAAC;AAEF,SAAgB,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":";;AAYA,sCAEC;AAZD,qCAAwC;AACxC,qCAAwC;AACxC,yCAA4C;AAE5C,MAAM,QAAQ,GAA6B;IACzC,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,QAAQ,EAAE,IAAI,yBAAc,EAAE;CAC/B,CAAC;AAEF,SAAgB,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { AIRunner, AIRunResult } from './base';
2
+ export declare class WindsurfRunner implements AIRunner {
3
+ readonly name = "windsurf";
4
+ isAvailable(): boolean;
5
+ run(prompt: string, notes?: string): Promise<AIRunResult>;
6
+ }
7
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/ai/windsurf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI/C,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,cAAc;IAE3B,WAAW,IAAI,OAAO;IAIhB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA4BhE"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WindsurfRunner = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const logger_1 = require("../logger");
6
+ const platform_1 = require("../platform");
7
+ class WindsurfRunner {
8
+ constructor() {
9
+ this.name = 'windsurf';
10
+ }
11
+ isAvailable() {
12
+ return (0, platform_1.commandExists)('windsurf');
13
+ }
14
+ async run(prompt, notes) {
15
+ const fullPrompt = notes ? `${prompt}\n\nAdditional context:\n${notes}` : prompt;
16
+ logger_1.logger.info('Running Windsurf...');
17
+ logger_1.logger.debug(`Prompt: ${fullPrompt.slice(0, 200)}...`);
18
+ const cwd = process.cwd();
19
+ const result = (0, node_child_process_1.spawnSync)('windsurf', ['--agent', '--print', '--trust', '--workspace', cwd, fullPrompt], {
20
+ encoding: 'utf8',
21
+ timeout: 10 * 60 * 1000,
22
+ cwd,
23
+ });
24
+ const success = result.status === 0;
25
+ const output = result.stdout || '';
26
+ const error = result.stderr || '';
27
+ if (!success) {
28
+ logger_1.logger.warn(`Windsurf exited with status ${result.status}`);
29
+ if (error)
30
+ logger_1.logger.debug(`stderr: ${error.slice(0, 300)}`);
31
+ }
32
+ return { success, output, error };
33
+ }
34
+ }
35
+ exports.WindsurfRunner = WindsurfRunner;
36
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/ai/windsurf.ts"],"names":[],"mappings":";;;AAAA,2DAA+C;AAE/C,sCAAmC;AACnC,0CAA4C;AAE5C,MAAa,cAAc;IAA3B;QACW,SAAI,GAAG,UAAU,CAAC;IAkC7B,CAAC;IAhCC,WAAW;QACT,OAAO,IAAA,wBAAa,EAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,KAAc;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjF,eAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnC,eAAM,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,UAAU,EACV,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,CAAC,EACjE;YACE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACvB,GAAG;SACJ,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,IAAI,KAAK;gBAAE,eAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AAnCD,wCAmCC"}
package/dist/cli.js CHANGED
@@ -66,9 +66,15 @@ scheduleCmd
66
66
  });
67
67
  scheduleCmd
68
68
  .command('get')
69
- .description('Show current cron schedule for this directory')
69
+ .description('Show all aidev cron schedules as a table')
70
70
  .action(async () => {
71
71
  await (0, schedule_1.scheduleGetCommand)();
72
72
  });
73
+ scheduleCmd
74
+ .command('remove [id]')
75
+ .description('Remove an aidev cron schedule by table ID (interactive if omitted)')
76
+ .action(async (id) => {
77
+ await (0, schedule_1.scheduleRemoveCommand)(id ? parseInt(id, 10) : undefined);
78
+ });
73
79
  program.parse(process.argv);
74
80
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
1
  export declare function ensureGitignore(dir?: string): void;
2
2
  export interface Answers {
3
+ provider: 'clickup' | 'jira';
3
4
  clickupApiKey: string;
4
5
  clickupTeamId: string;
5
6
  clickupTag: string;
6
7
  clickupPendingStatus: string;
7
8
  clickupInReviewStatus: string;
9
+ jiraBaseUrl: string;
10
+ jiraEmail: string;
11
+ jiraApiToken: string;
12
+ jiraProject: string;
13
+ jiraLabel: string;
14
+ jiraPendingStatus: string;
15
+ jiraInReviewStatus: string;
8
16
  assigneeTag: string;
9
17
  gitRemote: string;
10
18
  githubBaseBranch: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAiBA,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,IAAI,CAgBzD;AAQD,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAoHD,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1C;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAsB5C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6FjD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAkBA,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,IAAI,CAgBzD;AAQD,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;IAE7B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAE9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAE3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAoHD,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1C;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAsC5C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAwJjD"}