@iambarryking/ag 3.0.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.
Files changed (50) hide show
  1. package/README.md +199 -0
  2. package/dist/cli/parser.d.ts +6 -0
  3. package/dist/cli/parser.d.ts.map +1 -0
  4. package/dist/cli/parser.js +69 -0
  5. package/dist/cli/parser.js.map +1 -0
  6. package/dist/cli/repl.d.ts +10 -0
  7. package/dist/cli/repl.d.ts.map +1 -0
  8. package/dist/cli/repl.js +256 -0
  9. package/dist/cli/repl.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +80 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/core/agent.d.ts +54 -0
  15. package/dist/core/agent.d.ts.map +1 -0
  16. package/dist/core/agent.js +137 -0
  17. package/dist/core/agent.js.map +1 -0
  18. package/dist/core/colors.d.ts +10 -0
  19. package/dist/core/colors.d.ts.map +1 -0
  20. package/dist/core/colors.js +5 -0
  21. package/dist/core/colors.js.map +1 -0
  22. package/dist/core/config.d.ts +11 -0
  23. package/dist/core/config.d.ts.map +1 -0
  24. package/dist/core/config.js +30 -0
  25. package/dist/core/config.js.map +1 -0
  26. package/dist/core/loader.d.ts +3 -0
  27. package/dist/core/loader.d.ts.map +1 -0
  28. package/dist/core/loader.js +39 -0
  29. package/dist/core/loader.js.map +1 -0
  30. package/dist/core/types.d.ts +47 -0
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +2 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/memory/memory.d.ts +38 -0
  35. package/dist/memory/memory.d.ts.map +1 -0
  36. package/dist/memory/memory.js +153 -0
  37. package/dist/memory/memory.js.map +1 -0
  38. package/dist/tools/bash.d.ts +6 -0
  39. package/dist/tools/bash.d.ts.map +1 -0
  40. package/dist/tools/bash.js +37 -0
  41. package/dist/tools/bash.js.map +1 -0
  42. package/dist/tools/memory.d.ts +3 -0
  43. package/dist/tools/memory.d.ts.map +1 -0
  44. package/dist/tools/memory.js +27 -0
  45. package/dist/tools/memory.js.map +1 -0
  46. package/dist/tools/plan.d.ts +4 -0
  47. package/dist/tools/plan.d.ts.map +1 -0
  48. package/dist/tools/plan.js +49 -0
  49. package/dist/tools/plan.js.map +1 -0
  50. package/package.json +28 -0
