agent-enderun 0.2.2 → 0.2.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.
@@ -360,4 +360,28 @@
360
360
  "package.json"
361
361
  ]
362
362
  }
363
- ]
363
+ ],
364
+ {
365
+ "timestamp": "2026-05-12T18:16:03Z",
366
+ "agent": "manager",
367
+ "action": "MODIFY",
368
+ "requestId": "fa4ead74-1ab2-4d4f-884b-93cd74c9b4c8",
369
+ "status": "SUCCESS",
370
+ "summary": "Fixed missing enderun:check script in target projects, added vitest support, and included panda.config.ts in core files.",
371
+ "files": [
372
+ "bin/cli.js"
373
+ ]
374
+ }
375
+ },
376
+ {
377
+ "timestamp": "2026-05-12T18:17:33Z",
378
+ "agent": "manager",
379
+ "action": "MODIFY",
380
+ "requestId": "fa4ead74-1ab2-4d4f-884b-93cd74c9b4c8",
381
+ "status": "SUCCESS",
382
+ "summary": "Improved package localization logic to automatically rename internal packages based on the target project's name or scope during initialization.",
383
+ "files": [
384
+ "bin/cli.js"
385
+ ]
386
+ }
387
+ ]
package/ENDERUN.md CHANGED
@@ -1,4 +1,4 @@
1
- # Agent Enderun (v0.2.2)
1
+ # Agent Enderun (v0.2.4)
2
2
  # Place in project root. This file is the single source of truth for Base Project AI Extensions.
3
3
 
4
4
  ## 🎖️ AGENT CHECKLIST (MANDATORY BEFORE RESPONSE)
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # 🏛️ Agent Enderun — v0.2.2
1
+ # 🏛️ Agent Enderun — v0.2.4
2
2
 
3
3
  **The Supreme AI Governance & Orchestration Framework for Enterprise Development**
4
4
 
package/bin/cli.js CHANGED
@@ -139,6 +139,9 @@ function mergePackageJson(targetPath, sourcePath) {
139
139
  "enderun:status": "agent-enderun status",
140
140
  "enderun:trace": "agent-enderun trace:new",
141
141
  "enderun:verify": "agent-enderun verify-contract",
142
+ "enderun:check": "agent-enderun check",
143
+ "enderun:test": "vitest run",
144
+ "enderun:test:watch": "vitest",
142
145
  "enderun:build": `${runCmd} build --prefix packages/shared-types && ${runCmd} build --prefix packages/framework-mcp`,
143
146
  };
144
147
 
@@ -151,6 +154,7 @@ function mergePackageJson(targetPath, sourcePath) {
151
154
  ...(sourceDevDeps["typescript"] ? {"typescript": sourceDevDeps["typescript"]} : {}),
152
155
  ...(sourceDevDeps["@types/node"] ? {"@types/node": sourceDevDeps["@types/node"]} : {}),
153
156
  ...(sourceDevDeps["tsx"] ? {"tsx": sourceDevDeps["tsx"]} : {}),
157
+ ...(sourceDevDeps["vitest"] ? {"vitest": sourceDevDeps["vitest"]} : {}),
154
158
  "@pandacss/dev": "^0.53.0"
155
159
  });
156
160
 
@@ -321,6 +325,8 @@ async function initCommand(selectedAdapter) {
321
325
  ".env.example",
322
326
  "ENDERUN.md",
323
327
  "package.json",
328
+ "tsconfig.json",
329
+ "panda.config.ts",
324
330
  "packages/framework-mcp",
325
331
  "packages/shared-types",
326
332
  ];
@@ -378,8 +384,12 @@ async function initCommand(selectedAdapter) {
378
384
  } catch (e) {}
379
385
 
380
386
  let targetScope = "";
