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.
@@ -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 fs4 = require('fs');
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 fs4__default = /*#__PURE__*/_interopDefault(fs4);
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 (fs4__default.default.existsSync(REGISTRY_FILE)) {
41
- const data = fs4__default.default.readFileSync(REGISTRY_FILE, "utf8");
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
- fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
47
- fs4__default.default.unlinkSync(REGISTRY_FILE);
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 (fs4__default.default.existsSync(REGISTRY_FILE)) {
60
+ if (fs6__default.default.existsSync(REGISTRY_FILE)) {
61
61
  try {
62
62
  const backupFile = REGISTRY_FILE + ".backup." + Date.now();
63
- fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
64
- fs4__default.default.unlinkSync(REGISTRY_FILE);
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 (!fs4__default.default.existsSync(AMA_DIR)) {
74
- fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
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
- fs4__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
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 fs4__default.default.promises.readFile(filePath, "utf-8");
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 fs4__default.default.promises.readFile(filePath, "utf-8");
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 fs4__default.default.promises.writeFile(filePath, content);
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 (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1145
+ if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
1143
1146
  return null;
1144
1147
  }
1145
- const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
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 (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1154
+ if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
1152
1155
  return;
1153
1156
  }
1154
- const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
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 = fs4.readdirSync(dir, { withFileTypes: true });
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 (!fs4__default.default.existsSync(storagePath)) {
1336
+ if (!fs6__default.default.existsSync(storagePath)) {
1334
1337
  return projects;
1335
1338
  }
1336
1339
  try {
1337
- const workspaces = fs4__default.default.readdirSync(storagePath);
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 (fs4__default.default.existsSync(workspaceJsonPath)) {
1343
+ if (fs6__default.default.existsSync(workspaceJsonPath)) {
1341
1344
  try {
1342
- const content = fs4__default.default.readFileSync(workspaceJsonPath, "utf-8");
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 (fs4__default.default.existsSync(projectPath) && fs4__default.default.statSync(projectPath).isDirectory()) {
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 = fs4__default.default.realpathSync(projectPath);
1375
- if (fs4__default.default.existsSync(resolvedPath) && fs4__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
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 fs4__default.default.realpathSync(ideDir) === resolvedPath;
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 (fs4__default.default.existsSync(dirPath)) {
1402
- const projects = fs4__default.default.readdirSync(dirPath);
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 = fs4__default.default.lstatSync(projectPath);
1409
+ const stats = fs6__default.default.lstatSync(projectPath);
1407
1410
  let actualPath = null;
1408
1411
  if (stats.isSymbolicLink()) {
1409
- actualPath = fs4__default.default.realpathSync(projectPath);
1412
+ actualPath = fs6__default.default.realpathSync(projectPath);
1410
1413
  } else if (stats.isFile()) {
1411
1414
  try {
1412
- let content = fs4__default.default.readFileSync(projectPath, "utf-8").trim();
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 (fs4__default.default.existsSync(resolvedContent) && fs4__default.default.statSync(resolvedContent).isDirectory()) {
1418
- actualPath = fs4__default.default.realpathSync(resolvedContent);
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 = fs4__default.default.realpathSync(projectPath);
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 fs4__default.default.existsSync(binPath);
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 (!fs4__default.default.existsSync(AMA_DIR)) {
2070
- fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
2072
+ if (!fs6__default.default.existsSync(AMA_DIR)) {
2073
+ fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
2071
2074
  }
2072
- if (!fs4__default.default.existsSync(CODE_DIR)) {
2073
- fs4__default.default.mkdirSync(CODE_DIR, { recursive: true });
2075
+ if (!fs6__default.default.existsSync(CODE_DIR)) {
2076
+ fs6__default.default.mkdirSync(CODE_DIR, { recursive: true });
2074
2077
  }
2075
- if (!fs4__default.default.existsSync(STORAGE_DIR)) {
2076
- fs4__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
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 fs4__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
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 fs4__default.default.promises.unlink(tarballPath);
2091
+ await fs6__default.default.promises.unlink(tarballPath);
2089
2092
  const binPath = getCodeServerBin();
2090
- if (fs4__default.default.existsSync(binPath)) {
2091
- await fs4__default.default.promises.chmod(binPath, 493);
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 (!fs4__default.default.existsSync(binPath)) {
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 (fs4__default.default.existsSync(workspaceStoragePath)) {
2124
- await fs4__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
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 (fs4__default.default.existsSync(stateDbPath)) {
2128
- await fs4__default.default.promises.unlink(stateDbPath);
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(`Starting code-server in ${workDir}...`));
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(`\u2713 code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
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") {