@@ -0,0 +1,153 @@
1
+ import { readFileSync, writeFileSync, appendFileSync, existsSync, mkdirSync, readdirSync, unlinkSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { createHash } from 'node:crypto';
5
+ const AG_DIR = join(homedir(), '.ag');
6
+ function projectId(cwd) {
7
+ return createHash('md5').update(cwd).digest('hex').slice(0, 12);
8
+ }
9
+ function ensure(dir) {
10
+ if (!existsSync(dir))
11
+ mkdirSync(dir, { recursive: true });
12
+ }
13
+ function read(path) {
14
+ return existsSync(path) ? readFileSync(path, 'utf-8') : '';
15
+ }
16
+ // ── Paths ───────────────────────────────────────────────────────────────────
17
+ export function paths(cwd = process.cwd()) {
18
+ const proj = join(AG_DIR, 'projects', projectId(cwd));
19
+ ensure(proj);
20
+ ensure(AG_DIR);
21
+ const plansDir = join(proj, 'plans');
22
+ ensure(plansDir);
23
+ return {
24
+ globalMemory: join(AG_DIR, 'memory.md'),
25
+ projectMemory: join(proj, 'memory.md'),
26
+ plansDir,
27
+ history: join(proj, 'history.jsonl'),
28
+ projectDir: proj,
29
+ };
30
+ }
31
+ // ── Read ────────────────────────────────────────────────────────────────────
32
+ export function loadGlobalMemory(cwd) { return read(paths(cwd).globalMemory); }
33
+ export function loadProjectMemory(cwd) { return read(paths(cwd).projectMemory); }
34
+ export function loadPlan(cwd) {
35
+ const latest = latestPlanPath(cwd);
36
+ return latest ? read(latest) : '';
37
+ }
38
+ /** List all plan files sorted newest first */
39
+ export function listPlans(cwd) {
40
+ const dir = paths(cwd).plansDir;
41
+ if (!existsSync(dir))
42
+ return [];
43
+ return readdirSync(dir)
44
+ .filter(f => f.endsWith('.md') && statSync(join(dir, f)).size > 0)
45
+ .sort()
46
+ .reverse()
47
+ .map(f => ({ name: f.replace('.md', ''), path: join(dir, f) }));
48
+ }
49
+ /** Load a specific plan by name */
50
+ export function loadPlanByName(name, cwd) {
51
+ const file = join(paths(cwd).plansDir, `${name}.md`);
52
+ return read(file);
53
+ }
54
+ function latestPlanPath(cwd) {
55
+ const plans = listPlans(cwd);
56
+ return plans.length > 0 ? plans[0].path : null;
57
+ }
58
+ /** Build a system prompt prefix from all memory tiers (capped to avoid context bloat) */
59
+ export function loadContext(cwd) {
60
+ const cap = (s, limit = 2000) => s.length > limit ? s.slice(0, limit) + '\n[truncated]' : s;
61
+ const global = cap(loadGlobalMemory(cwd));
62
+ const project = cap(loadProjectMemory(cwd));
63
+ const plan = cap(loadPlan(cwd));
64
+ const parts = [];
65
+ if (global)
66
+ parts.push(`<global-memory>\n${global}\n</global-memory>`);
67
+ if (project)
68
+ parts.push(`<project-memory>\n${project}\n</project-memory>`);
69
+ if (plan) {
70
+ const plans = listPlans(cwd);
71
+ const header = plans.length > 1 ? `(${plans.length} plans total, showing latest)` : '';
72
+ parts.push(`<current-plan>${header}\n${plan}\n</current-plan>`);
73
+ }
74
+ return parts.join('\n\n');
75
+ }
76
+ /** Load recent user/assistant messages from history (for session continuity) */
77
+ export function loadHistory(cwd, limit = 10) {
78
+ const raw = read(paths(cwd).history);
79
+ if (!raw)
80
+ return [];
81
+ const lines = raw.trim().split('\n').filter(Boolean);
82
+ const messages = [];
83
+ for (const line of lines.slice(-limit * 3)) {
84
+ try {
85
+ const msg = JSON.parse(line);
86
+ if ((msg.role === 'user' || msg.role === 'assistant') && !msg.tool_calls) {
87
+ messages.push(msg);
88
+ }
89
+ }
90
+ catch { /* skip corrupt lines */ }
91
+ }
92
+ return messages.slice(-limit);
93
+ }
94
+ // ── Write ───────────────────────────────────────────────────────────────────
95
+ export function saveGlobalMemory(content, cwd) {
96
+ writeFileSync(paths(cwd).globalMemory, content);
97
+ }
98
+ export function appendGlobalMemory(content, cwd) {
99
+ const p = paths(cwd).globalMemory;
100
+ const prefix = existsSync(p) && readFileSync(p, 'utf-8').trim().length > 0 ? '\n' : '';
101
+ appendFileSync(p, prefix + content);
102
+ }
103
+ export function saveProjectMemory(content, cwd) {
104
+ writeFileSync(paths(cwd).projectMemory, content);
105
+ }
106
+ export function appendProjectMemory(content, cwd) {
107
+ const p = paths(cwd).projectMemory;
108
+ const prefix = existsSync(p) && readFileSync(p, 'utf-8').trim().length > 0 ? '\n' : '';
109
+ appendFileSync(p, prefix + content);
110
+ }
111
+ export function savePlan(content, name, cwd) {
112
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
113
+ const fileName = name ? `${ts}-${name}.md` : `${ts}.md`;
114
+ writeFileSync(join(paths(cwd).plansDir, fileName), content);
115
+ }
116
+ export function appendHistory(message, cwd) {
117
+ const p = paths(cwd).history;
118
+ appendFileSync(p, JSON.stringify(message) + '\n');
119
+ // Rotate if over 1MB
120
+ const stat = statSync(p, { throwIfNoEntry: false });
121
+ if (stat && stat.size > 1_000_000) {
122
+ const lines = readFileSync(p, 'utf-8').split('\n').filter(Boolean);
123
+ writeFileSync(p, lines.slice(-500).join('\n') + '\n');
124
+ }
125
+ }
126
+ export function getStats(cwd) {
127
+ const p = paths(cwd);
128
+ const historyRaw = read(p.history);
129
+ return {
130
+ globalMemory: existsSync(p.globalMemory) && read(p.globalMemory).length > 0,
131
+ projectMemory: existsSync(p.projectMemory) && read(p.projectMemory).length > 0,
132
+ planCount: listPlans(cwd).length,
133
+ historyLines: historyRaw ? historyRaw.trim().split('\n').filter(Boolean).length : 0,
134
+ };
135
+ }
136
+ // ── Clear ───────────────────────────────────────────────────────────────────
137
+ export function clearProject(cwd) {
138
+ const p = paths(cwd);
139
+ for (const f of [p.projectMemory, p.history]) {
140
+ if (existsSync(f))
141
+ writeFileSync(f, '');
142
+ }
143
+ for (const plan of listPlans(cwd)) {
144
+ unlinkSync(plan.path);
145
+ }
146
+ }
147
+ export function clearAll(cwd) {
148
+ clearProject(cwd);
149
+ const p = paths(cwd);
150
+ if (existsSync(p.globalMemory))
151
+ writeFileSync(p.globalMemory, '');
152
+ }
153
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bash tool - the universal interface for system operations
3
+ */
4
+ import { Tool } from '../core/types.js';
5
+ export declare const bashTool: Tool;
6
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,eAAO,MAAM,QAAQ,EAAE,IA8BtB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Bash tool - the universal interface for system operations
3
+ */
4
+ import { execSync } from 'node:child_process';
5
+ export const bashTool = {
6
+ type: 'function',
7
+ function: {
8
+ name: 'bash',
9
+ description: 'Run a shell command. Use this for everything: reading files (cat), writing files (tee), listing dirs (ls), searching (grep/find), editing (sed), installing packages, running tests, git — anything.',
10
+ parameters: {
11
+ type: 'object',
12
+ properties: {
13
+ command: {
14
+ type: 'string',
15
+ description: 'The shell command to execute'
16
+ }
17
+ },
18
+ required: ['command']
19
+ }
20
+ },
21
+ execute: ({ command }) => {
22
+ try {
23
+ return execSync(command, {
24
+ encoding: 'utf-8',
25
+ timeout: 60_000,
26
+ maxBuffer: 1024 * 1024
27
+ }).trim();
28
+ }
29
+ catch (error) {
30
+ const status = error.status ?? 1;
31
+ const stdout = error.stdout ?? '';
32
+ const stderr = error.stderr ?? '';
33
+ return `EXIT ${status}\n${(stdout + stderr).trim()}`;
34
+ }
35
+ }
36
+ };
37
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,sMAAsM;QACnN,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAuB,EAAU,EAAE;QACpD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,EAAE;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI,GAAG,IAAI;aACvB,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAClC,OAAO,QAAQ,MAAM,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../core/types.js';
2
+ export declare function memoryTool(cwd: string): Tool;
3
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAwB5C"}
@@ -0,0 +1,27 @@
1
+ import { appendGlobalMemory, appendProjectMemory } from '../memory/memory.js';
2
+ export function memoryTool(cwd) {
3
+ return {
4
+ type: 'function',
5
+ function: {
6
+ name: 'save_memory',
7
+ description: 'Save a fact, decision, or pattern to persistent memory. Use "global" for things that apply everywhere (preferences, patterns). Use "project" for things specific to the current codebase.',
8
+ parameters: {
9
+ type: 'object',
10
+ properties: {
11
+ tier: { type: 'string', enum: ['global', 'project'], description: 'Where to store: "global" (all projects) or "project" (this codebase only)' },
12
+ content: { type: 'string', description: 'The fact, decision, or pattern to remember' }
13
+ },
14
+ required: ['tier', 'content']
15
+ }
16
+ },
17
+ execute: ({ tier, content }) => {
18
+ if (tier === 'global') {
19
+ appendGlobalMemory(content, cwd);
20
+ return `Saved to global memory.`;
21
+ }
22
+ appendProjectMemory(content, cwd);
23
+ return `Saved to project memory.`;
24
+ }
25
+ };
26
+ }
27
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,2LAA2L;YACxM,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,2EAA2E,EAAE;oBAC/I,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;iBACvF;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC9B;SACF;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAqC,EAAU,EAAE;YACxE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACjC,OAAO,yBAAyB,CAAC;YACnC,CAAC;YACD,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClC,OAAO,0BAA0B,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Tool } from '../core/types.js';
2
+ export declare function planTool(cwd: string): Tool;
3
+ export declare function listPlansTool(cwd: string): Tool;
4
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAoB1C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAwB/C"}
@@ -0,0 +1,49 @@
1
+ import { savePlan, listPlans, loadPlanByName } from '../memory/memory.js';
2
+ export function planTool(cwd) {
3
+ return {
4
+ type: 'function',
5
+ function: {
6
+ name: 'save_plan',
7
+ description: 'Save a new plan. Each plan is timestamped and kept. The most recent plan is automatically loaded as context. Use this when asked to plan something or to break down a task.',
8
+ parameters: {
9
+ type: 'object',
10
+ properties: {
11
+ content: { type: 'string', description: 'The plan content' },
12
+ name: { type: 'string', description: 'Optional short name for the plan (e.g. "refactor-cli", "add-auth")' }
13
+ },
14
+ required: ['content']
15
+ }
16
+ },
17
+ execute: ({ content, name }) => {
18
+ savePlan(content, name, cwd);
19
+ return `Plan saved.${name ? ` (${name})` : ''}`;
20
+ }
21
+ };
22
+ }
23
+ export function listPlansTool(cwd) {
24
+ return {
25
+ type: 'function',
26
+ function: {
27
+ name: 'list_plans',
28
+ description: 'List all saved plans for this project, or read a specific plan by name. Use this to review previous plans.',
29
+ parameters: {
30
+ type: 'object',
31
+ properties: {
32
+ name: { type: 'string', description: 'Optional: name of a specific plan to read. Omit to list all plans.' }
33
+ },
34
+ required: []
35
+ }
36
+ },
37
+ execute: ({ name }) => {
38
+ if (name) {
39
+ const content = loadPlanByName(name, cwd);
40
+ return content || `No plan found with name "${name}".`;
41
+ }
42
+ const plans = listPlans(cwd);
43
+ if (plans.length === 0)
44
+ return 'No plans saved yet.';
45
+ return plans.map(p => p.name).join('\n');
46
+ }
47
+ };
48
+ }
49
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,6KAA6K;YAC1L,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;oBAC5D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oEAAoE,EAAE;iBAC5G;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QACD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAsC,EAAU,EAAE;YACzE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO,cAAc,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,4GAA4G;YACzH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oEAAoE,EAAE;iBAC5G;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAqB,EAAU,EAAE;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,OAAO,IAAI,4BAA4B,IAAI,IAAI,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,qBAAqB,CAAC;YACrD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@iambarryking/ag",
3
+ "version": "3.0.0",
4
+ "description": "Persistent AI coding agent with memory - any model via OpenRouter",
5
+ "type": "module",
6
+ "bin": {
7
+ "ag": "./dist/cli.js"
8
+ },
9
+ "files": ["dist"],
10
+ "engines": {
11
+ "node": ">=18.0.0"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsc --watch",
19
+ "start": "npm run build && node dist/cli.js",
20
+ "prepublishOnly": "tsc"
21
+ },
22
+ "keywords": ["agent", "ai", "typescript", "memory-palace", "cli", "openrouter"],
23
+ "license": "MIT",
24
+ "devDependencies": {
25
+ "typescript": "^6.0.0",
26
+ "@types/node": "^25.0.0"
27
+ }
28
+ }