agent-enderun 1.10.2 ā 1.11.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 +34 -44
- package/dist/framework-mcp/src/constants.d.ts +47 -0
- package/dist/framework-mcp/src/constants.js +65 -0
- package/dist/framework-mcp/src/constants.js.map +1 -0
- package/dist/framework-mcp/src/index.js +26 -5
- package/dist/framework-mcp/src/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/control_plane/locking.d.ts +3 -9
- package/dist/framework-mcp/src/tools/control_plane/locking.js.map +1 -1
- package/dist/framework-mcp/src/tools/control_plane/registry.d.ts +2 -8
- package/dist/framework-mcp/src/tools/control_plane/registry.js.map +1 -1
- package/dist/framework-mcp/src/tools/dashboard/start_dashboard.d.ts +2 -2
- package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js.map +1 -1
- package/dist/framework-mcp/src/tools/definitions.js +30 -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 +2 -2
- package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +12 -4
- package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/patch_file.d.ts +2 -2
- package/dist/framework-mcp/src/tools/file_system/patch_file.js +6 -2
- package/dist/framework-mcp/src/tools/file_system/patch_file.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/read_file.d.ts +2 -2
- package/dist/framework-mcp/src/tools/file_system/read_file.js +43 -26
- package/dist/framework-mcp/src/tools/file_system/read_file.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/replace_text.d.ts +2 -2
- package/dist/framework-mcp/src/tools/file_system/replace_text.js +7 -3
- package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -1
- package/dist/framework-mcp/src/tools/file_system/write_file.d.ts +2 -2
- package/dist/framework-mcp/src/tools/file_system/write_file.js +27 -15
- package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/get_status.d.ts +2 -2
- package/dist/framework-mcp/src/tools/framework/get_status.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/orchestrate.d.ts +2 -2
- package/dist/framework-mcp/src/tools/framework/orchestrate.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/run_tests.d.ts +2 -2
- package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/update_contract_hash.d.ts +2 -2
- package/dist/framework-mcp/src/tools/framework/update_contract_hash.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/update_memory.d.ts +2 -2
- package/dist/framework-mcp/src/tools/framework/update_memory.js +1 -1
- package/dist/framework-mcp/src/tools/framework/update_memory.js.map +1 -1
- package/dist/framework-mcp/src/tools/index.d.ts +1 -2
- package/dist/framework-mcp/src/tools/index.js +33 -25
- package/dist/framework-mcp/src/tools/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/messaging/log_action.d.ts +2 -2
- package/dist/framework-mcp/src/tools/messaging/log_action.js.map +1 -1
- package/dist/framework-mcp/src/tools/messaging/send_message.d.ts +2 -2
- package/dist/framework-mcp/src/tools/messaging/send_message.js +14 -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 +2 -2
- package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
- package/dist/framework-mcp/src/tools/quality/check_lint.d.ts +5 -0
- package/dist/framework-mcp/src/tools/quality/check_lint.js +29 -0
- package/dist/framework-mcp/src/tools/quality/check_lint.js.map +1 -0
- package/dist/framework-mcp/src/tools/search/get_gaps.d.ts +2 -2
- package/dist/framework-mcp/src/tools/search/get_gaps.js.map +1 -1
- package/dist/framework-mcp/src/tools/search/get_map.d.ts +2 -2
- package/dist/framework-mcp/src/tools/search/get_map.js +1 -1
- package/dist/framework-mcp/src/tools/search/get_map.js.map +1 -1
- package/dist/framework-mcp/src/tools/search/grep_search.d.ts +2 -2
- package/dist/framework-mcp/src/tools/search/grep_search.js +45 -28
- package/dist/framework-mcp/src/tools/search/grep_search.js.map +1 -1
- package/dist/framework-mcp/src/tools/search/list_dir.d.ts +2 -2
- package/dist/framework-mcp/src/tools/search/list_dir.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.d.ts +2 -0
- package/dist/framework-mcp/src/tools/shell/run_command.js +47 -0
- package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -0
- package/dist/framework-mcp/src/tools/types.d.ts +95 -28
- package/dist/framework-mcp/src/utils/metrics.d.ts +20 -0
- package/dist/framework-mcp/src/utils/metrics.js +24 -6
- package/dist/framework-mcp/src/utils/metrics.js.map +1 -1
- package/dist/framework-mcp/src/utils/security.d.ts +1 -3
- package/dist/framework-mcp/src/utils/security.js +21 -18
- package/dist/framework-mcp/src/utils/security.js.map +1 -1
- package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +19 -14
- package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +1 -1
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/quality/check_lint.test.d.ts +1 -0
- package/dist/framework-mcp/tests/tools/quality/check_lint.test.js +36 -0
- package/dist/framework-mcp/tests/tools/quality/check_lint.test.js.map +1 -0
- package/dist/framework-mcp/tests/tools/shell/run_command.test.d.ts +1 -0
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js +43 -0
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -0
- package/dist/src/cli/adapters/core.d.ts +1 -1
- package/dist/src/cli/adapters/core.js +4 -0
- package/dist/src/cli/adapters/core.js.map +1 -1
- package/dist/src/cli/adapters/index.d.ts +1 -0
- package/dist/src/cli/adapters/index.js +1 -0
- package/dist/src/cli/adapters/index.js.map +1 -1
- package/dist/src/cli/adapters/paths.d.ts +15 -0
- package/dist/src/cli/adapters/paths.js +101 -0
- package/dist/src/cli/adapters/paths.js.map +1 -0
- package/dist/src/cli/adapters/scaffold.d.ts +1 -1
- package/dist/src/cli/adapters/scaffold.js +10 -7
- package/dist/src/cli/adapters/scaffold.js.map +1 -1
- package/dist/src/cli/commands/check.js +15 -36
- package/dist/src/cli/commands/check.js.map +1 -1
- package/dist/src/cli/commands/dashboard/data-service.d.ts +8 -0
- package/dist/src/cli/commands/dashboard/data-service.js +37 -0
- package/dist/src/cli/commands/dashboard/data-service.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-core.d.ts +5 -2
- package/dist/src/cli/commands/init/scaffold-core.js +28 -6
- package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-standards.js +6 -1
- package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
- package/dist/src/cli/commands/init.js +30 -6
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/orchestrate.d.ts +11 -6
- package/dist/src/cli/commands/orchestrate.js +148 -128
- package/dist/src/cli/commands/orchestrate.js.map +1 -1
- package/dist/src/cli/commands/plan.d.ts +3 -1
- package/dist/src/cli/commands/plan.js +79 -22
- package/dist/src/cli/commands/plan.js.map +1 -1
- package/dist/src/cli/index.js +11 -15
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/compliance.js +0 -1
- package/dist/src/cli/utils/compliance.js.map +1 -1
- package/dist/src/cli/utils/config-schema.d.ts +7 -7
- package/dist/src/cli/utils/fs.js +1 -1
- package/dist/src/cli/utils/fs.js.map +1 -1
- package/dist/src/cli/utils/memory.d.ts +1 -1
- package/dist/src/cli/utils/memory.js +28 -8
- package/dist/src/cli/utils/memory.js.map +1 -1
- package/dist/src/cli/utils/pkg.d.ts +19 -0
- package/dist/src/cli/utils/pkg.js +29 -5
- package/dist/src/cli/utils/pkg.js.map +1 -1
- package/dist/src/modules/adapters/definitions.js +3 -3
- package/dist/src/modules/adapters/definitions.js.map +1 -1
- package/dist/src/modules/agents/definitions.js +2 -1
- package/dist/src/modules/agents/definitions.js.map +1 -1
- package/dist/src/modules/agents/registry/analyst.js +1 -1
- package/dist/src/modules/agents/registry/analyst.js.map +1 -1
- package/dist/src/modules/agents/registry/architect.js +1 -0
- package/dist/src/modules/agents/registry/architect.js.map +1 -1
- package/dist/src/modules/agents/registry/backend.js +7 -6
- package/dist/src/modules/agents/registry/backend.js.map +1 -1
- package/dist/src/modules/agents/registry/database.js +4 -3
- package/dist/src/modules/agents/registry/database.js.map +1 -1
- package/dist/src/modules/agents/registry/devops.js +1 -1
- package/dist/src/modules/agents/registry/devops.js.map +1 -1
- package/dist/src/modules/agents/registry/git.js +1 -1
- package/dist/src/modules/agents/registry/git.js.map +1 -1
- package/dist/src/modules/agents/registry/manager.js +3 -2
- package/dist/src/modules/agents/registry/manager.js.map +1 -1
- package/dist/src/modules/agents/registry/native.js +1 -1
- package/dist/src/modules/agents/registry/native.js.map +1 -1
- package/dist/src/modules/agents/registry/quality.js +1 -0
- package/dist/src/modules/agents/registry/quality.js.map +1 -1
- package/dist/src/modules/agents/registry/security.js +1 -0
- package/dist/src/modules/agents/registry/security.js.map +1 -1
- package/dist/src/shared/constants.d.ts +113 -0
- package/dist/src/shared/constants.js +178 -0
- package/dist/src/shared/constants.js.map +1 -0
- package/dist/tests/adapters/paths.test.d.ts +1 -0
- package/dist/tests/adapters/paths.test.js +63 -0
- package/dist/tests/adapters/paths.test.js.map +1 -0
- package/dist/tests/approve.test.js +5 -9
- package/dist/tests/approve.test.js.map +1 -1
- package/dist/tests/cli/init/unified_init.test.d.ts +1 -0
- package/dist/tests/cli/init/unified_init.test.js +47 -0
- package/dist/tests/cli/init/unified_init.test.js.map +1 -0
- package/dist/tests/fs-utils.test.js +1 -1
- package/dist/tests/fs-utils.test.js.map +1 -1
- package/dist/tests/memory-utils.test.js +1 -1
- package/dist/tests/memory-utils.test.js.map +1 -1
- package/dist/tests/shared/constants.test.d.ts +1 -0
- package/dist/tests/shared/constants.test.js +17 -0
- package/dist/tests/shared/constants.test.js.map +1 -0
- package/dist/tests/trace.test.js +2 -2
- package/dist/tests/trace.test.js.map +1 -1
- package/framework-mcp/dist/constants.js +64 -0
- package/framework-mcp/dist/index.js +109 -0
- package/framework-mcp/dist/tools/control_plane/locking.js +64 -0
- package/framework-mcp/dist/tools/control_plane/registry.js +34 -0
- package/framework-mcp/dist/tools/dashboard/start_dashboard.js +29 -0
- package/framework-mcp/dist/tools/definitions.js +300 -0
- package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +59 -0
- package/framework-mcp/dist/tools/file_system/patch_file.js +25 -0
- package/framework-mcp/dist/tools/file_system/read_file.js +51 -0
- package/framework-mcp/dist/tools/file_system/replace_text.js +43 -0
- package/framework-mcp/dist/tools/file_system/write_file.js +38 -0
- package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
- package/framework-mcp/dist/tools/framework/get_status.js +5 -0
- package/framework-mcp/dist/tools/framework/orchestrate.js +5 -0
- package/framework-mcp/dist/tools/framework/run_tests.js +25 -0
- package/framework-mcp/dist/tools/framework/update_contract_hash.js +5 -0
- package/framework-mcp/dist/tools/framework/update_memory.js +8 -0
- package/framework-mcp/dist/tools/index.js +62 -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/log_action.js +22 -0
- package/framework-mcp/dist/tools/messaging/send_message.js +87 -0
- package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
- package/framework-mcp/dist/tools/observability/get_health.js +19 -0
- package/framework-mcp/dist/tools/quality/check_lint.js +28 -0
- package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
- package/framework-mcp/dist/tools/search/get_map.js +43 -0
- package/framework-mcp/dist/tools/search/grep_search.js +76 -0
- package/framework-mcp/dist/tools/search/list_dir.js +28 -0
- package/framework-mcp/dist/tools/shell/run_command.js +46 -0
- package/framework-mcp/dist/tools/types.js +1 -0
- package/framework-mcp/dist/utils/cli.js +20 -0
- package/framework-mcp/dist/utils/compliance.js +29 -0
- package/framework-mcp/dist/utils/fs.js +44 -0
- package/framework-mcp/dist/utils/metrics.js +56 -0
- package/framework-mcp/dist/utils/security.js +60 -0
- package/framework-mcp/package.json +19 -0
- package/framework-mcp/src/constants.ts +78 -0
- package/framework-mcp/src/declarations.d.ts +17 -0
- package/framework-mcp/src/index.ts +132 -0
- package/framework-mcp/src/tools/control_plane/locking.ts +71 -0
- package/framework-mcp/src/tools/control_plane/registry.ts +38 -0
- package/framework-mcp/src/tools/dashboard/start_dashboard.ts +33 -0
- package/framework-mcp/src/tools/definitions.ts +302 -0
- package/framework-mcp/src/tools/file_system/batch_surgical_edit.ts +79 -0
- package/framework-mcp/src/tools/file_system/patch_file.ts +33 -0
- package/framework-mcp/src/tools/file_system/read_file.ts +58 -0
- package/framework-mcp/src/tools/file_system/replace_text.ts +52 -0
- package/framework-mcp/src/tools/file_system/write_file.ts +45 -0
- package/framework-mcp/src/tools/framework/audit_deps.ts +49 -0
- package/framework-mcp/src/tools/framework/get_status.ts +7 -0
- package/framework-mcp/src/tools/framework/orchestrate.ts +7 -0
- package/framework-mcp/src/tools/framework/run_tests.ts +28 -0
- package/framework-mcp/src/tools/framework/update_contract_hash.ts +7 -0
- package/framework-mcp/src/tools/framework/update_memory.ts +10 -0
- package/framework-mcp/src/tools/index.ts +66 -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/log_action.ts +28 -0
- package/framework-mcp/src/tools/messaging/send_message.ts +89 -0
- package/framework-mcp/src/tools/observability/check_ports.ts +30 -0
- package/framework-mcp/src/tools/observability/get_health.ts +24 -0
- package/framework-mcp/src/tools/quality/check_lint.ts +33 -0
- package/framework-mcp/src/tools/search/get_gaps.ts +54 -0
- package/framework-mcp/src/tools/search/get_map.ts +48 -0
- package/framework-mcp/src/tools/search/grep_search.ts +76 -0
- package/framework-mcp/src/tools/search/list_dir.ts +34 -0
- package/framework-mcp/src/tools/shell/run_command.ts +56 -0
- package/framework-mcp/src/tools/types.ts +89 -0
- package/framework-mcp/src/utils/cli.ts +20 -0
- package/framework-mcp/src/utils/compliance.ts +37 -0
- package/framework-mcp/src/utils/fs.ts +45 -0
- package/framework-mcp/src/utils/metrics.ts +73 -0
- package/framework-mcp/src/utils/security.ts +66 -0
- package/framework-mcp/tests/tools/file_system/file_system_tools.test.ts +212 -0
- package/framework-mcp/tests/tools/messaging/send_message.test.ts +136 -0
- package/framework-mcp/tests/tools/quality/check_lint.test.ts +46 -0
- package/framework-mcp/tests/tools/shell/run_command.test.ts +55 -0
- package/framework-mcp/tsconfig.json +14 -0
- package/package.json +9 -7
- package/src/cli/adapters/core.ts +7 -1
- package/src/cli/adapters/index.ts +1 -0
- package/src/cli/adapters/paths.ts +134 -0
- package/src/cli/adapters/scaffold.ts +17 -7
- package/src/cli/commands/check.ts +16 -38
- package/src/cli/commands/dashboard/data-service.ts +48 -0
- package/src/cli/commands/init/scaffold-core.ts +45 -6
- package/src/cli/commands/init/scaffold-standards.ts +6 -1
- package/src/cli/commands/init.ts +32 -6
- package/src/cli/commands/orchestrate.ts +151 -127
- package/src/cli/commands/plan.ts +89 -23
- package/src/cli/index.ts +14 -19
- package/src/cli/utils/compliance.ts +8 -9
- package/src/cli/utils/fs.ts +1 -1
- package/src/cli/utils/memory.ts +32 -7
- package/src/cli/utils/pkg.ts +42 -13
- package/src/modules/adapters/definitions.ts +4 -3
- package/src/modules/agents/definitions.ts +2 -1
- package/src/modules/agents/registry/analyst.ts +1 -1
- package/src/modules/agents/registry/architect.ts +1 -0
- package/src/modules/agents/registry/backend.ts +7 -6
- package/src/modules/agents/registry/database.ts +4 -3
- package/src/modules/agents/registry/devops.ts +1 -1
- package/src/modules/agents/registry/git.ts +1 -1
- package/src/modules/agents/registry/manager.ts +3 -2
- package/src/modules/agents/registry/native.ts +1 -1
- package/src/modules/agents/registry/quality.ts +1 -0
- package/src/modules/agents/registry/security.ts +1 -0
- package/src/shared/constants.ts +212 -0
- package/templates/prompts/bug-fix-recipe.md +20 -0
- package/templates/prompts/contract-design-recipe.md +21 -0
- package/templates/prompts/db-management-recipe.md +25 -0
- package/templates/prompts/deployment-recipe.md +23 -0
- package/templates/prompts/new-feature-recipe.md +19 -0
- package/templates/prompts/performance-optimization-recipe.md +23 -0
- package/templates/prompts/pull-request-template.md +21 -0
- package/templates/prompts/refactoring-recipe.md +21 -0
- package/templates/prompts/security-audit-recipe.md +20 -0
- package/templates/standards/architecture-standards.md +23 -0
- package/templates/standards/auth-standards.md +125 -0
- package/templates/standards/crud-governance.md +21 -0
- package/templates/standards/deployment-standards.md +21 -0
- package/templates/standards/frontend-standards.md +37 -0
- package/templates/standards/github-actions-standards.md +43 -0
- package/templates/standards/i18n-standards.md +17 -0
- package/templates/standards/kysely-standards.md +47 -0
- package/templates/standards/llm-governance.md +15 -0
- package/templates/standards/logging-and-secrets.md +34 -0
- package/templates/standards/mobile-standards.md +23 -0
- package/templates/standards/observability-standards.md +15 -0
- package/templates/standards/performance-standards.md +15 -0
- package/templates/standards/pino-standards.md +46 -0
- package/templates/standards/playwright-standards.md +54 -0
- package/templates/standards/quality-standards.md +31 -0
- package/templates/standards/react-query-standards.md +72 -0
- package/templates/standards/react-router-standards.md +62 -0
- package/templates/standards/security-audit-standards.md +16 -0
- package/templates/standards/security-standards.md +21 -0
- package/templates/standards/swagger-standards.md +50 -0
- package/templates/standards/tailwind-standards.md +20 -0
- package/templates/standards/testing-standards.md +31 -0
- package/templates/standards/typeorm-standards.md +49 -0
- package/templates/standards/vitest-standards.md +110 -0
- package/bin/validate-agent-army.js +0 -148
- package/src/cli/commands/app.ts +0 -56
- package/src/cli/utils/app-backend.ts +0 -257
- package/src/cli/utils/app-docs.ts +0 -83
- package/src/cli/utils/app-frontend.ts +0 -263
- package/src/cli/utils/app-inferrer.ts +0 -63
- package/src/cli/utils/app-mobile.ts +0 -113
- package/src/cli/utils/app-types.ts +0 -248
- package/src/cli/utils/app.ts +0 -6
package/src/cli/commands/init.ts
CHANGED
|
@@ -5,6 +5,9 @@ import {
|
|
|
5
5
|
resolveAdapter,
|
|
6
6
|
runAdapterPostInit,
|
|
7
7
|
scaffoldAgents,
|
|
8
|
+
resolveAgentsDir,
|
|
9
|
+
mirrorUnifiedAgentsToNative,
|
|
10
|
+
ADAPTER_IDS,
|
|
8
11
|
type AdapterId,
|
|
9
12
|
} from "../adapters/index.js";
|
|
10
13
|
import { ensureDir } from "../utils/fs.js";
|
|
@@ -112,18 +115,41 @@ export async function initCommand(adapterName: string, options: { unified?: bool
|
|
|
112
115
|
}
|
|
113
116
|
|
|
114
117
|
scaffoldConstitution(projectRoot, coreDir, adapterId, dryRun);
|
|
118
|
+
scaffoldFrameworkConfigs(projectRoot, coreDir, adapter, dryRun, selectedPalette, {
|
|
119
|
+
unified: isUnified,
|
|
120
|
+
adapters: isUnified ? [...ADAPTER_IDS] : [adapterId]
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
scaffoldStandards(path.join(projectRoot, coreDir), dryRun);
|
|
115
124
|
|
|
116
|
-
|
|
125
|
+
if (isUnified) {
|
|
126
|
+
// Scaffold ALL agents for ALL adapters under unified hub
|
|
127
|
+
for (const id of ADAPTER_IDS) {
|
|
128
|
+
const dest = resolveAgentsDir(id, true, aiToolDir);
|
|
129
|
+
scaffoldAgents(projectRoot, id, dryRun, selectedAgents, dest.agentsDir, dest.agentsExt);
|
|
130
|
+
if (!dryRun) mirrorUnifiedAgentsToNative(projectRoot, id);
|
|
131
|
+
}
|
|
132
|
+
UI.success(`ā
Scaffolding complete for all adapters under ${aiToolDir}/ with native mirrors.`);
|
|
133
|
+
} else {
|
|
134
|
+
// Standard single-adapter scaffold
|
|
135
|
+
const dest = resolveAgentsDir(adapterId, false);
|
|
136
|
+
scaffoldAgents(projectRoot, adapterId, dryRun, selectedAgents, dest.agentsDir, dest.agentsExt);
|
|
137
|
+
UI.success(`ā
Generated agent definitions under ${dest.agentsDir}/`);
|
|
138
|
+
}
|
|
117
139
|
|
|
118
140
|
const skillsBaseDir = path.join(projectRoot, aiToolDir, "skills");
|
|
119
141
|
scaffoldSkills(skillsBaseDir, dryRun);
|
|
120
|
-
|
|
121
|
-
initializeMemory(path.join(projectRoot, coreDir), dryRun);
|
|
122
|
-
scaffoldFrameworkConfigs(projectRoot, coreDir, adapter, dryRun, selectedPalette);
|
|
123
|
-
scaffoldStandards(path.join(projectRoot, coreDir), dryRun);
|
|
124
142
|
scaffoldOps(path.join(projectRoot, coreDir), dryRun);
|
|
125
|
-
scaffoldShims(projectRoot, coreDir, adapterId, adapter, dryRun);
|
|
143
|
+
scaffoldShims(projectRoot, coreDir, adapterId, adapter, dryRun, isUnified);
|
|
126
144
|
|
|
145
|
+
// Initialize runtime directories
|
|
146
|
+
if (!dryRun) {
|
|
147
|
+
ensureDir(path.join(projectRoot, coreDir, "messages"));
|
|
148
|
+
ensureDir(path.join(projectRoot, coreDir, "logs"));
|
|
149
|
+
ensureDir(path.join(projectRoot, coreDir, "memory-graph"));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
initializeMemory(path.join(projectRoot, coreDir), dryRun);
|
|
127
153
|
runAdapterPostInit(adapter, projectRoot);
|
|
128
154
|
|
|
129
155
|
UI.success(`\nš ${FRAMEWORK_NAME} (v${getPackageVersion()}) initialized successfully!`);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import chalk from "chalk";
|
|
4
3
|
import { getFrameworkDir, updateDocumentStore, readStatus } from "../utils/memory.js";
|
|
5
4
|
import { UI } from "../utils/ui.js";
|
|
6
5
|
import { writeTextFile, appendFile } from "../utils/fs.js";
|
|
@@ -19,7 +18,8 @@ export const HermesMessageSchema = z.object({
|
|
|
19
18
|
parentId: z.string().optional(),
|
|
20
19
|
status: z.enum(["PENDING", "PROCESSED", "WAITING", "APPROVED"]),
|
|
21
20
|
priority: z.enum(["HIGH", "NORMAL", "LOW"]).optional(),
|
|
22
|
-
action: z.string().optional()
|
|
21
|
+
action: z.string().optional(),
|
|
22
|
+
requiresApproval: z.boolean().optional(),
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
export type HermesMessage = z.infer<typeof HermesMessageSchema>;
|
|
@@ -49,162 +49,182 @@ export async function orchestrateCommand() {
|
|
|
49
49
|
isLooping = true;
|
|
50
50
|
|
|
51
51
|
while (isLooping) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
try {
|
|
53
|
+
// Initial load from disk to sync the cache
|
|
54
|
+
if (Object.keys(agentStatusCache).length === 0) {
|
|
55
|
+
const diskStatus = readStatus();
|
|
56
|
+
agentStatusCache = diskStatus || {};
|
|
57
|
+
}
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
// Check for agent timeouts (e.g. 30 minutes in EXECUTING state)
|
|
60
|
+
const agentStatuses = readStatus();
|
|
61
|
+
let updatedStatus = false;
|
|
62
|
+
for (const [agentName, info] of Object.entries(agentStatuses)) {
|
|
63
|
+
const { state, lastUpdated } = info as { state: string; task: string; lastUpdated?: string };
|
|
64
|
+
if (state === "EXECUTING" && lastUpdated) {
|
|
65
|
+
const lastUpdatedTime = Date.parse(lastUpdated);
|
|
66
|
+
if (!isNaN(lastUpdatedTime) && Date.now() - lastUpdatedTime > 30 * 60 * 1000) {
|
|
67
|
+
UI.error(`ā ļø Agent ${agentName} has TIMED OUT (in EXECUTING state for >30m). Transitioning to BLOCKED.`);
|
|
68
|
+
agentStatuses[agentName] = { state: "BLOCKED", task: "Timeout occurred", lastUpdated: new Date().toISOString() };
|
|
69
|
+
updatedStatus = true;
|
|
70
|
+
}
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
73
|
+
if (updatedStatus) {
|
|
74
|
+
updateDocumentStore("status", agentStatuses);
|
|
75
|
+
agentStatusCache = { ...agentStatuses }; // Sync cache
|
|
76
|
+
}
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
if (fs.existsSync(messagesDir)) {
|
|
79
|
+
const messageFiles = fs.readdirSync(messagesDir).filter((f) => f.endsWith(".json"));
|
|
80
|
+
const pendingMessages: HermesMessage[] = [];
|
|
81
|
+
const fileMessagesMap: Record<string, HermesMessage[]> = {};
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
83
|
+
for (const file of messageFiles) {
|
|
84
|
+
const filePath = path.join(messagesDir, file);
|
|
85
|
+
try {
|
|
86
|
+
const content = fs.readFileSync(filePath, "utf8").trim();
|
|
87
|
+
if (!content) continue;
|
|
88
|
+
const lines = content.split("\n");
|
|
89
|
+
const allMsgs: HermesMessage[] = [];
|
|
90
|
+
lines.forEach((line) => {
|
|
91
|
+
if (!line.trim()) return;
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(line);
|
|
94
|
+
const msg = HermesMessageSchema.parse(parsed);
|
|
95
|
+
|
|
96
|
+
// Contract Validation
|
|
97
|
+
if (msg.category === "ACTION" || msg.category === "DELEGATION") {
|
|
98
|
+
try {
|
|
99
|
+
const payload = JSON.parse(msg.content);
|
|
100
|
+
TaskRequestSchema.parse(payload);
|
|
101
|
+
} catch (e) {
|
|
102
|
+
UI.error(`Invalid task contract payload: ${(e as Error).message}`);
|
|
103
|
+
return; // Skip invalid message
|
|
104
|
+
}
|
|
103
105
|
}
|
|
104
|
-
}
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
// A message is actionable if it's pending, or if it's been approved.
|
|
108
|
+
if (msg.status === "PENDING" || msg.status === "APPROVED") {
|
|
109
|
+
pendingMessages.push(msg);
|
|
110
|
+
}
|
|
111
|
+
allMsgs.push(msg);
|
|
112
|
+
} catch (e) {
|
|
113
|
+
UI.error(`Skipping invalid Hermes message format: ${(e as Error).message}`);
|
|
108
114
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
} catch (err) {
|
|
116
|
-
UI.error(`Error occurred while reading ${file}.`);
|
|
117
|
-
logger.debug(`Failed to read message file ${file}`, err);
|
|
115
|
+
});
|
|
116
|
+
fileMessagesMap[file] = allMsgs;
|
|
117
|
+
} catch (err) {
|
|
118
|
+
UI.error(`Error occurred while reading ${file}.`);
|
|
119
|
+
logger.debug(`Failed to read message file ${file}`, err);
|
|
120
|
+
}
|
|
118
121
|
}
|
|
119
|
-
}
|
|
120
122
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
if (pendingMessages.length > 0) {
|
|
124
|
+
// Sort by priority: HIGH -> NORMAL -> LOW
|
|
125
|
+
const priorityOrder = { HIGH: 1, NORMAL: 2, LOW: 3 };
|
|
126
|
+
pendingMessages.sort((a, b) => {
|
|
127
|
+
const pA = priorityOrder[a.priority || "NORMAL"] || 2;
|
|
128
|
+
const pB = priorityOrder[b.priority || "NORMAL"] || 2;
|
|
129
|
+
if (pA !== pB) return pA - pB;
|
|
130
|
+
return Date.parse(a.timestamp) - Date.parse(b.timestamp);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
UI.intent("Multi-Agent Orchestration", `${pendingMessages.length} pending tasks and collaboration messages found.`);
|
|
130
134
|
|
|
131
|
-
|
|
135
|
+
const statusChanges: Record<string, { state: string; task: string }> = {};
|
|
132
136
|
|
|
133
|
-
|
|
137
|
+
for (const msg of pendingMessages) {
|
|
138
|
+
const { from, to, content, traceId, category, status, requiresApproval } = msg;
|
|
134
139
|
|
|
135
|
-
|
|
136
|
-
|
|
140
|
+
// Approval Gate for high-risk actions.
|
|
141
|
+
// If it requires approval but isn't approved yet, skip it for now.
|
|
142
|
+
if ((category === "ACTION" || category === "ALERT") && requiresApproval && status !== "APPROVED") {
|
|
143
|
+
logger.debug(`Action for @${to} (Trace: ${traceId}) is pending manager approval.`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Gate for regular messages.
|
|
148
|
+
// If it's a non-approval-required message, it should only be processed when PENDING.
|
|
149
|
+
// This prevents re-processing of SUBTASK/REPLY messages that might get set to APPROVED.
|
|
150
|
+
if (!(category === "ACTION" || category === "ALERT") && status !== "PENDING") {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
137
153
|
|
|
138
|
-
const isSubtask = category === "SUBTASK" || !!parentId;
|
|
139
|
-
const agentLabel = isSubtask ? `${to} (Sub-Agent)` : to;
|
|
140
154
|
|
|
141
|
-
|
|
155
|
+
const isSubtask = category === "SUBTASK" || !!msg.parentId;
|
|
156
|
+
const agentLabel = isSubtask ? `${to} (Sub-Agent)` : to;
|
|
142
157
|
|
|
143
|
-
|
|
144
|
-
if (category === "DELEGATION" || category === "SUBTASK") targetState = "BRIEFED";
|
|
158
|
+
UI.agentBox(agentLabel, content, `Trace: ${traceId} | From: ${from} | Category: ${category}`);
|
|
145
159
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
160
|
+
let targetState = "EXECUTING";
|
|
161
|
+
if (category === "DELEGATION" || category === "SUBTASK") targetState = "BRIEFED";
|
|
162
|
+
|
|
163
|
+
let taskDescription = content;
|
|
164
|
+
if (category === "DELEGATION" || category === "ACTION") {
|
|
165
|
+
try {
|
|
166
|
+
const payload = JSON.parse(content);
|
|
167
|
+
taskDescription = payload.task || content;
|
|
168
|
+
} catch {
|
|
169
|
+
// Ignore
|
|
170
|
+
}
|
|
153
171
|
}
|
|
154
|
-
}
|
|
155
172
|
|
|
156
|
-
|
|
173
|
+
statusChanges[to] = { state: targetState, task: taskDescription };
|
|
157
174
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
175
|
+
if (targetState === "BRIEFED") {
|
|
176
|
+
UI.success(`${to} informed and took over the task.`);
|
|
177
|
+
statusChanges[to] = { state: "EXECUTING", task: taskDescription };
|
|
178
|
+
}
|
|
162
179
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
180
|
+
if (isSubtask) {
|
|
181
|
+
UI.success(`Sub-task connection established (Parent: ${msg.parentId || "Unknown"}).`);
|
|
182
|
+
}
|
|
166
183
|
|
|
167
|
-
|
|
168
|
-
console.warn(chalk.gray(` š Instructions: ${frameworkDir}/agents/${to.replace("@", "")}.md`));
|
|
184
|
+
UI.success(`Collaboration initiated: ${from} -> ${to}`);
|
|
169
185
|
|
|
170
|
-
|
|
171
|
-
|
|
186
|
+
msg.status = "PROCESSED";
|
|
187
|
+
}
|
|
172
188
|
|
|
173
|
-
|
|
189
|
+
applyBatchStatusUpdates(statusChanges);
|
|
174
190
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
for (const file of Object.keys(fileMessagesMap)) {
|
|
178
|
-
const filePath = path.join(messagesDir, file);
|
|
179
|
-
const msgs = fileMessagesMap[file];
|
|
180
|
-
|
|
181
|
-
const activeMsgs = msgs.filter(m => m.status !== "PROCESSED");
|
|
182
|
-
const processedMsgs = msgs.filter(m => m.status === "PROCESSED");
|
|
191
|
+
const archiveDir = path.join(messagesDir, "archive");
|
|
183
192
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
193
|
+
for (const file of Object.keys(fileMessagesMap)) {
|
|
194
|
+
const filePath = path.join(messagesDir, file);
|
|
195
|
+
const msgs = fileMessagesMap[file];
|
|
196
|
+
|
|
197
|
+
const activeMsgs = msgs.filter(m => m.status !== "PROCESSED");
|
|
198
|
+
const processedMsgs = msgs.filter(m => m.status === "PROCESSED");
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
if (activeMsgs.length > 0) {
|
|
202
|
+
const updatedContent = activeMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
|
|
203
|
+
writeTextFile(filePath, updatedContent);
|
|
204
|
+
} else if (fs.existsSync(filePath)) {
|
|
205
|
+
writeTextFile(filePath, "");
|
|
206
|
+
}
|
|
191
207
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
208
|
+
if (processedMsgs.length > 0) {
|
|
209
|
+
if (!fs.existsSync(archiveDir)) {
|
|
210
|
+
fs.mkdirSync(archiveDir, { recursive: true });
|
|
211
|
+
}
|
|
212
|
+
const agentName = file.replace(".json", "");
|
|
213
|
+
const archivePath = path.join(archiveDir, `${agentName}_archive.json`);
|
|
214
|
+
const archiveContent = processedMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
|
|
215
|
+
appendFile(archivePath, archiveContent);
|
|
216
|
+
UI.success(`Archived ${processedMsgs.length} messages for @${agentName}`);
|
|
195
217
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
appendFile(archivePath, archiveContent);
|
|
200
|
-
UI.success(`Archived ${processedMsgs.length} messages for @${agentName}`);
|
|
218
|
+
} catch (err) {
|
|
219
|
+
UI.error(`Error occurred while updating and archiving the message file ${file}.`);
|
|
220
|
+
logger.debug(`Failed to update and archive message file ${file}`, err);
|
|
201
221
|
}
|
|
202
|
-
} catch (err) {
|
|
203
|
-
UI.error(`Error occurred while updating and archiving the message file ${file}.`);
|
|
204
|
-
logger.debug(`Failed to update and archive message file ${file}`, err);
|
|
205
222
|
}
|
|
206
223
|
}
|
|
207
224
|
}
|
|
225
|
+
} catch (globalLoopErr) {
|
|
226
|
+
UI.error(`ā ļø Critical error in Hermes orchestration loop: ${(globalLoopErr as Error).message}`);
|
|
227
|
+
logger.debug("Hermes global loop failure", globalLoopErr);
|
|
208
228
|
}
|
|
209
229
|
|
|
210
230
|
// Prevent 100% CPU and provide breathing room for I/O
|
|
@@ -223,6 +243,7 @@ export async function sendMessage(args: {
|
|
|
223
243
|
traceId: string;
|
|
224
244
|
parentId?: string;
|
|
225
245
|
priority?: "HIGH" | "NORMAL" | "LOW";
|
|
246
|
+
requiresApproval?: boolean;
|
|
226
247
|
}) {
|
|
227
248
|
const frameworkDir = getFrameworkDir();
|
|
228
249
|
const messagesDir = path.join(frameworkDir, "messages");
|
|
@@ -274,11 +295,14 @@ export async function sendMessage(args: {
|
|
|
274
295
|
|
|
275
296
|
try {
|
|
276
297
|
const defaultPriority = (args.category === "ALERT" || args.category === "ACTION") ? "HIGH" : "NORMAL";
|
|
298
|
+
const requiresApproval = args.requiresApproval !== undefined ? args.requiresApproval : (args.category === "ALERT" || args.category === "ACTION");
|
|
299
|
+
|
|
277
300
|
const message: HermesMessage = {
|
|
278
301
|
timestamp: new Date().toISOString(),
|
|
279
302
|
priority: args.priority || defaultPriority,
|
|
280
303
|
...args,
|
|
281
|
-
status: "PENDING"
|
|
304
|
+
status: "PENDING",
|
|
305
|
+
requiresApproval: requiresApproval,
|
|
282
306
|
};
|
|
283
307
|
|
|
284
308
|
appendFile(messagePath, JSON.stringify(message) + "\n");
|
package/src/cli/commands/plan.ts
CHANGED
|
@@ -1,47 +1,113 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import { updateDocumentStore } from "../utils/memory.js";
|
|
4
3
|
import { generateULID } from "../utils/time.js";
|
|
5
4
|
import { UI } from "../utils/ui.js";
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
|
-
*
|
|
7
|
+
* Reads ALL markdown files from the docs/ directory and creates
|
|
8
|
+
* planning tasks from them. Agents will use this to understand
|
|
9
|
+
* project requirements and generate code accordingly.
|
|
9
10
|
*/
|
|
10
11
|
export async function planCommand() {
|
|
11
12
|
const projectRoot = process.cwd();
|
|
12
|
-
const
|
|
13
|
+
const docsDir = path.join(projectRoot, "docs");
|
|
13
14
|
|
|
14
|
-
if (!fs.existsSync(
|
|
15
|
-
UI.error("
|
|
15
|
+
if (!fs.existsSync(docsDir)) {
|
|
16
|
+
UI.error("Docs directory not found at docs/");
|
|
17
|
+
console.warn("š” Create a docs/ folder with your project requirements in .md files.");
|
|
16
18
|
return;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
let match;
|
|
22
|
-
let count = 0;
|
|
21
|
+
const entries = fs.readdirSync(docsDir, { withFileTypes: true });
|
|
22
|
+
const mdFiles = entries.filter(e => e.isFile() && e.name.endsWith(".md"));
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
if (mdFiles.length === 0) {
|
|
25
|
+
UI.warning("No markdown files found in docs/ directory.");
|
|
26
|
+
console.warn("š” Add .md files to docs/ with your project requirements.");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
UI.intent("Planning Engine", `Reading ${mdFiles.length} document(s) from docs/...`);
|
|
31
|
+
|
|
32
|
+
// Discover available template standards
|
|
33
|
+
const templatesDir = path.join(projectRoot, "templates");
|
|
34
|
+
const standards: string[] = [];
|
|
35
|
+
if (fs.existsSync(templatesDir)) {
|
|
36
|
+
const templateFiles = fs.readdirSync(templatesDir);
|
|
37
|
+
standards.push(...templateFiles.filter(f => f.endsWith("-standards.md")).map(f => `templates/${f}`));
|
|
38
|
+
if (standards.length > 0) {
|
|
39
|
+
UI.success(`Found ${standards.length} standard templates available for code generation.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let totalTasks = 0;
|
|
44
|
+
|
|
45
|
+
for (const file of mdFiles) {
|
|
46
|
+
const filePath = path.join(docsDir, file.name);
|
|
47
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
48
|
+
const lines = content.split("\n");
|
|
30
49
|
const traceId = generateULID();
|
|
31
|
-
|
|
50
|
+
|
|
51
|
+
UI.success(`š docs/${file.name} (${lines.length} lines) ā Trace: ${traceId}`);
|
|
52
|
+
|
|
53
|
+
console.warn(` Content preview: ${content.substring(0, 200).replace(/\n/g, " ")}...`);
|
|
54
|
+
|
|
55
|
+
// Extract headings as task descriptions
|
|
56
|
+
const headingRegex = /^#{2,4}\s+(.+)$/gm;
|
|
57
|
+
let headingMatch;
|
|
58
|
+
let headingCount = 0;
|
|
59
|
+
while ((headingMatch = headingRegex.exec(content)) !== null) {
|
|
60
|
+
headingCount++;
|
|
61
|
+
totalTasks++;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Extract checklist items
|
|
65
|
+
const taskRegex = /- \[ \]\s+(.+)/g;
|
|
66
|
+
let taskMatch;
|
|
67
|
+
let taskCount = 0;
|
|
68
|
+
while ((taskMatch = taskRegex.exec(content)) !== null) {
|
|
69
|
+
if (taskMatch[1].trim().length >= 3) {
|
|
70
|
+
taskCount++;
|
|
71
|
+
totalTasks++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
console.warn(` š ${headingCount} sections, ${taskCount} actionable tasks detected`);
|
|
76
|
+
|
|
77
|
+
// Store in project memory-compatible format
|
|
78
|
+
const memoryDir = path.join(projectRoot, ".enderun", "memory", "tasks");
|
|
79
|
+
if (!fs.existsSync(memoryDir)) {
|
|
80
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const taskFile = path.join(memoryDir, `${traceId}.json`);
|
|
32
84
|
const taskData = {
|
|
33
85
|
traceId,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
agent: agent.trim().replace("@", ""),
|
|
86
|
+
source: `docs/${file.name}`,
|
|
87
|
+
description: `Process requirements from docs/${file.name}`,
|
|
37
88
|
status: "PENDING",
|
|
38
|
-
createdAt: new Date().toISOString()
|
|
89
|
+
createdAt: new Date().toISOString(),
|
|
90
|
+
standards,
|
|
91
|
+
headings: headingCount,
|
|
92
|
+
tasks: taskCount,
|
|
93
|
+
preview: content.substring(0, 500),
|
|
39
94
|
};
|
|
95
|
+
fs.writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
96
|
+
}
|
|
40
97
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
98
|
+
// Log available standards
|
|
99
|
+
if (standards.length > 0) {
|
|
100
|
+
console.warn("");
|
|
101
|
+
UI.divider();
|
|
102
|
+
console.warn("š Available Enterprise Standards:");
|
|
103
|
+
standards.forEach(s => console.warn(` - ${s}`));
|
|
104
|
+
UI.divider();
|
|
44
105
|
}
|
|
45
106
|
|
|
46
|
-
UI.success(
|
|
107
|
+
UI.success(`\nā
Planning complete: ${totalTasks} tasks identified from ${mdFiles.length} document(s).`);
|
|
108
|
+
console.warn("\nš Next steps:");
|
|
109
|
+
console.warn(" 1. Run 'agent-enderun status' to see project state");
|
|
110
|
+
console.warn(" 2. AI agents (Claude, Gemini, Grok, etc.) will read docs/ and templates/");
|
|
111
|
+
console.warn(" 3. Agents generate enterprise-standard code based on requirements");
|
|
112
|
+
console.warn(" 4. Use @agent delegation for specific tasks: agent-enderun @backend \"...\"");
|
|
47
113
|
}
|
package/src/cli/index.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import fs from "fs";
|
|
3
|
-
import {
|
|
4
|
-
import { getMemoryPath, readActiveTraceId } from "./utils/memory.js";
|
|
5
|
-
import { planCommand } from "./commands/plan.js";
|
|
6
|
-
import { initCommand } from "./commands/init.js";
|
|
3
|
+
import { approveCommand } from "./commands/approve.js";
|
|
7
4
|
import { checkCommand } from "./commands/check.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
5
|
+
import { updateApiContractCommand, verifyApiContractCommand } from "./commands/contract.js";
|
|
6
|
+
import { initCommand } from "./commands/init.js";
|
|
10
7
|
import { updateProjectMemoryCommand } from "./commands/memory.js";
|
|
11
|
-
import { createAppCommand } from "./commands/app.js";
|
|
12
|
-
import { verifyApiContractCommand, updateApiContractCommand } from "./commands/contract.js";
|
|
13
8
|
import { orchestrateCommand, sendMessage } from "./commands/orchestrate.js";
|
|
14
|
-
import {
|
|
9
|
+
import { planCommand } from "./commands/plan.js";
|
|
10
|
+
import { statusCommand } from "./commands/status.js";
|
|
11
|
+
import { traceNewCommand } from "./commands/trace.js";
|
|
12
|
+
import { getMemoryPath, readActiveTraceId } from "./utils/memory.js";
|
|
13
|
+
import { getPackageVersion, getValidatorPath } from "./utils/pkg.js";
|
|
15
14
|
|
|
16
15
|
/**
|
|
17
16
|
* Main CLI entry point.
|
|
@@ -21,8 +20,8 @@ async function main() {
|
|
|
21
20
|
const command = args[0];
|
|
22
21
|
|
|
23
22
|
const KNOWN_COMMANDS = [
|
|
24
|
-
"init", "check", "status", "trace:new", "update_project_memory",
|
|
25
|
-
"
|
|
23
|
+
"init", "check", "status", "trace:new", "update_project_memory",
|
|
24
|
+
"plan", "orchestrate", "loop", "verify-contract", "update-contract",
|
|
26
25
|
"validate", "validate-army", "check:al", "version", "-v", "--version", "help", "-h", "--help",
|
|
27
26
|
"git:commit", "git:sync", "check:compliance", "explorer:graph", "explorer:audit",
|
|
28
27
|
"knowledge:update", "knowledge:search", "log:action", "run-script", "security:audit", "check:lint", "approve"
|
|
@@ -77,6 +76,7 @@ async function main() {
|
|
|
77
76
|
case "plan":
|
|
78
77
|
await planCommand();
|
|
79
78
|
break;
|
|
79
|
+
|
|
80
80
|
case "status":
|
|
81
81
|
await statusCommand();
|
|
82
82
|
break;
|
|
@@ -100,10 +100,6 @@ async function main() {
|
|
|
100
100
|
break;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
case "create-app":
|
|
104
|
-
await createAppCommand(args.slice(1));
|
|
105
|
-
break;
|
|
106
|
-
|
|
107
103
|
case "dashboard": {
|
|
108
104
|
const { dashboardCommand } = await import("./commands/dashboard.js");
|
|
109
105
|
await dashboardCommand(args.slice(1));
|
|
@@ -128,7 +124,7 @@ async function main() {
|
|
|
128
124
|
case "verify-contract":
|
|
129
125
|
await verifyApiContractCommand();
|
|
130
126
|
break;
|
|
131
|
-
|
|
127
|
+
|
|
132
128
|
case "update-contract":
|
|
133
129
|
await updateApiContractCommand();
|
|
134
130
|
break;
|
|
@@ -287,7 +283,7 @@ Commands:
|
|
|
287
283
|
check Perform an enterprise-grade system health check
|
|
288
284
|
status Show active phase, trace ID, and agent statuses
|
|
289
285
|
trace:new <desc> Start a new task chain with a unique Trace ID
|
|
290
|
-
|
|
286
|
+
plan Read all docs/ files and create planning tasks
|
|
291
287
|
orchestrate Start the dynamic Hermes agent orchestration loop
|
|
292
288
|
verify-contract Validate type alignment between backend and frontend
|
|
293
289
|
update-contract Generate and synchronize a new contract hash
|
|
@@ -314,8 +310,8 @@ Example:
|
|
|
314
310
|
`);
|
|
315
311
|
}
|
|
316
312
|
|
|
317
|
-
import { logger } from "../shared/logger.js";
|
|
318
313
|
import { EnderunBaseError } from "../shared/errors.js";
|
|
314
|
+
import { logger } from "../shared/logger.js";
|
|
319
315
|
|
|
320
316
|
main().catch((err) => {
|
|
321
317
|
if (err instanceof EnderunBaseError) {
|
|
@@ -330,4 +326,3 @@ main().catch((err) => {
|
|
|
330
326
|
logger.fatal("Fatal exception during CLI execution", err);
|
|
331
327
|
process.exit(1);
|
|
332
328
|
});
|
|
333
|
-
|