agent-enderun 1.0.2 ā 1.0.4
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/.enderun/PROJECT_MEMORY.md +1 -0
- package/.enderun/agents/manager.md +3 -1
- package/.enderun/logs/manager.json +11 -1
- package/.enderun/skills/agent_handshake.md +37 -0
- package/.enderun/skills/multi_agent_coordination.md +64 -0
- package/.enderun/skills/subagent_lifecycle.md +48 -0
- package/README.md +53 -93
- package/docs/api-referans.md +1137 -0
- package/docs/is_akislari.md +902 -0
- package/docs/mimari.md +926 -0
- package/docs/moduller.md +294 -0
- package/docs/proje.md +521 -0
- package/docs/yap/304/261.md +2150 -0
- package/gemini.md +1 -1
- package/package.json +2 -2
- package/src/cli/adapters.ts +44 -10
- package/src/cli/commands/init.ts +24 -6
- package/src/cli/utils/fs.ts +1 -0
- package/src/cli/utils/memory.ts +17 -0
package/gemini.md
CHANGED
|
@@ -19,7 +19,7 @@ At the **start of every session**, before any work:
|
|
|
19
19
|
|
|
20
20
|
### š¾ Memory Tiers
|
|
21
21
|
- **Project Memory (Shared):** `.enderun/PROJECT_MEMORY.md` is the source of truth for task history, Trace IDs, and architectural decisions. **Update this at the end of every turn.**
|
|
22
|
-
- **Private Memory (User-Specific):** Use the
|
|
22
|
+
- **Private Memory (User-Specific):** Use the local `.gitignored` memory directory (e.g. `.enderun/memory/`) for personal workflows or user-specific notes that should not be committed to Git. Never use the system's `/tmp` directory.
|
|
23
23
|
- **Project Instructions:** This `gemini.md` file contains the "Supreme Law" and coding standards.
|
|
24
24
|
|
|
25
25
|
### š”ļø Core Mandates
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-enderun",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "The Supreme AI Governance & Orchestration Framework for Enterprise Development",
|
|
5
5
|
"author": "Yusuf BEKAR",
|
|
6
6
|
"license": "MIT",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"zod": "^3.24.2"
|
|
83
83
|
},
|
|
84
84
|
"enderun": {
|
|
85
|
-
"version": "1.0.
|
|
85
|
+
"version": "1.0.4",
|
|
86
86
|
"initializedAt": "2026-05-31T09:58:25.773Z"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {}
|
package/src/cli/adapters.ts
CHANGED
|
@@ -39,7 +39,7 @@ export const ADAPTERS: Record<AdapterId, AdapterConfig> = {
|
|
|
39
39
|
frameworkDir: ".grok",
|
|
40
40
|
shimFile: "grok.md",
|
|
41
41
|
templateDir: ".enderun",
|
|
42
|
-
nestedDirs: ["plugins", "knowledge"],
|
|
42
|
+
nestedDirs: ["plugins", "agents", "knowledge"],
|
|
43
43
|
},
|
|
44
44
|
antigravity: {
|
|
45
45
|
id: "antigravity",
|
|
@@ -74,11 +74,43 @@ const SHIM_FILES = ADAPTER_IDS.map((id) => ADAPTERS[id].shimFile);
|
|
|
74
74
|
|
|
75
75
|
export function resolveAdapter(input?: string): AdapterConfig {
|
|
76
76
|
const normalized = (input || "gemini").toLowerCase() as AdapterId;
|
|
77
|
+
let config: AdapterConfig;
|
|
77
78
|
if (ADAPTER_IDS.includes(normalized)) {
|
|
78
|
-
|
|
79
|
+
config = { ...ADAPTERS[normalized] };
|
|
80
|
+
} else {
|
|
81
|
+
console.warn(`ā ļø Unknown adapter "${input}". Falling back to gemini (.gemini/).`);
|
|
82
|
+
config = { ...ADAPTERS.gemini };
|
|
79
83
|
}
|
|
80
|
-
|
|
81
|
-
|
|
84
|
+
|
|
85
|
+
// Dynamic Unified Mode Check:
|
|
86
|
+
// If a root `.enderun` folder exists, --unified flag is passed, or configured in package.json,
|
|
87
|
+
// we override `frameworkDir` to be `.enderun` to avoid folder clutter!
|
|
88
|
+
// We bypass the folder exists check if running unit tests (Vitest) to preserve test integrity.
|
|
89
|
+
const targetDir = process.cwd();
|
|
90
|
+
const enderunExists = fs.existsSync(path.join(targetDir, ".enderun"));
|
|
91
|
+
const hasUnifiedFlag = process.argv.includes("--unified");
|
|
92
|
+
const isTesting = process.env.VITEST === "true" || process.env.NODE_ENV === "test";
|
|
93
|
+
|
|
94
|
+
let forceEnderun = (enderunExists && !isTesting) || hasUnifiedFlag;
|
|
95
|
+
try {
|
|
96
|
+
const pkgPath = path.join(targetDir, "package.json");
|
|
97
|
+
if (fs.existsSync(pkgPath)) {
|
|
98
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
99
|
+
if (pkg.enderun && (pkg.enderun.frameworkDir === ".enderun" || pkg.enderun.frameworkDir === "unified")) {
|
|
100
|
+
forceEnderun = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
// ignore
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (forceEnderun) {
|
|
108
|
+
config.frameworkDir = ".enderun";
|
|
109
|
+
// Ensure standard folder names inside .enderun for universal access
|
|
110
|
+
config.nestedDirs = ["agents", "skills", "knowledge"];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return config;
|
|
82
114
|
}
|
|
83
115
|
|
|
84
116
|
export function isAdapterShimFile(fileName: string): boolean {
|
|
@@ -92,15 +124,17 @@ export function remapFrameworkContent(
|
|
|
92
124
|
): string {
|
|
93
125
|
let result = content;
|
|
94
126
|
|
|
95
|
-
// 1. Dynamic Agent Folder Mapping based on adapter
|
|
127
|
+
// 1. Dynamic Agent Folder Mapping based on adapter (Only remap if NOT in unified .enderun mode)
|
|
96
128
|
let agentFolder = "agents";
|
|
97
129
|
let knowledgeFolder = "knowledge";
|
|
98
130
|
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
131
|
+
if (frameworkDir !== ".enderun") {
|
|
132
|
+
if (adapterId === "antigravity") {
|
|
133
|
+
agentFolder = "skills";
|
|
134
|
+
knowledgeFolder = "rules";
|
|
135
|
+
} else if (adapterId === "grok") {
|
|
136
|
+
agentFolder = "plugins";
|
|
137
|
+
}
|
|
104
138
|
}
|
|
105
139
|
|
|
106
140
|
// 2. Replacements
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -202,6 +202,22 @@ export async function initCommand(adapterInput?: string, dryRun = false) {
|
|
|
202
202
|
adapter.id,
|
|
203
203
|
dryRun,
|
|
204
204
|
);
|
|
205
|
+
|
|
206
|
+
if (item === templateDir && adapter.id === "grok") {
|
|
207
|
+
const grokAgentsDest = path.join(targetDir, frameworkDir, "agents");
|
|
208
|
+
ensureDir(grokAgentsDest, dryRun);
|
|
209
|
+
copyDir(
|
|
210
|
+
path.join(src, "agents"),
|
|
211
|
+
grokAgentsDest,
|
|
212
|
+
new Set(skipFiles),
|
|
213
|
+
nonDestructive,
|
|
214
|
+
frameworkDir,
|
|
215
|
+
targetScope,
|
|
216
|
+
sanitizeJson,
|
|
217
|
+
adapter.id,
|
|
218
|
+
dryRun,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
205
221
|
} else {
|
|
206
222
|
if (item === "package.json") continue;
|
|
207
223
|
|
|
@@ -292,12 +308,13 @@ describe("Initial Setup", () => {
|
|
|
292
308
|
}
|
|
293
309
|
|
|
294
310
|
// Always scaffold Antigravity (.agents/) workspace directory for cross-compatibility with agy CLI
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
311
|
+
if (adapter.id === "antigravity" || adapter.id === "antigravity-cli") {
|
|
312
|
+
const agentsFrameworkDir = path.join(targetDir, ".agents");
|
|
313
|
+
if (!dryRun) {
|
|
314
|
+
try {
|
|
315
|
+
fs.mkdirSync(agentsFrameworkDir, { recursive: true });
|
|
316
|
+
const agentsSubdir = path.join(agentsFrameworkDir, "agents");
|
|
317
|
+
fs.mkdirSync(agentsSubdir, { recursive: true });
|
|
301
318
|
|
|
302
319
|
// Write the 12 agent folders and agent.json files
|
|
303
320
|
const allAgents = [
|
|
@@ -415,6 +432,7 @@ describe("Initial Setup", () => {
|
|
|
415
432
|
// fallback
|
|
416
433
|
}
|
|
417
434
|
}
|
|
435
|
+
}
|
|
418
436
|
|
|
419
437
|
console.warn(`\nā ${adapter.id.toUpperCase()}: Setup complete.`);
|
|
420
438
|
console.warn(` ⢠Framework runtime: ${frameworkDir}/`);
|
package/src/cli/utils/fs.ts
CHANGED
package/src/cli/utils/memory.ts
CHANGED
|
@@ -7,6 +7,23 @@ import { FRAMEWORK_DIR_CANDIDATES } from "../adapters.js";
|
|
|
7
7
|
const targetDir = process.cwd();
|
|
8
8
|
|
|
9
9
|
export function getFrameworkDir(): string {
|
|
10
|
+
// 1. Check if configured in package.json to force a single, unified framework directory
|
|
11
|
+
try {
|
|
12
|
+
const pkgPath = path.join(targetDir, "package.json");
|
|
13
|
+
if (fs.existsSync(pkgPath)) {
|
|
14
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
15
|
+
if (pkg.enderun && typeof pkg.enderun.frameworkDir === "string") {
|
|
16
|
+
const customDir = pkg.enderun.frameworkDir;
|
|
17
|
+
if (fs.existsSync(path.join(targetDir, customDir))) {
|
|
18
|
+
return customDir;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
// ignore
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 2. Fall back to dynamic candidate scanning
|
|
10
27
|
for (const dir of FRAMEWORK_DIR_CANDIDATES) {
|
|
11
28
|
const dirPath = path.join(targetDir, dir);
|
|
12
29
|
if (!fs.existsSync(dirPath)) continue;
|