agent-enderun 0.6.8 → 0.7.1
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 → .antigravitycli}/BRAIN_DASHBOARD.md +0 -0
- package/.antigravitycli/ENDERUN.md +253 -0
- package/.antigravitycli/PROJECT_MEMORY.md +78 -0
- package/{.enderun → .antigravitycli}/STATUS.md +0 -0
- package/.antigravitycli/agents/agent_army_schema.json +79 -0
- package/.antigravitycli/agents/analyst/agent.json +55 -0
- package/.antigravitycli/agents/backend/agent.json +58 -0
- package/.antigravitycli/agents/explorer/agent.json +50 -0
- package/.antigravitycli/agents/frontend/agent.json +56 -0
- package/.antigravitycli/agents/git/agent.json +53 -0
- package/.antigravitycli/agents/manager/agent.json +82 -0
- package/.antigravitycli/agents/mobile/agent.json +52 -0
- package/.antigravitycli/agents/native/agent.json +56 -0
- package/.antigravitycli/assets/manager.png +0 -0
- package/{.enderun → .antigravitycli}/blueprints/README.md +1 -1
- package/{.enderun → .antigravitycli}/blueprints/backend/errors/config/meta.json +7 -2
- package/{.enderun → .antigravitycli}/blueprints/backend/errors/domain-error.ts +2 -1
- package/.antigravitycli/cli-commands.json +72 -0
- package/{.enderun → .antigravitycli}/config.json +1 -1
- package/{.enderun → .antigravitycli}/knowledge/api_design_rules.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/async_error_handling.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/branded_types_pattern.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/code_review_checklist.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/contract_versioning.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/database_migration.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/deployment_checklist.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/documentation_ownership.md +7 -7
- package/{.enderun → .antigravitycli}/knowledge/enterprise_capabilities_reference.md +11 -11
- package/{.enderun → .antigravitycli}/knowledge/enterprise_frontend_adaptation.md +4 -4
- package/{.enderun → .antigravitycli}/knowledge/enterprise_project_adaptation.md +3 -3
- package/{.enderun → .antigravitycli}/knowledge/framework_vs_user_project_boundary.md +3 -3
- package/{.enderun → .antigravitycli}/knowledge/frontend_professionalization_guidelines.md +2 -2
- package/{.enderun → .antigravitycli}/knowledge/frontend_real_battle_test_protocol.md +4 -4
- package/{.enderun → .antigravitycli}/knowledge/git_commit_strategy.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/hermes_live_test_guidelines.md +4 -4
- package/{.enderun → .antigravitycli}/knowledge/hermes_protocol.md +2 -2
- package/{.enderun → .antigravitycli}/knowledge/legacy_onboarding.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/manager_authority_audit_enforcement.md +4 -4
- package/{.enderun → .antigravitycli}/knowledge/monitoring_setup.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/performance_guidelines.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/project_scaffold_guidelines.md +4 -4
- package/{.enderun → .antigravitycli}/knowledge/reference_application_guidelines.md +1 -1
- package/{.enderun → .antigravitycli}/knowledge/repository_patterns.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/responsive_design_standards.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/security_scanning.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/troubleshooting_guide.md +0 -0
- package/{.enderun → .antigravitycli}/knowledge/zero_ui_library_policy.md +0 -0
- package/{.enderun/logs → .antigravitycli/messages}/.gitkeep +0 -0
- package/ENDERUN.md +9 -9
- package/README.md +115 -148
- package/antigravity.md +1 -1
- package/bin/cli.js +21 -36
- package/bin/validate-agent-army.js +46 -0
- package/docs/README.md +16 -43
- package/docs/architecture/approval-flows.md +38 -0
- package/docs/architecture/decisions/README.md +31 -0
- package/docs/architecture/notification-strategy.md +38 -0
- package/docs/backend/audit-logging.md +34 -0
- package/docs/backend/error-handling.md +52 -0
- package/docs/frontend/component-patterns.md +48 -0
- package/docs/frontend/forms.md +40 -0
- package/docs/frontend/notifications.md +37 -0
- package/framework-mcp/dist/tools/framework.js +9 -4
- package/framework-mcp/dist/tools/messages.js +1 -1
- package/framework-mcp/dist/utils.js +17 -8
- package/framework-mcp/package.json +1 -1
- package/framework-mcp/src/tools/database.ts +2 -2
- package/framework-mcp/src/tools/framework.ts +9 -4
- package/framework-mcp/src/utils.ts +3 -10
- package/package.json +7 -11
- package/.enderun/PROJECT_MEMORY.md +0 -62
- package/.enderun/agents/README.md +0 -45
- package/.enderun/agents/analyst.md +0 -432
- package/.enderun/agents/backend.md +0 -683
- package/.enderun/agents/explorer.md +0 -253
- package/.enderun/agents/frontend.md +0 -742
- package/.enderun/agents/git.md +0 -190
- package/.enderun/agents/manager.md +0 -574
- package/.enderun/agents/mobile.md +0 -177
- package/.enderun/agents/native.md +0 -225
- package/.enderun/cli-commands.json +0 -21
- package/.enderun/docs/README.md +0 -50
- package/.enderun/docs/api/README.md +0 -8
- package/.enderun/docs/api/auth.md +0 -11
- package/.enderun/docs/api/errors.md +0 -7
- package/.enderun/docs/error-handling.md +0 -13
- package/.enderun/docs/phase1-reference-app-execution-plan.md +0 -177
- package/.enderun/docs/privacy.md +0 -3
- package/.enderun/docs/project-docs.md +0 -19
- package/.enderun/docs/security.md +0 -13
- package/.enderun/docs/structure-audit-2026-05-24.md +0 -72
- package/.enderun/docs/tech-stack.md +0 -37
- package/.enderun/docs/troubleshooting.md +0 -7
- package/.enderun/logs/manager.json +0 -47
- package/.enderun/messages/.gitkeep +0 -0
- package/claude.md +0 -15
- package/codex.md +0 -15
- package/cursor.md +0 -15
- package/gemini.md +0 -15
- /package/{.enderun → .antigravitycli}/knowledge/README.md +0 -0
- /package/{.enderun → .antigravitycli}/knowledge/blueprint_driven_construction.md +0 -0
- /package/{.enderun → .antigravitycli}/knowledge/database_governance_guidelines.md +0 -0
- /package/{.enderun → .antigravitycli}/knowledge/documentation_ownership_status.md +0 -0
- /package/{.enderun → .antigravitycli}/knowledge/testing_standards.md +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
|
|
6
|
+
const AGENTS_DIR = path.resolve("./.antigravitycli/agents");
|
|
7
|
+
const SCHEMA_PATH = path.resolve("./.antigravitycli/agents/agent_army_schema.json");
|
|
8
|
+
|
|
9
|
+
console.log("🛡️ STARTING AUTOMATED AGENT ARMY VALIDATION...");
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const schema = JSON.parse(fs.readFileSync(SCHEMA_PATH, "utf8"));
|
|
13
|
+
const requiredKeys = schema.required;
|
|
14
|
+
const agents = fs.readdirSync(AGENTS_DIR);
|
|
15
|
+
let totalFailed = 0;
|
|
16
|
+
|
|
17
|
+
console.log("--------------------------------------------------");
|
|
18
|
+
console.log("| Agent ID | Status | Score | Category |");
|
|
19
|
+
console.log("--------------------------------------------------");
|
|
20
|
+
|
|
21
|
+
for (const agentDirName of agents) {
|
|
22
|
+
const agentJsonPath = path.join(AGENTS_DIR, agentDirName, "agent.json");
|
|
23
|
+
if (!fs.existsSync(agentJsonPath)) continue;
|
|
24
|
+
|
|
25
|
+
const agent = JSON.parse(fs.readFileSync(agentJsonPath, "utf8"));
|
|
26
|
+
const missing = requiredKeys.filter(k => agent[k] === undefined);
|
|
27
|
+
|
|
28
|
+
if (missing.length > 0) {
|
|
29
|
+
console.log(`| ${agentDirName.padEnd(9)} | ❌ FAILED | ----- | ${`Missing keys: ${missing.join(", ")}`.slice(0, 14)} |`);
|
|
30
|
+
totalFailed++;
|
|
31
|
+
} else {
|
|
32
|
+
console.log(`| ${agent.id.padEnd(9)} | ✅ PASSED | ${agent.capabilityRating.padEnd(5)} | ${agent.category.padEnd(14).slice(0, 14)} |`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
console.log("--------------------------------------------------");
|
|
37
|
+
if (totalFailed > 0) {
|
|
38
|
+
console.error(`❌ Validation failed! Detected ${totalFailed} invalid agent configurations.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
} else {
|
|
41
|
+
console.log("🎉 SUCCESS: All 8 core agents comply 100% with the Master Agent Army Schema!");
|
|
42
|
+
}
|
|
43
|
+
} catch (e) {
|
|
44
|
+
console.error("❌ Critical error during schema validation:", e);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
package/docs/README.md
CHANGED
|
@@ -1,53 +1,26 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent Enderun — Corporate Project Portal
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Welcome to the central documentation portal for your corporate project. This portal is designed to provide your **Agent Army** and human developers with a structured, clean, and unambiguous framework for software design, architecture, and governance.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 📂 Documentation Directory
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
### [1. Architecture & Governance](architecture/)
|
|
10
|
+
- **[Architecture Decisions (ADRs)](architecture/decisions/)**: Log of key architectural choices and design patterns.
|
|
11
|
+
- **[Approval & High-Risk Workflows](architecture/approval-flows.md)**: Detailed contracts and state machines for `managerApproval` tokens.
|
|
12
|
+
- **[Notification Strategy](architecture/notification-strategy.md)**: Dynamic notification patterns and toaster integrations.
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
### [2. Frontend Standards](frontend/)
|
|
15
|
+
- **[Component Patterns](frontend/component-patterns.md)**: Guidelines for custom, Zero-UI-Library React components styled with Panda CSS.
|
|
16
|
+
- **[Form Validations](frontend/forms.md)**: Type-safe form states using Zod and React hooks.
|
|
17
|
+
- **[Toaster Notifications](frontend/notifications.md)**: Integration guides for Sonner toast configurations.
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
| `api-reference.md` | @backend | Public API endpoints and usage examples |
|
|
17
|
-
| `components.md` | @frontend | UI component catalog and usage guidelines |
|
|
18
|
-
| `deployment.md` | @manager | Deployment steps and environment setup |
|
|
19
|
-
| `decisions.md` | @manager | Architecture Decision Records (ADRs) |
|
|
20
|
-
|
|
21
|
-
## Distinction from `.enderun/docs/`
|
|
22
|
-
|
|
23
|
-
| Path | Purpose |
|
|
24
|
-
| :--- | :--- |
|
|
25
|
-
| `/docs/` | **Your project** documentation — written by agents as features are built |
|
|
26
|
-
| `/.enderun/docs/` | **Framework** configuration — tech-stack, security policy, privacy policy |
|
|
27
|
-
|
|
28
|
-
> Agents will populate this folder automatically during **PHASE_2 (Core Development)**.
|
|
19
|
+
### [3. Backend Standards](backend/)
|
|
20
|
+
- **[Error Handling](backend/error-handling.md)**: Standardized `DomainError` class hierarchies and Fastify error maps.
|
|
21
|
+
- **[Audit Logging](backend/audit-logging.md)**: Database auditing schemes and transaction log contracts.
|
|
29
22
|
|
|
30
23
|
---
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Bu klasör **Agent Enderun ajanları** tarafından yönetilir ve framework'ün kendisi için değil, **sizin projeniz** için oluşturulan dokümanları içerir.
|
|
35
|
-
|
|
36
|
-
## Burada Neler Var?
|
|
37
|
-
|
|
38
|
-
| Dosya | Sahip Ajan | Açıklama |
|
|
39
|
-
| :--- | :--- | :--- |
|
|
40
|
-
| `architecture.md` | @backend | Sistem mimarisi ve veri akış diyagramları |
|
|
41
|
-
| `api-reference.md` | @backend | Genel API uç noktaları ve kullanım örnekleri |
|
|
42
|
-
| `components.md` | @frontend | UI bileşen kataloğu ve kullanım kılavuzları |
|
|
43
|
-
| `deployment.md` | @manager | Dağıtım adımları ve ortam kurulumu |
|
|
44
|
-
| `decisions.md` | @manager | Mimari Karar Kayıtları (ADRs) |
|
|
45
|
-
|
|
46
|
-
## `.enderun/docs/` Klasöründen Farkı
|
|
47
|
-
|
|
48
|
-
| Yol | Amaç |
|
|
49
|
-
| :--- | :--- |
|
|
50
|
-
| `/docs/` | **Sizin projenizin** dokümantasyonu — özellikler geliştirildikçe ajanlar tarafından yazılır |
|
|
51
|
-
| `/.enderun/docs/` | **Framework** konfigürasyonu — tech-stack, güvenlik politikası, gizlilik politikası |
|
|
52
|
-
|
|
53
|
-
> Ajanlar bu klasörü **PHASE_2 (Core Development)** sırasında otomatik olarak dolduracaktır.
|
|
25
|
+
> [!TIP]
|
|
26
|
+
> **Enforcement Rule:** All agents in the army are mandated to read these guidelines before writing any code, ensuring 100% architectural alignment and clean, modular codebase organization.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Approval & High-Risk Workflows
|
|
2
|
+
|
|
3
|
+
This document establishes the security guidelines, contracts, and state machines for **High-Risk Administrative Actions** that require dynamic `@manager` signature payloads.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🔒 High-Risk Actions Matrix
|
|
8
|
+
|
|
9
|
+
The following operations require an explicit `managerApproval` token injection:
|
|
10
|
+
|
|
11
|
+
| Action Category | Target Resource | Verification Criteria | Rollback Strategy |
|
|
12
|
+
| :--- | :--- | :--- | :--- |
|
|
13
|
+
| **Identity & Access** | suspends users, role updates | Signed token from `@manager` | demote role to standard User |
|
|
14
|
+
| **Data Purge** | bulk database catalog purge | `@manager` + Human dual signature | Restore from daily pg_dump |
|
|
15
|
+
| **System Settings** | updating cache parameters | Verified `@manager` hash | Reload last active env config |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🛰️ hermesApproval Transaction Payload
|
|
20
|
+
|
|
21
|
+
Every high-risk action must inject this exact JSON contract in the transaction header/payload:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
interface ManagerApproval {
|
|
25
|
+
approved: boolean;
|
|
26
|
+
traceId: string; // active ULID Trace ID
|
|
27
|
+
approvedBy: "@manager"; // signed coordinator identifier
|
|
28
|
+
approvedAt: string; // ISO timestamp
|
|
29
|
+
reason: string; // justification for database auditing
|
|
30
|
+
riskLevel: "Critical" | "High";
|
|
31
|
+
rollbackPlan: string; // automated/manual rollback script steps
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
> [!WARNING]
|
|
38
|
+
> **Audit Lock:** Any transaction failing to present a verified `ManagerApproval` signature will trigger an automatic transaction abort and generate a high-priority security alert.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Architecture Decision Records (ADRs)
|
|
2
|
+
|
|
3
|
+
Use this directory to store all major architectural and technical choices made during the development of your corporate applications. Storing decisions as markdown-based ADRs creates a strong institutional memory, allowing future developers and AI agents to quickly understand the rationale behind the system's design.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📝 ADR Template
|
|
8
|
+
|
|
9
|
+
Every new ADR must follow this exact format:
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
# ADR [ID]: [Title of Decision]
|
|
13
|
+
|
|
14
|
+
**Date:** YYYY-MM-DD
|
|
15
|
+
**Status:** [Proposed | Approved | Superseded | Retired]
|
|
16
|
+
**Author:** [Agent Name | Developer Name]
|
|
17
|
+
|
|
18
|
+
## Context
|
|
19
|
+
Provide brief background details regarding the problem we are solving, technical constraints, and why a decision is necessary.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
Detail the chosen path, technologies, patterns, or libraries being adopted.
|
|
23
|
+
|
|
24
|
+
## Consequences
|
|
25
|
+
Outline the positive, negative, and neutral impacts of this decision on the codebase, performance, and maintenance.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
> [!IMPORTANT]
|
|
31
|
+
> **Traceability:** Every ADR must include the active **Trace ID** under which it was generated to maintain 100% development accountability.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Notification Strategy & Toast Patterns
|
|
2
|
+
|
|
3
|
+
This document defines the central notification patterns for all web applications, ensuring consistent, responsive, and highly accessible user feedback.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🎨 Toast Design Tokens
|
|
8
|
+
|
|
9
|
+
All notifications must be categorized under these specific fütüristik statuses:
|
|
10
|
+
|
|
11
|
+
- **SUCCESS (Emerald Green):** For completed asynchronous actions.
|
|
12
|
+
- **ERROR (Ruby Red):** For blocked operations or aborted transactions.
|
|
13
|
+
- **INFO (Neon Blue):** For background jobs and non-blocking events.
|
|
14
|
+
- **WARNING (Amber Orange):** For dangerous or high-risk state mutations.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 💻 Technical Integration (Sonner Toaster)
|
|
19
|
+
|
|
20
|
+
The frontend applications must use the custom Sonner Toaster wrapped in a highly accessible container:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { toast } from "sonner";
|
|
24
|
+
|
|
25
|
+
// Standard Success Toast
|
|
26
|
+
toast.success("User role updated successfully.", {
|
|
27
|
+
description: "Trace ID: 01JK5V3A4B5...",
|
|
28
|
+
action: {
|
|
29
|
+
label: "Undo",
|
|
30
|
+
onClick: () => handleRollback()
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
> [!TIP]
|
|
38
|
+
> **Accessibility:** Every toast notification must carry an explicit `role="alert"` or `role="status"` attribute to ensure compatible screen-reader audio feedback.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Backend Audit Logging & Observability
|
|
2
|
+
|
|
3
|
+
This document defines the schema, storage criteria, and compliance guidelines for transactional database audit logs.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🔒 Audit Log Schema
|
|
8
|
+
|
|
9
|
+
Every state-changing transaction (Insert, Update, Delete) must generate a secure, untamperable audit record with this exact schema:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"timestamp": "2026-05-24T12:00:00.000Z",
|
|
14
|
+
"userId": "usr_91a0b3...",
|
|
15
|
+
"operation": "UPDATE",
|
|
16
|
+
"targetTable": "users",
|
|
17
|
+
"targetRowId": "42",
|
|
18
|
+
"previousState": {
|
|
19
|
+
"role": "User",
|
|
20
|
+
"status": "Active"
|
|
21
|
+
},
|
|
22
|
+
"newState": {
|
|
23
|
+
"role": "SuperAdmin",
|
|
24
|
+
"status": "Active"
|
|
25
|
+
},
|
|
26
|
+
"traceId": "01H...",
|
|
27
|
+
"managerApprovalSignature": "approved_sig_payload_hash"
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
> [!WARNING]
|
|
34
|
+
> **Data Privacy:** Audit logs must never contain raw PII (Personally Identifiable Information) such as unhashed passwords, credit card tokens, or cleartext social security numbers.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Backend Error Handling & DomainError Hierarchy
|
|
2
|
+
|
|
3
|
+
This document defines the error handling architecture, status codes, and standard API responses for all Fastify backend microservices.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🔒 DomainError Class Structure
|
|
8
|
+
|
|
9
|
+
Never throw raw javascript errors. Always extend the abstract `DomainError` class to ensure all failures carry typed status codes and machine-readable error codes:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export abstract class DomainError extends Error {
|
|
13
|
+
public readonly statusCode: number;
|
|
14
|
+
public readonly code: string;
|
|
15
|
+
|
|
16
|
+
constructor(message: string, statusCode: number, code: string) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = this.constructor.name;
|
|
19
|
+
this.statusCode = statusCode;
|
|
20
|
+
this.code = code;
|
|
21
|
+
Error.captureStackTrace(this, this.constructor);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 📝 Error Map Example
|
|
29
|
+
|
|
30
|
+
Map domain errors securely inside Fastify error handlers:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
fastify.setErrorHandler((error, request, reply) => {
|
|
34
|
+
if (error instanceof DomainError) {
|
|
35
|
+
reply.status(error.statusCode).send({
|
|
36
|
+
success: false,
|
|
37
|
+
code: error.code,
|
|
38
|
+
message: error.message,
|
|
39
|
+
traceId: request.headers["x-trace-id"]
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Log unexpected internal errors securely
|
|
45
|
+
fastify.log.error(error);
|
|
46
|
+
reply.status(500).send({
|
|
47
|
+
success: false,
|
|
48
|
+
code: "INTERNAL_ERROR",
|
|
49
|
+
message: "An unexpected error occurred."
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Frontend Component Patterns & Panda CSS Standards
|
|
2
|
+
|
|
3
|
+
Guidelines for crafting custom, high-performance, and highly accessible React components styled exclusively with Panda CSS.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🎨 Zero UI Library Policy
|
|
8
|
+
|
|
9
|
+
In our framework, using ready-made external UI libraries (such as Radix UI, Shadcn, or Tailwind CSS) is **strictly forbidden**. This prevents bundle bloat, ensures design consistency, and protects codebase hygiene.
|
|
10
|
+
|
|
11
|
+
All components must be:
|
|
12
|
+
- Written as custom vanilla HTML elements.
|
|
13
|
+
- Styled with type-safe Panda CSS design tokens.
|
|
14
|
+
- Bound to state using lightweight React hooks.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 💻 Panda CSS Styling Example
|
|
19
|
+
|
|
20
|
+
Create fütüristik glassmorphic containers using type-safe tokens:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { css } from "../../styled-system/css";
|
|
24
|
+
|
|
25
|
+
export const Card = ({ children }) => {
|
|
26
|
+
return (
|
|
27
|
+
<div className={css({
|
|
28
|
+
padding: "6",
|
|
29
|
+
borderRadius: "xl",
|
|
30
|
+
background: "rgba(255, 255, 255, 0.05)",
|
|
31
|
+
backdropFilter: "blur(12px)",
|
|
32
|
+
border: "1px solid rgba(255, 255, 255, 0.1)",
|
|
33
|
+
transition: "all 0.3s ease",
|
|
34
|
+
_hover: {
|
|
35
|
+
background: "rgba(255, 255, 255, 0.08)",
|
|
36
|
+
transform: "translateY(-4px)"
|
|
37
|
+
}
|
|
38
|
+
})}>
|
|
39
|
+
{children}
|
|
40
|
+
</div>
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
> [!IMPORTANT]
|
|
48
|
+
> **Unique Test IDs:** Every interactive component (buttons, inputs, select triggers) must include a unique `data-testid` attribute to facilitate automated QA auditing.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Type-Safe Forms with Zod Validations
|
|
2
|
+
|
|
3
|
+
Guidelines for building highly responsive, type-safe web forms using React state hooks and Zod validation schemas.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📝 Form Validation Pattern
|
|
8
|
+
|
|
9
|
+
Always decouple validation schemas from the component render context:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
|
|
14
|
+
export const CreateUserFormSchema = z.object({
|
|
15
|
+
email: z.string().email("Invalid email address"),
|
|
16
|
+
role: z.enum(["admin", "editor", "user"]),
|
|
17
|
+
fullName: z.string().min(2, "Full name must be at least 2 characters")
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Verify states on submit:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
const onSubmit = (data: unknown) => {
|
|
25
|
+
const result = CreateUserFormSchema.safeParse(data);
|
|
26
|
+
if (!result.success) {
|
|
27
|
+
const fieldErrors = result.error.formErrors.fieldErrors;
|
|
28
|
+
setErrors(fieldErrors);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Submit verified payload
|
|
33
|
+
submitPayload(result.data);
|
|
34
|
+
};
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
> [!IMPORTANT]
|
|
40
|
+
> **Keyboard Traps:** Ensure form fields support keyboard navigation (`Tab` index navigation) and submit correctly upon hitting `Enter` when inside an active field.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Frontend Notifications & Sonner Toaster Integration
|
|
2
|
+
|
|
3
|
+
This document defines the integration steps, design tokens, and accessibility standards for frontend notifications inside your React/Vite applications.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 💻 Toaster Configuration
|
|
8
|
+
|
|
9
|
+
Place the custom Sonner Toaster container in your root layout:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { Toaster } from "sonner";
|
|
13
|
+
|
|
14
|
+
export const RootLayout = ({ children }) => {
|
|
15
|
+
return (
|
|
16
|
+
<>
|
|
17
|
+
<Toaster
|
|
18
|
+
theme="dark"
|
|
19
|
+
position="bottom-right"
|
|
20
|
+
toastOptions={{
|
|
21
|
+
style: {
|
|
22
|
+
background: "#121214",
|
|
23
|
+
border: "1px solid #29292e",
|
|
24
|
+
color: "#e1e1e6"
|
|
25
|
+
}
|
|
26
|
+
}}
|
|
27
|
+
/>
|
|
28
|
+
<main>{children}</main>
|
|
29
|
+
</>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
> [!TIP]
|
|
37
|
+
> **Dynamic Action Toasts:** For high-risk administrative operations (such as user suspends), toast messages must present a valid action hook button to undo the action instantly.
|
|
@@ -103,13 +103,15 @@ export const frameworkHandlers = {
|
|
|
103
103
|
{ path: "apps/backend/src/types", type: "folder" },
|
|
104
104
|
{ path: "apps/web/src/types", type: "folder" },
|
|
105
105
|
{ path: "framework-mcp/src", type: "folder" },
|
|
106
|
-
{ path: path.join(frameworkDir, "docs/api"), type: "folder", optional: true },
|
|
107
106
|
{ path: ".env", type: "file", optional: true },
|
|
108
107
|
{ path: ".env.example", type: "file" },
|
|
109
108
|
{ path: path.join(frameworkDir, "PROJECT_MEMORY.md"), type: "file" },
|
|
110
109
|
{ path: path.join(frameworkDir, "BRAIN_DASHBOARD.md"), type: "file" },
|
|
111
|
-
{ path:
|
|
112
|
-
{ path:
|
|
110
|
+
{ path: "docs/README.md", type: "file" },
|
|
111
|
+
{ path: "docs/getting-started.md", type: "file" },
|
|
112
|
+
{ path: "docs/architecture/approval-flows.md", type: "file" },
|
|
113
|
+
{ path: "docs/backend/error-handling.md", type: "file" },
|
|
114
|
+
{ path: "docs/frontend/component-patterns.md", type: "file" },
|
|
113
115
|
];
|
|
114
116
|
for (const item of checkPaths) {
|
|
115
117
|
const fullPath = path.join(projectRoot, item.path);
|
|
@@ -122,7 +124,10 @@ export const frameworkHandlers = {
|
|
|
122
124
|
missing.push(`[MISSING FOLDER] ${frameworkDir}/agents`);
|
|
123
125
|
}
|
|
124
126
|
else {
|
|
125
|
-
const agents = fs.readdirSync(agentsDir).filter((f) =>
|
|
127
|
+
const agents = fs.readdirSync(agentsDir).filter((f) => {
|
|
128
|
+
const fullAgentDir = path.join(agentsDir, f);
|
|
129
|
+
return fs.statSync(fullAgentDir).isDirectory() && fs.existsSync(path.join(fullAgentDir, "agent.json"));
|
|
130
|
+
});
|
|
126
131
|
const logsDir = path.join(projectRoot, frameworkDir, "logs");
|
|
127
132
|
for (const agentName of agents) {
|
|
128
133
|
const logFile = path.join(logsDir, `${agentName}.json`);
|
|
@@ -123,7 +123,7 @@ export const messageHandlers = {
|
|
|
123
123
|
return { content: [{ type: "text", text: `### HERMES INBOX: @${agentName}\n\n${formatted}` }] };
|
|
124
124
|
}
|
|
125
125
|
catch {
|
|
126
|
-
return { content: [{ type: "text", text: "Failed to
|
|
126
|
+
return { content: [{ type: "text", text: "Failed to read agent messages." }] };
|
|
127
127
|
}
|
|
128
128
|
},
|
|
129
129
|
get_agent_inbox_stats: async (args, projectRoot) => {
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import fs from "fs";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
const getPackageVersion = () => {
|
|
7
|
+
try {
|
|
8
|
+
const pkgPath = path.join(__dirname, "../package.json");
|
|
9
|
+
if (fs.existsSync(pkgPath)) {
|
|
10
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
11
|
+
return pkg.version || "0.7.1";
|
|
10
12
|
}
|
|
11
13
|
}
|
|
12
|
-
|
|
14
|
+
catch {
|
|
15
|
+
// fallback
|
|
16
|
+
}
|
|
17
|
+
return "0.6.6";
|
|
18
|
+
};
|
|
19
|
+
export const FRAMEWORK_VERSION = getPackageVersion();
|
|
20
|
+
export function getFrameworkDir(_projectRoot) {
|
|
21
|
+
return ".agents"; // Antigravity-only runtime folder
|
|
13
22
|
}
|
|
14
23
|
export function resolveSafePath(projectRoot, targetPath) {
|
|
15
24
|
const resolved = path.resolve(projectRoot, targetPath);
|
|
@@ -31,11 +31,11 @@ export const databaseHandlers = {
|
|
|
31
31
|
const text = sourceFile.getFullText();
|
|
32
32
|
const tableMatches = Array.from(text.matchAll(/\.createTable\(['"]([^'"]+)['"]\)/g));
|
|
33
33
|
for (let i = 0; i < tableMatches.length; i++) {
|
|
34
|
-
const match = tableMatches[i] as
|
|
34
|
+
const match = tableMatches[i] as RegExpExecArray;
|
|
35
35
|
const tableName = match[1]; tablesFound++;
|
|
36
36
|
mermaid += ` ${tableName} {\n`;
|
|
37
37
|
const startIndex = match.index ?? 0;
|
|
38
|
-
const nextMatch = tableMatches[i + 1];
|
|
38
|
+
const nextMatch = tableMatches[i + 1] as RegExpExecArray | undefined;
|
|
39
39
|
const endIndex = nextMatch ? (nextMatch.index ?? text.length) : text.length;
|
|
40
40
|
const tableBlockText = text.substring(startIndex, endIndex);
|
|
41
41
|
const colRegex = /\.addColumn\(['"]([^'"]+)['"]\s*,\s*['"]([^'"]+)['"]/g;
|
|
@@ -103,13 +103,15 @@ export const frameworkHandlers = {
|
|
|
103
103
|
{ path: "apps/backend/src/types", type: "folder" },
|
|
104
104
|
{ path: "apps/web/src/types", type: "folder" },
|
|
105
105
|
{ path: "framework-mcp/src", type: "folder" },
|
|
106
|
-
{ path: path.join(frameworkDir, "docs/api"), type: "folder", optional: true },
|
|
107
106
|
{ path: ".env", type: "file", optional: true },
|
|
108
107
|
{ path: ".env.example", type: "file" },
|
|
109
108
|
{ path: path.join(frameworkDir, "PROJECT_MEMORY.md"), type: "file" },
|
|
110
109
|
{ path: path.join(frameworkDir, "BRAIN_DASHBOARD.md"), type: "file" },
|
|
111
|
-
{ path:
|
|
112
|
-
{ path:
|
|
110
|
+
{ path: "docs/README.md", type: "file" },
|
|
111
|
+
{ path: "docs/getting-started.md", type: "file" },
|
|
112
|
+
{ path: "docs/architecture/approval-flows.md", type: "file" },
|
|
113
|
+
{ path: "docs/backend/error-handling.md", type: "file" },
|
|
114
|
+
{ path: "docs/frontend/component-patterns.md", type: "file" },
|
|
113
115
|
];
|
|
114
116
|
for (const item of checkPaths) {
|
|
115
117
|
const fullPath = path.join(projectRoot, item.path);
|
|
@@ -121,7 +123,10 @@ export const frameworkHandlers = {
|
|
|
121
123
|
if (!fs.existsSync(agentsDir)) {
|
|
122
124
|
missing.push(`[MISSING FOLDER] ${frameworkDir}/agents`);
|
|
123
125
|
} else {
|
|
124
|
-
const agents = fs.readdirSync(agentsDir).filter((f) =>
|
|
126
|
+
const agents = fs.readdirSync(agentsDir).filter((f) => {
|
|
127
|
+
const fullAgentDir = path.join(agentsDir, f);
|
|
128
|
+
return fs.statSync(fullAgentDir).isDirectory() && fs.existsSync(path.join(fullAgentDir, "agent.json"));
|
|
129
|
+
});
|
|
125
130
|
const logsDir = path.join(projectRoot, frameworkDir, "logs");
|
|
126
131
|
for (const agentName of agents) {
|
|
127
132
|
const logFile = path.join(logsDir, `${agentName}.json`);
|
|
@@ -10,7 +10,7 @@ const getPackageVersion = (): string => {
|
|
|
10
10
|
const pkgPath = path.join(__dirname, "../package.json");
|
|
11
11
|
if (fs.existsSync(pkgPath)) {
|
|
12
12
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
13
|
-
return pkg.version || "0.
|
|
13
|
+
return pkg.version || "0.7.1";
|
|
14
14
|
}
|
|
15
15
|
} catch {
|
|
16
16
|
// fallback
|
|
@@ -20,15 +20,8 @@ const getPackageVersion = (): string => {
|
|
|
20
20
|
|
|
21
21
|
export const FRAMEWORK_VERSION = getPackageVersion();
|
|
22
22
|
|
|
23
|
-
export function getFrameworkDir(
|
|
24
|
-
|
|
25
|
-
for (const adp of adapters) {
|
|
26
|
-
const fullPath = path.join(projectRoot, adp);
|
|
27
|
-
if (fs.existsSync(fullPath) && fs.lstatSync(fullPath).isDirectory()) {
|
|
28
|
-
return adp;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return ".enderun";
|
|
23
|
+
export function getFrameworkDir(_projectRoot: string): string {
|
|
24
|
+
return ".agents"; // Antigravity-only runtime folder
|
|
32
25
|
}
|
|
33
26
|
|
|
34
27
|
export function resolveSafePath(projectRoot: string, targetPath: string): string {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-enderun",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "The Supreme AI Governance & Orchestration Framework for Enterprise Development",
|
|
5
5
|
"author": "Yusuf BEKAR",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"framework-mcp/dist",
|
|
36
36
|
"framework-mcp/src",
|
|
37
37
|
"framework-mcp/package.json",
|
|
38
|
-
".
|
|
38
|
+
".antigravitycli",
|
|
39
39
|
"ENDERUN.md",
|
|
40
40
|
"README.md",
|
|
41
41
|
"LICENSE",
|
|
@@ -44,14 +44,10 @@
|
|
|
44
44
|
"tsconfig.json",
|
|
45
45
|
"panda.config.ts",
|
|
46
46
|
"antigravity.md",
|
|
47
|
-
"cursor.md",
|
|
48
|
-
"claude.md",
|
|
49
|
-
"codex.md",
|
|
50
|
-
"gemini.md",
|
|
51
47
|
"docs"
|
|
52
48
|
],
|
|
53
49
|
"scripts": {
|
|
54
|
-
"enderun:build": "npm run build --
|
|
50
|
+
"enderun:build": "npm run build --prefix framework-mcp",
|
|
55
51
|
"enderun:test": "vitest run",
|
|
56
52
|
"enderun:test:watch": "vitest",
|
|
57
53
|
"enderun:status": "agent-enderun status",
|
|
@@ -69,7 +65,6 @@
|
|
|
69
65
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
70
66
|
"@pandacss/dev": "^0.53.0",
|
|
71
67
|
"@types/node": "^22.13.4",
|
|
72
|
-
"agent-enderun": "^0.6.8",
|
|
73
68
|
"concurrently": "^9.1.2",
|
|
74
69
|
"eslint": "^9.20.1",
|
|
75
70
|
"ts-morph": "^28.0.0",
|
|
@@ -77,11 +72,12 @@
|
|
|
77
72
|
"typescript": "^5.9.3",
|
|
78
73
|
"typescript-eslint": "^8.59.3",
|
|
79
74
|
"vitest": "^3.0.5",
|
|
80
|
-
"zod": "^3.24.2"
|
|
75
|
+
"zod": "^3.24.2",
|
|
76
|
+
"agent-enderun": "^0.6.8"
|
|
81
77
|
},
|
|
82
78
|
"enderun": {
|
|
83
79
|
"version": "0.6.8",
|
|
84
|
-
"initializedAt": "2026-05-
|
|
80
|
+
"initializedAt": "2026-05-24T12:00:52.687Z"
|
|
85
81
|
},
|
|
86
82
|
"dependencies": {}
|
|
87
|
-
}
|
|
83
|
+
}
|