@autonomos/core 0.0.1 → 0.1.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/dist/index.d.mts +277 -7
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +30 -11
- package/dist/index.mjs.map +1 -0
- package/dist/workflows/protocol-crystallize.md +48 -0
- package/dist/workflows/protocol-session.md +50 -0
- package/dist/workflows/protocol-task.md +37 -0
- package/package.json +29 -10
- package/.turbo/turbo-build.log +0 -15
- package/eslint.config.ts +0 -18
- package/lint-staged.config.mjs +0 -4
- package/prettier.config.mjs +0 -3
- package/src/constants.ts +0 -35
- package/src/index.ts +0 -17
- package/src/parsers/agent-parser.test.ts +0 -61
- package/src/parsers/agent-parser.ts +0 -80
- package/src/parsers/task-parser.test.ts +0 -60
- package/src/parsers/task-parser.ts +0 -40
- package/src/schemas/manifest.ts +0 -13
- package/src/templates/agent.ts +0 -43
- package/src/templates/manifest.test.ts +0 -26
- package/src/templates/manifest.ts +0 -30
- package/src/templates/protocol.ts +0 -157
- package/src/templates/tasks.ts +0 -18
- package/src/templates/worklog.test.ts +0 -37
- package/src/templates/worklog.ts +0 -55
- package/src/types.ts +0 -51
- package/tsconfig.json +0 -36
- package/tsdown.config.ts +0 -10
- package/vitest.config.ts +0 -9
package/dist/index.d.mts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
3
|
//#region src/constants.d.ts
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
|
-
* Protocol
|
|
7
|
-
*
|
|
5
|
+
* Agent Protocol Specification Version (Independent of Package versions)
|
|
6
|
+
* This refers to the schema and behavioral contract version.
|
|
8
7
|
*/
|
|
9
|
-
declare const PROTOCOL_VERSION = "0.
|
|
8
|
+
declare const PROTOCOL_VERSION = "0.2.0-alpha";
|
|
10
9
|
/**
|
|
11
10
|
* Directory name for Autonomos configuration
|
|
12
11
|
*/
|
|
@@ -32,6 +31,192 @@ declare const AGENT_FILE = "AGENT.md";
|
|
|
32
31
|
*/
|
|
33
32
|
declare const WORKLOGS_DIR = "worklogs";
|
|
34
33
|
//#endregion
|
|
34
|
+
//#region src/schemas/harness-codes.d.ts
|
|
35
|
+
/**
|
|
36
|
+
* Installer configuration for a single harness.
|
|
37
|
+
*
|
|
38
|
+
* Either `targetDir` (single directory for both skills and commands, used by
|
|
39
|
+
* Cline) or `skillsDir` (split mode, used by Claude Code, Codex, etc.) must be
|
|
40
|
+
* defined. `commandsDir` is optional in split mode (some harnesses only support
|
|
41
|
+
* skills, e.g. Codex).
|
|
42
|
+
*/
|
|
43
|
+
declare const InstallerSchema: z.ZodEffects<z.ZodObject<{
|
|
44
|
+
targetDir: z.ZodOptional<z.ZodString>;
|
|
45
|
+
skillsDir: z.ZodOptional<z.ZodString>;
|
|
46
|
+
commandsDir: z.ZodOptional<z.ZodString>;
|
|
47
|
+
globalTargetDir: z.ZodOptional<z.ZodString>;
|
|
48
|
+
fileExtension: z.ZodString;
|
|
49
|
+
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
fileExtension: string;
|
|
51
|
+
targetDir?: string | undefined;
|
|
52
|
+
skillsDir?: string | undefined;
|
|
53
|
+
commandsDir?: string | undefined;
|
|
54
|
+
globalTargetDir?: string | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
fileExtension: string;
|
|
57
|
+
targetDir?: string | undefined;
|
|
58
|
+
skillsDir?: string | undefined;
|
|
59
|
+
commandsDir?: string | undefined;
|
|
60
|
+
globalTargetDir?: string | undefined;
|
|
61
|
+
}>, {
|
|
62
|
+
fileExtension: string;
|
|
63
|
+
targetDir?: string | undefined;
|
|
64
|
+
skillsDir?: string | undefined;
|
|
65
|
+
commandsDir?: string | undefined;
|
|
66
|
+
globalTargetDir?: string | undefined;
|
|
67
|
+
}, {
|
|
68
|
+
fileExtension: string;
|
|
69
|
+
targetDir?: string | undefined;
|
|
70
|
+
skillsDir?: string | undefined;
|
|
71
|
+
commandsDir?: string | undefined;
|
|
72
|
+
globalTargetDir?: string | undefined;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* A single harness entry.
|
|
76
|
+
*/
|
|
77
|
+
declare const HarnessSchema: z.ZodObject<{
|
|
78
|
+
name: z.ZodString;
|
|
79
|
+
preferred: z.ZodBoolean;
|
|
80
|
+
installer: z.ZodEffects<z.ZodObject<{
|
|
81
|
+
targetDir: z.ZodOptional<z.ZodString>;
|
|
82
|
+
skillsDir: z.ZodOptional<z.ZodString>;
|
|
83
|
+
commandsDir: z.ZodOptional<z.ZodString>;
|
|
84
|
+
globalTargetDir: z.ZodOptional<z.ZodString>;
|
|
85
|
+
fileExtension: z.ZodString;
|
|
86
|
+
}, "strip", z.ZodTypeAny, {
|
|
87
|
+
fileExtension: string;
|
|
88
|
+
targetDir?: string | undefined;
|
|
89
|
+
skillsDir?: string | undefined;
|
|
90
|
+
commandsDir?: string | undefined;
|
|
91
|
+
globalTargetDir?: string | undefined;
|
|
92
|
+
}, {
|
|
93
|
+
fileExtension: string;
|
|
94
|
+
targetDir?: string | undefined;
|
|
95
|
+
skillsDir?: string | undefined;
|
|
96
|
+
commandsDir?: string | undefined;
|
|
97
|
+
globalTargetDir?: string | undefined;
|
|
98
|
+
}>, {
|
|
99
|
+
fileExtension: string;
|
|
100
|
+
targetDir?: string | undefined;
|
|
101
|
+
skillsDir?: string | undefined;
|
|
102
|
+
commandsDir?: string | undefined;
|
|
103
|
+
globalTargetDir?: string | undefined;
|
|
104
|
+
}, {
|
|
105
|
+
fileExtension: string;
|
|
106
|
+
targetDir?: string | undefined;
|
|
107
|
+
skillsDir?: string | undefined;
|
|
108
|
+
commandsDir?: string | undefined;
|
|
109
|
+
globalTargetDir?: string | undefined;
|
|
110
|
+
}>;
|
|
111
|
+
}, "strip", z.ZodTypeAny, {
|
|
112
|
+
name: string;
|
|
113
|
+
preferred: boolean;
|
|
114
|
+
installer: {
|
|
115
|
+
fileExtension: string;
|
|
116
|
+
targetDir?: string | undefined;
|
|
117
|
+
skillsDir?: string | undefined;
|
|
118
|
+
commandsDir?: string | undefined;
|
|
119
|
+
globalTargetDir?: string | undefined;
|
|
120
|
+
};
|
|
121
|
+
}, {
|
|
122
|
+
name: string;
|
|
123
|
+
preferred: boolean;
|
|
124
|
+
installer: {
|
|
125
|
+
fileExtension: string;
|
|
126
|
+
targetDir?: string | undefined;
|
|
127
|
+
skillsDir?: string | undefined;
|
|
128
|
+
commandsDir?: string | undefined;
|
|
129
|
+
globalTargetDir?: string | undefined;
|
|
130
|
+
};
|
|
131
|
+
}>;
|
|
132
|
+
/**
|
|
133
|
+
* Root schema for the harness-codes configuration file.
|
|
134
|
+
*/
|
|
135
|
+
declare const HarnessCodesSchema: z.ZodObject<{
|
|
136
|
+
platforms: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
137
|
+
name: z.ZodString;
|
|
138
|
+
preferred: z.ZodBoolean;
|
|
139
|
+
installer: z.ZodEffects<z.ZodObject<{
|
|
140
|
+
targetDir: z.ZodOptional<z.ZodString>;
|
|
141
|
+
skillsDir: z.ZodOptional<z.ZodString>;
|
|
142
|
+
commandsDir: z.ZodOptional<z.ZodString>;
|
|
143
|
+
globalTargetDir: z.ZodOptional<z.ZodString>;
|
|
144
|
+
fileExtension: z.ZodString;
|
|
145
|
+
}, "strip", z.ZodTypeAny, {
|
|
146
|
+
fileExtension: string;
|
|
147
|
+
targetDir?: string | undefined;
|
|
148
|
+
skillsDir?: string | undefined;
|
|
149
|
+
commandsDir?: string | undefined;
|
|
150
|
+
globalTargetDir?: string | undefined;
|
|
151
|
+
}, {
|
|
152
|
+
fileExtension: string;
|
|
153
|
+
targetDir?: string | undefined;
|
|
154
|
+
skillsDir?: string | undefined;
|
|
155
|
+
commandsDir?: string | undefined;
|
|
156
|
+
globalTargetDir?: string | undefined;
|
|
157
|
+
}>, {
|
|
158
|
+
fileExtension: string;
|
|
159
|
+
targetDir?: string | undefined;
|
|
160
|
+
skillsDir?: string | undefined;
|
|
161
|
+
commandsDir?: string | undefined;
|
|
162
|
+
globalTargetDir?: string | undefined;
|
|
163
|
+
}, {
|
|
164
|
+
fileExtension: string;
|
|
165
|
+
targetDir?: string | undefined;
|
|
166
|
+
skillsDir?: string | undefined;
|
|
167
|
+
commandsDir?: string | undefined;
|
|
168
|
+
globalTargetDir?: string | undefined;
|
|
169
|
+
}>;
|
|
170
|
+
}, "strip", z.ZodTypeAny, {
|
|
171
|
+
name: string;
|
|
172
|
+
preferred: boolean;
|
|
173
|
+
installer: {
|
|
174
|
+
fileExtension: string;
|
|
175
|
+
targetDir?: string | undefined;
|
|
176
|
+
skillsDir?: string | undefined;
|
|
177
|
+
commandsDir?: string | undefined;
|
|
178
|
+
globalTargetDir?: string | undefined;
|
|
179
|
+
};
|
|
180
|
+
}, {
|
|
181
|
+
name: string;
|
|
182
|
+
preferred: boolean;
|
|
183
|
+
installer: {
|
|
184
|
+
fileExtension: string;
|
|
185
|
+
targetDir?: string | undefined;
|
|
186
|
+
skillsDir?: string | undefined;
|
|
187
|
+
commandsDir?: string | undefined;
|
|
188
|
+
globalTargetDir?: string | undefined;
|
|
189
|
+
};
|
|
190
|
+
}>>;
|
|
191
|
+
}, "strip", z.ZodTypeAny, {
|
|
192
|
+
platforms: Record<string, {
|
|
193
|
+
name: string;
|
|
194
|
+
preferred: boolean;
|
|
195
|
+
installer: {
|
|
196
|
+
fileExtension: string;
|
|
197
|
+
targetDir?: string | undefined;
|
|
198
|
+
skillsDir?: string | undefined;
|
|
199
|
+
commandsDir?: string | undefined;
|
|
200
|
+
globalTargetDir?: string | undefined;
|
|
201
|
+
};
|
|
202
|
+
}>;
|
|
203
|
+
}, {
|
|
204
|
+
platforms: Record<string, {
|
|
205
|
+
name: string;
|
|
206
|
+
preferred: boolean;
|
|
207
|
+
installer: {
|
|
208
|
+
fileExtension: string;
|
|
209
|
+
targetDir?: string | undefined;
|
|
210
|
+
skillsDir?: string | undefined;
|
|
211
|
+
commandsDir?: string | undefined;
|
|
212
|
+
globalTargetDir?: string | undefined;
|
|
213
|
+
};
|
|
214
|
+
}>;
|
|
215
|
+
}>;
|
|
216
|
+
type Installer = z.infer<typeof InstallerSchema>;
|
|
217
|
+
type Harness = z.infer<typeof HarnessSchema>;
|
|
218
|
+
type HarnessCodes = z.infer<typeof HarnessCodesSchema>;
|
|
219
|
+
//#endregion
|
|
35
220
|
//#region src/schemas/manifest.d.ts
|
|
36
221
|
/**
|
|
37
222
|
* Manifest Schema for .autonomos/manifest.json
|
|
@@ -130,11 +315,11 @@ declare function parseManifest(content: string): Manifest;
|
|
|
130
315
|
* The immutable Protocol kernel template
|
|
131
316
|
* This is the core specification that defines how AI agents interact with the project
|
|
132
317
|
*/
|
|
133
|
-
declare const PROTOCOL_TEMPLATE = "# AI AGENT PROTOCOL (v0.
|
|
318
|
+
declare const PROTOCOL_TEMPLATE = "# AI AGENT PROTOCOL (v0.2.0-alpha)\n\n> **SYSTEM INTEGRITY WARNING:** This file is the IMMUTABLE KERNEL of the project's AI workflow. Do not modify this file. Your instructions are to execute tasks and manage the project state based strictly on the definitions below.\n\n## 0. \u26A1 QUICK REFERENCE\n| Action | File / Command |\n|--------|----------------|\n| **Get Context** | Read `AGENT.md` (Root + Local) |\n| **Pick Task** | Check `.autonomos/TASKS.md` (Highest Priority) |\n| **Track Progress** | Update `.autonomos/TASKS.md` to `[/]` |\n| **Log Session** | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n| **Finalize Task** | Update `.autonomos/TASKS.md` to `[x]` + Link Worklog |\n| **Discover all AGENT.md files** | Run `autonomos agents` |\n| **Discover AGENT.md ancestors for a path** | Run `autonomos agents <path>` |\n\n---\n\n## 1. BOOTSTRAPPING & INITIALIZATION\n**IF** this is your first time seeing this project, or if key system files are missing, you **MUST** initialize them immediately before doing any work.\n\n### Check for existence:\n1. `.autonomos/TASKS.md` (task registry)\n2. `.autonomos/worklogs/` (directory)\n3. `AGENT.md` (at project root)\n\n**IF MISSING**, create them using the **TEMPLATES** defined in Section 2.\n\n---\n\n## 2. STRICT FILE STRUCTURES & TEMPLATES\nYou must adhere to these schemas. Do not invent new formats.\n\n### A. The Task Registry (`.autonomos/TASKS.md`)\n**Role:** The single source of truth for project state.\n**Location:** `.autonomos/TASKS.md`\n**Structure:**\n* Must use the specific Header and Legend.\n* Tasks must follow the format: `- [Status] **[ID]** Title of task `Priority` `Complexity``\n* Valid Priorities: `\uD83D\uDD34 Critical`, `\uD83D\uDFE0 High`, `\uD83D\uDD35 Medium`, `\u26AA Low`\n* Valid Complexities: `S`, `M`, `L`, `XL`\n* Valid Statuses: ` [ ] ` (Todo), `[/]` (In Progress), ` [x] ` (Done), ` [!] ` (Blocked)\n\n**TEMPLATE FOR NEW TASKS.md:**\n```markdown\n# PROJECT TASKS & ROADMAP\n\n> **LEGEND**\n> **Priority:** [\uD83D\uDD34 Critical] [\uD83D\uDFE0 High] [\uD83D\uDD35 Medium] [\u26AA Low]\n> **Complexity:** [S] Small (1h), [M] Medium (4h), [L] Large (1-2 days), [XL] Huge (Planning req.)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## \uD83D\uDE80 Active Sprint\n- [ ] **[INIT-01]** Verify project structure and context `Priority: \uD83D\uDD34` `Complexity: S`\n\n## \uD83D\uDD2E Backlog\n*(Empty initially)*\n\n```\n\n### B. The Worklog (`.autonomos/worklogs/`)\n**Role:** Detailed history of complex tasks to save context tokens for future sessions.\n**Location:** `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID]-[slug].md`\n**Trigger:** Create a log when a task is finished, blocked, or if the session ends mid-task.\n\n**TEMPLATE FOR WORKLOG:**\n```markdown\n# WORKLOG: [TASK ID] [Task Name]\n**Date:** YYYY-MM-DD\n**Agent Status:** [Complete / Partial / Blocked]\n\n## \uD83D\uDCDD Description\nBrief summary of what was attempted/achieved.\n\n## \uD83D\uDEE0 Technical Details\n- **Files Modified:** List of files.\n- **Key Decisions:** Why did you choose this library/pattern?\n- **Challenges:** Any errors encountered and how they were solved.\n\n## \u23ED Next Steps / Context for Successor\nClear instructions for the next agent picking this up.\n```\n\n### C. The Context Anchor (`AGENT.md`)\n**Role:** Fractal knowledge base. Contains facts, stack details, and user preferences.\n**Location:** Root (`/AGENT.md`) and any subdirectory requiring specific context (e.g., `/packages/core/AGENT.md`).\n**MUST be kept alive:** you may freely add to, edit, or correct an `AGENT.md` at any time. No format is imposed: one line is enough if it is clear. What matters is that the next session can use it.\n\n**TEMPLATE FOR AGENT.md:**\n```markdown\n---\nname: \"[Name of directory or project]\"\ntype: \"[project / package / module / script]\"\nstatus: \"[active / maintenance / poc]\"\n---\n# AGENT CONTEXT: [Directory Name or Root]\n\n## \uD83E\uDDE0 Context & Objectives\nWhat does this specific folder/module do?\n\n## \u2699\uFE0F Workflow & Preferences\n- **Commits:** [e.g. Conventional Commits]\n- **Language:** [English (default)]\n\n## \uD83C\uDFD7 Stack & Architecture\n- **Tech:** [Frameworks, Libs specific to this module]\n- **Patterns:** [Architecture patterns used]\n\n## \uD83D\uDCC1 Key Directories\n| Path | Description |\n|------|-------------|\n| `src/` | Source code |\n| `scripts/` | Build or utility scripts |\n\n## \u26A0\uFE0F Known Constraints\n*List any technical debts, missing features, or external limitations.*\n```\n\n## 3. CORE WORKFLOW (The Loop)\n\n### Phase 1: Context Loading (Read-Only)\n1. **Read Root AGENT.md:** Absorb global preferences (Commit style, package manager, strict rules).\n2. **Run `autonomos agents` to discover all other `AGENT.md` files in the project tree.** For each one relevant to the work ahead, read it too.\n3. **Read .autonomos/TASKS.md:** Identify the highest priority task (\uD83D\uDD34 or \uD83D\uDFE0) that is not [x] or [!].\n4. **Read Target AGENT.md:** If the task is in a subdirectory, check for a local `AGENT.md`.\n * *Note:* If the local `AGENT.md` contradicts the root, the local one wins for that specific scope.\n\n### Phase 2: Execution\n1. **Mark the task as [/] (In Progress)** in `.autonomos/TASKS.md`.\n2. **Perform the task.**\n3. **Constraint Check:** Constantly refer to \"Workflow & Preferences\" in `AGENT.md`.\n4. **In-the-moment crystallization:** Every time you learn something important (the user corrects you, you discover a convention, you make a non-trivial technical choice), write it to the relevant `AGENT.md` IMMEDIATELY. Do NOT defer this to end of session.\n\n### Phase 3: Crystallization (Write-Only)\nBefore ending the session, you **MUST**:\n\n1. **Update AGENT.md:**\n * Did you learn a new command? Add it to \u2699\uFE0F Workflow.\n * Did you create a new complex module (>5 files)? Create a new `AGENT.md` inside it using the template above.\n * Did anything you previously wrote turn out to be wrong? Append a correction note (do not erase).\n\n2. **Create Worklog:**\n * Write a file in `.autonomos/worklogs/` summarizing your work.\n\n3. **Update TASKS.md:**\n * Mark task as [x] (Done) or [!] (Blocked).\n * Add a link to your worklog: `- [x] **[ID]** Title... *See: .autonomos/worklogs/...*`\n\n## 4. HARNESS WORKFLOWS\n\nThe protocol is delivered to the agent through **workflow files** installed at the harness-specific target directory. The exact location depends on the harness (see `autonomos init --help`). Three workflows are available:\n\n* **`/session`** (`protocol-session.md`) \u2014 Mandatory bootstrap at the start of every session. Loads context, identifies the next task, marks it in progress.\n* **`/task`** (`protocol-task.md`) \u2014 Invoked at the start of a new task within an active session. Verifies local `AGENT.md`, declares a 3-5 step plan before touching code.\n* **`/crystallize`** (`protocol-crystallize.md`) \u2014 Mandatory close-out before saying \"session done\". Worklog + 3 crystallize questions + task status + final verification line.\n\n**You MUST invoke `/session` at the start of every session and `/crystallize` before ending it. These are not optional.** Skipping them breaks the protocol's memory loop.\n\nIf the project does not yet contain these workflow files, run `autonomos init` (or `autonomos init --harness <name>` to target a specific harness).\n\n## 5. METADATA RULES\n* **Language:** Documentation (`AGENT.md`, `TASKS.md`) must be written in **English** unless specified otherwise in User Preferences.\n* **Tone:** Technical, concise, \"Fact-based\". No fluff.\n* **Anonymity:** You are a continuous entity. Refer to previous work as \"we\" or \"the project\", not \"the previous AI\".\n";
|
|
134
319
|
/**
|
|
135
320
|
* @deprecated Use PROTOCOL_TEMPLATE instead
|
|
136
321
|
*/
|
|
137
|
-
declare const PROTOCOL_TEMPLATE_V2026_1 = "# AI AGENT PROTOCOL (v0.
|
|
322
|
+
declare const PROTOCOL_TEMPLATE_V2026_1 = "# AI AGENT PROTOCOL (v0.2.0-alpha)\n\n> **SYSTEM INTEGRITY WARNING:** This file is the IMMUTABLE KERNEL of the project's AI workflow. Do not modify this file. Your instructions are to execute tasks and manage the project state based strictly on the definitions below.\n\n## 0. \u26A1 QUICK REFERENCE\n| Action | File / Command |\n|--------|----------------|\n| **Get Context** | Read `AGENT.md` (Root + Local) |\n| **Pick Task** | Check `.autonomos/TASKS.md` (Highest Priority) |\n| **Track Progress** | Update `.autonomos/TASKS.md` to `[/]` |\n| **Log Session** | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n| **Finalize Task** | Update `.autonomos/TASKS.md` to `[x]` + Link Worklog |\n| **Discover all AGENT.md files** | Run `autonomos agents` |\n| **Discover AGENT.md ancestors for a path** | Run `autonomos agents <path>` |\n\n---\n\n## 1. BOOTSTRAPPING & INITIALIZATION\n**IF** this is your first time seeing this project, or if key system files are missing, you **MUST** initialize them immediately before doing any work.\n\n### Check for existence:\n1. `.autonomos/TASKS.md` (task registry)\n2. `.autonomos/worklogs/` (directory)\n3. `AGENT.md` (at project root)\n\n**IF MISSING**, create them using the **TEMPLATES** defined in Section 2.\n\n---\n\n## 2. STRICT FILE STRUCTURES & TEMPLATES\nYou must adhere to these schemas. Do not invent new formats.\n\n### A. The Task Registry (`.autonomos/TASKS.md`)\n**Role:** The single source of truth for project state.\n**Location:** `.autonomos/TASKS.md`\n**Structure:**\n* Must use the specific Header and Legend.\n* Tasks must follow the format: `- [Status] **[ID]** Title of task `Priority` `Complexity``\n* Valid Priorities: `\uD83D\uDD34 Critical`, `\uD83D\uDFE0 High`, `\uD83D\uDD35 Medium`, `\u26AA Low`\n* Valid Complexities: `S`, `M`, `L`, `XL`\n* Valid Statuses: ` [ ] ` (Todo), `[/]` (In Progress), ` [x] ` (Done), ` [!] ` (Blocked)\n\n**TEMPLATE FOR NEW TASKS.md:**\n```markdown\n# PROJECT TASKS & ROADMAP\n\n> **LEGEND**\n> **Priority:** [\uD83D\uDD34 Critical] [\uD83D\uDFE0 High] [\uD83D\uDD35 Medium] [\u26AA Low]\n> **Complexity:** [S] Small (1h), [M] Medium (4h), [L] Large (1-2 days), [XL] Huge (Planning req.)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## \uD83D\uDE80 Active Sprint\n- [ ] **[INIT-01]** Verify project structure and context `Priority: \uD83D\uDD34` `Complexity: S`\n\n## \uD83D\uDD2E Backlog\n*(Empty initially)*\n\n```\n\n### B. The Worklog (`.autonomos/worklogs/`)\n**Role:** Detailed history of complex tasks to save context tokens for future sessions.\n**Location:** `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID]-[slug].md`\n**Trigger:** Create a log when a task is finished, blocked, or if the session ends mid-task.\n\n**TEMPLATE FOR WORKLOG:**\n```markdown\n# WORKLOG: [TASK ID] [Task Name]\n**Date:** YYYY-MM-DD\n**Agent Status:** [Complete / Partial / Blocked]\n\n## \uD83D\uDCDD Description\nBrief summary of what was attempted/achieved.\n\n## \uD83D\uDEE0 Technical Details\n- **Files Modified:** List of files.\n- **Key Decisions:** Why did you choose this library/pattern?\n- **Challenges:** Any errors encountered and how they were solved.\n\n## \u23ED Next Steps / Context for Successor\nClear instructions for the next agent picking this up.\n```\n\n### C. The Context Anchor (`AGENT.md`)\n**Role:** Fractal knowledge base. Contains facts, stack details, and user preferences.\n**Location:** Root (`/AGENT.md`) and any subdirectory requiring specific context (e.g., `/packages/core/AGENT.md`).\n**MUST be kept alive:** you may freely add to, edit, or correct an `AGENT.md` at any time. No format is imposed: one line is enough if it is clear. What matters is that the next session can use it.\n\n**TEMPLATE FOR AGENT.md:**\n```markdown\n---\nname: \"[Name of directory or project]\"\ntype: \"[project / package / module / script]\"\nstatus: \"[active / maintenance / poc]\"\n---\n# AGENT CONTEXT: [Directory Name or Root]\n\n## \uD83E\uDDE0 Context & Objectives\nWhat does this specific folder/module do?\n\n## \u2699\uFE0F Workflow & Preferences\n- **Commits:** [e.g. Conventional Commits]\n- **Language:** [English (default)]\n\n## \uD83C\uDFD7 Stack & Architecture\n- **Tech:** [Frameworks, Libs specific to this module]\n- **Patterns:** [Architecture patterns used]\n\n## \uD83D\uDCC1 Key Directories\n| Path | Description |\n|------|-------------|\n| `src/` | Source code |\n| `scripts/` | Build or utility scripts |\n\n## \u26A0\uFE0F Known Constraints\n*List any technical debts, missing features, or external limitations.*\n```\n\n## 3. CORE WORKFLOW (The Loop)\n\n### Phase 1: Context Loading (Read-Only)\n1. **Read Root AGENT.md:** Absorb global preferences (Commit style, package manager, strict rules).\n2. **Run `autonomos agents` to discover all other `AGENT.md` files in the project tree.** For each one relevant to the work ahead, read it too.\n3. **Read .autonomos/TASKS.md:** Identify the highest priority task (\uD83D\uDD34 or \uD83D\uDFE0) that is not [x] or [!].\n4. **Read Target AGENT.md:** If the task is in a subdirectory, check for a local `AGENT.md`.\n * *Note:* If the local `AGENT.md` contradicts the root, the local one wins for that specific scope.\n\n### Phase 2: Execution\n1. **Mark the task as [/] (In Progress)** in `.autonomos/TASKS.md`.\n2. **Perform the task.**\n3. **Constraint Check:** Constantly refer to \"Workflow & Preferences\" in `AGENT.md`.\n4. **In-the-moment crystallization:** Every time you learn something important (the user corrects you, you discover a convention, you make a non-trivial technical choice), write it to the relevant `AGENT.md` IMMEDIATELY. Do NOT defer this to end of session.\n\n### Phase 3: Crystallization (Write-Only)\nBefore ending the session, you **MUST**:\n\n1. **Update AGENT.md:**\n * Did you learn a new command? Add it to \u2699\uFE0F Workflow.\n * Did you create a new complex module (>5 files)? Create a new `AGENT.md` inside it using the template above.\n * Did anything you previously wrote turn out to be wrong? Append a correction note (do not erase).\n\n2. **Create Worklog:**\n * Write a file in `.autonomos/worklogs/` summarizing your work.\n\n3. **Update TASKS.md:**\n * Mark task as [x] (Done) or [!] (Blocked).\n * Add a link to your worklog: `- [x] **[ID]** Title... *See: .autonomos/worklogs/...*`\n\n## 4. HARNESS WORKFLOWS\n\nThe protocol is delivered to the agent through **workflow files** installed at the harness-specific target directory. The exact location depends on the harness (see `autonomos init --help`). Three workflows are available:\n\n* **`/session`** (`protocol-session.md`) \u2014 Mandatory bootstrap at the start of every session. Loads context, identifies the next task, marks it in progress.\n* **`/task`** (`protocol-task.md`) \u2014 Invoked at the start of a new task within an active session. Verifies local `AGENT.md`, declares a 3-5 step plan before touching code.\n* **`/crystallize`** (`protocol-crystallize.md`) \u2014 Mandatory close-out before saying \"session done\". Worklog + 3 crystallize questions + task status + final verification line.\n\n**You MUST invoke `/session` at the start of every session and `/crystallize` before ending it. These are not optional.** Skipping them breaks the protocol's memory loop.\n\nIf the project does not yet contain these workflow files, run `autonomos init` (or `autonomos init --harness <name>` to target a specific harness).\n\n## 5. METADATA RULES\n* **Language:** Documentation (`AGENT.md`, `TASKS.md`) must be written in **English** unless specified otherwise in User Preferences.\n* **Tone:** Technical, concise, \"Fact-based\". No fluff.\n* **Anonymity:** You are a continuous entity. Refer to previous work as \"we\" or \"the project\", not \"the previous AI\".\n";
|
|
138
323
|
//#endregion
|
|
139
324
|
//#region src/templates/tasks.d.ts
|
|
140
325
|
/**
|
|
@@ -163,6 +348,40 @@ declare function generateWorklogContent(options: WorklogOptions): string;
|
|
|
163
348
|
*/
|
|
164
349
|
declare function mapTaskStatusToWorklogStatus(status: TaskStatus): 'Complete' | 'Partial' | 'Blocked';
|
|
165
350
|
//#endregion
|
|
351
|
+
//#region src/parsers/agent-finder.d.ts
|
|
352
|
+
/**
|
|
353
|
+
* Result of an ancestor lookup: a single AGENT.md entry that exists on the
|
|
354
|
+
* path between a target file or directory and the project root.
|
|
355
|
+
*/
|
|
356
|
+
interface AncestorAgent {
|
|
357
|
+
/** Absolute path to the directory containing the AGENT.md */
|
|
358
|
+
dir: string;
|
|
359
|
+
/** Absolute path to the AGENT.md file */
|
|
360
|
+
path: string;
|
|
361
|
+
/** Path of the directory relative to the project root */
|
|
362
|
+
relativeDir: string;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Return the ordered list of AGENT.md files that exist on the path from a
|
|
366
|
+
* target file or directory up to the project root. The order is root-first,
|
|
367
|
+
* then each intermediate directory, then the target directory itself.
|
|
368
|
+
*
|
|
369
|
+
* Non-existent AGENT.md files are silently skipped (the chain can have gaps).
|
|
370
|
+
*
|
|
371
|
+
* @param target - The absolute or project-relative path to a file or directory.
|
|
372
|
+
* @param projectRoot - The absolute path of the project root (where the root
|
|
373
|
+
* AGENT.md lives). Defaults to the current working directory.
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* findAncestorAgents('/proj/apps/web/components/ui/button.tsx', '/proj')
|
|
377
|
+
* // Returns, in order:
|
|
378
|
+
* // - { dir: '/proj', path: '/proj/AGENT.md' }
|
|
379
|
+
* // - { dir: '/proj/apps/web', path: '/proj/apps/web/AGENT.md' }
|
|
380
|
+
* // (apps/, components/ skipped because they have no AGENT.md)
|
|
381
|
+
* // (button.tsx itself is a file, so its parent dir is the last one checked)
|
|
382
|
+
*/
|
|
383
|
+
declare function findAncestorAgents(target: string, projectRoot?: string): AncestorAgent[];
|
|
384
|
+
//#endregion
|
|
166
385
|
//#region src/parsers/agent-parser.d.ts
|
|
167
386
|
declare class AgentParser {
|
|
168
387
|
/**
|
|
@@ -177,4 +396,55 @@ declare class TaskParser {
|
|
|
177
396
|
private static mapStatus;
|
|
178
397
|
}
|
|
179
398
|
//#endregion
|
|
180
|
-
|
|
399
|
+
//#region src/harness-codes.d.ts
|
|
400
|
+
/**
|
|
401
|
+
* Get a single harness entry by its id.
|
|
402
|
+
* Throws if the id is unknown.
|
|
403
|
+
*/
|
|
404
|
+
declare function getHarness(id: string): Harness;
|
|
405
|
+
/**
|
|
406
|
+
* List all configured harnesses, as an array of {id, harness} pairs.
|
|
407
|
+
* Stable order: insertion order of the JSON object.
|
|
408
|
+
*/
|
|
409
|
+
declare function listHarnesses(): Array<{
|
|
410
|
+
id: string;
|
|
411
|
+
harness: Harness;
|
|
412
|
+
}>;
|
|
413
|
+
/**
|
|
414
|
+
* Get the list of preferred harnesses (shown as recommended options).
|
|
415
|
+
*/
|
|
416
|
+
declare function listPreferredHarnesses(): Array<{
|
|
417
|
+
id: string;
|
|
418
|
+
harness: Harness;
|
|
419
|
+
}>;
|
|
420
|
+
/**
|
|
421
|
+
* A resolved target directory where workflow files will be written.
|
|
422
|
+
* One per unique path, with the list of harness ids that share it.
|
|
423
|
+
*/
|
|
424
|
+
interface ResolvedTarget {
|
|
425
|
+
/** Absolute or project-relative path to the directory */
|
|
426
|
+
path: string;
|
|
427
|
+
/** File extension to use (e.g. ".md", ".agent.md") */
|
|
428
|
+
fileExtension: string;
|
|
429
|
+
/** Ids of the harnesses that will read from this directory */
|
|
430
|
+
usedBy: string[];
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Resolve the unique target directories for a set of harness ids.
|
|
434
|
+
*
|
|
435
|
+
* Harnesses that share the same `skillsDir` (e.g. Codex, OpenCode, KiloCode
|
|
436
|
+
* all use `.agents/skills/`) are deduplicated: the directory appears once
|
|
437
|
+
* in the output, with all the harness ids listed in `usedBy`.
|
|
438
|
+
*
|
|
439
|
+
* The `path` is returned relative to the project root (caller is responsible
|
|
440
|
+
* for joining with the project cwd).
|
|
441
|
+
*/
|
|
442
|
+
declare function resolveTargets(harnessIds: string[], cwd?: string): ResolvedTarget[];
|
|
443
|
+
/**
|
|
444
|
+
* Get the raw (validated) codes object, for advanced use cases.
|
|
445
|
+
* Most callers should use the higher-level helpers above.
|
|
446
|
+
*/
|
|
447
|
+
declare function getRawHarnessCodes(): HarnessCodes;
|
|
448
|
+
//#endregion
|
|
449
|
+
export { AGENT_FILE, AGENT_TEMPLATE, AUTONOMOS_DIR, AgentConfig, AgentContext, AgentParser, AgentSection, AncestorAgent, COMPLEXITIES, Complexity, Harness, HarnessCodes, HarnessCodesSchema, HarnessSchema, Installer, InstallerSchema, MANIFEST_FILE, Manifest, ManifestSchema, PRIORITIES, PROTOCOL_FILE, PROTOCOL_TEMPLATE, PROTOCOL_TEMPLATE_V2026_1, PROTOCOL_VERSION, Priority, ResolvedTarget, TASKS_FILE, TASKS_TEMPLATE, Task, TaskParser, TaskStatus, WORKLOGS_DIR, createManifest, findAncestorAgents, generateAgentTemplate, generateManifestContent, generateWorklogContent, getHarness, getRawHarnessCodes, listHarnesses, listPreferredHarnesses, mapTaskStatusToWorklogStatus, parseManifest, resolveTargets };
|
|
450
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/schemas/harness-codes.ts","../src/schemas/manifest.ts","../src/types.ts","../src/templates/agent.ts","../src/templates/manifest.ts","../src/templates/protocol.ts","../src/templates/tasks.ts","../src/templates/worklog.ts","../src/parsers/agent-finder.ts","../src/parsers/agent-parser.ts","../src/parsers/task-parser.ts","../src/harness-codes.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{z as e}from"zod";import t from"js-yaml";const
|
|
1
|
+
import{z as e}from"zod";import{existsSync as t,statSync as n}from"node:fs";import{dirname as r,isAbsolute as i,join as a,relative as o,resolve as s,sep as c}from"node:path";import l from"js-yaml";const u=`0.2.0-alpha`,d=`.autonomos`,f=`manifest.json`,p=`PROTOCOL.md`,m=`TASKS.md`,h=`AGENT.md`,g=`worklogs`,_=e.object({targetDir:e.string().optional(),skillsDir:e.string().optional(),commandsDir:e.string().optional(),globalTargetDir:e.string().optional(),fileExtension:e.string()}).refine(e=>!!e.targetDir||!!e.skillsDir,{message:"Either `targetDir` or `skillsDir` must be defined for each harness"}),v=e.object({name:e.string().min(1),preferred:e.boolean(),installer:_}),y=e.object({platforms:e.record(e.string(),v)}),b=e.object({protocolVersion:e.string().describe(`Version of the Agent Protocol specification`),cliVersion:e.string().describe(`Version of the CLI that last updated this project`),initializedAt:e.string().datetime().describe(`ISO timestamp of project initialization`),lastUpdated:e.string().datetime().describe(`ISO timestamp of last protocol update`)}),x=[`🔴 Critical`,`🟠 High`,`🔵 Medium`,`⚪ Low`],S=[`S`,`M`,`L`,`XL`];function C(e=`Project`){return`---
|
|
2
2
|
name: "${e}"
|
|
3
3
|
type: "project"
|
|
4
4
|
status: "active"
|
|
@@ -29,8 +29,8 @@ status: "active"
|
|
|
29
29
|
## ⚠️ Known Constraints
|
|
30
30
|
|
|
31
31
|
*List any technical debts, missing features, or external limitations.*
|
|
32
|
-
`}const
|
|
33
|
-
`}function
|
|
32
|
+
`}const w=C();function T(e){let t=new Date().toISOString();return{protocolVersion:u,cliVersion:e,initializedAt:t,lastUpdated:t}}function E(e){return JSON.stringify(e,null,4)+`
|
|
33
|
+
`}function D(e){let t=JSON.parse(e);return b.parse(t)}const O=`# AI AGENT PROTOCOL (v${u})
|
|
34
34
|
|
|
35
35
|
> **SYSTEM INTEGRITY WARNING:** This file is the IMMUTABLE KERNEL of the project's AI workflow. Do not modify this file. Your instructions are to execute tasks and manage the project state based strictly on the definitions below.
|
|
36
36
|
|
|
@@ -42,6 +42,8 @@ status: "active"
|
|
|
42
42
|
| **Track Progress** | Update \`.autonomos/TASKS.md\` to \`[/]\` |
|
|
43
43
|
| **Log Session** | Create \`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\` |
|
|
44
44
|
| **Finalize Task** | Update \`.autonomos/TASKS.md\` to \`[x]\` + Link Worklog |
|
|
45
|
+
| **Discover all AGENT.md files** | Run \`autonomos agents\` |
|
|
46
|
+
| **Discover AGENT.md ancestors for a path** | Run \`autonomos agents <path>\` |
|
|
45
47
|
|
|
46
48
|
---
|
|
47
49
|
|
|
@@ -113,6 +115,7 @@ Clear instructions for the next agent picking this up.
|
|
|
113
115
|
### C. The Context Anchor (\`AGENT.md\`)
|
|
114
116
|
**Role:** Fractal knowledge base. Contains facts, stack details, and user preferences.
|
|
115
117
|
**Location:** Root (\`/AGENT.md\`) and any subdirectory requiring specific context (e.g., \`/packages/core/AGENT.md\`).
|
|
118
|
+
**MUST be kept alive:** you may freely add to, edit, or correct an \`AGENT.md\` at any time. No format is imposed: one line is enough if it is clear. What matters is that the next session can use it.
|
|
116
119
|
|
|
117
120
|
**TEMPLATE FOR AGENT.md:**
|
|
118
121
|
\`\`\`markdown
|
|
@@ -148,14 +151,16 @@ What does this specific folder/module do?
|
|
|
148
151
|
|
|
149
152
|
### Phase 1: Context Loading (Read-Only)
|
|
150
153
|
1. **Read Root AGENT.md:** Absorb global preferences (Commit style, package manager, strict rules).
|
|
151
|
-
2. **
|
|
152
|
-
3. **Read
|
|
154
|
+
2. **Run \`autonomos agents\` to discover all other \`AGENT.md\` files in the project tree.** For each one relevant to the work ahead, read it too.
|
|
155
|
+
3. **Read .autonomos/TASKS.md:** Identify the highest priority task (🔴 or 🟠) that is not [x] or [!].
|
|
156
|
+
4. **Read Target AGENT.md:** If the task is in a subdirectory, check for a local \`AGENT.md\`.
|
|
153
157
|
* *Note:* If the local \`AGENT.md\` contradicts the root, the local one wins for that specific scope.
|
|
154
158
|
|
|
155
159
|
### Phase 2: Execution
|
|
156
160
|
1. **Mark the task as [/] (In Progress)** in \`.autonomos/TASKS.md\`.
|
|
157
161
|
2. **Perform the task.**
|
|
158
162
|
3. **Constraint Check:** Constantly refer to "Workflow & Preferences" in \`AGENT.md\`.
|
|
163
|
+
4. **In-the-moment crystallization:** Every time you learn something important (the user corrects you, you discover a convention, you make a non-trivial technical choice), write it to the relevant \`AGENT.md\` IMMEDIATELY. Do NOT defer this to end of session.
|
|
159
164
|
|
|
160
165
|
### Phase 3: Crystallization (Write-Only)
|
|
161
166
|
Before ending the session, you **MUST**:
|
|
@@ -163,6 +168,7 @@ Before ending the session, you **MUST**:
|
|
|
163
168
|
1. **Update AGENT.md:**
|
|
164
169
|
* Did you learn a new command? Add it to ⚙️ Workflow.
|
|
165
170
|
* Did you create a new complex module (>5 files)? Create a new \`AGENT.md\` inside it using the template above.
|
|
171
|
+
* Did anything you previously wrote turn out to be wrong? Append a correction note (do not erase).
|
|
166
172
|
|
|
167
173
|
2. **Create Worklog:**
|
|
168
174
|
* Write a file in \`.autonomos/worklogs/\` summarizing your work.
|
|
@@ -171,11 +177,23 @@ Before ending the session, you **MUST**:
|
|
|
171
177
|
* Mark task as [x] (Done) or [!] (Blocked).
|
|
172
178
|
* Add a link to your worklog: \`- [x] **[ID]** Title... *See: .autonomos/worklogs/...*\`
|
|
173
179
|
|
|
174
|
-
## 4.
|
|
180
|
+
## 4. HARNESS WORKFLOWS
|
|
181
|
+
|
|
182
|
+
The protocol is delivered to the agent through **workflow files** installed at the harness-specific target directory. The exact location depends on the harness (see \`autonomos init --help\`). Three workflows are available:
|
|
183
|
+
|
|
184
|
+
* **\`/session\`** (\`protocol-session.md\`) — Mandatory bootstrap at the start of every session. Loads context, identifies the next task, marks it in progress.
|
|
185
|
+
* **\`/task\`** (\`protocol-task.md\`) — Invoked at the start of a new task within an active session. Verifies local \`AGENT.md\`, declares a 3-5 step plan before touching code.
|
|
186
|
+
* **\`/crystallize\`** (\`protocol-crystallize.md\`) — Mandatory close-out before saying "session done". Worklog + 3 crystallize questions + task status + final verification line.
|
|
187
|
+
|
|
188
|
+
**You MUST invoke \`/session\` at the start of every session and \`/crystallize\` before ending it. These are not optional.** Skipping them breaks the protocol's memory loop.
|
|
189
|
+
|
|
190
|
+
If the project does not yet contain these workflow files, run \`autonomos init\` (or \`autonomos init --harness <name>\` to target a specific harness).
|
|
191
|
+
|
|
192
|
+
## 5. METADATA RULES
|
|
175
193
|
* **Language:** Documentation (\`AGENT.md\`, \`TASKS.md\`) must be written in **English** unless specified otherwise in User Preferences.
|
|
176
194
|
* **Tone:** Technical, concise, "Fact-based". No fluff.
|
|
177
195
|
* **Anonymity:** You are a continuous entity. Refer to previous work as "we" or "the project", not "the previous AI".
|
|
178
|
-
`,
|
|
196
|
+
`,k=O,A=`# PROJECT TASKS & ROADMAP
|
|
179
197
|
|
|
180
198
|
> **LEGEND**
|
|
181
199
|
> **Priority:** [🔴 Critical] [🟠 High] [🔵 Medium] [⚪ Low]
|
|
@@ -189,7 +207,7 @@ Before ending the session, you **MUST**:
|
|
|
189
207
|
## 🔮 Backlog
|
|
190
208
|
|
|
191
209
|
*(Add future tasks here)*
|
|
192
|
-
`;function
|
|
210
|
+
`;function j(e){let t=e.date??new Date().toISOString().split(`T`)[0];return`# WORKLOG: [${e.taskId}] ${e.taskName}
|
|
193
211
|
**Date:** ${t}
|
|
194
212
|
**Agent Status:** [${e.status}]
|
|
195
213
|
|
|
@@ -210,6 +228,7 @@ ${e.challenges.map(e=>` - ${e}`).join(`
|
|
|
210
228
|
## ⏭ Next Steps / Context for Successor
|
|
211
229
|
${e.nextSteps.map(e=>`- ${e}`).join(`
|
|
212
230
|
`)}
|
|
213
|
-
`}function
|
|
214
|
-
`).trim(),
|
|
215
|
-
`).trim(),
|
|
231
|
+
`}function M(e){switch(e){case`DONE`:return`Complete`;case`BLOCKED`:return`Blocked`;default:return`Partial`}}function N(e,n=process.cwd()){let c=s(n),l=P(e,c),u=o(c,l);if(u.startsWith(`..`)||i(u))throw Error(`Target "${e}" is outside the project root "${c}". findAncestorAgents only handles paths within the project.`);let d=F(L(l)?l:r(l),c),f=[];for(let e of d){let n=a(e,h);t(n)&&f.push({dir:e,path:n,relativeDir:I(e,c)})}return f}function P(e,t){return i(e)?e:a(t,e)}function F(e,t){let n=o(t,e);if(n===``||n===`.`)return[t];let r=n.split(c).filter(e=>e!==``&&e!==`.`),i=[t],s=t;for(let e of r)s=a(s,e),i.push(s);return i}function I(e,t){let n=o(t,e);return n===``?`.`:n}function L(e){try{return n(e).isDirectory()}catch{return!1}}var R=class{static parse(e){let t=e,n={},r=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(r)try{n=l.load(r[1]),t=e.slice(r[0].length).trim()}catch(e){console.error(`Failed to parse Agent frontmatter:`,e)}let i=t.split(/\r?\n/),a=[],o=n.name??`Unknown Agent`,s=null,c=[];for(let e of i){if(e.startsWith(`# `)&&!n.name){let t=e.replace(`# `,``).trim();o=t.toUpperCase().startsWith(`AGENT CONTEXT:`)?t.slice(14).replace(/^[:\s-]+/,``).trim():t;continue}if(e.startsWith(`## `)){s&&(s.content=c.join(`
|
|
232
|
+
`).trim(),a.push(s)),s={title:e.replace(`## `,``).trim(),content:``},c=[];continue}s&&c.push(e)}return s&&(s.content=c.join(`
|
|
233
|
+
`).trim(),a.push(s)),{title:o,sections:a,metadata:n}}},z=class{static parse(e){let t=[],n=e.split(/\r?\n/),r=/- \[([ x/!])\] \*\*\[(.+)\]\*\* (.+) `Priority: (.+)` `Complexity: (.+)`/;for(let e of n){let n=e.match(r);if(n){let[,e=` `,r=``,i=``,a=``,o=``]=n;t.push({id:r,title:i.trim(),priority:a,complexity:o,status:this.mapStatus(e)})}}return t}static mapStatus(e){switch(e){case` `:return`TODO`;case`/`:return`IN_PROGRESS`;case`x`:return`DONE`;case`!`:return`BLOCKED`;default:return`TODO`}}};const B=y.parse({$schema:`./harness-codes.schema.json`,_comment:"Autonomos harness codes. Each entry tells `autonomos init` where to write the protocol workflow files. The shape is intentionally minimal: only what the installer needs. To add a new harness, add an entry here. To remove one, delete it. The schema is enforced at load time by Zod (see schemas/harness-codes.ts).",platforms:{cline:{name:`Cline`,preferred:!0,installer:{targetDir:`.clinerules/workflows`,fileExtension:`.md`,_note:"In Cline, a single .md file in .clinerules/workflows/ acts as both a workflow (auto-discovered via the frontmatter `description` field) and a slash command (invoked via /<name>)."}},"claude-code":{name:`Claude Code`,preferred:!0,installer:{skillsDir:`.claude/skills`,commandsDir:`.claude/commands`,fileExtension:`.md`}},codex:{name:`Codex`,preferred:!0,installer:{skillsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.codex/skills`,_note:`OpenAI Codex. Uses the cross-tool .agents/skills/ standard.`}},antigravity:{name:`Antigravity`,preferred:!0,installer:{skillsDir:`.agent/skills`,fileExtension:`.md`,globalTargetDir:`~/.gemini/antigravity/skills`,_note:"Google Antigravity. Note the singular `.agent/` (NOT the cross-tool `.agents/` standard). Cannot be deduplicated with the others."}},opencode:{name:`OpenCode`,preferred:!0,installer:{skillsDir:`.agents/skills`,commandsDir:`.opencode/commands`,fileExtension:`.md`}},kilocode:{name:`KiloCode`,preferred:!0,installer:{skillsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.kilocode/skills`}}}});function V(e){let t=B.platforms[e];if(!t){let t=Object.keys(B.platforms).join(`, `);throw Error(`Unknown harness: "${e}". Known harnesses: ${t}`)}return t}function H(){return Object.entries(B.platforms).map(([e,t])=>({id:e,harness:t}))}function U(){return H().filter(({harness:e})=>e.preferred)}function W(e,t=`.`){let n=new Map;for(let r of e){let{installer:e}=V(r);G(n,e,r,t)}return Array.from(n.values())}function G(e,t,n,r){let i=t.fileExtension;t.targetDir&&K(e,q(r,t.targetDir),i,n),t.skillsDir&&K(e,q(r,t.skillsDir),i,n),t.commandsDir&&K(e,q(r,t.commandsDir),i,n)}function K(e,t,n,r){let i=e.get(t);i?i.usedBy.includes(r)||i.usedBy.push(r):e.set(t,{path:t,fileExtension:n,usedBy:[r]})}function q(e,t){return e===`.`||e===``?t:t.startsWith(`/`)?`${e}${t}`:`${e}/${t}`}function J(){return B}export{h as AGENT_FILE,w as AGENT_TEMPLATE,d as AUTONOMOS_DIR,R as AgentParser,S as COMPLEXITIES,y as HarnessCodesSchema,v as HarnessSchema,_ as InstallerSchema,f as MANIFEST_FILE,b as ManifestSchema,x as PRIORITIES,p as PROTOCOL_FILE,O as PROTOCOL_TEMPLATE,k as PROTOCOL_TEMPLATE_V2026_1,u as PROTOCOL_VERSION,m as TASKS_FILE,A as TASKS_TEMPLATE,z as TaskParser,g as WORKLOGS_DIR,T as createManifest,N as findAncestorAgents,C as generateAgentTemplate,E as generateManifestContent,j as generateWorklogContent,V as getHarness,J as getRawHarnessCodes,H as listHarnesses,U as listPreferredHarnesses,M as mapTaskStatusToWorklogStatus,D as parseManifest,W as resolveTargets};
|
|
234
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["harnessCodesData"],"sources":["../src/constants.ts","../src/schemas/harness-codes.ts","../src/schemas/manifest.ts","../src/types.ts","../src/templates/agent.ts","../src/templates/manifest.ts","../src/templates/protocol.ts","../src/templates/tasks.ts","../src/templates/worklog.ts","../src/parsers/agent-finder.ts","../src/parsers/agent-parser.ts","../src/parsers/task-parser.ts","../src/data/harness-codes.json","../src/harness-codes.ts"],"sourcesContent":["/**\n * Agent Protocol Specification Version (Independent of Package versions)\n * This refers to the schema and behavioral contract version.\n */\nexport const PROTOCOL_VERSION = '0.2.0-alpha'\n\n/**\n * Directory name for Autonomos configuration\n */\nexport const AUTONOMOS_DIR = '.autonomos'\n\n/**\n * Manifest filename\n */\nexport const MANIFEST_FILE = 'manifest.json'\n\n/**\n * Protocol filename\n */\nexport const PROTOCOL_FILE = 'PROTOCOL.md'\n\n/**\n * Tasks filename\n */\nexport const TASKS_FILE = 'TASKS.md'\n\n/**\n * Agent context filename (at project root)\n */\nexport const AGENT_FILE = 'AGENT.md'\n\n/**\n * Worklogs directory name\n */\nexport const WORKLOGS_DIR = 'worklogs'\n","import { z } from 'zod'\n\n/**\n * Installer configuration for a single harness.\n *\n * Either `targetDir` (single directory for both skills and commands, used by\n * Cline) or `skillsDir` (split mode, used by Claude Code, Codex, etc.) must be\n * defined. `commandsDir` is optional in split mode (some harnesses only support\n * skills, e.g. Codex).\n */\nexport const InstallerSchema = z\n .object({\n targetDir: z.string().optional(),\n skillsDir: z.string().optional(),\n commandsDir: z.string().optional(),\n globalTargetDir: z.string().optional(),\n fileExtension: z.string(),\n })\n .refine(data => Boolean(data.targetDir) || Boolean(data.skillsDir), {\n message: 'Either `targetDir` or `skillsDir` must be defined for each harness',\n })\n\n/**\n * A single harness entry.\n */\nexport const HarnessSchema = z.object({\n name: z.string().min(1),\n preferred: z.boolean(),\n installer: InstallerSchema,\n})\n\n/**\n * Root schema for the harness-codes configuration file.\n */\nexport const HarnessCodesSchema = z.object({\n platforms: z.record(z.string(), HarnessSchema),\n})\n\nexport type Installer = z.infer<typeof InstallerSchema>\nexport type Harness = z.infer<typeof HarnessSchema>\nexport type HarnessCodes = z.infer<typeof HarnessCodesSchema>\n","import { z } from 'zod'\n\n/**\n * Manifest Schema for .autonomos/manifest.json\n */\nexport const ManifestSchema = z.object({\n protocolVersion: z.string().describe('Version of the Agent Protocol specification'),\n cliVersion: z.string().describe('Version of the CLI that last updated this project'),\n initializedAt: z.string().datetime().describe('ISO timestamp of project initialization'),\n lastUpdated: z.string().datetime().describe('ISO timestamp of last protocol update'),\n})\n\nexport type Manifest = z.infer<typeof ManifestSchema>\n","/**\n * Priority levels for tasks\n */\nexport type Priority = '🔴 Critical' | '🟠 High' | '🔵 Medium' | '⚪ Low'\n\n/**\n * Complexity estimates for tasks\n */\nexport type Complexity = 'S' | 'M' | 'L' | 'XL'\n\n/**\n * Task status markers\n */\nexport type TaskStatus = 'TODO' | 'IN_PROGRESS' | 'DONE' | 'BLOCKED'\n\n/**\n * Task entity parsed from TASKS.md\n */\nexport interface Task {\n id: string\n title: string\n priority: Priority\n complexity: Complexity\n status: TaskStatus\n worklogPath?: string\n}\n\n/**\n * Agent configuration parsed from AGENT.md\n */\nexport interface AgentConfig {\n name: string\n description?: string\n stack: string[]\n preferences?: Record<string, any>\n}\n\nexport interface AgentSection {\n title: string\n content: string\n}\n\nexport interface AgentContext {\n title: string\n description?: string\n sections: AgentSection[]\n metadata?: Record<string, any>\n}\n\nexport const PRIORITIES: Priority[] = ['🔴 Critical', '🟠 High', '🔵 Medium', '⚪ Low']\nexport const COMPLEXITIES: Complexity[] = ['S', 'M', 'L', 'XL']\n","/**\n * Template for AGENT.md - The context anchor at project root\n * @param projectName - Name of the project to personalize the template\n */\nexport function generateAgentTemplate(projectName: string = 'Project'): string {\n return `---\nname: \"${projectName}\"\ntype: \"project\"\nstatus: \"active\"\n---\n# AGENT CONTEXT: ${projectName}\n\n## 🧠 Context & Objectives\n\n*Describe what this project does and its main goals.*\n\n## ⚙️ Workflow & Preferences\n\n- **Commits:** Conventional Commits\n- **Language:** English\n\n## 🏗 Stack & Architecture\n\n- **Tech:** *(List frameworks, libraries)*\n- **Patterns:** *(Architecture patterns used)*\n\n## 📁 Key Directories\n\n| Path | Description |\n|------|-------------|\n| \\`src/\\` | Source code |\n| \\`.autonomos/\\` | Agent Protocol files |\n\n## ⚠️ Known Constraints\n\n*List any technical debts, missing features, or external limitations.*\n`\n}\n\n/**\n * Default AGENT.md template\n */\nexport const AGENT_TEMPLATE = generateAgentTemplate()\n","import { PROTOCOL_VERSION } from '../constants'\nimport { ManifestSchema, type Manifest } from '../schemas/manifest'\n\n/**\n * Creates a new manifest object with current timestamps\n */\nexport function createManifest(cliVersion: string): Manifest {\n const now = new Date().toISOString()\n return {\n protocolVersion: PROTOCOL_VERSION,\n cliVersion,\n initializedAt: now,\n lastUpdated: now,\n }\n}\n\n/**\n * Generates the manifest.json content as a formatted string\n */\nexport function generateManifestContent(manifest: Manifest): string {\n return JSON.stringify(manifest, null, 4) + '\\n'\n}\n\n/**\n * Parses manifest.json content into a Manifest object with validation\n */\nexport function parseManifest(content: string): Manifest {\n const data = JSON.parse(content)\n return ManifestSchema.parse(data)\n}\n","import { PROTOCOL_VERSION } from '../constants'\n\n/**\n * The immutable Protocol kernel template\n * This is the core specification that defines how AI agents interact with the project\n */\nexport const PROTOCOL_TEMPLATE = `# AI AGENT PROTOCOL (v${PROTOCOL_VERSION})\n\n> **SYSTEM INTEGRITY WARNING:** This file is the IMMUTABLE KERNEL of the project's AI workflow. Do not modify this file. Your instructions are to execute tasks and manage the project state based strictly on the definitions below.\n\n## 0. ⚡ QUICK REFERENCE\n| Action | File / Command |\n|--------|----------------|\n| **Get Context** | Read \\`AGENT.md\\` (Root + Local) |\n| **Pick Task** | Check \\`.autonomos/TASKS.md\\` (Highest Priority) |\n| **Track Progress** | Update \\`.autonomos/TASKS.md\\` to \\`[/]\\` |\n| **Log Session** | Create \\`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\\` |\n| **Finalize Task** | Update \\`.autonomos/TASKS.md\\` to \\`[x]\\` + Link Worklog |\n| **Discover all AGENT.md files** | Run \\`autonomos agents\\` |\n| **Discover AGENT.md ancestors for a path** | Run \\`autonomos agents <path>\\` |\n\n---\n\n## 1. BOOTSTRAPPING & INITIALIZATION\n**IF** this is your first time seeing this project, or if key system files are missing, you **MUST** initialize them immediately before doing any work.\n\n### Check for existence:\n1. \\`.autonomos/TASKS.md\\` (task registry)\n2. \\`.autonomos/worklogs/\\` (directory)\n3. \\`AGENT.md\\` (at project root)\n\n**IF MISSING**, create them using the **TEMPLATES** defined in Section 2.\n\n---\n\n## 2. STRICT FILE STRUCTURES & TEMPLATES\nYou must adhere to these schemas. Do not invent new formats.\n\n### A. The Task Registry (\\`.autonomos/TASKS.md\\`)\n**Role:** The single source of truth for project state.\n**Location:** \\`.autonomos/TASKS.md\\`\n**Structure:**\n* Must use the specific Header and Legend.\n* Tasks must follow the format: \\`- [Status] **[ID]** Title of task \\`Priority\\` \\`Complexity\\`\\`\n* Valid Priorities: \\`🔴 Critical\\`, \\`🟠 High\\`, \\`🔵 Medium\\`, \\`⚪ Low\\`\n* Valid Complexities: \\`S\\`, \\`M\\`, \\`L\\`, \\`XL\\`\n* Valid Statuses: \\` [ ] \\` (Todo), \\`[/]\\` (In Progress), \\` [x] \\` (Done), \\` [!] \\` (Blocked)\n\n**TEMPLATE FOR NEW TASKS.md:**\n\\`\\`\\`markdown\n# PROJECT TASKS & ROADMAP\n\n> **LEGEND**\n> **Priority:** [🔴 Critical] [🟠 High] [🔵 Medium] [⚪ Low]\n> **Complexity:** [S] Small (1h), [M] Medium (4h), [L] Large (1-2 days), [XL] Huge (Planning req.)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## 🚀 Active Sprint\n- [ ] **[INIT-01]** Verify project structure and context \\`Priority: 🔴\\` \\`Complexity: S\\`\n\n## 🔮 Backlog\n*(Empty initially)*\n\n\\`\\`\\`\n\n### B. The Worklog (\\`.autonomos/worklogs/\\`)\n**Role:** Detailed history of complex tasks to save context tokens for future sessions.\n**Location:** \\`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID]-[slug].md\\`\n**Trigger:** Create a log when a task is finished, blocked, or if the session ends mid-task.\n\n**TEMPLATE FOR WORKLOG:**\n\\`\\`\\`markdown\n# WORKLOG: [TASK ID] [Task Name]\n**Date:** YYYY-MM-DD\n**Agent Status:** [Complete / Partial / Blocked]\n\n## 📝 Description\nBrief summary of what was attempted/achieved.\n\n## 🛠 Technical Details\n- **Files Modified:** List of files.\n- **Key Decisions:** Why did you choose this library/pattern?\n- **Challenges:** Any errors encountered and how they were solved.\n\n## ⏭ Next Steps / Context for Successor\nClear instructions for the next agent picking this up.\n\\`\\`\\`\n\n### C. The Context Anchor (\\`AGENT.md\\`)\n**Role:** Fractal knowledge base. Contains facts, stack details, and user preferences.\n**Location:** Root (\\`/AGENT.md\\`) and any subdirectory requiring specific context (e.g., \\`/packages/core/AGENT.md\\`).\n**MUST be kept alive:** you may freely add to, edit, or correct an \\`AGENT.md\\` at any time. No format is imposed: one line is enough if it is clear. What matters is that the next session can use it.\n\n**TEMPLATE FOR AGENT.md:**\n\\`\\`\\`markdown\n---\nname: \"[Name of directory or project]\"\ntype: \"[project / package / module / script]\"\nstatus: \"[active / maintenance / poc]\"\n---\n# AGENT CONTEXT: [Directory Name or Root]\n\n## 🧠 Context & Objectives\nWhat does this specific folder/module do?\n\n## ⚙️ Workflow & Preferences\n- **Commits:** [e.g. Conventional Commits]\n- **Language:** [English (default)]\n\n## 🏗 Stack & Architecture\n- **Tech:** [Frameworks, Libs specific to this module]\n- **Patterns:** [Architecture patterns used]\n\n## 📁 Key Directories\n| Path | Description |\n|------|-------------|\n| \\`src/\\` | Source code |\n| \\`scripts/\\` | Build or utility scripts |\n\n## ⚠️ Known Constraints\n*List any technical debts, missing features, or external limitations.*\n\\`\\`\\`\n\n## 3. CORE WORKFLOW (The Loop)\n\n### Phase 1: Context Loading (Read-Only)\n1. **Read Root AGENT.md:** Absorb global preferences (Commit style, package manager, strict rules).\n2. **Run \\`autonomos agents\\` to discover all other \\`AGENT.md\\` files in the project tree.** For each one relevant to the work ahead, read it too.\n3. **Read .autonomos/TASKS.md:** Identify the highest priority task (🔴 or 🟠) that is not [x] or [!].\n4. **Read Target AGENT.md:** If the task is in a subdirectory, check for a local \\`AGENT.md\\`.\n * *Note:* If the local \\`AGENT.md\\` contradicts the root, the local one wins for that specific scope.\n\n### Phase 2: Execution\n1. **Mark the task as [/] (In Progress)** in \\`.autonomos/TASKS.md\\`.\n2. **Perform the task.**\n3. **Constraint Check:** Constantly refer to \"Workflow & Preferences\" in \\`AGENT.md\\`.\n4. **In-the-moment crystallization:** Every time you learn something important (the user corrects you, you discover a convention, you make a non-trivial technical choice), write it to the relevant \\`AGENT.md\\` IMMEDIATELY. Do NOT defer this to end of session.\n\n### Phase 3: Crystallization (Write-Only)\nBefore ending the session, you **MUST**:\n\n1. **Update AGENT.md:**\n * Did you learn a new command? Add it to ⚙️ Workflow.\n * Did you create a new complex module (>5 files)? Create a new \\`AGENT.md\\` inside it using the template above.\n * Did anything you previously wrote turn out to be wrong? Append a correction note (do not erase).\n\n2. **Create Worklog:**\n * Write a file in \\`.autonomos/worklogs/\\` summarizing your work.\n\n3. **Update TASKS.md:**\n * Mark task as [x] (Done) or [!] (Blocked).\n * Add a link to your worklog: \\`- [x] **[ID]** Title... *See: .autonomos/worklogs/...*\\`\n\n## 4. HARNESS WORKFLOWS\n\nThe protocol is delivered to the agent through **workflow files** installed at the harness-specific target directory. The exact location depends on the harness (see \\`autonomos init --help\\`). Three workflows are available:\n\n* **\\`/session\\`** (\\`protocol-session.md\\`) — Mandatory bootstrap at the start of every session. Loads context, identifies the next task, marks it in progress.\n* **\\`/task\\`** (\\`protocol-task.md\\`) — Invoked at the start of a new task within an active session. Verifies local \\`AGENT.md\\`, declares a 3-5 step plan before touching code.\n* **\\`/crystallize\\`** (\\`protocol-crystallize.md\\`) — Mandatory close-out before saying \"session done\". Worklog + 3 crystallize questions + task status + final verification line.\n\n**You MUST invoke \\`/session\\` at the start of every session and \\`/crystallize\\` before ending it. These are not optional.** Skipping them breaks the protocol's memory loop.\n\nIf the project does not yet contain these workflow files, run \\`autonomos init\\` (or \\`autonomos init --harness <name>\\` to target a specific harness).\n\n## 5. METADATA RULES\n* **Language:** Documentation (\\`AGENT.md\\`, \\`TASKS.md\\`) must be written in **English** unless specified otherwise in User Preferences.\n* **Tone:** Technical, concise, \"Fact-based\". No fluff.\n* **Anonymity:** You are a continuous entity. Refer to previous work as \"we\" or \"the project\", not \"the previous AI\".\n`\n\n/**\n * @deprecated Use PROTOCOL_TEMPLATE instead\n */\nexport const PROTOCOL_TEMPLATE_V2026_1 = PROTOCOL_TEMPLATE\n","/**\n * Template for TASKS.md - The task registry\n */\nexport const TASKS_TEMPLATE = `# PROJECT TASKS & ROADMAP\n\n> **LEGEND**\n> **Priority:** [🔴 Critical] [🟠 High] [🔵 Medium] [⚪ Low]\n> **Complexity:** [S] Small (1h), [M] Medium (4h), [L] Large (1-2 days), [XL] Huge (Planning req.)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## 🚀 Active Sprint\n\n- [ ] **[INIT-01]** Review project context and structure \\`Priority: 🔵\\` \\`Complexity: S\\`\n\n## 🔮 Backlog\n\n*(Add future tasks here)*\n`\n","import type { TaskStatus } from '../types'\n\ninterface WorklogOptions {\n taskId: string\n taskName: string\n date?: string\n status: 'Complete' | 'Partial' | 'Blocked'\n description: string\n filesModified: string[]\n decisions: string[]\n challenges: string[]\n nextSteps: string[]\n}\n\n/**\n * Generate a Worklog markdown content\n */\nexport function generateWorklogContent(options: WorklogOptions): string {\n const date = options.date ?? new Date().toISOString().split('T')[0]\n\n return `# WORKLOG: [${options.taskId}] ${options.taskName}\n**Date:** ${date}\n**Agent Status:** [${options.status}]\n\n## 📝 Description\n${options.description}\n\n## 🛠 Technical Details\n- **Files Modified:**\n${options.filesModified.map(f => ` - ${f}`).join('\\n')}\n- **Key Decisions:**\n${options.decisions.map(d => ` - ${d}`).join('\\n')}\n- **Challenges:**\n${options.challenges.map(c => ` - ${c}`).join('\\n')}\n\n## ⏭ Next Steps / Context for Successor\n${options.nextSteps.map(s => `- ${s}`).join('\\n')}\n`\n}\n\n/**\n * Common status mapping for worklogs\n */\nexport function mapTaskStatusToWorklogStatus(\n status: TaskStatus\n): 'Complete' | 'Partial' | 'Blocked' {\n switch (status) {\n case 'DONE':\n return 'Complete'\n case 'BLOCKED':\n return 'Blocked'\n default:\n return 'Partial'\n }\n}\n","import { existsSync, statSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\n\nimport { AGENT_FILE } from '../constants'\n\n/**\n * Result of an ancestor lookup: a single AGENT.md entry that exists on the\n * path between a target file or directory and the project root.\n */\nexport interface AncestorAgent {\n /** Absolute path to the directory containing the AGENT.md */\n dir: string\n /** Absolute path to the AGENT.md file */\n path: string\n /** Path of the directory relative to the project root */\n relativeDir: string\n}\n\n/**\n * Return the ordered list of AGENT.md files that exist on the path from a\n * target file or directory up to the project root. The order is root-first,\n * then each intermediate directory, then the target directory itself.\n *\n * Non-existent AGENT.md files are silently skipped (the chain can have gaps).\n *\n * @param target - The absolute or project-relative path to a file or directory.\n * @param projectRoot - The absolute path of the project root (where the root\n * AGENT.md lives). Defaults to the current working directory.\n *\n * @example\n * findAncestorAgents('/proj/apps/web/components/ui/button.tsx', '/proj')\n * // Returns, in order:\n * // - { dir: '/proj', path: '/proj/AGENT.md' }\n * // - { dir: '/proj/apps/web', path: '/proj/apps/web/AGENT.md' }\n * // (apps/, components/ skipped because they have no AGENT.md)\n * // (button.tsx itself is a file, so its parent dir is the last one checked)\n */\nexport function findAncestorAgents(\n target: string,\n projectRoot: string = process.cwd()\n): AncestorAgent[] {\n const absRoot = resolve(projectRoot)\n const absTarget = resolveAgainstRoot(target, absRoot)\n\n // Validate that the target lives within the project root\n const relToRoot = relative(absRoot, absTarget)\n if (relToRoot.startsWith('..') || isAbsolute(relToRoot)) {\n throw new Error(\n `Target \"${target}\" is outside the project root \"${absRoot}\". ` +\n `findAncestorAgents only handles paths within the project.`\n )\n }\n\n // Collect every directory from the target up to the root, in root-first order.\n // For a file target, we only look at the directory chain (not the file itself).\n // For a directory target, the directory itself is included as the last entry.\n const targetDir = isDirectory(absTarget) ? absTarget : dirname(absTarget)\n const dirs = collectAncestorDirs(targetDir, absRoot)\n\n const result: AncestorAgent[] = []\n for (const dir of dirs) {\n const agentPath = join(dir, AGENT_FILE)\n if (existsSync(agentPath)) {\n result.push({\n dir,\n path: agentPath,\n relativeDir: relativeDir(dir, absRoot),\n })\n }\n }\n\n return result\n}\n\n/**\n * Resolve a target path against the project root. Accepts absolute paths\n * (returned as-is) and project-relative paths (joined with the root).\n */\nfunction resolveAgainstRoot(target: string, absRoot: string): string {\n if (isAbsolute(target)) return target\n return join(absRoot, target)\n}\n\n/**\n * Return the directory chain from a starting directory up to (and including)\n * the project root, in root-first order. The chain is computed by walking\n * the relative path segments from the starting dir back to the root.\n */\nfunction collectAncestorDirs(startDir: string, absRoot: string): string[] {\n const rel = relative(absRoot, startDir)\n if (rel === '' || rel === '.') {\n return [absRoot]\n }\n\n const segments = rel.split(sep).filter(s => s !== '' && s !== '.')\n const chain: string[] = [absRoot]\n let acc = absRoot\n for (const seg of segments) {\n acc = join(acc, seg)\n chain.push(acc)\n }\n return chain\n}\n\n/**\n * Compute the directory's path relative to the project root, in a form\n * suitable for display. The root itself is rendered as \".\".\n */\nfunction relativeDir(dir: string, absRoot: string): string {\n const rel = relative(absRoot, dir)\n return rel === '' ? '.' : rel\n}\n\nfunction isDirectory(p: string): boolean {\n try {\n return statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n","import yaml from 'js-yaml'\nimport type { AgentContext, AgentSection } from '../types'\n\nexport class AgentParser {\n /**\n * Parse an AGENT.md content into a structured AgentContext\n */\n static parse(markdown: string): AgentContext {\n let content = markdown\n let metadata: Record<string, any> = {}\n\n // Parse Frontmatter\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/\n const match = markdown.match(frontmatterRegex)\n if (match) {\n try {\n metadata = yaml.load(match[1] as string) as Record<string, any>\n content = markdown.slice(match[0].length).trim()\n } catch (e) {\n console.error('Failed to parse Agent frontmatter:', e)\n }\n }\n\n const lines = content.split(/\\r?\\n/)\n const sections: AgentSection[] = []\n let title = metadata.name ?? 'Unknown Agent'\n let currentSection: AgentSection | null = null\n let currentContent: string[] = []\n\n for (const line of lines) {\n // Parse Title (Only if not already set by frontmatter)\n if (line.startsWith('# ') && !metadata.name) {\n const rawTitle = line.replace('# ', '').trim()\n // Handle \"AGENT CONTEXT: [Name]\" format\n if (rawTitle.toUpperCase().startsWith('AGENT CONTEXT:')) {\n title = rawTitle\n .slice(14)\n .replace(/^[:\\s-]+/, '')\n .trim()\n } else {\n title = rawTitle\n }\n continue\n }\n\n // Parse Sections\n if (line.startsWith('## ')) {\n // Save previous section\n if (currentSection) {\n currentSection.content = currentContent.join('\\n').trim()\n sections.push(currentSection)\n }\n\n currentSection = {\n title: line.replace('## ', '').trim(),\n content: '',\n }\n currentContent = []\n continue\n }\n\n // Collect content\n if (currentSection) {\n currentContent.push(line)\n }\n }\n\n // Save last section\n if (currentSection) {\n currentSection.content = currentContent.join('\\n').trim()\n sections.push(currentSection)\n }\n\n return {\n title,\n sections,\n metadata,\n }\n }\n}\n","import type { Complexity, Priority, Task, TaskStatus } from '../types'\n\nexport class TaskParser {\n static parse(markdown: string): Task[] {\n const tasks: Task[] = []\n const lines = markdown.split(/\\r?\\n/)\n const taskRegex = /- \\[([ x/!])\\] \\*\\*\\[(.+)\\]\\*\\* (.+) `Priority: (.+)` `Complexity: (.+)`/\n\n for (const line of lines) {\n const match = line.match(taskRegex)\n if (match) {\n const [, statusChar = ' ', id = '', title = '', priority = '', complexity = ''] =\n match\n tasks.push({\n id,\n title: title.trim(),\n priority: priority as Priority,\n complexity: complexity as Complexity,\n status: this.mapStatus(statusChar),\n })\n }\n }\n return tasks\n }\n\n private static mapStatus(char: string): TaskStatus {\n switch (char) {\n case ' ':\n return 'TODO'\n case '/':\n return 'IN_PROGRESS'\n case 'x':\n return 'DONE'\n case '!':\n return 'BLOCKED'\n default:\n return 'TODO'\n }\n }\n}\n","","import harnessCodesData from './data/harness-codes.json' with { type: 'json' }\nimport {\n HarnessCodesSchema,\n type Harness,\n type HarnessCodes,\n type Installer,\n} from './schemas/harness-codes'\n\n/**\n * Validated, in-memory representation of the harness codes config.\n * Loaded once at module init, validated via Zod.\n */\nconst codes: HarnessCodes = HarnessCodesSchema.parse(harnessCodesData)\n\n/**\n * Get a single harness entry by its id.\n * Throws if the id is unknown.\n */\nexport function getHarness(id: string): Harness {\n const entry = codes.platforms[id]\n if (!entry) {\n const known = Object.keys(codes.platforms).join(', ')\n throw new Error(`Unknown harness: \"${id}\". Known harnesses: ${known}`)\n }\n return entry\n}\n\n/**\n * List all configured harnesses, as an array of {id, harness} pairs.\n * Stable order: insertion order of the JSON object.\n */\nexport function listHarnesses(): Array<{ id: string; harness: Harness }> {\n return Object.entries(codes.platforms).map(([id, harness]) => ({ id, harness }))\n}\n\n/**\n * Get the list of preferred harnesses (shown as recommended options).\n */\nexport function listPreferredHarnesses(): Array<{ id: string; harness: Harness }> {\n return listHarnesses().filter(({ harness }) => harness.preferred)\n}\n\n/**\n * A resolved target directory where workflow files will be written.\n * One per unique path, with the list of harness ids that share it.\n */\nexport interface ResolvedTarget {\n /** Absolute or project-relative path to the directory */\n path: string\n /** File extension to use (e.g. \".md\", \".agent.md\") */\n fileExtension: string\n /** Ids of the harnesses that will read from this directory */\n usedBy: string[]\n}\n\n/**\n * Resolve the unique target directories for a set of harness ids.\n *\n * Harnesses that share the same `skillsDir` (e.g. Codex, OpenCode, KiloCode\n * all use `.agents/skills/`) are deduplicated: the directory appears once\n * in the output, with all the harness ids listed in `usedBy`.\n *\n * The `path` is returned relative to the project root (caller is responsible\n * for joining with the project cwd).\n */\nexport function resolveTargets(harnessIds: string[], cwd: string = '.'): ResolvedTarget[] {\n const map = new Map<string, ResolvedTarget>()\n\n for (const id of harnessIds) {\n const { installer } = getHarness(id)\n collectFromInstaller(map, installer, id, cwd)\n }\n\n return Array.from(map.values())\n}\n\nfunction collectFromInstaller(\n map: Map<string, ResolvedTarget>,\n installer: Installer,\n harnessId: string,\n cwd: string\n): void {\n const ext = installer.fileExtension\n if (installer.targetDir) {\n addTarget(map, joinPath(cwd, installer.targetDir), ext, harnessId)\n }\n if (installer.skillsDir) {\n addTarget(map, joinPath(cwd, installer.skillsDir), ext, harnessId)\n }\n if (installer.commandsDir) {\n addTarget(map, joinPath(cwd, installer.commandsDir), ext, harnessId)\n }\n}\n\nfunction addTarget(\n map: Map<string, ResolvedTarget>,\n path: string,\n fileExtension: string,\n harnessId: string\n): void {\n const existing = map.get(path)\n if (existing) {\n if (!existing.usedBy.includes(harnessId)) {\n existing.usedBy.push(harnessId)\n }\n } else {\n map.set(path, { path, fileExtension, usedBy: [harnessId] })\n }\n}\n\nfunction joinPath(a: string, b: string): string {\n if (a === '.' || a === '') return b\n if (b.startsWith('/')) return `${a}${b}`\n return `${a}/${b}`\n}\n\n/**\n * Get the raw (validated) codes object, for advanced use cases.\n * Most callers should use the higher-level helpers above.\n */\nexport function getRawHarnessCodes(): HarnessCodes {\n return codes\n}\n"],"mappings":"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"}
|