agent-enderun 1.1.5 → 1.1.7
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.md +13 -10
- package/README.md +14 -31
- package/bin/run-multi-test.js +77 -0
- package/dist/framework-mcp/src/tools/dashboard/start_dashboard.d.ts +5 -0
- package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js +30 -0
- package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js.map +1 -0
- package/dist/framework-mcp/src/tools/definitions.js +118 -0
- package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.d.ts +5 -0
- package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +51 -0
- package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js.map +1 -0
- package/dist/framework-mcp/src/tools/file_system/replace_text.js +8 -4
- package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/write_file.js +3 -0
- package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/audit_deps.d.ts +6 -0
- package/dist/framework-mcp/src/tools/framework/audit_deps.js +42 -0
- package/dist/framework-mcp/src/tools/framework/audit_deps.js.map +1 -0
- package/dist/framework-mcp/src/tools/framework/run_tests.d.ts +5 -0
- package/dist/framework-mcp/src/tools/framework/run_tests.js +26 -0
- package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -0
- package/dist/framework-mcp/src/tools/index.js +24 -0
- package/dist/framework-mcp/src/tools/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/memory/get_insights.d.ts +6 -0
- package/dist/framework-mcp/src/tools/memory/get_insights.js +35 -0
- package/dist/framework-mcp/src/tools/memory/get_insights.js.map +1 -0
- package/dist/framework-mcp/src/tools/memory/read_memory.d.ts +6 -0
- package/dist/framework-mcp/src/tools/memory/read_memory.js +29 -0
- package/dist/framework-mcp/src/tools/memory/read_memory.js.map +1 -0
- package/dist/framework-mcp/src/tools/messaging/send_message.js +1 -1
- package/dist/framework-mcp/src/tools/messaging/send_message.js.map +1 -1
- package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +5 -0
- package/dist/framework-mcp/src/tools/observability/check_ports.js +27 -0
- package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -0
- package/dist/framework-mcp/src/tools/observability/get_health.d.ts +5 -0
- package/dist/framework-mcp/src/tools/observability/get_health.js +21 -0
- package/dist/framework-mcp/src/tools/observability/get_health.js.map +1 -0
- package/dist/framework-mcp/src/tools/search/get_gaps.d.ts +6 -0
- package/dist/framework-mcp/src/tools/search/get_gaps.js +49 -0
- package/dist/framework-mcp/src/tools/search/get_gaps.js.map +1 -0
- package/dist/framework-mcp/src/tools/search/get_map.d.ts +6 -0
- package/dist/framework-mcp/src/tools/search/get_map.js +45 -0
- package/dist/framework-mcp/src/tools/search/get_map.js.map +1 -0
- package/dist/framework-mcp/src/tools/search/grep_search.d.ts +5 -0
- package/dist/framework-mcp/src/tools/search/grep_search.js +60 -0
- package/dist/framework-mcp/src/tools/search/grep_search.js.map +1 -0
- package/dist/framework-mcp/src/tools/search/list_dir.d.ts +5 -0
- package/dist/framework-mcp/src/tools/search/list_dir.js +29 -0
- package/dist/framework-mcp/src/tools/search/list_dir.js.map +1 -0
- package/dist/framework-mcp/src/tools/types.d.ts +10 -5
- package/dist/framework-mcp/src/utils/compliance.d.ts +5 -0
- package/dist/framework-mcp/src/utils/compliance.js +30 -0
- package/dist/framework-mcp/src/utils/compliance.js.map +1 -0
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +5 -5
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
- package/dist/src/cli/adapters/types.d.ts +2 -2
- package/dist/src/cli/adapters.d.ts +1 -1
- package/dist/src/cli/adapters.js +45 -77
- package/dist/src/cli/adapters.js.map +1 -1
- package/dist/src/cli/commands/check.js +52 -6
- package/dist/src/cli/commands/check.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +5 -1
- package/dist/src/cli/commands/init.js +184 -106
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/orchestrate.d.ts +3 -3
- package/dist/src/cli/commands/orchestrate.js +14 -8
- package/dist/src/cli/commands/orchestrate.js.map +1 -1
- package/dist/src/cli/commands/status.js +3 -2
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/index.js +4 -3
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/shims.js +6 -6
- package/dist/src/cli/utils/app-backend.d.ts +2 -0
- package/dist/src/cli/utils/app-backend.js +236 -0
- package/dist/src/cli/utils/app-backend.js.map +1 -0
- package/dist/src/cli/utils/app-docs.d.ts +3 -0
- package/dist/src/cli/utils/app-docs.js +59 -0
- package/dist/src/cli/utils/app-docs.js.map +1 -0
- package/dist/src/cli/utils/app-frontend.d.ts +2 -0
- package/dist/src/cli/utils/app-frontend.js +248 -0
- package/dist/src/cli/utils/app-frontend.js.map +1 -0
- package/dist/src/cli/utils/app-inferrer.d.ts +14 -0
- package/dist/src/cli/utils/app-inferrer.js +39 -0
- package/dist/src/cli/utils/app-inferrer.js.map +1 -0
- package/dist/src/cli/utils/app-types.d.ts +3 -0
- package/dist/src/cli/utils/app-types.js +233 -0
- package/dist/src/cli/utils/app-types.js.map +1 -0
- package/dist/src/cli/utils/app.d.ts +5 -32
- package/dist/src/cli/utils/app.js +5 -794
- package/dist/src/cli/utils/app.js.map +1 -1
- package/dist/src/cli/utils/memory.js +8 -4
- package/dist/src/cli/utils/memory.js.map +1 -1
- package/dist/src/modules/adapters/antigravity-cli.js +3 -3
- package/dist/src/modules/adapters/antigravity-cli.js.map +1 -1
- package/dist/src/modules/adapters/claude.js +1 -1
- package/dist/src/modules/adapters/claude.js.map +1 -1
- package/dist/src/modules/adapters/codex.js +2 -2
- package/dist/src/modules/adapters/codex.js.map +1 -1
- package/dist/src/modules/adapters/cursor.js +1 -1
- package/dist/src/modules/adapters/cursor.js.map +1 -1
- package/dist/src/modules/adapters/definitions.d.ts +9 -0
- package/dist/src/modules/adapters/definitions.js +124 -0
- package/dist/src/modules/adapters/definitions.js.map +1 -0
- package/dist/src/modules/adapters/gemini.js +2 -2
- package/dist/src/modules/adapters/gemini.js.map +1 -1
- package/dist/src/modules/adapters/grok.js +1 -1
- package/dist/src/modules/adapters/grok.js.map +1 -1
- package/dist/src/modules/agents/definitions.js +26 -27
- package/dist/src/modules/agents/definitions.js.map +1 -1
- package/dist/src/shared/config.d.ts +3 -3
- package/dist/src/shared/logger.js +8 -5
- package/dist/src/shared/logger.js.map +1 -1
- package/dist/tests/adapter.test.d.ts +1 -0
- package/dist/tests/adapter.test.js +129 -0
- package/dist/tests/adapter.test.js.map +1 -0
- package/dist/tests/agents-definitions.test.d.ts +1 -0
- package/dist/tests/agents-definitions.test.js +54 -0
- package/dist/tests/agents-definitions.test.js.map +1 -0
- package/dist/tests/approve.test.d.ts +1 -0
- package/dist/tests/approve.test.js +88 -0
- package/dist/tests/approve.test.js.map +1 -0
- package/dist/tests/config.test.d.ts +1 -0
- package/dist/tests/config.test.js +58 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/container.runner.d.ts +1 -0
- package/dist/tests/container.runner.js +68 -0
- package/dist/tests/container.runner.js.map +1 -0
- package/dist/tests/container.test.d.ts +1 -0
- package/dist/tests/container.test.js +73 -0
- package/dist/tests/container.test.js.map +1 -0
- package/dist/tests/errors.test.d.ts +1 -0
- package/dist/tests/errors.test.js +64 -0
- package/dist/tests/errors.test.js.map +1 -0
- package/dist/tests/fs-utils.test.d.ts +1 -0
- package/dist/tests/fs-utils.test.js +101 -0
- package/dist/tests/fs-utils.test.js.map +1 -0
- package/dist/tests/logger.test.d.ts +1 -0
- package/dist/tests/logger.test.js +81 -0
- package/dist/tests/logger.test.js.map +1 -0
- package/dist/tests/memory-utils.test.d.ts +1 -0
- package/dist/tests/memory-utils.test.js +173 -0
- package/dist/tests/memory-utils.test.js.map +1 -0
- package/dist/tests/orchestrate.test.d.ts +1 -0
- package/dist/tests/orchestrate.test.js +131 -0
- package/dist/tests/orchestrate.test.js.map +1 -0
- package/dist/tests/skills-definitions.test.d.ts +1 -0
- package/dist/tests/skills-definitions.test.js +34 -0
- package/dist/tests/skills-definitions.test.js.map +1 -0
- package/dist/tests/status.test.d.ts +1 -0
- package/dist/tests/status.test.js +105 -0
- package/dist/tests/status.test.js.map +1 -0
- package/dist/tests/string.test.d.ts +1 -0
- package/dist/tests/string.test.js +89 -0
- package/dist/tests/string.test.js.map +1 -0
- package/dist/tests/time.test.d.ts +1 -0
- package/dist/tests/time.test.js +48 -0
- package/dist/tests/time.test.js.map +1 -0
- package/dist/tests/trace.test.d.ts +1 -0
- package/dist/tests/trace.test.js +61 -0
- package/dist/tests/trace.test.js.map +1 -0
- package/dist/vitest.config.js +1 -0
- package/dist/vitest.config.js.map +1 -1
- package/docs/getting-started.md +4 -0
- package/docs/user/corporate-governance.md +25 -0
- package/framework-mcp/dist/tools/dashboard/start_dashboard.js +29 -0
- package/framework-mcp/dist/tools/definitions.js +118 -0
- package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +50 -0
- package/framework-mcp/dist/tools/file_system/replace_text.js +8 -4
- package/framework-mcp/dist/tools/file_system/write_file.js +3 -0
- package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
- package/framework-mcp/dist/tools/framework/run_tests.js +25 -0
- package/framework-mcp/dist/tools/index.js +24 -0
- package/framework-mcp/dist/tools/memory/get_insights.js +34 -0
- package/framework-mcp/dist/tools/memory/read_memory.js +28 -0
- package/framework-mcp/dist/tools/messaging/send_message.js +1 -1
- package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
- package/framework-mcp/dist/tools/observability/get_health.js +20 -0
- package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
- package/framework-mcp/dist/tools/search/get_map.js +44 -0
- package/framework-mcp/dist/tools/search/grep_search.js +59 -0
- package/framework-mcp/dist/tools/search/list_dir.js +28 -0
- package/framework-mcp/dist/utils/compliance.js +29 -0
- package/framework-mcp/package.json +1 -1
- package/framework-mcp/src/tools/dashboard/start_dashboard.ts +33 -0
- package/framework-mcp/src/tools/definitions.ts +118 -0
- package/framework-mcp/src/tools/file_system/batch_surgical_edit.ts +70 -0
- package/framework-mcp/src/tools/file_system/replace_text.ts +10 -4
- package/framework-mcp/src/tools/file_system/write_file.ts +5 -0
- package/framework-mcp/src/tools/framework/audit_deps.ts +49 -0
- package/framework-mcp/src/tools/framework/run_tests.ts +28 -0
- package/framework-mcp/src/tools/index.ts +24 -0
- package/framework-mcp/src/tools/memory/get_insights.ts +41 -0
- package/framework-mcp/src/tools/memory/read_memory.ts +31 -0
- package/framework-mcp/src/tools/messaging/send_message.ts +1 -1
- package/framework-mcp/src/tools/observability/check_ports.ts +30 -0
- package/framework-mcp/src/tools/observability/get_health.ts +25 -0
- package/framework-mcp/src/tools/search/get_gaps.ts +54 -0
- package/framework-mcp/src/tools/search/get_map.ts +50 -0
- package/framework-mcp/src/tools/search/grep_search.ts +66 -0
- package/framework-mcp/src/tools/search/list_dir.ts +34 -0
- package/framework-mcp/src/tools/types.ts +11 -1
- package/framework-mcp/src/utils/compliance.ts +37 -0
- package/framework-mcp/tests/tools/messaging/send_message.test.ts +5 -5
- package/package.json +3 -3
- package/src/cli/adapters/types.ts +2 -2
- package/src/cli/adapters.ts +45 -80
- package/src/cli/commands/check.ts +52 -6
- package/src/cli/commands/init.ts +193 -114
- package/src/cli/commands/orchestrate.ts +14 -8
- package/src/cli/commands/status.ts +3 -2
- package/src/cli/index.ts +4 -3
- package/src/cli/shims.ts +6 -6
- package/src/cli/utils/app-backend.ts +249 -0
- package/src/cli/utils/app-docs.ts +65 -0
- package/src/cli/utils/app-frontend.ts +257 -0
- package/src/cli/utils/app-inferrer.ts +53 -0
- package/src/cli/utils/app-types.ts +243 -0
- package/src/cli/utils/app.ts +5 -849
- package/src/cli/utils/memory.ts +8 -4
- package/src/modules/adapters/definitions.ts +125 -0
- package/src/modules/agents/definitions.ts +26 -27
- package/src/shared/logger.ts +8 -5
- package/templates/prompts/bug-fix-recipe.md +20 -0
- package/templates/prompts/new-feature-recipe.md +19 -0
- package/templates/prompts/refactoring-recipe.md +21 -0
- package/templates/standards/architecture-standards.md +23 -0
- package/templates/standards/crud-governance.md +21 -0
- package/templates/standards/frontend-standards.md +38 -0
- package/templates/standards/i18n-standards.md +17 -0
- package/templates/standards/logging-and-secrets.md +29 -0
- package/templates/standards/mobile-standards.md +24 -0
- package/templates/standards/quality-standards.md +31 -0
- package/templates/standards/security-standards.md +21 -0
- package/templates/standards/tailwind-standards.md +20 -0
- package/templates/standards/testing-standards.md +31 -0
- package/src/modules/adapters/antigravity-cli.ts +0 -25
- package/src/modules/adapters/claude.ts +0 -36
- package/src/modules/adapters/codex.ts +0 -22
- package/src/modules/adapters/cursor.ts +0 -22
- package/src/modules/adapters/gemini.ts +0 -27
- package/src/modules/adapters/grok.ts +0 -20
- package/templates/architecture/agents-manifest.md +0 -79
- package/templates/architecture/approval-flows.md +0 -61
- package/templates/architecture/enterprise-architecture.md +0 -69
- package/templates/architecture/standards/crud-governance.md +0 -46
- package/templates/architecture/standards/data-fetching-patterns.md +0 -13
- package/templates/architecture/standards/design-system.md +0 -31
- package/templates/architecture/standards/documentation-ownership.md +0 -21
- package/templates/architecture/standards/logging.md +0 -7
- package/templates/architecture/standards/mobile-standards.md +0 -48
- package/templates/architecture/standards/tech-stack.md +0 -9
- package/templates/backend/error-handling.md +0 -74
- package/templates/frontend/component-patterns.md +0 -91
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { CORE_SKILLS } from "../src/modules/skills/definitions.js";
|
|
3
|
+
describe("Skills Definitions", () => {
|
|
4
|
+
it("should define all core skills with proper keys", () => {
|
|
5
|
+
const keys = Object.keys(CORE_SKILLS);
|
|
6
|
+
expect(keys).toContain("FILE_SYSTEM");
|
|
7
|
+
expect(keys).toContain("EDITING");
|
|
8
|
+
expect(keys).toContain("ORCHESTRATION");
|
|
9
|
+
expect(keys).toContain("GOVERNANCE");
|
|
10
|
+
expect(keys).toContain("QUALITY_ASSURANCE");
|
|
11
|
+
expect(keys).toContain("DATABASE_MANAGEMENT");
|
|
12
|
+
expect(keys).toContain("DEVOPS_INFRASTRUCTURE");
|
|
13
|
+
});
|
|
14
|
+
it("should ensure all skills have valid properties, mandates and tools", () => {
|
|
15
|
+
for (const [key, skill] of Object.entries(CORE_SKILLS)) {
|
|
16
|
+
expect(skill.name).toBeTypeOf("string");
|
|
17
|
+
expect(skill.name.length).toBeGreaterThan(0);
|
|
18
|
+
expect(skill.description).toBeTypeOf("string");
|
|
19
|
+
expect(skill.description.length).toBeGreaterThan(0);
|
|
20
|
+
expect(Array.isArray(skill.tools)).toBe(true);
|
|
21
|
+
expect(skill.tools.length).toBeGreaterThan(0);
|
|
22
|
+
for (const tool of skill.tools) {
|
|
23
|
+
expect(tool).toBeTypeOf("string");
|
|
24
|
+
}
|
|
25
|
+
expect(Array.isArray(skill.mandates)).toBe(true);
|
|
26
|
+
expect(skill.mandates.length).toBeGreaterThan(0);
|
|
27
|
+
for (const mandate of skill.mandates) {
|
|
28
|
+
expect(mandate).toBeTypeOf("string");
|
|
29
|
+
expect(mandate.length).toBeGreaterThan(0);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=skills-definitions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-definitions.test.js","sourceRoot":"","sources":["../../tests/skills-definitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { statusCommand } from "../src/cli/commands/status.js";
|
|
5
|
+
describe("Status Command", () => {
|
|
6
|
+
const tempDir = path.join(process.cwd(), "tests", "temp-status-test");
|
|
7
|
+
let cwdSpy;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.resetModules();
|
|
10
|
+
if (!fs.existsSync(tempDir)) {
|
|
11
|
+
fs.mkdirSync(tempDir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
cwdSpy = vi.spyOn(process, "cwd").mockReturnValue(tempDir);
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
cwdSpy.mockRestore();
|
|
17
|
+
if (fs.existsSync(tempDir)) {
|
|
18
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
it("should print error if PROJECT_MEMORY.md is missing", async () => {
|
|
22
|
+
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
23
|
+
statusCommand();
|
|
24
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("PROJECT_MEMORY.md not found"));
|
|
25
|
+
consoleErrorSpy.mockRestore();
|
|
26
|
+
});
|
|
27
|
+
it("should parse Table Style status correctly", async () => {
|
|
28
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
29
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
30
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
31
|
+
const tableMemory = `## STATUS
|
|
32
|
+
| Active Phase | Profile | Last Update | Active Trace ID | Blockers |
|
|
33
|
+
| :----------- | :------ | :---------- | :-------------- | :------- |
|
|
34
|
+
| Phase 1 | Dev | 2024-06-07 | 01HY7Y2A00ABC | None |
|
|
35
|
+
|
|
36
|
+
## ACTIVE TASKS
|
|
37
|
+
| Task 1 |
|
|
38
|
+
`;
|
|
39
|
+
fs.writeFileSync(memoryPath, tableMemory);
|
|
40
|
+
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
41
|
+
statusCommand();
|
|
42
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Phase: Phase 1"));
|
|
43
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Profile: Dev"));
|
|
44
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Trace ID: 01HY7Y2A00ABC"));
|
|
45
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Blockers: None"));
|
|
46
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Active Tasks:"));
|
|
47
|
+
consoleWarnSpy.mockRestore();
|
|
48
|
+
});
|
|
49
|
+
it("should parse List Style status and render manager state correctly", async () => {
|
|
50
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
51
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
52
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
53
|
+
const listMemory = `## STATUS
|
|
54
|
+
- Phase: Phase 2
|
|
55
|
+
- Profile: Prod
|
|
56
|
+
- Last Update: 2024-06-08
|
|
57
|
+
- Trace ID: 01HY7Y2A00XYZ
|
|
58
|
+
- Blockers: High CPU
|
|
59
|
+
- @manager state: EXECUTING
|
|
60
|
+
`;
|
|
61
|
+
fs.writeFileSync(memoryPath, listMemory);
|
|
62
|
+
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
63
|
+
statusCommand();
|
|
64
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Phase: Phase 2"));
|
|
65
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Profile: Prod"));
|
|
66
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Trace ID: 01HY7Y2A00XYZ"));
|
|
67
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Blockers: High CPU"));
|
|
68
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Manager: EXECUTING"));
|
|
69
|
+
consoleWarnSpy.mockRestore();
|
|
70
|
+
});
|
|
71
|
+
it("should print warning when format is unrecognized", async () => {
|
|
72
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
73
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
74
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
75
|
+
fs.writeFileSync(memoryPath, "## STATUS\nRandom text that matches no format.\n");
|
|
76
|
+
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
77
|
+
statusCommand();
|
|
78
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Status data could not be parsed"));
|
|
79
|
+
consoleWarnSpy.mockRestore();
|
|
80
|
+
});
|
|
81
|
+
it("should display Enderun Army Status if STATUS.md exists", async () => {
|
|
82
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
83
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
84
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
85
|
+
fs.writeFileSync(memoryPath, "## STATUS\n- Phase: Phase 1\n");
|
|
86
|
+
const statusPath = path.join(frameworkDir, "STATUS.md");
|
|
87
|
+
const statusContent = `
|
|
88
|
+
# Status Log
|
|
89
|
+
| Agent | State | Active Task |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| @manager | READY | Idle |
|
|
92
|
+
| @coder | EXECUTING | Writing Tests |
|
|
93
|
+
| @tester | BLOCKED | Sandbox issue |
|
|
94
|
+
`;
|
|
95
|
+
fs.writeFileSync(statusPath, statusContent);
|
|
96
|
+
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
97
|
+
statusCommand();
|
|
98
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Enderun Army Status"));
|
|
99
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@manager"));
|
|
100
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@coder"));
|
|
101
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@tester"));
|
|
102
|
+
consoleWarnSpy.mockRestore();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../tests/status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { insertTaskRow, sanitizeTableCell, normalizeAgentName, normalizePriority, slugifyName, titleCase } from "../src/cli/utils/string.js";
|
|
3
|
+
describe("String Utilities", () => {
|
|
4
|
+
describe("insertTaskRow", () => {
|
|
5
|
+
it("should insert a row directly under the active tasks table divider", () => {
|
|
6
|
+
const memoryContent = "## ACTIVE TASKS\n| Task | Status |\n| :--- | :--- | :--- | :--- | :--- |\n| Existing Task | Done |\n";
|
|
7
|
+
const row = "| New Task | Pending |";
|
|
8
|
+
const result = insertTaskRow(memoryContent, row);
|
|
9
|
+
expect(result).toBe("## ACTIVE TASKS\n| Task | Status |\n| :--- | :--- | :--- | :--- | :--- |\n| New Task | Pending |\n| Existing Task | Done |\n");
|
|
10
|
+
});
|
|
11
|
+
it("should return null if ## ACTIVE TASKS section is missing", () => {
|
|
12
|
+
const memoryContent = "## TASKS\n| :--- | :--- | :--- | :--- | :--- |\n";
|
|
13
|
+
const result = insertTaskRow(memoryContent, "| Row |");
|
|
14
|
+
expect(result).toBeNull();
|
|
15
|
+
});
|
|
16
|
+
it("should return null if table divider is missing", () => {
|
|
17
|
+
const memoryContent = "## ACTIVE TASKS\n| Task | Status |\n";
|
|
18
|
+
const result = insertTaskRow(memoryContent, "| Row |");
|
|
19
|
+
expect(result).toBeNull();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe("sanitizeTableCell", () => {
|
|
23
|
+
it("should escape vertical pipes", () => {
|
|
24
|
+
expect(sanitizeTableCell("Value | with | pipes")).toBe("Value \\| with \\| pipes");
|
|
25
|
+
});
|
|
26
|
+
it("should replace newlines with spaces", () => {
|
|
27
|
+
expect(sanitizeTableCell("Line 1\nLine 2\r\nLine 3")).toBe("Line 1 Line 2 Line 3");
|
|
28
|
+
});
|
|
29
|
+
it("should trim surrounding whitespace", () => {
|
|
30
|
+
expect(sanitizeTableCell(" some value ")).toBe("some value");
|
|
31
|
+
});
|
|
32
|
+
it("should handle non-string inputs", () => {
|
|
33
|
+
expect(sanitizeTableCell(12345)).toBe("12345");
|
|
34
|
+
expect(sanitizeTableCell(true)).toBe("true");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("normalizeAgentName", () => {
|
|
38
|
+
it("should remove leading @ symbols", () => {
|
|
39
|
+
expect(normalizeAgentName("@manager")).toBe("manager");
|
|
40
|
+
expect(normalizeAgentName("@@@coder")).toBe("coder");
|
|
41
|
+
});
|
|
42
|
+
it("should fallback to manager if name is empty, null or undefined", () => {
|
|
43
|
+
expect(normalizeAgentName(undefined)).toBe("manager");
|
|
44
|
+
expect(normalizeAgentName(null)).toBe("manager");
|
|
45
|
+
expect(normalizeAgentName("")).toBe("manager");
|
|
46
|
+
expect(normalizeAgentName(" ")).toBe("manager");
|
|
47
|
+
});
|
|
48
|
+
it("should trim whitespace", () => {
|
|
49
|
+
expect(normalizeAgentName(" coder ")).toBe("coder");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("normalizePriority", () => {
|
|
53
|
+
it("should accept valid priorities P0, P1, P2, P3", () => {
|
|
54
|
+
expect(normalizePriority("P0")).toBe("P0");
|
|
55
|
+
expect(normalizePriority("p1")).toBe("P1");
|
|
56
|
+
expect(normalizePriority(" P3 ")).toBe("P3");
|
|
57
|
+
});
|
|
58
|
+
it("should fallback to P2 for invalid priorities", () => {
|
|
59
|
+
expect(normalizePriority("P4")).toBe("P2");
|
|
60
|
+
expect(normalizePriority("invalid")).toBe("P2");
|
|
61
|
+
expect(normalizePriority(null)).toBe("P2");
|
|
62
|
+
expect(normalizePriority(undefined)).toBe("P2");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("slugifyName", () => {
|
|
66
|
+
it("should convert to lowercase, replace special chars with hyphens and trim hyphens", () => {
|
|
67
|
+
expect(slugifyName("Enderun App Core")).toBe("enderun-app-core");
|
|
68
|
+
expect(slugifyName("Agent-Manager_123!")).toBe("agent-manager-123");
|
|
69
|
+
expect(slugifyName("---Leading-Trailing---")).toBe("leading-trailing");
|
|
70
|
+
});
|
|
71
|
+
it("should fallback to enderun-app for empty or invalid slugs", () => {
|
|
72
|
+
expect(slugifyName("")).toBe("enderun-app");
|
|
73
|
+
expect(slugifyName("!!!")).toBe("enderun-app");
|
|
74
|
+
expect(slugifyName(null)).toBe("enderun-app");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe("titleCase", () => {
|
|
78
|
+
it("should format string to Title Case and handle delimiters", () => {
|
|
79
|
+
expect(titleCase("enderun-app-core")).toBe("Enderun App Core");
|
|
80
|
+
expect(titleCase("agent_manager_test")).toBe("Agent Manager Test");
|
|
81
|
+
expect(titleCase(" multiple spaces ")).toBe("Multiple Spaces");
|
|
82
|
+
});
|
|
83
|
+
it("should fallback to Enderun App for empty input", () => {
|
|
84
|
+
expect(titleCase("")).toBe("Enderun App");
|
|
85
|
+
expect(titleCase(null)).toBe("Enderun App");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=string.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.test.js","sourceRoot":"","sources":["../../tests/string.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateULID, sleep } from "../src/cli/utils/time.js";
|
|
3
|
+
describe("Time Utilities", () => {
|
|
4
|
+
describe("generateULID", () => {
|
|
5
|
+
const CROCKFORD_BASE32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
6
|
+
it("should generate a 26 character string", () => {
|
|
7
|
+
const ulid = generateULID();
|
|
8
|
+
expect(ulid).toHaveLength(26);
|
|
9
|
+
});
|
|
10
|
+
it("should only contain valid Crockford's base32 characters (excluding I, L, O, U)", () => {
|
|
11
|
+
const ulid = generateULID();
|
|
12
|
+
for (const char of ulid) {
|
|
13
|
+
expect(CROCKFORD_BASE32).toContain(char);
|
|
14
|
+
expect("ILOU").not.toContain(char);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it("should be deterministic when given a seed time and seed number", () => {
|
|
18
|
+
const seedTime = 1717718400000; // 2024-06-07T00:00:00.000Z
|
|
19
|
+
const seed = 42;
|
|
20
|
+
const ulid1 = generateULID(seedTime, seed);
|
|
21
|
+
const ulid2 = generateULID(seedTime, seed);
|
|
22
|
+
expect(ulid1).toBe(ulid2);
|
|
23
|
+
expect(ulid1).toHaveLength(26);
|
|
24
|
+
// Ensure first 10 chars encode seedTime correctly in base32
|
|
25
|
+
expect(ulid1.substring(0, 10)).toBe("01HY7Y2A00");
|
|
26
|
+
});
|
|
27
|
+
it("should generate different random parts without a seed even at the same seedTime", () => {
|
|
28
|
+
const seedTime = Date.now();
|
|
29
|
+
const ulid1 = generateULID(seedTime);
|
|
30
|
+
const ulid2 = generateULID(seedTime);
|
|
31
|
+
expect(ulid1).not.toBe(ulid2);
|
|
32
|
+
expect(ulid1.substring(0, 10)).toBe(ulid2.substring(0, 10)); // Time part must be equal
|
|
33
|
+
expect(ulid1.substring(10)).not.toBe(ulid2.substring(10)); // Random part must differ
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("sleep", () => {
|
|
37
|
+
it("should delay execution by approximately the specified time", () => {
|
|
38
|
+
const start = Date.now();
|
|
39
|
+
const delay = 50; // 50ms
|
|
40
|
+
sleep(delay);
|
|
41
|
+
const duration = Date.now() - start;
|
|
42
|
+
// Atomics.wait is quite precise, but let's give a generous buffer for CI
|
|
43
|
+
expect(duration).toBeGreaterThanOrEqual(delay - 5);
|
|
44
|
+
expect(duration).toBeLessThanOrEqual(delay + 50);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=time.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.test.js","sourceRoot":"","sources":["../../tests/time.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { traceNewCommand } from "../src/cli/commands/trace.js";
|
|
5
|
+
describe("Trace Command", () => {
|
|
6
|
+
const tempDir = path.join(process.cwd(), "tests", "temp-trace-test");
|
|
7
|
+
let cwdSpy;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.resetModules();
|
|
10
|
+
if (!fs.existsSync(tempDir)) {
|
|
11
|
+
fs.mkdirSync(tempDir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
cwdSpy = vi.spyOn(process, "cwd").mockReturnValue(tempDir);
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
cwdSpy.mockRestore();
|
|
17
|
+
if (fs.existsSync(tempDir)) {
|
|
18
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
it("should print error if PROJECT_MEMORY.md is missing", async () => {
|
|
22
|
+
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
23
|
+
const result = traceNewCommand("Test description");
|
|
24
|
+
expect(result).toBeUndefined();
|
|
25
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("PROJECT_MEMORY.md not found"));
|
|
26
|
+
consoleErrorSpy.mockRestore();
|
|
27
|
+
});
|
|
28
|
+
it("should print error if ACTIVE TASKS table is missing in PROJECT_MEMORY.md", async () => {
|
|
29
|
+
// Setup mock environment structure
|
|
30
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
31
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
32
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
33
|
+
fs.writeFileSync(memoryPath, "# PROJECT MEMORY\nNo tasks table here.\n");
|
|
34
|
+
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
35
|
+
const result = traceNewCommand("Test description");
|
|
36
|
+
expect(result).toBeUndefined();
|
|
37
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("ACTIVE TASKS table not found"));
|
|
38
|
+
consoleErrorSpy.mockRestore();
|
|
39
|
+
});
|
|
40
|
+
it("should successfully generate Trace ID and add task to table", async () => {
|
|
41
|
+
const frameworkDir = path.join(tempDir, ".gemini");
|
|
42
|
+
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
43
|
+
const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
|
|
44
|
+
// Setup proper template with ACTIVE TASKS table
|
|
45
|
+
const template = "## CURRENT STATUS\n\n## ACTIVE TASKS\n| Trace ID | Description | Agent | Priority | Status |\n| :--- | :--- | :--- | :--- | :--- |\n";
|
|
46
|
+
fs.writeFileSync(memoryPath, template);
|
|
47
|
+
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
48
|
+
const traceId = traceNewCommand("Implement tests", "coder", "P1");
|
|
49
|
+
expect(traceId).toBeDefined();
|
|
50
|
+
expect(typeof traceId).toBe("string");
|
|
51
|
+
expect(traceId).toHaveLength(26);
|
|
52
|
+
const updatedContent = fs.readFileSync(memoryPath, "utf8");
|
|
53
|
+
expect(updatedContent).toContain(traceId);
|
|
54
|
+
expect(updatedContent).toContain("Implement tests");
|
|
55
|
+
expect(updatedContent).toContain("@coder");
|
|
56
|
+
expect(updatedContent).toContain("P1");
|
|
57
|
+
expect(updatedContent).toContain("IN_PROGRESS");
|
|
58
|
+
consoleWarnSpy.mockRestore();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=trace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.test.js","sourceRoot":"","sources":["../../tests/trace.test.ts"],"names":[],"mappings":"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"}
|
package/dist/vitest.config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;QACnE,QAAQ,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,UAAU,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;aACjB;SACJ;KACJ;CACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;QACnE,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,UAAU,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;aACjB;SACJ;KACJ;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 🏛️ Kurumsal Yönetim Asistanı Kurulum Rehberi
|
|
2
|
+
|
|
3
|
+
Agent Enderun, projenize entegre edildiğinde sadece kod yazmakla kalmaz, aynı zamanda kurumsal standartlarınızı koruyan bir **Yönetim Asistanı** (AL Assistant) olarak görev yapar.
|
|
4
|
+
|
|
5
|
+
## 🚀 Nasıl Çalışır?
|
|
6
|
+
|
|
7
|
+
1. **İlklendirme:** `npx agent-enderun init gemini --unified` komutunu çalıştırdığınızda, kurumsal standartlar `.gemini/knowledge/` dizinine otomatik olarak kopyalanır.
|
|
8
|
+
2. **Ajan Disiplini:** `@manager` ajanı, tüm geliştirmeleri bu standartlara göre denetler. Eğer bir uzman ajan (örn: `@backend`) kurumsal kurallara aykırı bir işlem yapmaya çalışırsa (örn: `any` tipi kullanmak veya doğrudan DB silme işlemi), `@manager` bu işlemi durdurur ve onay mekanizmasını tetikler.
|
|
9
|
+
3. **AL (Agent Lifecycle):** Projeniz Faz 0'dan Faz 4'e kadar disiplinli bir şekilde ilerler.
|
|
10
|
+
|
|
11
|
+
## 🛠️ Standartları Özelleştirme
|
|
12
|
+
|
|
13
|
+
Kendi kurumsal kurallarınızı eklemek için şu dosyaları düzenleyebilirsiniz:
|
|
14
|
+
- `.gemini/knowledge/crud-governance.md`: Veri erişim ve güvenlik kuralları.
|
|
15
|
+
- `.gemini/knowledge/architecture-standards.md`: Mimari katman ve teknoloji standartları.
|
|
16
|
+
- `ENDERUN.md`: Projenin genel anayasası.
|
|
17
|
+
|
|
18
|
+
## 🎖️ Denetim Komutları
|
|
19
|
+
|
|
20
|
+
- `agent-enderun check`: Projenin kurumsal standartlara ve dosya yapısına uyumunu denetler.
|
|
21
|
+
- `agent-enderun status`: Aktif fazı ve ajanların durumunu gösterir.
|
|
22
|
+
- `agent-enderun approve [TraceID]`: `@manager` tarafından durdurulan yüksek riskli işlemler için insan onayı verir.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
*Agent Enderun ile projeleriniz kurumsal disiplin altında, otonom ve güvenli bir şekilde büyür.*
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { exec } from "child_process";
|
|
4
|
+
/**
|
|
5
|
+
* Starts the Enderun Web Dashboard server.
|
|
6
|
+
*/
|
|
7
|
+
export function handleStartDashboard(projectRoot, args) {
|
|
8
|
+
const port = args.port || 5858;
|
|
9
|
+
const dashboardScript = path.join(projectRoot, "bin/enderun-dashboard.js");
|
|
10
|
+
if (!fs.existsSync(dashboardScript)) {
|
|
11
|
+
throw new Error("Dashboard server script not found in bin/enderun-dashboard.js");
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
// Start the dashboard as a background process
|
|
15
|
+
exec(`node "${dashboardScript}"`, {
|
|
16
|
+
cwd: projectRoot,
|
|
17
|
+
env: { ...process.env, PORT: String(port) }
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
content: [{
|
|
21
|
+
type: "text",
|
|
22
|
+
text: `🖥️ **Enderun Web Dashboard started!**\n\nAccess it at: http://localhost:${port}\n\nThis interface will show real-time agent status, system health, and orchestration logs.`
|
|
23
|
+
}]
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return { isError: true, content: [{ type: "text", text: `Failed to start dashboard: ${String(e)}` }] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -12,6 +12,29 @@ export const TOOLS = [
|
|
|
12
12
|
required: ["path"],
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
|
+
{
|
|
16
|
+
name: "list_dir",
|
|
17
|
+
description: "List the contents of a directory. Essential for codebase exploration.",
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
path: { type: "string", description: "Path to the directory relative to project root (default: '.')" },
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "grep_search",
|
|
27
|
+
description: "Perform a recursive regex search across the codebase to find functions, variables, or patterns.",
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
pattern: { type: "string", description: "The regex pattern to search for" },
|
|
32
|
+
includePattern: { type: "string", description: "Optional: Filter files by extension (e.g., '.ts')" },
|
|
33
|
+
excludePattern: { type: "string", description: "Optional: Directory pattern to exclude (default: 'node_modules')" },
|
|
34
|
+
},
|
|
35
|
+
required: ["pattern"],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
15
38
|
{
|
|
16
39
|
name: "write_file",
|
|
17
40
|
description: "Write content to a file. Creates directories if missing.",
|
|
@@ -33,10 +56,34 @@ export const TOOLS = [
|
|
|
33
56
|
path: { type: "string", description: "Path to the file" },
|
|
34
57
|
oldText: { type: "string", description: "The exact text to find" },
|
|
35
58
|
newText: { type: "string", description: "The text to replace it with" },
|
|
59
|
+
allowMultiple: { type: "boolean", description: "Allow multiple replacements if oldText is not unique." }
|
|
36
60
|
},
|
|
37
61
|
required: ["path", "oldText", "newText"],
|
|
38
62
|
},
|
|
39
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: "batch_surgical_edit",
|
|
66
|
+
description: "Perform multiple surgical text replacements across multiple files in a single batch request. More efficient for cross-cutting changes.",
|
|
67
|
+
inputSchema: {
|
|
68
|
+
type: "object",
|
|
69
|
+
properties: {
|
|
70
|
+
edits: {
|
|
71
|
+
type: "array",
|
|
72
|
+
items: {
|
|
73
|
+
type: "object",
|
|
74
|
+
properties: {
|
|
75
|
+
path: { type: "string", description: "Path to the file" },
|
|
76
|
+
oldText: { type: "string", description: "The exact text to find" },
|
|
77
|
+
newText: { type: "string", description: "The text to replace it with" },
|
|
78
|
+
allowMultiple: { type: "boolean", description: "Allow multiple replacements in this file." }
|
|
79
|
+
},
|
|
80
|
+
required: ["path", "oldText", "newText"]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
required: ["edits"],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
40
87
|
{
|
|
41
88
|
name: "patch_file",
|
|
42
89
|
description: "Safely update a file by replacing a specific line range with new content.",
|
|
@@ -51,11 +98,82 @@ export const TOOLS = [
|
|
|
51
98
|
required: ["path", "startLine", "endLine", "newContent"],
|
|
52
99
|
},
|
|
53
100
|
},
|
|
101
|
+
{
|
|
102
|
+
name: "get_project_map",
|
|
103
|
+
description: "Generate a tree-view map of the project structure to visualize the layout. Useful for onboarding and architectural analysis.",
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: "object",
|
|
106
|
+
properties: {
|
|
107
|
+
maxDepth: { type: "number", description: "Maximum directory depth to scan (default: 3)" },
|
|
108
|
+
includeFiles: { type: "boolean", description: "Whether to include files in the map (default: true)" }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "get_project_gaps",
|
|
114
|
+
description: "Scans the codebase for TODOs, FIXMEs, and empty function bodies. Helps identify what is left and where the agent might have skipped logic.",
|
|
115
|
+
inputSchema: {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
path: { type: "string", description: "Path to the source directory (default: 'src')" },
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "audit_dependencies",
|
|
124
|
+
description: "Audits package.json for unused, redundant, or duplicate-like packages to ensure a clean dependency tree.",
|
|
125
|
+
inputSchema: { type: "object", properties: {} },
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: "run_tests",
|
|
129
|
+
description: "Execute project test suites (Vitest, Playwright, etc.) and capture detailed pass/fail reports for analysis.",
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
command: { type: "string", description: "The test command to run (default: 'npm test')" }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "get_system_health",
|
|
139
|
+
description: "Retrieve real-time system metrics like CPU load, RAM usage, and uptime.",
|
|
140
|
+
inputSchema: { type: "object", properties: {} }
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "check_active_ports",
|
|
144
|
+
description: "Identify which network ports are currently active and listening. Helps verify if the dev server or API is running.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
type: "object",
|
|
147
|
+
properties: {
|
|
148
|
+
filter: { type: "string", description: "Optional: Filter results by port number or service name (e.g., ':3000')" }
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "start_dashboard",
|
|
154
|
+
description: "Start the Enderun Web Dashboard (Command Center) to visualize real-time agent status, logs, and system metrics in the browser.",
|
|
155
|
+
inputSchema: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
port: { type: "number", description: "Optional: Port to run the dashboard on (default: 5858)" }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
54
162
|
{
|
|
55
163
|
name: "get_framework_status",
|
|
56
164
|
description: "Get the current project phase, active traces, and agent states.",
|
|
57
165
|
inputSchema: { type: "object", properties: {} },
|
|
58
166
|
},
|
|
167
|
+
{
|
|
168
|
+
name: "read_project_memory",
|
|
169
|
+
description: "Read the full project central memory (PROJECT_MEMORY.md). Use this at the start of a session to gain context.",
|
|
170
|
+
inputSchema: { type: "object", properties: {} },
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "get_memory_insights",
|
|
174
|
+
description: "Retrieve a summarized version of the project memory (active phase, trace, and last 5 actions) to save tokens.",
|
|
175
|
+
inputSchema: { type: "object", properties: {} },
|
|
176
|
+
},
|
|
59
177
|
{
|
|
60
178
|
name: "update_project_memory",
|
|
61
179
|
description: "Update a specific section in PROJECT_MEMORY.md.",
|