autodev-cli 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +174 -0
- package/bin/autodev-ping.js +83 -0
- package/bin/autodev-watch.js +138 -0
- package/bin/autodev.js +11 -0
- package/out/cli.js +119 -0
- package/out/cli.js.map +1 -0
- package/out/commands/config.js +124 -0
- package/out/commands/config.js.map +1 -0
- package/out/commands/connect.js +66 -0
- package/out/commands/connect.js.map +1 -0
- package/out/commands/init.js +195 -0
- package/out/commands/init.js.map +1 -0
- package/out/commands/start.js +86 -0
- package/out/commands/start.js.map +1 -0
- package/out/commands/status.js +103 -0
- package/out/commands/status.js.map +1 -0
- package/out/commands/tailOutput.js +102 -0
- package/out/commands/tailOutput.js.map +1 -0
- package/out/commands/up.js +82 -0
- package/out/commands/up.js.map +1 -0
- package/out/connect.js +169 -0
- package/out/connect.js.map +1 -0
- package/out/launchIde.js +218 -0
- package/out/launchIde.js.map +1 -0
- package/out/logger.js +47 -0
- package/out/logger.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.upCommand = upCommand;
|
|
37
|
+
exports.launchCommand = launchCommand;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../logger");
|
|
40
|
+
const init_1 = require("./init");
|
|
41
|
+
const launchIde_1 = require("../launchIde");
|
|
42
|
+
function upCommand(program) {
|
|
43
|
+
program
|
|
44
|
+
.command('up [path]')
|
|
45
|
+
.description('Init the workspace and launch it in an IDE (shortcut for init --ide=…)')
|
|
46
|
+
.requiredOption('--ide <ide>', 'IDE to launch: vscode | cursor')
|
|
47
|
+
.option('-p, --provider <provider>', 'Default AI provider', 'claude-cli')
|
|
48
|
+
.option('--no-extension', 'Skip auto-installing the autoaidev extension')
|
|
49
|
+
.option('--force', 'Overwrite existing files')
|
|
50
|
+
.action((workspacePath, opts) => {
|
|
51
|
+
(0, init_1.runInit)(workspacePath, {
|
|
52
|
+
ide: opts.ide,
|
|
53
|
+
provider: opts.provider,
|
|
54
|
+
force: opts.force,
|
|
55
|
+
extension: opts.extension,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function launchCommand(program) {
|
|
60
|
+
program
|
|
61
|
+
.command('launch [path]')
|
|
62
|
+
.description('Open an existing workspace in an IDE (no init)')
|
|
63
|
+
.requiredOption('--ide <ide>', 'IDE to launch: vscode | cursor')
|
|
64
|
+
.option('--no-extension', 'Skip auto-installing the autoaidev extension')
|
|
65
|
+
.action((workspacePath, opts) => {
|
|
66
|
+
const cwd = workspacePath ? path.resolve(workspacePath) : process.cwd();
|
|
67
|
+
if (!(0, launchIde_1.isIdeId)(opts.ide)) {
|
|
68
|
+
logger_1.log.error(`Unknown --ide value "${opts.ide}". Valid: vscode | cursor`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const ide = opts.ide;
|
|
72
|
+
if (opts.extension !== false && !(0, launchIde_1.isAutodevExtensionInstalled)(ide)) {
|
|
73
|
+
const vsix = (0, launchIde_1.findBundledVsix)();
|
|
74
|
+
(0, launchIde_1.installAutodevExtension)(ide, vsix ?? undefined);
|
|
75
|
+
}
|
|
76
|
+
const ok = (0, launchIde_1.launchIde)(ide, cwd);
|
|
77
|
+
if (!ok) {
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,8BAgBC;AAOD,sCAqBC;AAjED,2CAA6B;AAE7B,sCAAgC;AAChC,iCAAiC;AACjC,4CAOsB;AAUtB,SAAgB,SAAS,CAAC,OAAgB;IACxC,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,wEAAwE,CAAC;SACrF,cAAc,CAAC,aAAa,EAAE,gCAAgC,CAAC;SAC/D,MAAM,CAAC,2BAA2B,EAAE,qBAAqB,EAAE,YAAY,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;SACxE,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;SAC7C,MAAM,CAAC,CAAC,aAAiC,EAAE,IAAY,EAAE,EAAE;QAC1D,IAAA,cAAO,EAAC,aAAa,EAAE;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAOD,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,aAAa,EAAE,gCAAgC,CAAC;SAC/D,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;SACxE,MAAM,CAAC,CAAC,aAAiC,EAAE,IAAgB,EAAE,EAAE;QAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACxE,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,YAAG,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,GAAG,2BAA2B,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,GAAU,IAAI,CAAC,GAAG,CAAC;QAE5B,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,IAAA,uCAA2B,EAAC,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,GAAG,IAAA,2BAAe,GAAE,CAAC;YAC/B,IAAA,mCAAuB,EAAC,GAAG,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,EAAE,GAAG,IAAA,qBAAS,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/out/connect.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.applyWsUrl = applyWsUrl;
|
|
37
|
+
exports.applySetupUrl = applySetupUrl;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const http = __importStar(require("http"));
|
|
41
|
+
const https = __importStar(require("https"));
|
|
42
|
+
const url_1 = require("url");
|
|
43
|
+
const logger_1 = require("./logger");
|
|
44
|
+
const settings_1 = require("autoaidev/settings");
|
|
45
|
+
const hooks_1 = require("autoaidev/hooks");
|
|
46
|
+
function configWritePath(cwd) {
|
|
47
|
+
return path.join(cwd, '.autodev', 'settings.json');
|
|
48
|
+
}
|
|
49
|
+
function saveSettings(cwd, settings) {
|
|
50
|
+
const file = configWritePath(cwd);
|
|
51
|
+
const dir = path.dirname(file);
|
|
52
|
+
if (!fs.existsSync(dir)) {
|
|
53
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
fs.writeFileSync(file, JSON.stringify(settings, null, 2) + '\n', 'utf8');
|
|
56
|
+
}
|
|
57
|
+
function loadOrDefault(cwd) {
|
|
58
|
+
return { ...settings_1.SETTINGS_DEFAULTS, ...(0, settings_1.loadSettingsForRoot)(cwd) };
|
|
59
|
+
}
|
|
60
|
+
/** Fetch JSON from a URL using the built-in http/https module (no deps). */
|
|
61
|
+
function fetchJson(url, timeoutMs = 15_000) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = new url_1.URL(url);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
reject(new Error(`Invalid URL: ${url}`));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const lib = parsed.protocol === 'http:' ? http : https;
|
|
72
|
+
const req = lib.request(url, {
|
|
73
|
+
method: 'GET',
|
|
74
|
+
headers: { 'Accept': 'application/json', 'User-Agent': 'autodev-cli' },
|
|
75
|
+
}, (res) => {
|
|
76
|
+
const chunks = [];
|
|
77
|
+
res.on('data', (c) => chunks.push(c));
|
|
78
|
+
res.on('end', () => {
|
|
79
|
+
const body = Buffer.concat(chunks).toString('utf8');
|
|
80
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
81
|
+
try {
|
|
82
|
+
resolve(JSON.parse(body));
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
reject(new Error(`Invalid JSON from ${url}: ${e.message}`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
reject(new Error(`HTTP ${res.statusCode} from ${url}: ${body.slice(0, 300)}`));
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
req.setTimeout(timeoutMs, () => { req.destroy(new Error(`Timed out after ${timeoutMs}ms fetching ${url}`)); });
|
|
94
|
+
req.on('error', reject);
|
|
95
|
+
req.end();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Save a full WS URL (with token+endpoint query params) into the workspace settings. */
|
|
99
|
+
function applyWsUrl(cwd, wsUrl) {
|
|
100
|
+
const parsed = (0, settings_1.parseWsUrl)(wsUrl);
|
|
101
|
+
if (!parsed) {
|
|
102
|
+
throw new Error(`--connect URL must be a ws:// or wss:// URL with token & endpoint params, got: ${wsUrl}`);
|
|
103
|
+
}
|
|
104
|
+
const settings = loadOrDefault(cwd);
|
|
105
|
+
settings.wsUrl = wsUrl;
|
|
106
|
+
settings.serverBaseUrl = parsed.serverBaseUrl;
|
|
107
|
+
settings.serverApiKey = parsed.serverApiKey;
|
|
108
|
+
settings.webhookSlug = parsed.webhookSlug;
|
|
109
|
+
// Connecting to pixel-office implies we want hook events flowing back AND
|
|
110
|
+
// the agent to auto-start when the IDE opens this workspace.
|
|
111
|
+
settings.hooksEnabled = true;
|
|
112
|
+
settings.autoStartLoop = true;
|
|
113
|
+
saveSettings(cwd, settings);
|
|
114
|
+
ensureHooksInstalled(cwd);
|
|
115
|
+
logger_1.log.success(`Connected → ${parsed.serverBaseUrl}`);
|
|
116
|
+
logger_1.log.gray(` endpoint: ${parsed.webhookSlug}`);
|
|
117
|
+
logger_1.log.gray(` saved to: ${configWritePath(cwd)}`);
|
|
118
|
+
}
|
|
119
|
+
function ensureHooksInstalled(cwd) {
|
|
120
|
+
try {
|
|
121
|
+
if (!(0, hooks_1.areHooksInstalled)('project', cwd)) {
|
|
122
|
+
(0, hooks_1.installHooks)('project', cwd);
|
|
123
|
+
logger_1.log.gray(' hooks installed (Claude + Copilot)');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logger_1.log.warn(` hooks install skipped: ${err.message}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Fetch credentials from a signed setup URL and apply them to the workspace. */
|
|
131
|
+
async function applySetupUrl(cwd, setupUrl) {
|
|
132
|
+
logger_1.log.info(`Fetching credentials from ${setupUrl}…`);
|
|
133
|
+
const json = await fetchJson(setupUrl);
|
|
134
|
+
if (!json.success || !json.data) {
|
|
135
|
+
throw new Error(json.error ?? 'Setup endpoint returned an error');
|
|
136
|
+
}
|
|
137
|
+
const d = json.data;
|
|
138
|
+
if (!d.wsUrl) {
|
|
139
|
+
throw new Error('Setup response did not include a wsUrl');
|
|
140
|
+
}
|
|
141
|
+
const settings = loadOrDefault(cwd);
|
|
142
|
+
settings.wsUrl = d.wsUrl;
|
|
143
|
+
if (d.apiKey) {
|
|
144
|
+
settings.serverApiKey = d.apiKey;
|
|
145
|
+
}
|
|
146
|
+
if (d.slug) {
|
|
147
|
+
settings.webhookSlug = d.slug;
|
|
148
|
+
}
|
|
149
|
+
if (d.serverBaseUrl) {
|
|
150
|
+
settings.serverBaseUrl = d.serverBaseUrl;
|
|
151
|
+
}
|
|
152
|
+
// Override the parsed values from the wsUrl (in case the server reports a
|
|
153
|
+
// different externally-visible base URL than the WS URL host).
|
|
154
|
+
const parsed = (0, settings_1.parseWsUrl)(d.wsUrl);
|
|
155
|
+
if (parsed && !d.serverBaseUrl) {
|
|
156
|
+
settings.serverBaseUrl = parsed.serverBaseUrl;
|
|
157
|
+
}
|
|
158
|
+
// Binding to pixel-office implies we want hook events flowing back AND
|
|
159
|
+
// the agent to auto-start when the IDE opens this workspace.
|
|
160
|
+
settings.hooksEnabled = true;
|
|
161
|
+
settings.autoStartLoop = true;
|
|
162
|
+
saveSettings(cwd, settings);
|
|
163
|
+
ensureHooksInstalled(cwd);
|
|
164
|
+
logger_1.log.success(`Connected → ${settings.serverBaseUrl}`);
|
|
165
|
+
logger_1.log.gray(` agent: ${d.agentName ?? d.agentId ?? d.slug}`);
|
|
166
|
+
logger_1.log.gray(` endpoint: ${d.slug ?? settings.webhookSlug}`);
|
|
167
|
+
logger_1.log.gray(` saved to: ${configWritePath(cwd)}`);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
|
package/out/launchIde.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isIdeId = isIdeId;
|
|
37
|
+
exports.resolveIdeExecutable = resolveIdeExecutable;
|
|
38
|
+
exports.launchIde = launchIde;
|
|
39
|
+
exports.isAutodevExtensionInstalled = isAutodevExtensionInstalled;
|
|
40
|
+
exports.installAutodevExtension = installAutodevExtension;
|
|
41
|
+
exports.findBundledVsix = findBundledVsix;
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const logger_1 = require("./logger");
|
|
46
|
+
const IDE_INFO = {
|
|
47
|
+
vscode: {
|
|
48
|
+
label: 'VS Code',
|
|
49
|
+
cmd: 'code',
|
|
50
|
+
altCmds: ['code-insiders'],
|
|
51
|
+
extensionId: 'AutoAIDev.autoaidev',
|
|
52
|
+
},
|
|
53
|
+
cursor: {
|
|
54
|
+
label: 'Cursor',
|
|
55
|
+
cmd: 'cursor',
|
|
56
|
+
altCmds: [],
|
|
57
|
+
extensionId: 'AutoAIDev.autoaidev',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
function isIdeId(value) {
|
|
61
|
+
return value === 'vscode' || value === 'cursor';
|
|
62
|
+
}
|
|
63
|
+
/** Resolve an IDE launcher executable (the shim, e.g. `code.cmd` on Windows). */
|
|
64
|
+
function resolveIdeExecutable(ide) {
|
|
65
|
+
const info = IDE_INFO[ide];
|
|
66
|
+
for (const candidate of [info.cmd, ...info.altCmds]) {
|
|
67
|
+
const found = whichSync(candidate);
|
|
68
|
+
if (found) {
|
|
69
|
+
return found;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function whichSync(cmd) {
|
|
75
|
+
const isWin = process.platform === 'win32';
|
|
76
|
+
// Prefer .CMD/.BAT over .EXE on Windows: VS Code and Cursor ship a GUI
|
|
77
|
+
// launcher (Code.exe / Cursor.exe) that doesn't accept the --new-window
|
|
78
|
+
// CLI flag, plus a `bin/code.cmd` shim that does. We want the shim.
|
|
79
|
+
const exts = isWin
|
|
80
|
+
? ['.CMD', '.BAT', '.EXE', '.COM']
|
|
81
|
+
: [''];
|
|
82
|
+
const sep = isWin ? ';' : ':';
|
|
83
|
+
const dirs = (process.env.PATH ?? '').split(sep).filter(Boolean);
|
|
84
|
+
for (const ext of exts) {
|
|
85
|
+
for (const dir of dirs) {
|
|
86
|
+
const full = path.join(dir, cmd + ext);
|
|
87
|
+
try {
|
|
88
|
+
if (fs.existsSync(full)) {
|
|
89
|
+
return full;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch { /* ignore */ }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/** Open the workspace folder in the chosen IDE. Detached so the CLI can exit. */
|
|
98
|
+
function launchIde(ide, cwd, opts = {}) {
|
|
99
|
+
const info = IDE_INFO[ide];
|
|
100
|
+
const exe = resolveIdeExecutable(ide);
|
|
101
|
+
if (!exe) {
|
|
102
|
+
logger_1.log.error(`Could not find "${info.cmd}" on PATH. Install ${info.label} and ensure the shell command is registered.`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// VS Code / Cursor focus the existing window if the folder is already open.
|
|
106
|
+
// --new-window forces a fresh window so the user always sees the launch.
|
|
107
|
+
const args = opts.newWindow !== false ? ['--new-window', cwd] : [cwd];
|
|
108
|
+
try {
|
|
109
|
+
const isWin = process.platform === 'win32';
|
|
110
|
+
const winCmd = isWin ? buildWinCmd(exe, args) : '';
|
|
111
|
+
if (process.env.AUTODEV_DEBUG) {
|
|
112
|
+
logger_1.log.gray(`exe: ${exe}`);
|
|
113
|
+
logger_1.log.gray(`cmd: ${winCmd || (exe + ' ' + args.join(' '))}`);
|
|
114
|
+
}
|
|
115
|
+
const child = isWin
|
|
116
|
+
? (0, child_process_1.spawn)('cmd.exe', ['/d', '/s', '/c', winCmd], {
|
|
117
|
+
cwd, detached: true, stdio: 'ignore', windowsVerbatimArguments: true,
|
|
118
|
+
})
|
|
119
|
+
: (0, child_process_1.spawn)(exe, args, { cwd, detached: true, stdio: 'ignore' });
|
|
120
|
+
child.unref();
|
|
121
|
+
logger_1.log.success(`Launched ${info.label} → ${cwd}`);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
logger_1.log.error(`Failed to launch ${info.label}: ${err.message}`);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// `cmd /s /c "<command>"` strips the outer quote pair before parsing, so we
|
|
130
|
+
// wrap our already-quoted command in an EXTRA pair: `cmd /s /c ""path with
|
|
131
|
+
// spaces" arg1"`. After stripping, cmd sees `"path with spaces" arg1` which
|
|
132
|
+
// parses correctly. Without the extra wrap, cmd splits `D:\Program Files\…`
|
|
133
|
+
// at the space and tries to run `D:\Program`.
|
|
134
|
+
function buildWinCmd(exe, args) {
|
|
135
|
+
const inner = [`"${exe}"`, ...args.map(a => `"${a}"`)].join(' ');
|
|
136
|
+
return `"${inner}"`;
|
|
137
|
+
}
|
|
138
|
+
function spawnIdeCliPiped(exe, args) {
|
|
139
|
+
if (process.platform === 'win32') {
|
|
140
|
+
const r = (0, child_process_1.spawnSync)('cmd.exe', ['/d', '/s', '/c', buildWinCmd(exe, args)], {
|
|
141
|
+
encoding: 'utf8',
|
|
142
|
+
windowsVerbatimArguments: true,
|
|
143
|
+
});
|
|
144
|
+
return { status: r.status, stdout: typeof r.stdout === 'string' ? r.stdout : '' };
|
|
145
|
+
}
|
|
146
|
+
const r = (0, child_process_1.spawnSync)(exe, args, { encoding: 'utf8' });
|
|
147
|
+
return { status: r.status, stdout: typeof r.stdout === 'string' ? r.stdout : '' };
|
|
148
|
+
}
|
|
149
|
+
function spawnIdeCliInherit(exe, args) {
|
|
150
|
+
if (process.platform === 'win32') {
|
|
151
|
+
const r = (0, child_process_1.spawnSync)('cmd.exe', ['/d', '/s', '/c', buildWinCmd(exe, args)], {
|
|
152
|
+
stdio: 'inherit',
|
|
153
|
+
windowsVerbatimArguments: true,
|
|
154
|
+
});
|
|
155
|
+
return { status: r.status };
|
|
156
|
+
}
|
|
157
|
+
const r = (0, child_process_1.spawnSync)(exe, args, { stdio: 'inherit' });
|
|
158
|
+
return { status: r.status };
|
|
159
|
+
}
|
|
160
|
+
/** Returns true if the autoaidev extension is already installed in the IDE. */
|
|
161
|
+
function isAutodevExtensionInstalled(ide) {
|
|
162
|
+
const exe = resolveIdeExecutable(ide);
|
|
163
|
+
if (!exe) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const info = IDE_INFO[ide];
|
|
167
|
+
try {
|
|
168
|
+
const r = spawnIdeCliPiped(exe, ['--list-extensions']);
|
|
169
|
+
if (r.status !== 0) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const ids = r.stdout.split(/\r?\n/).map(s => s.trim().toLowerCase());
|
|
173
|
+
return ids.includes(info.extensionId.toLowerCase());
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Install the autoaidev extension into the IDE. Accepts a marketplace id or a .vsix path. */
|
|
180
|
+
function installAutodevExtension(ide, source) {
|
|
181
|
+
const exe = resolveIdeExecutable(ide);
|
|
182
|
+
if (!exe) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
const info = IDE_INFO[ide];
|
|
186
|
+
const target = source ?? info.extensionId;
|
|
187
|
+
logger_1.log.info(`Installing ${info.extensionId} into ${info.label}…`);
|
|
188
|
+
try {
|
|
189
|
+
const r = spawnIdeCliInherit(exe, ['--install-extension', target, '--force']);
|
|
190
|
+
if (r.status === 0) {
|
|
191
|
+
logger_1.log.success(`Installed ${info.extensionId} into ${info.label}`);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
logger_1.log.warn(`${info.label} returned exit ${r.status} while installing the extension.`);
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
logger_1.log.error(`Extension install failed: ${err.message}`);
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Look for a sibling autoaidev VSIX next to the CLI install (for local/dev installs). */
|
|
203
|
+
function findBundledVsix() {
|
|
204
|
+
const candidates = [
|
|
205
|
+
path.resolve(__dirname, '..', 'autoaidev.vsix'),
|
|
206
|
+
path.resolve(__dirname, '..', '..', 'autodev-vscode-extension', 'autoaidev.vsix'),
|
|
207
|
+
];
|
|
208
|
+
for (const c of candidates) {
|
|
209
|
+
try {
|
|
210
|
+
if (fs.existsSync(c)) {
|
|
211
|
+
return c;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch { /* ignore */ }
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=launchIde.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchIde.js","sourceRoot":"","sources":["../src/launchIde.ts"],"names":[],"mappings":"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"}
|
package/out/logger.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ANSI color logger — no external dependencies
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.log = void 0;
|
|
5
|
+
const R = '\x1b[0m';
|
|
6
|
+
const B = '\x1b[1m';
|
|
7
|
+
const GR = '\x1b[32m'; // green
|
|
8
|
+
const YE = '\x1b[33m'; // yellow
|
|
9
|
+
const CY = '\x1b[36m'; // cyan
|
|
10
|
+
const RE = '\x1b[31m'; // red
|
|
11
|
+
const GY = '\x1b[90m'; // gray
|
|
12
|
+
const MA = '\x1b[35m'; // magenta
|
|
13
|
+
function ts() {
|
|
14
|
+
return `${GY}[${new Date().toLocaleTimeString()}]${R}`;
|
|
15
|
+
}
|
|
16
|
+
exports.log = {
|
|
17
|
+
info: (msg) => console.log(`${ts()} ${CY}${msg}${R}`),
|
|
18
|
+
success: (msg) => console.log(`${ts()} ${GR}${msg}${R}`),
|
|
19
|
+
warn: (msg) => console.log(`${ts()} ${YE}${msg}${R}`),
|
|
20
|
+
error: (msg) => console.error(`${ts()} ${RE}${B}${msg}${R}`),
|
|
21
|
+
task: (msg) => console.log(`${ts()} ${B}${GR}${msg}${R}`),
|
|
22
|
+
plain: (msg) => console.log(`${ts()} ${msg}`),
|
|
23
|
+
gray: (msg) => console.log(`${ts()} ${GY}${msg}${R}`),
|
|
24
|
+
section: (msg) => console.log(`\n${B}${MA}${msg}${R}\n`),
|
|
25
|
+
/** Routes based on message prefix (matches what taskLoop emits). */
|
|
26
|
+
auto: (msg) => {
|
|
27
|
+
if (msg.startsWith('▶')) {
|
|
28
|
+
exports.log.task(msg);
|
|
29
|
+
}
|
|
30
|
+
else if (msg.match(/✓|✅/)) {
|
|
31
|
+
exports.log.success(msg);
|
|
32
|
+
}
|
|
33
|
+
else if (msg.match(/⚠|⏳/)) {
|
|
34
|
+
exports.log.warn(msg);
|
|
35
|
+
}
|
|
36
|
+
else if (msg.match(/✗|❌|🚫/)) {
|
|
37
|
+
exports.log.error(msg);
|
|
38
|
+
}
|
|
39
|
+
else if (msg.match(/^\[/)) {
|
|
40
|
+
exports.log.gray(msg);
|
|
41
|
+
} // debug-style [tag]
|
|
42
|
+
else {
|
|
43
|
+
exports.log.plain(msg);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "autodev-cli",
|
|
3
|
+
"version": "1.4.0",
|
|
4
|
+
"description": "AutoAIDev CLI — autonomous AI task loop with VS Code / Cursor launcher",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"autodev": "./bin/autodev.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./out/cli.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"out",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"ai",
|
|
18
|
+
"claude",
|
|
19
|
+
"copilot",
|
|
20
|
+
"opencode",
|
|
21
|
+
"autonomous",
|
|
22
|
+
"agent",
|
|
23
|
+
"cli",
|
|
24
|
+
"vscode",
|
|
25
|
+
"cursor"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p ./",
|
|
29
|
+
"dev": "tsc -p ./ --watch",
|
|
30
|
+
"prepublishOnly": "npm run build",
|
|
31
|
+
"start": "node bin/autodev.js"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"autoaidev": "^1.0.58",
|
|
35
|
+
"commander": "^12.1.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^20.0.0",
|
|
39
|
+
"typescript": "^5.4.0"
|
|
40
|
+
}
|
|
41
|
+
}
|