amai 0.0.8 → 0.0.9
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/dist/cli.cjs +133 -79
- package/dist/cli.js +131 -77
- package/dist/lib/daemon-entry.cjs +110 -56
- package/dist/lib/daemon-entry.js +108 -54
- package/dist/server.cjs +3 -0
- package/dist/server.js +3 -0
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ var WebSocket = require('ws');
|
|
|
5
5
|
var zod = require('zod');
|
|
6
6
|
var fs5 = require('fs/promises');
|
|
7
7
|
var path10 = require('path');
|
|
8
|
-
var
|
|
8
|
+
var fs6 = require('fs');
|
|
9
9
|
var os3 = require('os');
|
|
10
10
|
var child_process = require('child_process');
|
|
11
11
|
var util = require('util');
|
|
@@ -19,7 +19,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
19
19
|
var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
|
|
20
20
|
var fs5__default = /*#__PURE__*/_interopDefault(fs5);
|
|
21
21
|
var path10__default = /*#__PURE__*/_interopDefault(path10);
|
|
22
|
-
var
|
|
22
|
+
var fs6__default = /*#__PURE__*/_interopDefault(fs6);
|
|
23
23
|
var os3__default = /*#__PURE__*/_interopDefault(os3);
|
|
24
24
|
var pc2__default = /*#__PURE__*/_interopDefault(pc2);
|
|
25
25
|
|
|
@@ -37,14 +37,14 @@ var ProjectRegistry = class {
|
|
|
37
37
|
}
|
|
38
38
|
load() {
|
|
39
39
|
try {
|
|
40
|
-
if (
|
|
41
|
-
const data =
|
|
40
|
+
if (fs6__default.default.existsSync(REGISTRY_FILE)) {
|
|
41
|
+
const data = fs6__default.default.readFileSync(REGISTRY_FILE, "utf8");
|
|
42
42
|
const parsed = JSON.parse(data);
|
|
43
43
|
if (!Array.isArray(parsed)) {
|
|
44
44
|
console.error("Invalid project registry format: expected array, got", typeof parsed);
|
|
45
45
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
fs6__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
47
|
+
fs6__default.default.unlinkSync(REGISTRY_FILE);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
const projects = parsed;
|
|
@@ -57,11 +57,11 @@ var ProjectRegistry = class {
|
|
|
57
57
|
}
|
|
58
58
|
} catch (error) {
|
|
59
59
|
console.error("Failed to load project registry:", error);
|
|
60
|
-
if (
|
|
60
|
+
if (fs6__default.default.existsSync(REGISTRY_FILE)) {
|
|
61
61
|
try {
|
|
62
62
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
fs6__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
64
|
+
fs6__default.default.unlinkSync(REGISTRY_FILE);
|
|
65
65
|
console.log("Corrupted registry file backed up and removed. Starting fresh.");
|
|
66
66
|
} catch (backupError) {
|
|
67
67
|
}
|
|
@@ -70,11 +70,11 @@ var ProjectRegistry = class {
|
|
|
70
70
|
}
|
|
71
71
|
save() {
|
|
72
72
|
try {
|
|
73
|
-
if (!
|
|
74
|
-
|
|
73
|
+
if (!fs6__default.default.existsSync(AMA_DIR)) {
|
|
74
|
+
fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
75
75
|
}
|
|
76
76
|
const projects = Array.from(this.projects.values());
|
|
77
|
-
|
|
77
|
+
fs6__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
|
|
78
78
|
} catch (error) {
|
|
79
79
|
console.error("Failed to save project registry:", error);
|
|
80
80
|
}
|
|
@@ -742,20 +742,20 @@ var editFiles = async function(input, projectCwd) {
|
|
|
742
742
|
let existingContent = "";
|
|
743
743
|
if (isNewFile === void 0) {
|
|
744
744
|
try {
|
|
745
|
-
existingContent = await
|
|
745
|
+
existingContent = await fs6__default.default.promises.readFile(filePath, "utf-8");
|
|
746
746
|
isNewFile = false;
|
|
747
747
|
} catch (error) {
|
|
748
748
|
isNewFile = true;
|
|
749
749
|
}
|
|
750
750
|
} else if (!isNewFile) {
|
|
751
751
|
try {
|
|
752
|
-
existingContent = await
|
|
752
|
+
existingContent = await fs6__default.default.promises.readFile(filePath, "utf-8");
|
|
753
753
|
} catch (error) {
|
|
754
754
|
isNewFile = true;
|
|
755
755
|
}
|
|
756
756
|
}
|
|
757
757
|
try {
|
|
758
|
-
await
|
|
758
|
+
await fs6__default.default.promises.writeFile(filePath, content);
|
|
759
759
|
} catch (writeError) {
|
|
760
760
|
throw writeError;
|
|
761
761
|
}
|
|
@@ -1134,24 +1134,27 @@ var list = async function(input, projectCwd) {
|
|
|
1134
1134
|
var startHttpServer = () => {
|
|
1135
1135
|
const app = new hono.Hono();
|
|
1136
1136
|
app.use(cors.cors());
|
|
1137
|
+
app.get("/", (c) => {
|
|
1138
|
+
return c.text("Hello World");
|
|
1139
|
+
});
|
|
1137
1140
|
nodeServer.serve({ fetch: app.fetch, port: 3456 });
|
|
1138
1141
|
};
|
|
1139
1142
|
var CREDENTIALS_DIR = path10__default.default.join(os3__default.default.homedir(), ".amai");
|
|
1140
1143
|
var CREDENTIALS_PATH = path10__default.default.join(CREDENTIALS_DIR, "credentials.json");
|
|
1141
1144
|
function getTokens() {
|
|
1142
|
-
if (!
|
|
1145
|
+
if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1143
1146
|
return null;
|
|
1144
1147
|
}
|
|
1145
|
-
const raw =
|
|
1148
|
+
const raw = fs6__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1146
1149
|
const data = JSON.parse(raw);
|
|
1147
1150
|
return data;
|
|
1148
1151
|
}
|
|
1149
1152
|
var getUserId = () => {
|
|
1150
1153
|
try {
|
|
1151
|
-
if (!
|
|
1154
|
+
if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1152
1155
|
return;
|
|
1153
1156
|
}
|
|
1154
|
-
const raw =
|
|
1157
|
+
const raw = fs6__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1155
1158
|
const data = JSON.parse(raw);
|
|
1156
1159
|
return {
|
|
1157
1160
|
userId: data.user.id
|
|
@@ -1298,7 +1301,7 @@ var runTerminalCommand = async (input, projectCwd) => {
|
|
|
1298
1301
|
};
|
|
1299
1302
|
var ignoreFiles = ["node_modules", ".git", ".next", ".env", ".env.local", ".env.development.local", ".env.test.local", ".env.production.local"];
|
|
1300
1303
|
var getContext = (dir, base = dir, allFiles = []) => {
|
|
1301
|
-
const filePath =
|
|
1304
|
+
const filePath = fs6.readdirSync(dir, { withFileTypes: true });
|
|
1302
1305
|
for (const file of filePath) {
|
|
1303
1306
|
if (ignoreFiles.includes(file.name)) continue;
|
|
1304
1307
|
const fullPath = path10__default.default.join(dir, file.name);
|
|
@@ -1330,16 +1333,16 @@ function getWorkspaceStoragePath(ide) {
|
|
|
1330
1333
|
function scanWorkspaceStorage(ide) {
|
|
1331
1334
|
const projects = [];
|
|
1332
1335
|
const storagePath = getWorkspaceStoragePath();
|
|
1333
|
-
if (!
|
|
1336
|
+
if (!fs6__default.default.existsSync(storagePath)) {
|
|
1334
1337
|
return projects;
|
|
1335
1338
|
}
|
|
1336
1339
|
try {
|
|
1337
|
-
const workspaces =
|
|
1340
|
+
const workspaces = fs6__default.default.readdirSync(storagePath);
|
|
1338
1341
|
for (const workspace of workspaces) {
|
|
1339
1342
|
const workspaceJsonPath = path10__default.default.join(storagePath, workspace, "workspace.json");
|
|
1340
|
-
if (
|
|
1343
|
+
if (fs6__default.default.existsSync(workspaceJsonPath)) {
|
|
1341
1344
|
try {
|
|
1342
|
-
const content =
|
|
1345
|
+
const content = fs6__default.default.readFileSync(workspaceJsonPath, "utf-8");
|
|
1343
1346
|
const data = JSON.parse(content);
|
|
1344
1347
|
if (data.folder && typeof data.folder === "string") {
|
|
1345
1348
|
let projectPath = data.folder;
|
|
@@ -1347,7 +1350,7 @@ function scanWorkspaceStorage(ide) {
|
|
|
1347
1350
|
projectPath = projectPath.replace("file://", "");
|
|
1348
1351
|
projectPath = decodeURIComponent(projectPath);
|
|
1349
1352
|
}
|
|
1350
|
-
if (
|
|
1353
|
+
if (fs6__default.default.existsSync(projectPath) && fs6__default.default.statSync(projectPath).isDirectory()) {
|
|
1351
1354
|
projects.push({
|
|
1352
1355
|
name: path10__default.default.basename(projectPath),
|
|
1353
1356
|
path: projectPath,
|
|
@@ -1371,11 +1374,11 @@ var scanIdeProjects = async () => {
|
|
|
1371
1374
|
const seenPaths = /* @__PURE__ */ new Set();
|
|
1372
1375
|
const addProject = (projectPath, ide) => {
|
|
1373
1376
|
try {
|
|
1374
|
-
const resolvedPath =
|
|
1375
|
-
if (
|
|
1377
|
+
const resolvedPath = fs6__default.default.realpathSync(projectPath);
|
|
1378
|
+
if (fs6__default.default.existsSync(resolvedPath) && fs6__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
|
|
1376
1379
|
const isIdeProjectsDir = Object.values(IDE_PROJECTS_PATHS).some((ideDir) => {
|
|
1377
1380
|
try {
|
|
1378
|
-
return
|
|
1381
|
+
return fs6__default.default.realpathSync(ideDir) === resolvedPath;
|
|
1379
1382
|
} catch {
|
|
1380
1383
|
return false;
|
|
1381
1384
|
}
|
|
@@ -1398,30 +1401,30 @@ var scanIdeProjects = async () => {
|
|
|
1398
1401
|
}
|
|
1399
1402
|
for (const [ide, dirPath] of Object.entries(IDE_PROJECTS_PATHS)) {
|
|
1400
1403
|
if (ide === "cursor") continue;
|
|
1401
|
-
if (
|
|
1402
|
-
const projects =
|
|
1404
|
+
if (fs6__default.default.existsSync(dirPath)) {
|
|
1405
|
+
const projects = fs6__default.default.readdirSync(dirPath);
|
|
1403
1406
|
projects.forEach((project) => {
|
|
1404
1407
|
const projectPath = path10__default.default.join(dirPath, project);
|
|
1405
1408
|
try {
|
|
1406
|
-
const stats =
|
|
1409
|
+
const stats = fs6__default.default.lstatSync(projectPath);
|
|
1407
1410
|
let actualPath = null;
|
|
1408
1411
|
if (stats.isSymbolicLink()) {
|
|
1409
|
-
actualPath =
|
|
1412
|
+
actualPath = fs6__default.default.realpathSync(projectPath);
|
|
1410
1413
|
} else if (stats.isFile()) {
|
|
1411
1414
|
try {
|
|
1412
|
-
let content =
|
|
1415
|
+
let content = fs6__default.default.readFileSync(projectPath, "utf-8").trim();
|
|
1413
1416
|
if (content.startsWith("~/") || content === "~") {
|
|
1414
1417
|
content = content.replace(/^~/, HOME);
|
|
1415
1418
|
}
|
|
1416
1419
|
const resolvedContent = path10__default.default.isAbsolute(content) ? content : path10__default.default.resolve(path10__default.default.dirname(projectPath), content);
|
|
1417
|
-
if (
|
|
1418
|
-
actualPath =
|
|
1420
|
+
if (fs6__default.default.existsSync(resolvedContent) && fs6__default.default.statSync(resolvedContent).isDirectory()) {
|
|
1421
|
+
actualPath = fs6__default.default.realpathSync(resolvedContent);
|
|
1419
1422
|
}
|
|
1420
1423
|
} catch {
|
|
1421
1424
|
return;
|
|
1422
1425
|
}
|
|
1423
1426
|
} else if (stats.isDirectory()) {
|
|
1424
|
-
actualPath =
|
|
1427
|
+
actualPath = fs6__default.default.realpathSync(projectPath);
|
|
1425
1428
|
}
|
|
1426
1429
|
if (actualPath) {
|
|
1427
1430
|
addProject(actualPath, ide);
|
|
@@ -2060,20 +2063,20 @@ function getCodeServerBin() {
|
|
|
2060
2063
|
}
|
|
2061
2064
|
function isCodeServerInstalled() {
|
|
2062
2065
|
const binPath = getCodeServerBin();
|
|
2063
|
-
return
|
|
2066
|
+
return fs6__default.default.existsSync(binPath);
|
|
2064
2067
|
}
|
|
2065
2068
|
async function installCodeServer() {
|
|
2066
2069
|
const { ext } = getPlatformInfo();
|
|
2067
2070
|
const downloadUrl = getDownloadUrl();
|
|
2068
2071
|
const tarballPath = path10__default.default.join(AMA_DIR, `code-server.${ext}`);
|
|
2069
|
-
if (!
|
|
2070
|
-
|
|
2072
|
+
if (!fs6__default.default.existsSync(AMA_DIR)) {
|
|
2073
|
+
fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
2071
2074
|
}
|
|
2072
|
-
if (!
|
|
2073
|
-
|
|
2075
|
+
if (!fs6__default.default.existsSync(CODE_DIR)) {
|
|
2076
|
+
fs6__default.default.mkdirSync(CODE_DIR, { recursive: true });
|
|
2074
2077
|
}
|
|
2075
|
-
if (!
|
|
2076
|
-
|
|
2078
|
+
if (!fs6__default.default.existsSync(STORAGE_DIR)) {
|
|
2079
|
+
fs6__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
|
|
2077
2080
|
}
|
|
2078
2081
|
console.log(pc2__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
|
|
2079
2082
|
console.log(pc2__default.default.gray(downloadUrl));
|
|
@@ -2082,13 +2085,13 @@ async function installCodeServer() {
|
|
|
2082
2085
|
throw new Error(`Failed to download code-server: ${response.statusText}`);
|
|
2083
2086
|
}
|
|
2084
2087
|
const buffer = await response.arrayBuffer();
|
|
2085
|
-
await
|
|
2088
|
+
await fs6__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
|
|
2086
2089
|
console.log(pc2__default.default.cyan("Extracting code-server..."));
|
|
2087
2090
|
await execAsync3(`tar -xzf ${tarballPath} -C ${CODE_DIR}`);
|
|
2088
|
-
await
|
|
2091
|
+
await fs6__default.default.promises.unlink(tarballPath);
|
|
2089
2092
|
const binPath = getCodeServerBin();
|
|
2090
|
-
if (
|
|
2091
|
-
await
|
|
2093
|
+
if (fs6__default.default.existsSync(binPath)) {
|
|
2094
|
+
await fs6__default.default.promises.chmod(binPath, 493);
|
|
2092
2095
|
}
|
|
2093
2096
|
console.log(pc2__default.default.green("\u2713 code-server installed successfully"));
|
|
2094
2097
|
}
|
|
@@ -2110,26 +2113,77 @@ async function killExistingCodeServer() {
|
|
|
2110
2113
|
} catch {
|
|
2111
2114
|
}
|
|
2112
2115
|
}
|
|
2116
|
+
async function setupDefaultSettings() {
|
|
2117
|
+
const userDir = path10__default.default.join(STORAGE_DIR, "User");
|
|
2118
|
+
const settingsPath = path10__default.default.join(userDir, "settings.json");
|
|
2119
|
+
if (!fs6__default.default.existsSync(userDir)) {
|
|
2120
|
+
fs6__default.default.mkdirSync(userDir, { recursive: true });
|
|
2121
|
+
}
|
|
2122
|
+
const defaultSettings = {
|
|
2123
|
+
// Disable signature verification for Open VSX extensions
|
|
2124
|
+
"extensions.verifySignature": false,
|
|
2125
|
+
// Theme settings
|
|
2126
|
+
"workbench.colorTheme": "Min Dark",
|
|
2127
|
+
"workbench.startupEditor": "none",
|
|
2128
|
+
// Editor settings
|
|
2129
|
+
"editor.fontSize": 14,
|
|
2130
|
+
"editor.fontFamily": "'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace",
|
|
2131
|
+
"editor.minimap.enabled": false,
|
|
2132
|
+
"editor.wordWrap": "on",
|
|
2133
|
+
// UI settings
|
|
2134
|
+
"window.menuBarVisibility": "compact",
|
|
2135
|
+
"workbench.activityBar.location": "top"
|
|
2136
|
+
};
|
|
2137
|
+
let existingSettings = {};
|
|
2138
|
+
if (fs6__default.default.existsSync(settingsPath)) {
|
|
2139
|
+
try {
|
|
2140
|
+
const content = await fs6__default.default.promises.readFile(settingsPath, "utf-8");
|
|
2141
|
+
existingSettings = JSON.parse(content);
|
|
2142
|
+
} catch {
|
|
2143
|
+
}
|
|
2144
|
+
}
|
|
2145
|
+
const mergedSettings = { ...defaultSettings, ...existingSettings };
|
|
2146
|
+
mergedSettings["workbench.colorTheme"] = "Min Dark";
|
|
2147
|
+
mergedSettings["extensions.verifySignature"] = false;
|
|
2148
|
+
await fs6__default.default.promises.writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2));
|
|
2149
|
+
console.log(pc2__default.default.green("ama code-server settings configured"));
|
|
2150
|
+
}
|
|
2151
|
+
async function installExtensions() {
|
|
2152
|
+
const binPath = getCodeServerBin();
|
|
2153
|
+
const extensions = [
|
|
2154
|
+
"castrogusttavo.min-theme"
|
|
2155
|
+
];
|
|
2156
|
+
for (const ext of extensions) {
|
|
2157
|
+
try {
|
|
2158
|
+
console.log(pc2__default.default.cyan(`ama installing extension: ${ext}...`));
|
|
2159
|
+
await execAsync3(`"${binPath}" --user-data-dir "${STORAGE_DIR}" --install-extension ${ext}`);
|
|
2160
|
+
console.log(pc2__default.default.green(`ama extension ${ext} installed`));
|
|
2161
|
+
} catch (error) {
|
|
2162
|
+
console.log(pc2__default.default.yellow(`ama failed to install extension ${ext}`), error);
|
|
2163
|
+
}
|
|
2164
|
+
}
|
|
2165
|
+
}
|
|
2113
2166
|
async function startCodeServer(cwd) {
|
|
2114
2167
|
const binPath = getCodeServerBin();
|
|
2115
2168
|
const workDir = cwd || process.cwd();
|
|
2116
|
-
if (!
|
|
2117
|
-
throw new Error("code-server is not installed. Run installCodeServer() first.");
|
|
2169
|
+
if (!fs6__default.default.existsSync(binPath)) {
|
|
2170
|
+
throw new Error("ama code-server is not installed. Run installCodeServer() first.");
|
|
2118
2171
|
}
|
|
2119
2172
|
await killExistingCodeServer();
|
|
2173
|
+
await setupDefaultSettings();
|
|
2174
|
+
await installExtensions();
|
|
2120
2175
|
const workspaceStoragePath = path10__default.default.join(STORAGE_DIR, "User", "workspaceStorage");
|
|
2121
|
-
path10__default.default.join(STORAGE_DIR, "User", "globalStorage");
|
|
2122
2176
|
try {
|
|
2123
|
-
if (
|
|
2124
|
-
await
|
|
2177
|
+
if (fs6__default.default.existsSync(workspaceStoragePath)) {
|
|
2178
|
+
await fs6__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
|
|
2125
2179
|
}
|
|
2126
2180
|
const stateDbPath = path10__default.default.join(STORAGE_DIR, "User", "globalStorage", "state.vscdb");
|
|
2127
|
-
if (
|
|
2128
|
-
await
|
|
2181
|
+
if (fs6__default.default.existsSync(stateDbPath)) {
|
|
2182
|
+
await fs6__default.default.promises.unlink(stateDbPath);
|
|
2129
2183
|
}
|
|
2130
2184
|
} catch {
|
|
2131
2185
|
}
|
|
2132
|
-
console.log(pc2__default.default.cyan(`
|
|
2186
|
+
console.log(pc2__default.default.cyan(`ama starting code-server`));
|
|
2133
2187
|
const codeServer = child_process.spawn(
|
|
2134
2188
|
binPath,
|
|
2135
2189
|
[
|
|
@@ -2148,7 +2202,7 @@ async function startCodeServer(cwd) {
|
|
|
2148
2202
|
stdio: ["ignore", "pipe", "pipe"]
|
|
2149
2203
|
}
|
|
2150
2204
|
);
|
|
2151
|
-
console.log(pc2__default.default.green(
|
|
2205
|
+
console.log(pc2__default.default.green(`ama code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
|
|
2152
2206
|
return codeServer;
|
|
2153
2207
|
}
|
|
2154
2208
|
if (process.env.AMA_DAEMON === "1") {
|