@aigencydev/cli 0.1.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 +83 -0
- package/dist/agent/chunker.js +59 -0
- package/dist/agent/chunker.js.map +1 -0
- package/dist/agent/history.js +35 -0
- package/dist/agent/history.js.map +1 -0
- package/dist/agent/loop.js +219 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/memory.js +177 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/api-client/auth.js +43 -0
- package/dist/api-client/auth.js.map +1 -0
- package/dist/api-client/base.js +154 -0
- package/dist/api-client/base.js.map +1 -0
- package/dist/api-client/stream.js +123 -0
- package/dist/api-client/stream.js.map +1 -0
- package/dist/api-client/updates.js +31 -0
- package/dist/api-client/updates.js.map +1 -0
- package/dist/api-client/usage.js +15 -0
- package/dist/api-client/usage.js.map +1 -0
- package/dist/auth/oauth.js +178 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/pkce.js +19 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session.js +48 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/storage.js +142 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/chat.js +76 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/help.js +61 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.js +43 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.js +153 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +30 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/update.js +88 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.js +64 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config/defaults.js +54 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/hooks.js +99 -0
- package/dist/config/hooks.js.map +1 -0
- package/dist/config/paths.js +62 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/settings.js +80 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/security/command-filter.js +121 -0
- package/dist/security/command-filter.js.map +1 -0
- package/dist/security/sandbox.js +182 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/sanitize.js +59 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/tools/bash.js +206 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/diff.js +56 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/edit-file.js +165 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/list-files.js +116 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/read-file.js +107 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/registry.js +54 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-files.js +159 -0
- package/dist/tools/search-files.js.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write-file.js +141 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/App.js +264 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/InputBar.js +22 -0
- package/dist/ui/InputBar.js.map +1 -0
- package/dist/ui/MessageList.js +82 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/ModeIndicator.js +23 -0
- package/dist/ui/ModeIndicator.js.map +1 -0
- package/dist/ui/PermissionPrompt.js +61 -0
- package/dist/ui/PermissionPrompt.js.map +1 -0
- package/dist/ui/StatusBar.js +39 -0
- package/dist/ui/StatusBar.js.map +1 -0
- package/dist/ui/theme.js +42 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/abort.js +61 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.js +102 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIGENCY CLI — kimlik bilgisi saklama.
|
|
3
|
+
*
|
|
4
|
+
* Strateji: AES-256-GCM ile şifrelenmiş dosya (~/.aigency/credentials.enc).
|
|
5
|
+
* Anahtar deterministik olarak kullanıcı homedir + os username'den türetilir
|
|
6
|
+
* (PBKDF2, 120.000 iterasyon). Bu yaklaşım OS keyring kadar güçlü değil ama:
|
|
7
|
+
* - Dış native binding gerektirmez (Bun compile uyumlu)
|
|
8
|
+
* - Dosya tek bir kullanıcıya bağlı
|
|
9
|
+
* - Dosya başka makineye kopyalansa bile çözülemez
|
|
10
|
+
*
|
|
11
|
+
* Faz 5'te @napi-rs/keyring entegrasyonu eklenecek (OS Keychain/Credential Manager/libsecret).
|
|
12
|
+
* Bu dosya fallback olarak kalacak.
|
|
13
|
+
*/
|
|
14
|
+
import fs from "node:fs/promises";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import crypto from "node:crypto";
|
|
18
|
+
import { getFallbackCredentialsFile, getUserAigencyDir } from "../config/paths.js";
|
|
19
|
+
import { log } from "../utils/logger.js";
|
|
20
|
+
const ALGO = "aes-256-gcm";
|
|
21
|
+
const KEY_ITERATIONS = 120_000;
|
|
22
|
+
const SALT = Buffer.from("aigency-cli-salt-v1", "utf8");
|
|
23
|
+
const MAGIC = Buffer.from("AIGCLI01", "utf8"); // Dosya başlığı — format doğrulama
|
|
24
|
+
function deriveKey() {
|
|
25
|
+
// Kullanıcı home dizini + os kullanıcı adı → PBKDF2
|
|
26
|
+
const seed = `${os.homedir()}|${os.userInfo().username}|aigency-cli`;
|
|
27
|
+
return crypto.pbkdf2Sync(seed, SALT, KEY_ITERATIONS, 32, "sha256");
|
|
28
|
+
}
|
|
29
|
+
async function ensureDir() {
|
|
30
|
+
await fs.mkdir(getUserAigencyDir(), { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Credentials dosyasını oku ve çöz.
|
|
34
|
+
* Yoksa null döner.
|
|
35
|
+
*/
|
|
36
|
+
export async function readStoredCredentials() {
|
|
37
|
+
const filePath = getFallbackCredentialsFile();
|
|
38
|
+
let raw;
|
|
39
|
+
try {
|
|
40
|
+
raw = await fs.readFile(filePath);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const code = err?.code;
|
|
44
|
+
if (code === "ENOENT")
|
|
45
|
+
return null;
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
// Format: MAGIC (8) | iv (12) | authTag (16) | ciphertext
|
|
49
|
+
if (raw.length < 8 + 12 + 16)
|
|
50
|
+
return null;
|
|
51
|
+
const magic = raw.subarray(0, 8);
|
|
52
|
+
if (!magic.equals(MAGIC)) {
|
|
53
|
+
log.debug("credentials.enc: magic eşleşmedi, eski format olabilir");
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const iv = raw.subarray(8, 8 + 12);
|
|
57
|
+
const authTag = raw.subarray(8 + 12, 8 + 12 + 16);
|
|
58
|
+
const ciphertext = raw.subarray(8 + 12 + 16);
|
|
59
|
+
try {
|
|
60
|
+
const key = deriveKey();
|
|
61
|
+
const decipher = crypto.createDecipheriv(ALGO, key, iv);
|
|
62
|
+
decipher.setAuthTag(authTag);
|
|
63
|
+
const plaintext = Buffer.concat([
|
|
64
|
+
decipher.update(ciphertext),
|
|
65
|
+
decipher.final(),
|
|
66
|
+
]).toString("utf8");
|
|
67
|
+
const parsed = JSON.parse(plaintext);
|
|
68
|
+
// Basit şekil doğrulaması
|
|
69
|
+
if (typeof parsed.access_token !== "string" ||
|
|
70
|
+
typeof parsed.refresh_token !== "string" ||
|
|
71
|
+
typeof parsed.expires_at !== "string" ||
|
|
72
|
+
!parsed.user) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
log.debug(`credentials.enc çözülemedi: ${err.message}`);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Credentials'ı şifrele ve kaydet.
|
|
84
|
+
* Mevcut dosyanın üstüne yazar.
|
|
85
|
+
*/
|
|
86
|
+
export async function writeStoredCredentials(creds) {
|
|
87
|
+
await ensureDir();
|
|
88
|
+
const filePath = getFallbackCredentialsFile();
|
|
89
|
+
const plaintext = Buffer.from(JSON.stringify(creds), "utf8");
|
|
90
|
+
const key = deriveKey();
|
|
91
|
+
const iv = crypto.randomBytes(12);
|
|
92
|
+
const cipher = crypto.createCipheriv(ALGO, key, iv);
|
|
93
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
94
|
+
const authTag = cipher.getAuthTag();
|
|
95
|
+
const payload = Buffer.concat([MAGIC, iv, authTag, ciphertext]);
|
|
96
|
+
// Atomic yazma: önce .tmp, sonra rename
|
|
97
|
+
const tmpPath = filePath + ".tmp";
|
|
98
|
+
await fs.writeFile(tmpPath, payload);
|
|
99
|
+
try {
|
|
100
|
+
// Sadece kullanıcıya okuma/yazma izni (Unix)
|
|
101
|
+
if (process.platform !== "win32") {
|
|
102
|
+
await fs.chmod(tmpPath, 0o600);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// chmod başarısız olsa bile devam et
|
|
107
|
+
}
|
|
108
|
+
await fs.rename(tmpPath, filePath);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Credentials dosyasını sil (logout).
|
|
112
|
+
*/
|
|
113
|
+
export async function clearStoredCredentials() {
|
|
114
|
+
const filePath = getFallbackCredentialsFile();
|
|
115
|
+
try {
|
|
116
|
+
await fs.unlink(filePath);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
const code = err?.code;
|
|
120
|
+
if (code !== "ENOENT")
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Kullanıcı metadata'sını ayrı bir JSON dosyasında tutar (~/.aigency/cli.json).
|
|
126
|
+
* Bu dosya şifreli DEĞİL — sadece raw olmayan bilgi içerir (e-posta, cihaz adı).
|
|
127
|
+
*/
|
|
128
|
+
export async function writeUserMetadata(data) {
|
|
129
|
+
await ensureDir();
|
|
130
|
+
const filePath = path.join(getUserAigencyDir(), "cli.json");
|
|
131
|
+
await fs.writeFile(filePath, JSON.stringify(data, null, 2) + "\n", "utf8");
|
|
132
|
+
}
|
|
133
|
+
export async function readUserMetadata() {
|
|
134
|
+
const filePath = path.join(getUserAigencyDir(), "cli.json");
|
|
135
|
+
try {
|
|
136
|
+
return JSON.parse(await fs.readFile(filePath, "utf8"));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/auth/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIGENCY CLI — komut dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* Commander yerine doğrudan argv parse ediyoruz (küçük bağımlılık alanı).
|
|
5
|
+
* Her komut kendi dosyasında ve basit ayrıştırma ile çalışır.
|
|
6
|
+
*/
|
|
7
|
+
import { CLI_VERSION, CLI_DISPLAY_NAME } from "./version.js";
|
|
8
|
+
import { runHelpCommand } from "./commands/help.js";
|
|
9
|
+
import { runLoginCommand } from "./commands/login.js";
|
|
10
|
+
import { runLogoutCommand } from "./commands/logout.js";
|
|
11
|
+
import { runUsageCommand } from "./commands/usage.js";
|
|
12
|
+
import { runUpdateCommand } from "./commands/update.js";
|
|
13
|
+
import { runInitCommand } from "./commands/init.js";
|
|
14
|
+
import { runChatCommand } from "./commands/chat.js";
|
|
15
|
+
import { log } from "./utils/logger.js";
|
|
16
|
+
import { CliError } from "./utils/errors.js";
|
|
17
|
+
import { color } from "./utils/formatting.js";
|
|
18
|
+
function parseArgs(argv) {
|
|
19
|
+
const flags = {};
|
|
20
|
+
const positional = [];
|
|
21
|
+
let command;
|
|
22
|
+
let firstPositional;
|
|
23
|
+
for (let i = 0; i < argv.length; i++) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
if (arg.startsWith("--")) {
|
|
26
|
+
const eq = arg.indexOf("=");
|
|
27
|
+
if (eq !== -1) {
|
|
28
|
+
flags[arg.slice(2, eq)] = arg.slice(eq + 1);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const next = argv[i + 1];
|
|
32
|
+
if (next && !next.startsWith("-")) {
|
|
33
|
+
flags[arg.slice(2)] = next;
|
|
34
|
+
i++;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
flags[arg.slice(2)] = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (arg.startsWith("-") && arg.length > 1) {
|
|
42
|
+
flags[arg.slice(1)] = true;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (firstPositional === undefined)
|
|
46
|
+
firstPositional = arg;
|
|
47
|
+
if (!command && isValidCommand(arg)) {
|
|
48
|
+
command = arg;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
positional.push(arg);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { command, firstPositional, flags, positional };
|
|
56
|
+
}
|
|
57
|
+
function isValidCommand(s) {
|
|
58
|
+
return ["login", "logout", "usage", "update", "init", "chat", "help", "version"].includes(s);
|
|
59
|
+
}
|
|
60
|
+
function parseModeFlag(value) {
|
|
61
|
+
if (typeof value !== "string")
|
|
62
|
+
return undefined;
|
|
63
|
+
const allowed = ["default", "plan", "accept_edits", "auto"];
|
|
64
|
+
return allowed.includes(value) ? value : undefined;
|
|
65
|
+
}
|
|
66
|
+
function parseModelFlag(value) {
|
|
67
|
+
if (typeof value !== "string")
|
|
68
|
+
return undefined;
|
|
69
|
+
return value === "pro" || value === "max" ? value : undefined;
|
|
70
|
+
}
|
|
71
|
+
export async function runCli(argv) {
|
|
72
|
+
const parsed = parseArgs(argv);
|
|
73
|
+
// --version / -v
|
|
74
|
+
if (parsed.flags.version || parsed.flags.v || parsed.command === "version") {
|
|
75
|
+
log.plain(`${CLI_DISPLAY_NAME} v${CLI_VERSION}`);
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
// --help / -h / help
|
|
79
|
+
if (parsed.flags.help || parsed.flags.h || parsed.command === "help") {
|
|
80
|
+
runHelpCommand();
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
// Argüman yok → interactive chat başlat (kullanıcı login ise)
|
|
84
|
+
// Login değilse chat komutu AuthError fırlatacak ve catch edilecek
|
|
85
|
+
const modeFromFlag = parseModeFlag(parsed.flags.mode);
|
|
86
|
+
const modelFromFlag = parseModelFlag(parsed.flags.model);
|
|
87
|
+
try {
|
|
88
|
+
if (!parsed.command && !parsed.firstPositional) {
|
|
89
|
+
await runChatCommand({
|
|
90
|
+
mode: modeFromFlag,
|
|
91
|
+
model: modelFromFlag,
|
|
92
|
+
});
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
// Argüman var ama tanınan komut değil → prompt olarak chat'e geçir
|
|
96
|
+
if (!parsed.command && parsed.firstPositional) {
|
|
97
|
+
const prompt = [parsed.firstPositional, ...parsed.positional]
|
|
98
|
+
.filter(Boolean)
|
|
99
|
+
.join(" ");
|
|
100
|
+
await runChatCommand({
|
|
101
|
+
prompt,
|
|
102
|
+
mode: modeFromFlag,
|
|
103
|
+
model: modelFromFlag,
|
|
104
|
+
});
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
switch (parsed.command) {
|
|
108
|
+
case "login":
|
|
109
|
+
await runLoginCommand({
|
|
110
|
+
noBrowser: parsed.flags["no-browser"] === true,
|
|
111
|
+
});
|
|
112
|
+
return 0;
|
|
113
|
+
case "logout":
|
|
114
|
+
await runLogoutCommand();
|
|
115
|
+
return 0;
|
|
116
|
+
case "usage":
|
|
117
|
+
await runUsageCommand({
|
|
118
|
+
json: parsed.flags.json === true,
|
|
119
|
+
brief: parsed.flags.brief === true,
|
|
120
|
+
});
|
|
121
|
+
return 0;
|
|
122
|
+
case "update":
|
|
123
|
+
await runUpdateCommand();
|
|
124
|
+
return 0;
|
|
125
|
+
case "init":
|
|
126
|
+
await runInitCommand({ force: parsed.flags.force === true });
|
|
127
|
+
return 0;
|
|
128
|
+
case "chat": {
|
|
129
|
+
const prompt = parsed.positional.join(" ") || undefined;
|
|
130
|
+
await runChatCommand({
|
|
131
|
+
prompt,
|
|
132
|
+
mode: modeFromFlag,
|
|
133
|
+
model: modelFromFlag,
|
|
134
|
+
});
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
default:
|
|
138
|
+
log.error(`Bilinmeyen komut: ${parsed.command}`);
|
|
139
|
+
log.hint("`aigency help` ile kullanılabilir komutları listeleyin");
|
|
140
|
+
return 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
if (err instanceof CliError) {
|
|
145
|
+
log.error(err.message);
|
|
146
|
+
if (err.hint)
|
|
147
|
+
log.hint(err.hint);
|
|
148
|
+
if (process.env.AIGENCY_CLI_DEBUG === "1" && err.details) {
|
|
149
|
+
log.dim(JSON.stringify(err.details, null, 2));
|
|
150
|
+
}
|
|
151
|
+
return typeof err.status === "number" && err.status > 0 ? 1 : 1;
|
|
152
|
+
}
|
|
153
|
+
// Beklenmeyen hata
|
|
154
|
+
log.error(`Beklenmeyen hata: ${err.message}`);
|
|
155
|
+
if (process.env.AIGENCY_CLI_DEBUG === "1") {
|
|
156
|
+
log.dim(color.gray(err.stack || ""));
|
|
157
|
+
}
|
|
158
|
+
return 2;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aigency` (default) veya `aigency chat "prompt"` — interactive chat.
|
|
3
|
+
*
|
|
4
|
+
* Ink render entry. `aigency login` ile aktif session gerekir.
|
|
5
|
+
*/
|
|
6
|
+
import React from "react";
|
|
7
|
+
import fs from "node:fs/promises";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { render } from "ink";
|
|
10
|
+
import { requireActiveSession } from "../auth/session.js";
|
|
11
|
+
import { loadSettings } from "../config/settings.js";
|
|
12
|
+
import { loadMemorySnapshot } from "../agent/memory.js";
|
|
13
|
+
import { App } from "../ui/App.js";
|
|
14
|
+
import { log } from "../utils/logger.js";
|
|
15
|
+
/**
|
|
16
|
+
* Proje kökünü bulmak için yukarı doğru git/package.json/pyproject.toml/Cargo.toml ara.
|
|
17
|
+
* Bulunamazsa cwd'yi döndür.
|
|
18
|
+
*/
|
|
19
|
+
async function findProjectRoot(cwd) {
|
|
20
|
+
const markers = [
|
|
21
|
+
".git",
|
|
22
|
+
"package.json",
|
|
23
|
+
"pyproject.toml",
|
|
24
|
+
"Cargo.toml",
|
|
25
|
+
"go.mod",
|
|
26
|
+
".aigency",
|
|
27
|
+
];
|
|
28
|
+
let current = path.resolve(cwd);
|
|
29
|
+
const root = path.parse(current).root;
|
|
30
|
+
// En fazla 10 seviye yukarı çık — sonsuz döngü koruması
|
|
31
|
+
for (let i = 0; i < 10; i++) {
|
|
32
|
+
for (const marker of markers) {
|
|
33
|
+
try {
|
|
34
|
+
await fs.access(path.join(current, marker));
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// yok, devam et
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const parent = path.dirname(current);
|
|
42
|
+
if (parent === current || parent === root)
|
|
43
|
+
break;
|
|
44
|
+
current = parent;
|
|
45
|
+
}
|
|
46
|
+
return cwd;
|
|
47
|
+
}
|
|
48
|
+
export async function runChatCommand(options = {}) {
|
|
49
|
+
const session = await requireActiveSession();
|
|
50
|
+
const cwd = process.cwd();
|
|
51
|
+
const projectRoot = await findProjectRoot(cwd);
|
|
52
|
+
const settings = await loadSettings({ cwd: projectRoot });
|
|
53
|
+
// CLI arg veya proje ayarı → varsayılan
|
|
54
|
+
const mode = options.mode || settings.mode;
|
|
55
|
+
const model = options.model || settings.model;
|
|
56
|
+
// Proje hafızası
|
|
57
|
+
const memory = await loadMemorySnapshot(projectRoot);
|
|
58
|
+
if (memory.files.length > 0) {
|
|
59
|
+
log.debug(`memory: ${memory.files.length} dosya yüklendi (${memory.totalBytes}b)`);
|
|
60
|
+
}
|
|
61
|
+
// Ink ekranı başlat
|
|
62
|
+
const { waitUntilExit } = render(React.createElement(App, {
|
|
63
|
+
session,
|
|
64
|
+
initialMode: mode,
|
|
65
|
+
initialModel: model,
|
|
66
|
+
cwd,
|
|
67
|
+
projectRoot,
|
|
68
|
+
initialPrompt: options.prompt,
|
|
69
|
+
settings,
|
|
70
|
+
memorySummary: memory.summary,
|
|
71
|
+
}), {
|
|
72
|
+
exitOnCtrlC: false, // App component kendi yönetir
|
|
73
|
+
});
|
|
74
|
+
await waitUntilExit();
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aigency help` — kullanım özeti.
|
|
3
|
+
*/
|
|
4
|
+
import { log } from "../utils/logger.js";
|
|
5
|
+
import { color, symbols } from "../utils/formatting.js";
|
|
6
|
+
import { CLI_DISPLAY_NAME, CLI_VERSION } from "../version.js";
|
|
7
|
+
export function runHelpCommand() {
|
|
8
|
+
log.plain(`${color.bold(CLI_DISPLAY_NAME)} ${color.dim("v" + CLI_VERSION)}`);
|
|
9
|
+
log.plain(color.dim("Terminalden yapay zeka destekli kod üretimi, dosya yönetimi ve proje otomasyonu"));
|
|
10
|
+
log.newline();
|
|
11
|
+
log.plain(color.bold("Kullanım:"));
|
|
12
|
+
log.plain(" aigency Interactive chat başlat");
|
|
13
|
+
log.plain(' aigency "bir prompt" Tek satır prompt ile başlat');
|
|
14
|
+
log.plain(" aigency <komut> [seçenekler] Belirli bir komut çalıştır");
|
|
15
|
+
log.newline();
|
|
16
|
+
log.plain(color.bold("Komutlar:"));
|
|
17
|
+
const commands = [
|
|
18
|
+
["chat", "Interactive chat başlat (argümansız çalıştırmakla aynı)"],
|
|
19
|
+
["login", "Hesabınıza bağlanır (tarayıcıda onay)"],
|
|
20
|
+
["logout", "Oturumu sonlandırır ve yerel token'ları siler"],
|
|
21
|
+
["init", "Mevcut dizinde .aigency/ proje klasörünü oluşturur"],
|
|
22
|
+
["usage", "Aylık token kullanımı ve paket bilgisi"],
|
|
23
|
+
["update", "Yeni sürüm kontrolü"],
|
|
24
|
+
["help", "Bu yardım mesajını gösterir"],
|
|
25
|
+
["version", "Sürüm bilgisini gösterir"],
|
|
26
|
+
];
|
|
27
|
+
for (const [name, desc] of commands) {
|
|
28
|
+
log.plain(` ${color.cyan(name.padEnd(10))} ${color.dim(desc)}`);
|
|
29
|
+
}
|
|
30
|
+
log.newline();
|
|
31
|
+
log.plain(color.bold("Genel seçenekler:"));
|
|
32
|
+
log.plain(` ${color.cyan("--help, -h")} Komut yardımını göster`);
|
|
33
|
+
log.plain(` ${color.cyan("--version, -v")} Sürüm bilgisi`);
|
|
34
|
+
log.plain(` ${color.cyan("--json")} Çıktıyı JSON olarak ver (bazı komutlar)`);
|
|
35
|
+
log.plain(` ${color.cyan("--mode")} İzin modu (default/plan/accept_edits/auto)`);
|
|
36
|
+
log.plain(` ${color.cyan("--model")} Model tier (pro/max)`);
|
|
37
|
+
log.newline();
|
|
38
|
+
log.plain(color.bold("Interactive chat kısayolları:"));
|
|
39
|
+
log.plain(` ${color.cyan("Shift+Tab")} Mod döngüsü (default → plan → accept_edits → auto)`);
|
|
40
|
+
log.plain(` ${color.cyan("Ctrl+C")} Aktif işlemi iptal et (veya çık)`);
|
|
41
|
+
log.plain(` ${color.cyan("/clear")} Sohbet geçmişini temizle`);
|
|
42
|
+
log.plain(` ${color.cyan("/help")} Komut referansı`);
|
|
43
|
+
log.plain(` ${color.cyan("/mode <ad>")} Modu doğrudan seç`);
|
|
44
|
+
log.plain(` ${color.cyan("/cost")} Bu oturumdaki token kullanımı`);
|
|
45
|
+
log.plain(` ${color.cyan("/exit")} Çıkış`);
|
|
46
|
+
log.newline();
|
|
47
|
+
log.plain(color.bold("Ortam değişkenleri:"));
|
|
48
|
+
log.plain(` ${color.cyan("AIGENCY_CLI_API_URL")} API sunucu URL'i (varsayılan https://aigency.dev)`);
|
|
49
|
+
log.plain(` ${color.cyan("AIGENCY_CLI_DEBUG")} 1 → debug log'ları göster`);
|
|
50
|
+
log.newline();
|
|
51
|
+
log.plain(color.bold("Örnekler:"));
|
|
52
|
+
log.plain(` ${color.dim(symbols.arrow + " aigency login")}`);
|
|
53
|
+
log.plain(` ${color.dim(symbols.arrow + " aigency init")}`);
|
|
54
|
+
log.plain(` ${color.dim(symbols.arrow + ' aigency "src/index.ts dosyasını oku"')}`);
|
|
55
|
+
log.plain(` ${color.dim(symbols.arrow + ' aigency --mode plan "Flask API template hazırla"')}`);
|
|
56
|
+
log.plain(` ${color.dim(symbols.arrow + " aigency usage")}`);
|
|
57
|
+
log.plain(` ${color.dim(symbols.arrow + " aigency update")}`);
|
|
58
|
+
log.newline();
|
|
59
|
+
log.dim("Rehber ve SSS: https://aigency.dev/forge");
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aigency init` — mevcut dizinde .aigency/ klasörünü oluşturur.
|
|
3
|
+
*
|
|
4
|
+
* İçerik:
|
|
5
|
+
* .aigency/settings.json — proje-özel varsayılan ayarlar
|
|
6
|
+
* .aigency/memory/ — agent hafıza dosyaları için boş klasör
|
|
7
|
+
* .aigency/.gitignore — .aigency/memory gitignore
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs/promises";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { getProjectAigencyDir, getProjectMemoryDir, getProjectSettingsFile, } from "../config/paths.js";
|
|
12
|
+
import { DEFAULT_SETTINGS } from "../config/defaults.js";
|
|
13
|
+
import { log } from "../utils/logger.js";
|
|
14
|
+
import { color } from "../utils/formatting.js";
|
|
15
|
+
export async function runInitCommand(options = {}) {
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const aigencyDir = getProjectAigencyDir(cwd);
|
|
18
|
+
const memoryDir = getProjectMemoryDir(cwd);
|
|
19
|
+
const settingsFile = getProjectSettingsFile(cwd);
|
|
20
|
+
// Mevcut durum kontrolü
|
|
21
|
+
let exists = false;
|
|
22
|
+
try {
|
|
23
|
+
await fs.access(aigencyDir);
|
|
24
|
+
exists = true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
exists = false;
|
|
28
|
+
}
|
|
29
|
+
if (exists && !options.force) {
|
|
30
|
+
log.warn(`.aigency/ zaten var — ${color.dim("--force ile üzerine yaz")}`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
await fs.mkdir(memoryDir, { recursive: true });
|
|
34
|
+
// settings.json
|
|
35
|
+
await fs.writeFile(settingsFile, JSON.stringify(DEFAULT_SETTINGS, null, 2) + "\n", "utf8");
|
|
36
|
+
// .gitignore
|
|
37
|
+
const gitignorePath = path.join(aigencyDir, ".gitignore");
|
|
38
|
+
await fs.writeFile(gitignorePath, ["# AIGENCY CLI proje verisi", "memory/", ""].join("\n"), "utf8");
|
|
39
|
+
log.success(`.aigency/ oluşturuldu — ${color.dim(aigencyDir)}`);
|
|
40
|
+
log.hint("Proje ayarlarını düzenlemek için `.aigency/settings.json` dosyasını düzenleyin");
|
|
41
|
+
log.hint("`aigency login` ile hesabınıza bağlanıp kullanmaya başlayın");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAO/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAuB,EAAE;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAEjD,wBAAwB;IACxB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,gBAAgB;IAChB,MAAM,EAAE,CAAC,SAAS,CAChB,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAChD,MAAM,CACP,CAAC;IAEF,aAAa;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,CAChB,aAAa,EACb,CAAC,4BAA4B,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACxD,MAAM,CACP,CAAC;IAEF,GAAG,CAAC,OAAO,CAAC,2BAA2B,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC3F,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AAC1E,CAAC"}
|