381
- if (targetPkg.name && targetPkg.name.startsWith("@")) {
382
- targetScope = targetPkg.name.split("/")[0];
387
+ if (targetPkg.name) {
388
+ targetScope = targetPkg.name.startsWith("@")
389
+ ? targetPkg.name.split("/")[0]
390
+ : `@${targetPkg.name}`;
391
+ } else {
392
+ targetScope = `@${path.basename(targetDir)}`;
383
393
  }
384
394
 
385
395
  for (const item of filesToProcess) {
@@ -629,15 +639,34 @@ function sanitizeJson(obj, targetScope = "") {
629
639
 
630
640
  // Replace scope if needed
631
641
  if (targetScope) {
642
+ const scopeName = targetScope.startsWith("@") ? targetScope.slice(1) : targetScope;
643
+
644
+ // Handle scoped: @ai-enderun/foo -> @target/foo
632
645
  if (typeof key === "string" && key.startsWith("@ai-enderun/")) {
633
646
  finalKey = key.replace("@ai-enderun/", `${targetScope}/`);
634
647
  }
635
- if (typeof value === "string") {
636
- if (value.startsWith("@ai-enderun/")) {
637
- finalValue = value.replace("@ai-enderun/", `${targetScope}/`);
638
- } else if (value.startsWith("workspace:")) {
639
- finalValue = "*";
640
- }
648
+ if (typeof value === "string" && value.startsWith("@ai-enderun/")) {
649
+ finalValue = value.replace("@ai-enderun/", `${targetScope}/`);
650
+ }
651
+
652
+ // Handle unscoped: ai-enderun-foo -> target-foo
653
+ if (typeof key === "string" && key.startsWith("ai-enderun-")) {
654
+ finalKey = key.replace("ai-enderun-", `${scopeName}-`);
655
+ }
656
+ if (typeof value === "string" && value.startsWith("ai-enderun-")) {
657
+ finalValue = value.replace("ai-enderun-", `${scopeName}-`);
658
+ }
659
+
660
+ // Handle agent-enderun -> target (ONLY for the package name)
661
+ if (key === "name" && value === "agent-enderun") {
662
+ finalValue = scopeName;
663
+ }
664
+
665
+ // Preserve agent-enderun in dependencies and bin
666
+ // (No action needed as finalKey/finalValue default to original)
667
+
668
+ if (typeof value === "string" && value.startsWith("workspace:")) {
669
+ finalValue = "*";
641
670
  }
642
671
  } else if (typeof value === "string" && value.startsWith("workspace:")) {
643
672
  finalValue = "*";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-enderun",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "The Supreme AI Governance & Orchestration Framework for Enterprise Development",
5
5
  "author": "Yusuf BEKAR",
6
6
  "license": "MIT",
@@ -23,7 +23,8 @@
23
23
  "framework"
24
24
  ],
25
25
  "workspaces": [
26
- "packages/*"
26
+ "packages/*",
27
+ "apps/*"
27
28
  ],
28
29
  "bin": {
29
30
  "agent-enderun": "bin/cli.js"
@@ -49,16 +50,27 @@
49
50
  ".env.example"
50
51
  ],
51
52
  "scripts": {
52
- "enderun:build": "npm run build --prefix packages/shared-types && npm run build --prefix packages/framework-mcp",
53
+ "enderun:build": "npm run build --workspaces --if-present",
54
+ "enderun:test": "vitest run",
55
+ "enderun:test:watch": "vitest",
53
56
  "enderun:status": "agent-enderun status",
54
57
  "enderun:trace": "agent-enderun trace:new",
55
- "enderun:verify": "agent-enderun verify-contract"
58
+ "enderun:verify": "agent-enderun verify-contract",
59
+ "enderun:check": "agent-enderun check",
60
+ "clean": "rm -rf node_modules packages/*/node_modules apps/*/node_modules packages/*/dist apps/*/dist"
56
61
  },
57
62
  "publishConfig": {
58
63
  "access": "public"
59
64
  },
60
65
  "dependencies": {},
61
- "devDependencies": {},
66
+ "devDependencies": {
67
+ "@types/node": "^22.13.4",
68
+ "typescript": "^5.9.3",
69
+ "tsx": "^4.19.4",
70
+ "vitest": "^3.0.5",
71
+ "eslint": "^9.20.1",
72
+ "concurrently": "^9.1.2"
73
+ },
62
74
  "enderun": {
63
75
  "version": "0.2.2",
64
76
  "initializedAt": "2026-05-09T13:24:27.472Z"
@@ -4,7 +4,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprot
4
4
  import { allTools, allHandlers } from "./tools/index.js";
5
5
  const server = new Server({
6
6
  name: "ai-enderun-mcp",
7
- version: "0.2.0",
7
+ version: "0.2.2",
8
8
  }, {
9
9
  capabilities: {
10
10
  tools: {},
@@ -98,8 +98,8 @@ export const frameworkHandlers = {
98
98
  { path: ".env.example", type: "file" },
99
99
  { path: path.join(frameworkDir, "PROJECT_MEMORY.md"), type: "file" },
100
100
  { path: path.join(frameworkDir, "BRAIN_DASHBOARD.md"), type: "file" },
101
- { path: "docs/tech-stack.md", type: "file" },
102
- { path: "docs/project-docs.md", type: "file" },
101
+ { path: path.join(frameworkDir, "docs/tech-stack.md"), type: "file" },
102
+ { path: path.join(frameworkDir, "docs/project-docs.md"), type: "file" },
103
103
  ];
104
104
  for (const item of checkPaths) {
105
105
  const fullPath = path.join(projectRoot, item.path);
@@ -1,6 +1,6 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
- export const FRAMEWORK_VERSION = "0.2.0";
3
+ export const FRAMEWORK_VERSION = "0.2.2";
4
4
  export function getFrameworkDir(projectRoot) {
5
5
  const adapters = [".gemini", ".claude", ".cursor", ".codex", ".enderun"];
6
6
  for (const adp of adapters) {
@@ -56,10 +56,18 @@ export function buildLineMatches(files, matcher, maxResults, projectRoot) {
56
56
  return matches;
57
57
  }
58
58
  export function collectMarkdownArtifacts(projectRoot) {
59
- const docsRoot = path.join(projectRoot, "docs");
60
- if (!fs.existsSync(docsRoot))
61
- return [];
62
- return collectFilesRecursively(docsRoot, new Set(["md"])).map((filePath) => path.relative(projectRoot, filePath));
59
+ const frameworkDir = getFrameworkDir(projectRoot);
60
+ const searchPaths = [
61
+ path.join(projectRoot, "docs"),
62
+ path.join(projectRoot, frameworkDir, "docs")
63
+ ];
64
+ const results = [];
65
+ for (const docsRoot of searchPaths) {
66
+ if (fs.existsSync(docsRoot)) {
67
+ results.push(...collectFilesRecursively(docsRoot, new Set(["md"])).map((filePath) => path.relative(projectRoot, filePath)));
68
+ }
69
+ }
70
+ return Array.from(new Set(results));
63
71
  }
64
72
  export function replaceSectionContent(markdown, sectionTitle, newBody) {
65
73
  const escaped = sectionTitle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-enderun-mcp",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Enterprise-grade MCP Server for AI Agent Framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -5,7 +5,7 @@ import { allTools, allHandlers } from "./tools/index.js";
5
5
 
6
6
  const server = new Server({
7
7
  name: "ai-enderun-mcp",
8
- version: "0.2.2",
8
+ version: "0.2.4",
9
9
  }, {
10
10
  capabilities: {
11
11
  tools: {},
@@ -97,8 +97,8 @@ export const frameworkHandlers = {
97
97
  { path: ".env.example", type: "file" },
98
98
  { path: path.join(frameworkDir, "PROJECT_MEMORY.md"), type: "file" },
99
99
  { path: path.join(frameworkDir, "BRAIN_DASHBOARD.md"), type: "file" },
100
- { path: "docs/tech-stack.md", type: "file" },
101
- { path: "docs/project-docs.md", type: "file" },
100
+ { path: path.join(frameworkDir, "docs/tech-stack.md"), type: "file" },
101
+ { path: path.join(frameworkDir, "docs/project-docs.md"), type: "file" },
102
102
  ];
103
103
  for (const item of checkPaths) {
104
104
  const fullPath = path.join(projectRoot, item.path);
@@ -1,7 +1,7 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
3
 
4
- export const FRAMEWORK_VERSION = "0.2.2";
4
+ export const FRAMEWORK_VERSION = "0.2.4";
5
5
 
6
6
  export function getFrameworkDir(projectRoot: string): string {
7
7
  const adapters = [".gemini", ".claude", ".cursor", ".codex", ".enderun"];
@@ -62,10 +62,19 @@ export function buildLineMatches(files: string[], matcher: (line: string) => boo
62
62
  }
63
63
 
64
64
  export function collectMarkdownArtifacts(projectRoot: string): string[] {
65
- const docsRoot = path.join(projectRoot, "docs");
66
- if (!fs.existsSync(docsRoot))
67
- return [];
68
- return collectFilesRecursively(docsRoot, new Set(["md"])).map((filePath) => path.relative(projectRoot, filePath));
65
+ const frameworkDir = getFrameworkDir(projectRoot);
66
+ const searchPaths = [
67
+ path.join(projectRoot, "docs"),
68
+ path.join(projectRoot, frameworkDir, "docs")
69
+ ];
70
+
71
+ const results: string[] = [];
72
+ for (const docsRoot of searchPaths) {
73
+ if (fs.existsSync(docsRoot)) {
74
+ results.push(...collectFilesRecursively(docsRoot, new Set(["md"])).map((filePath) => path.relative(projectRoot, filePath)));
75
+ }
76
+ }
77
+ return Array.from(new Set(results));
69
78
  }
70
79
 
71
80
  export function replaceSectionContent(markdown: string, sectionTitle: string, newBody: string): string {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-enderun/shared-types",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Shared TypeScript types for AI-Enderun Framework. Ensures Contract-First synchronization between agents.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,16 +1,8 @@
1
1
  {
2
+ "extends": "../../tsconfig.json",
2
3
  "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "Node",
6
- "declaration": true,
7
- "declarationMap": true,
8
- "sourceMap": true,
9
4
  "outDir": "./dist",
10
- "strict": true,
11
- "esModuleInterop": true,
12
- "skipLibCheck": true,
13
- "forceConsistentCasingInFileNames": true
5
+ "rootDir": "./src"
14
6
  },
15
7
  "include": ["src/**/*"],
16
8
  "exclude": ["node_modules", "dist"]