@autonomos/core 0.6.0 → 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/README.md CHANGED
@@ -8,7 +8,7 @@ This package contains the shared constants, types, templates, and parsers that d
8
8
 
9
9
  ## Features
10
10
 
11
- - **Constants**: Shared directory and file names (`.autonomos`, `manifest.json`, optional `specs/`, and `decisions/`)
11
+ - **Constants**: Shared directory and file names (`.autonomos`, `manifest.json`, optional `archive/`, `specs/`, and `decisions/`)
12
12
  - **Templates**: Immutable templates for `PROTOCOL.md`, `TASKS.md`, `AGENT.md`, and `manifest.json`.
13
13
  - **Knowledge boundaries**: Markdown-first conventions for optional specifications and decision records (ADR), without requiring a parser.
14
14
  - **Types**: TypeScript definitions for protocol entities (Tasks, Agents, Manifest).
@@ -24,6 +24,26 @@ console.log(`Current Protocol Version: ${PROTOCOL_VERSION}`)
24
24
  const tasks = TaskParser.parse(markdownContent)
25
25
  ```
26
26
 
27
+ ## Current and Historical Task IDs
28
+
29
+ ```typescript
30
+ import { readTaskRegistry } from '@autonomos/core'
31
+
32
+ const registry = readTaskRegistry(projectRoot, { history: true })
33
+ const reservedIds = new Set([...registry.current, ...registry.archived].map(task => task.id))
34
+ // Do not allocate a new ID until registry.complete is true and duplicates are resolved.
35
+ console.log(registry.duplicateIds, registry.warnings, reservedIds)
36
+ ```
37
+
38
+ The default reads only the current task registry. Explicit history recursively
39
+ reads `.autonomos/archive/**/TASKS.md`, without following symbolic links. References
40
+ include ID, status, source path relative to the supplied root, and line number.
41
+ `TaskParser.references` recognizes task IDs/status without optional metadata and
42
+ ignores fenced examples; the existing detailed `TaskParser.parse` API is unchanged.
43
+ `complete` describes the requested read, not semantic validity or task completion.
44
+ The reader never mutates or decides which records are obsolete. Archives and their
45
+ index remain project-owned Markdown; no CLI or Git is required for retrieval.
46
+
27
47
  ## Structure
28
48
 
29
49
  - `src/constants.ts`: Global constants and versioning.
package/dist/index.d.mts CHANGED
@@ -5,7 +5,7 @@ import { z } from "zod";
5
5
  * Agent Protocol Specification Version (Independent of Package versions)
6
6
  * This refers to the schema and behavioral contract version.
7
7
  */
8
- declare const PROTOCOL_VERSION = "0.6.0-alpha";
8
+ declare const PROTOCOL_VERSION = "0.7.0-alpha";
9
9
  /**
10
10
  * Directory name for Autonomos configuration
11
11
  */
@@ -38,6 +38,8 @@ declare const SPECS_DIR = "specs";
38
38
  * Optional project-owned directory for technical decision records (ADRs)
39
39
  */
40
40
  declare const DECISIONS_DIR = "decisions";
41
+ /** Optional project-owned history, never loaded by default. */
42
+ declare const ARCHIVE_DIR = "archive";
41
43
  //#endregion
42
44
  //#region src/schemas/harness-codes.d.ts
43
45
  /**
@@ -57,36 +59,46 @@ declare const InstallerSchema: z.ZodEffects<z.ZodObject<{
57
59
  targetDir: z.ZodOptional<z.ZodString>;
58
60
  skillsDir: z.ZodOptional<z.ZodString>;
59
61
  commandsDir: z.ZodOptional<z.ZodString>;
62
+ promptsDir: z.ZodOptional<z.ZodString>;
60
63
  globalTargetDir: z.ZodOptional<z.ZodString>;
61
64
  fileExtension: z.ZodString;
65
+ _note: z.ZodOptional<z.ZodString>;
62
66
  }, "strip", z.ZodTypeAny, {
63
67
  fileExtension: string;
64
68
  workflowsDir?: string | undefined;
65
69
  targetDir?: string | undefined;
66
70
  skillsDir?: string | undefined;
67
71
  commandsDir?: string | undefined;
72
+ promptsDir?: string | undefined;
68
73
  globalTargetDir?: string | undefined;
74
+ _note?: string | undefined;
69
75
  }, {
70
76
  fileExtension: string;
71
77
  workflowsDir?: string | undefined;
72
78
  targetDir?: string | undefined;
73
79
  skillsDir?: string | undefined;
74
80
  commandsDir?: string | undefined;
81
+ promptsDir?: string | undefined;
75
82
  globalTargetDir?: string | undefined;
83
+ _note?: string | undefined;
76
84
  }>, {
77
85
  fileExtension: string;
78
86
  workflowsDir?: string | undefined;
79
87
  targetDir?: string | undefined;
80
88
  skillsDir?: string | undefined;
81
89
  commandsDir?: string | undefined;
90
+ promptsDir?: string | undefined;
82
91
  globalTargetDir?: string | undefined;
92
+ _note?: string | undefined;
83
93
  }, {
84
94
  fileExtension: string;
85
95
  workflowsDir?: string | undefined;
86
96
  targetDir?: string | undefined;
87
97
  skillsDir?: string | undefined;
88
98
  commandsDir?: string | undefined;
99
+ promptsDir?: string | undefined;
89
100
  globalTargetDir?: string | undefined;
101
+ _note?: string | undefined;
90
102
  }>;
91
103
  /**
92
104
  * A single harness entry.
@@ -99,36 +111,46 @@ declare const HarnessSchema: z.ZodObject<{
99
111
  targetDir: z.ZodOptional<z.ZodString>;
100
112
  skillsDir: z.ZodOptional<z.ZodString>;
101
113
  commandsDir: z.ZodOptional<z.ZodString>;
114
+ promptsDir: z.ZodOptional<z.ZodString>;
102
115
  globalTargetDir: z.ZodOptional<z.ZodString>;
103
116
  fileExtension: z.ZodString;
117
+ _note: z.ZodOptional<z.ZodString>;
104
118
  }, "strip", z.ZodTypeAny, {
105
119
  fileExtension: string;
106
120
  workflowsDir?: string | undefined;
107
121
  targetDir?: string | undefined;
108
122
  skillsDir?: string | undefined;
109
123
  commandsDir?: string | undefined;
124
+ promptsDir?: string | undefined;
110
125
  globalTargetDir?: string | undefined;
126
+ _note?: string | undefined;
111
127
  }, {
112
128
  fileExtension: string;
113
129
  workflowsDir?: string | undefined;
114
130
  targetDir?: string | undefined;
115
131
  skillsDir?: string | undefined;
116
132
  commandsDir?: string | undefined;
133
+ promptsDir?: string | undefined;
117
134
  globalTargetDir?: string | undefined;
135
+ _note?: string | undefined;
118
136
  }>, {
119
137
  fileExtension: string;
120
138
  workflowsDir?: string | undefined;
121
139
  targetDir?: string | undefined;
122
140
  skillsDir?: string | undefined;
123
141
  commandsDir?: string | undefined;
142
+ promptsDir?: string | undefined;
124
143
  globalTargetDir?: string | undefined;
144
+ _note?: string | undefined;
125
145
  }, {
126
146
  fileExtension: string;
127
147
  workflowsDir?: string | undefined;
128
148
  targetDir?: string | undefined;
129
149
  skillsDir?: string | undefined;
130
150
  commandsDir?: string | undefined;
151
+ promptsDir?: string | undefined;
131
152
  globalTargetDir?: string | undefined;
153
+ _note?: string | undefined;
132
154
  }>;
133
155
  }, "strip", z.ZodTypeAny, {
134
156
  name: string;
@@ -139,7 +161,9 @@ declare const HarnessSchema: z.ZodObject<{
139
161
  targetDir?: string | undefined;
140
162
  skillsDir?: string | undefined;
141
163
  commandsDir?: string | undefined;
164
+ promptsDir?: string | undefined;
142
165
  globalTargetDir?: string | undefined;
166
+ _note?: string | undefined;
143
167
  };
144
168
  }, {
145
169
  name: string;
@@ -150,7 +174,9 @@ declare const HarnessSchema: z.ZodObject<{
150
174
  targetDir?: string | undefined;
151
175
  skillsDir?: string | undefined;
152
176
  commandsDir?: string | undefined;
177
+ promptsDir?: string | undefined;
153
178
  globalTargetDir?: string | undefined;
179
+ _note?: string | undefined;
154
180
  };
155
181
  }>;
156
182
  /**
@@ -165,36 +191,46 @@ declare const HarnessCodesSchema: z.ZodObject<{
165
191
  targetDir: z.ZodOptional<z.ZodString>;
166
192
  skillsDir: z.ZodOptional<z.ZodString>;
167
193
  commandsDir: z.ZodOptional<z.ZodString>;
194
+ promptsDir: z.ZodOptional<z.ZodString>;
168
195
  globalTargetDir: z.ZodOptional<z.ZodString>;
169
196
  fileExtension: z.ZodString;
197
+ _note: z.ZodOptional<z.ZodString>;
170
198
  }, "strip", z.ZodTypeAny, {
171
199
  fileExtension: string;
172
200
  workflowsDir?: string | undefined;
173
201
  targetDir?: string | undefined;
174
202
  skillsDir?: string | undefined;
175
203
  commandsDir?: string | undefined;
204
+ promptsDir?: string | undefined;
176
205
  globalTargetDir?: string | undefined;
206
+ _note?: string | undefined;
177
207
  }, {
178
208
  fileExtension: string;
179
209
  workflowsDir?: string | undefined;
180
210
  targetDir?: string | undefined;
181
211
  skillsDir?: string | undefined;
182
212
  commandsDir?: string | undefined;
213
+ promptsDir?: string | undefined;
183
214
  globalTargetDir?: string | undefined;
215
+ _note?: string | undefined;
184
216
  }>, {
185
217
  fileExtension: string;
186
218
  workflowsDir?: string | undefined;
187
219
  targetDir?: string | undefined;
188
220
  skillsDir?: string | undefined;
189
221
  commandsDir?: string | undefined;
222
+ promptsDir?: string | undefined;
190
223
  globalTargetDir?: string | undefined;
224
+ _note?: string | undefined;
191
225
  }, {
192
226
  fileExtension: string;
193
227
  workflowsDir?: string | undefined;
194
228
  targetDir?: string | undefined;
195
229
  skillsDir?: string | undefined;
196
230
  commandsDir?: string | undefined;
231
+ promptsDir?: string | undefined;
197
232
  globalTargetDir?: string | undefined;
233
+ _note?: string | undefined;
198
234
  }>;
199
235
  }, "strip", z.ZodTypeAny, {
200
236
  name: string;
@@ -205,7 +241,9 @@ declare const HarnessCodesSchema: z.ZodObject<{
205
241
  targetDir?: string | undefined;
206
242
  skillsDir?: string | undefined;
207
243
  commandsDir?: string | undefined;
244
+ promptsDir?: string | undefined;
208
245
  globalTargetDir?: string | undefined;
246
+ _note?: string | undefined;
209
247
  };
210
248
  }, {
211
249
  name: string;
@@ -216,7 +254,9 @@ declare const HarnessCodesSchema: z.ZodObject<{
216
254
  targetDir?: string | undefined;
217
255
  skillsDir?: string | undefined;
218
256
  commandsDir?: string | undefined;
257
+ promptsDir?: string | undefined;
219
258
  globalTargetDir?: string | undefined;
259
+ _note?: string | undefined;
220
260
  };
221
261
  }>>;
222
262
  }, "strip", z.ZodTypeAny, {
@@ -229,7 +269,9 @@ declare const HarnessCodesSchema: z.ZodObject<{
229
269
  targetDir?: string | undefined;
230
270
  skillsDir?: string | undefined;
231
271
  commandsDir?: string | undefined;
272
+ promptsDir?: string | undefined;
232
273
  globalTargetDir?: string | undefined;
274
+ _note?: string | undefined;
233
275
  };
234
276
  }>;
235
277
  }, {
@@ -242,7 +284,9 @@ declare const HarnessCodesSchema: z.ZodObject<{
242
284
  targetDir?: string | undefined;
243
285
  skillsDir?: string | undefined;
244
286
  commandsDir?: string | undefined;
287
+ promptsDir?: string | undefined;
245
288
  globalTargetDir?: string | undefined;
289
+ _note?: string | undefined;
246
290
  };
247
291
  }>;
248
292
  }>;
@@ -355,25 +399,25 @@ declare function parseManifest(content: string): Manifest;
355
399
  //#endregion
356
400
  //#region src/templates/protocol.d.ts
357
401
  /**
358
- * The Protocol kernel template — v0.6
402
+ * The Protocol kernel template — v0.7
359
403
  *
360
- * Design principles (v0.6):
404
+ * Design principles (v0.7):
361
405
  * - PROTOCOL.md is a compact REFERENCE, not an executable workflow.
362
406
  * - All step-by-step instructions live in the workflow files.
363
407
  * - No duplication between PROTOCOL.md and workflows.
364
408
  * - Short enough that an LLM can re-scan it mid-session without cost.
365
409
  */
366
- declare const PROTOCOL_TEMPLATE = "# AUTONOMOS PROTOCOL (v0.6.0-alpha)\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the `/session` workflow |\n| Start a task | Read the `/task` workflow |\n| Triage a problem or proposal | Read the optional `/issue` workflow |\n| Adopt existing project knowledge | Read the optional `/adopt` workflow |\n| Audit accumulated drift | Read the `/reconcile` workflow |\n| Design or critique a surface | Read the optional `/design` workflow |\n| End a session | Read the `/crystallize` workflow |\n| Get context | Read root `AGENT.md`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume `[/]` or pick highest-priority `[ ]` |\n| Log session work | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| `AGENT.md` | Root + any subdirectory | Durable guidance for its directory scope |\n| `TASKS.md` | `.autonomos/TASKS.md` | Single source of truth for task state |\n| `ISSUES.md` | `.autonomos/ISSUES.md` | Optional problem, proposal, and question intake |\n| `worklogs/` | `.autonomos/worklogs/` | Historical session evidence, not current guidance |\n| `specs/` | `.autonomos/specs/` | Optional project-owned normative target state |\n| `decisions/` | `.autonomos/decisions/` | Optional project-owned decision records (ADRs) |\n| `DESIGN.md` | Root or target scope | Optional project-owned visual/interaction direction |\n| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\n\n## Design Direction Boundary\n\n`DESIGN.md` is optional project-owned direction, not a managed protocol\nartifact. Use `/design` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable `AGENT.md`; consolidate or replace obsolete entries instead of appending history.\n\n**Root `AGENT.md`** \u2014 Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local `AGENT.md`** (in any subdirectory) \u2014 Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n```markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\*.test.ts)\n- Constraint: template changes require workflow test updates\n```\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md`, `specs/`, and `decisions/` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- `.autonomos/specs/` and `.autonomos/decisions/` are optional, project-owned, first-use directories; `init`, `update`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is `draft`, `accepted`, or `superseded`. Only `accepted` is normative; `superseded` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use `proposed`, `accepted`, or `superseded`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in `AGENT.md`, user/developer reference in `docs/`, execution state in `TASKS.md`, and historical evidence in `worklogs/`.\n- Read only relevant accepted records at task start. Use `/adopt` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n```markdown\n# SPEC-001 \u2014 Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n```\n\n```markdown\n# ADR-001 \u2014 Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n```\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Task Format\n\n`- [Status] **[ID]** Title \\`Priority\\` \\`Complexity\\``\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| `[ ]` Todo | `\uD83D\uDD34 Critical` | `S` Small |\n| `[/]` In Progress | `\uD83D\uDFE0 High` | `M` Medium |\n| `[x]` Done | `\uD83D\uDD35 Medium` | `L` Large |\n| `[!]` Blocked | `\u26AA Low` | `XL` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\n";
410
+ declare const PROTOCOL_TEMPLATE = "# AUTONOMOS PROTOCOL (v0.7.0-alpha)\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the `/session` workflow |\n| Start a task | Read the `/task` workflow |\n| Triage a problem or proposal | Read the optional `/issue` workflow |\n| Adopt existing project knowledge | Read the optional `/adopt` workflow |\n| Reconcile drift and archive history | Read the `/reconcile` workflow |\n| Design or critique a surface | Read the optional `/design` workflow |\n| End a session | Read the `/crystallize` workflow |\n| Get context | Read root `AGENT.md`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume `[/]` or pick highest-priority `[ ]` |\n| Log session work | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| `AGENT.md` | Root + any subdirectory | Durable guidance for its directory scope |\n| `TASKS.md` | `.autonomos/TASKS.md` | Current task state and optional Current direction |\n| `ISSUES.md` | `.autonomos/ISSUES.md` | Optional problem, proposal, and question intake |\n| `worklogs/` | `.autonomos/worklogs/` | Historical session evidence, not current guidance |\n| `archive/` | `.autonomos/archive/` | Optional history, searched only when justified |\n| `specs/` | `.autonomos/specs/` | Optional project-owned normative target state |\n| `decisions/` | `.autonomos/decisions/` | Optional project-owned decision records (ADRs) |\n| `DESIGN.md` | Root or target scope | Optional project-owned visual/interaction direction |\n| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\n\n## Design Direction Boundary\n\n`DESIGN.md` is optional project-owned direction, not a managed protocol\nartifact. Use `/design` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable `AGENT.md`; consolidate or replace obsolete entries instead of appending history. Preserve valid subclaims in mixed paragraphs. Check the resulting text for completed-action narratives, task progress and unsupported prohibitions; these do not belong in operating guidance.\n\n**Root `AGENT.md`** \u2014 Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local `AGENT.md`** (in any subdirectory) \u2014 Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n```markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\*.test.ts)\n- Constraint: template changes require workflow test updates\n```\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md`, `specs/`, and `decisions/` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- `.autonomos/specs/` and `.autonomos/decisions/` are optional, project-owned, first-use directories; `init`, `update`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is `draft`, `accepted`, or `superseded`. Only `accepted` is normative; `superseded` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use `proposed`, `accepted`, or `superseded`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in `AGENT.md`, user/developer reference in `docs/`, execution state in `TASKS.md`, and historical evidence in `worklogs/`.\n- Read only relevant accepted records at task start. Use `/adopt` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n```markdown\n# SPEC-001 \u2014 Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n```\n\n```markdown\n# ADR-001 \u2014 Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n```\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Current Context and Archival Lifecycle\n\n- Current context must support ordinary work without archives. Keep applicable guidance, accepted requirements/decisions, unresolved work, dependencies and necessary next actions discoverable. Acceptance is independent of implementation; dated temporary directives remain active until lifted or their stated end condition is met.\n- A completed task or resolved/declined issue is an archival candidate only when its own scope is settled and still-needed outcomes/constraints/references are retained in current context. Explicitly abandoned work may be archived with its reason, without claiming it was completed. A completed child does not satisfy unmet parent acceptance criteria.\n- Record new task completion dates as `Completed: YYYY-MM-DD`; do not infer missing old dates from worklog filenames. Age, a checkbox, absent code or a newer statement alone is not proof of obsolescence.\n- Group archival at coherent completed-work boundaries, not per task or calendar interval. No Sprint object or scheduled maintenance is required. Correct certain in-scope drift proactively during normal work; use `/reconcile` for investigation, consolidation and archival.\n- Before moving history, consolidate current knowledge in its existing narrowest home. Optional `Current direction` in `TASKS.md` explains present aims, recent consequential outcomes and next work; rewrite it rather than append chronology. Keep progress out of `AGENT.md`.\n- Create project-owned `.autonomos/archive/README.md` and meaningful batch directories on first use only. A batch can contain `TASKS.md`, `ISSUES.md`, `worklogs/` and provenance for retired guidance. Group/split batches by useful scope; there is no fixed age, size or mandatory per-record schema.\n- Archive means move, not delete or rewrite conclusions. Preserve historical record content, identifiers and provenance; repair relative paths when necessary. Preserve original mixed-source text when retiring only some claims. Applicable specs/decisions stay current independently of execution records. Extraction into new normative artifacts still uses `/adopt`.\n- The archive index maps batch topics to records, not a second task journal. Search by ID or subject only when a specific question requires history; neither archives nor their entire index are routine startup context. Keep only necessary dependency/outcome pointers in current records, not a permanent stub for every completed task.\n- Archived task and issue IDs remain reserved. Before assigning an ID, search current and archived registries. With a CLI, `readTaskRegistry(root, { history: true })` exposes task references and duplicates; plain Markdown search works without it.\n- Verify exact source text before edits, retained current knowledge, IDs and resolvable references after moves. Do not confuse tool annotations with file content or historical validation with a current observation. Re-read shared files before writing and preserve unrelated concurrent changes. Stop when a second pass yields no deterministic correction.\n- `autonomos status` summarizes the current task registry; `--history` adds separate archived counts and read/collision diagnostics. Archived means historical, not necessarily completed. History uses batch `TASKS.md` files, not arbitrary worklog checklists.\n- Archives are project-owned, like specs and decisions. Initialization, updates and integrity checks neither create empty archives nor overwrite, relocate or judge their contents. Installing a new protocol performs no automatic cleanup. Version-control policy stays project-owned; Git is not required for archival or retrieval.\n\nExample (only files needed by a batch are created):\n\n```text\n.autonomos/\n TASKS.md\n ISSUES.md\n archive/\n README.md\n realtime-experiment-retirement/\n TASKS.md\n ISSUES.md\n worklogs/\n```\n\n## Task Format\n\n`- [Status] **[ID]** Title \\`Priority\\` \\`Complexity\\``\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| `[ ]` Todo | `\uD83D\uDD34 Critical` | `S` Small |\n| `[/]` In Progress | `\uD83D\uDFE0 High` | `M` Medium |\n| `[x]` Done | `\uD83D\uDD35 Medium` | `L` Large |\n| `[!]` Blocked | `\u26AA Low` | `XL` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\n";
367
411
  /**
368
412
  * @deprecated Use PROTOCOL_TEMPLATE instead
369
413
  */
370
- declare const PROTOCOL_TEMPLATE_V2026_1 = "# AUTONOMOS PROTOCOL (v0.6.0-alpha)\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the `/session` workflow |\n| Start a task | Read the `/task` workflow |\n| Triage a problem or proposal | Read the optional `/issue` workflow |\n| Adopt existing project knowledge | Read the optional `/adopt` workflow |\n| Audit accumulated drift | Read the `/reconcile` workflow |\n| Design or critique a surface | Read the optional `/design` workflow |\n| End a session | Read the `/crystallize` workflow |\n| Get context | Read root `AGENT.md`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume `[/]` or pick highest-priority `[ ]` |\n| Log session work | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| `AGENT.md` | Root + any subdirectory | Durable guidance for its directory scope |\n| `TASKS.md` | `.autonomos/TASKS.md` | Single source of truth for task state |\n| `ISSUES.md` | `.autonomos/ISSUES.md` | Optional problem, proposal, and question intake |\n| `worklogs/` | `.autonomos/worklogs/` | Historical session evidence, not current guidance |\n| `specs/` | `.autonomos/specs/` | Optional project-owned normative target state |\n| `decisions/` | `.autonomos/decisions/` | Optional project-owned decision records (ADRs) |\n| `DESIGN.md` | Root or target scope | Optional project-owned visual/interaction direction |\n| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\n\n## Design Direction Boundary\n\n`DESIGN.md` is optional project-owned direction, not a managed protocol\nartifact. Use `/design` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable `AGENT.md`; consolidate or replace obsolete entries instead of appending history.\n\n**Root `AGENT.md`** \u2014 Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local `AGENT.md`** (in any subdirectory) \u2014 Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n```markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\*.test.ts)\n- Constraint: template changes require workflow test updates\n```\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md`, `specs/`, and `decisions/` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- `.autonomos/specs/` and `.autonomos/decisions/` are optional, project-owned, first-use directories; `init`, `update`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is `draft`, `accepted`, or `superseded`. Only `accepted` is normative; `superseded` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use `proposed`, `accepted`, or `superseded`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in `AGENT.md`, user/developer reference in `docs/`, execution state in `TASKS.md`, and historical evidence in `worklogs/`.\n- Read only relevant accepted records at task start. Use `/adopt` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n```markdown\n# SPEC-001 \u2014 Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n```\n\n```markdown\n# ADR-001 \u2014 Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n```\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Task Format\n\n`- [Status] **[ID]** Title \\`Priority\\` \\`Complexity\\``\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| `[ ]` Todo | `\uD83D\uDD34 Critical` | `S` Small |\n| `[/]` In Progress | `\uD83D\uDFE0 High` | `M` Medium |\n| `[x]` Done | `\uD83D\uDD35 Medium` | `L` Large |\n| `[!]` Blocked | `\u26AA Low` | `XL` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\n";
414
+ declare const PROTOCOL_TEMPLATE_V2026_1 = "# AUTONOMOS PROTOCOL (v0.7.0-alpha)\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the `/session` workflow |\n| Start a task | Read the `/task` workflow |\n| Triage a problem or proposal | Read the optional `/issue` workflow |\n| Adopt existing project knowledge | Read the optional `/adopt` workflow |\n| Reconcile drift and archive history | Read the `/reconcile` workflow |\n| Design or critique a surface | Read the optional `/design` workflow |\n| End a session | Read the `/crystallize` workflow |\n| Get context | Read root `AGENT.md`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume `[/]` or pick highest-priority `[ ]` |\n| Log session work | Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| `AGENT.md` | Root + any subdirectory | Durable guidance for its directory scope |\n| `TASKS.md` | `.autonomos/TASKS.md` | Current task state and optional Current direction |\n| `ISSUES.md` | `.autonomos/ISSUES.md` | Optional problem, proposal, and question intake |\n| `worklogs/` | `.autonomos/worklogs/` | Historical session evidence, not current guidance |\n| `archive/` | `.autonomos/archive/` | Optional history, searched only when justified |\n| `specs/` | `.autonomos/specs/` | Optional project-owned normative target state |\n| `decisions/` | `.autonomos/decisions/` | Optional project-owned decision records (ADRs) |\n| `DESIGN.md` | Root or target scope | Optional project-owned visual/interaction direction |\n| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\n\n## Design Direction Boundary\n\n`DESIGN.md` is optional project-owned direction, not a managed protocol\nartifact. Use `/design` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable `AGENT.md`; consolidate or replace obsolete entries instead of appending history. Preserve valid subclaims in mixed paragraphs. Check the resulting text for completed-action narratives, task progress and unsupported prohibitions; these do not belong in operating guidance.\n\n**Root `AGENT.md`** \u2014 Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local `AGENT.md`** (in any subdirectory) \u2014 Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n```markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\*.test.ts)\n- Constraint: template changes require workflow test updates\n```\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md`, `specs/`, and `decisions/` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- `.autonomos/specs/` and `.autonomos/decisions/` are optional, project-owned, first-use directories; `init`, `update`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is `draft`, `accepted`, or `superseded`. Only `accepted` is normative; `superseded` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use `proposed`, `accepted`, or `superseded`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in `AGENT.md`, user/developer reference in `docs/`, execution state in `TASKS.md`, and historical evidence in `worklogs/`.\n- Read only relevant accepted records at task start. Use `/adopt` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n```markdown\n# SPEC-001 \u2014 Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n```\n\n```markdown\n# ADR-001 \u2014 Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n```\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Current Context and Archival Lifecycle\n\n- Current context must support ordinary work without archives. Keep applicable guidance, accepted requirements/decisions, unresolved work, dependencies and necessary next actions discoverable. Acceptance is independent of implementation; dated temporary directives remain active until lifted or their stated end condition is met.\n- A completed task or resolved/declined issue is an archival candidate only when its own scope is settled and still-needed outcomes/constraints/references are retained in current context. Explicitly abandoned work may be archived with its reason, without claiming it was completed. A completed child does not satisfy unmet parent acceptance criteria.\n- Record new task completion dates as `Completed: YYYY-MM-DD`; do not infer missing old dates from worklog filenames. Age, a checkbox, absent code or a newer statement alone is not proof of obsolescence.\n- Group archival at coherent completed-work boundaries, not per task or calendar interval. No Sprint object or scheduled maintenance is required. Correct certain in-scope drift proactively during normal work; use `/reconcile` for investigation, consolidation and archival.\n- Before moving history, consolidate current knowledge in its existing narrowest home. Optional `Current direction` in `TASKS.md` explains present aims, recent consequential outcomes and next work; rewrite it rather than append chronology. Keep progress out of `AGENT.md`.\n- Create project-owned `.autonomos/archive/README.md` and meaningful batch directories on first use only. A batch can contain `TASKS.md`, `ISSUES.md`, `worklogs/` and provenance for retired guidance. Group/split batches by useful scope; there is no fixed age, size or mandatory per-record schema.\n- Archive means move, not delete or rewrite conclusions. Preserve historical record content, identifiers and provenance; repair relative paths when necessary. Preserve original mixed-source text when retiring only some claims. Applicable specs/decisions stay current independently of execution records. Extraction into new normative artifacts still uses `/adopt`.\n- The archive index maps batch topics to records, not a second task journal. Search by ID or subject only when a specific question requires history; neither archives nor their entire index are routine startup context. Keep only necessary dependency/outcome pointers in current records, not a permanent stub for every completed task.\n- Archived task and issue IDs remain reserved. Before assigning an ID, search current and archived registries. With a CLI, `readTaskRegistry(root, { history: true })` exposes task references and duplicates; plain Markdown search works without it.\n- Verify exact source text before edits, retained current knowledge, IDs and resolvable references after moves. Do not confuse tool annotations with file content or historical validation with a current observation. Re-read shared files before writing and preserve unrelated concurrent changes. Stop when a second pass yields no deterministic correction.\n- `autonomos status` summarizes the current task registry; `--history` adds separate archived counts and read/collision diagnostics. Archived means historical, not necessarily completed. History uses batch `TASKS.md` files, not arbitrary worklog checklists.\n- Archives are project-owned, like specs and decisions. Initialization, updates and integrity checks neither create empty archives nor overwrite, relocate or judge their contents. Installing a new protocol performs no automatic cleanup. Version-control policy stays project-owned; Git is not required for archival or retrieval.\n\nExample (only files needed by a batch are created):\n\n```text\n.autonomos/\n TASKS.md\n ISSUES.md\n archive/\n README.md\n realtime-experiment-retirement/\n TASKS.md\n ISSUES.md\n worklogs/\n```\n\n## Task Format\n\n`- [Status] **[ID]** Title \\`Priority\\` \\`Complexity\\``\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| `[ ]` Todo | `\uD83D\uDD34 Critical` | `S` Small |\n| `[/]` In Progress | `\uD83D\uDFE0 High` | `M` Medium |\n| `[x]` Done | `\uD83D\uDD35 Medium` | `L` Large |\n| `[!]` Blocked | `\u26AA Low` | `XL` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\n";
371
415
  //#endregion
372
416
  //#region src/templates/tasks.d.ts
373
417
  /**
374
418
  * Template for TASKS.md - The task registry
375
419
  */
376
- declare const TASKS_TEMPLATE = "# 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\n- [ ] **[INIT-01]** Review project context and structure `Priority: \uD83D\uDD35` `Complexity: S`\n\n## \uD83D\uDD2E Backlog\n\n*(Add future tasks here)*\n";
420
+ declare const TASKS_TEMPLATE = "# PROJECT TASKS & ROADMAP\n\n> **LEGEND**\n> **Priority:** [\uD83D\uDD34 Critical] [\uD83D\uDFE0 High] [\uD83D\uDD35 Medium] [\u26AA Low]\n> **Complexity:** [S] Small, [M] Medium, [L] Large, [XL] Huge (Planning required)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## \uD83D\uDE80 Current work\n\n- [ ] **[INIT-01]** Review project context and structure `Priority: \uD83D\uDD35` `Complexity: S`\n\n## \uD83D\uDD2E Backlog\n\n*(Add future tasks here)*\n";
377
421
  //#endregion
378
422
  //#region src/templates/worklog.d.ts
379
423
  interface WorklogOptions {
@@ -476,10 +520,37 @@ declare function displayRelative(target: string, base: string): string;
476
520
  //#endregion
477
521
  //#region src/parsers/task-parser.d.ts
478
522
  declare class TaskParser {
523
+ /** Discover IDs/status without requiring optional priority or complexity metadata. */
524
+ static references(markdown: string): {
525
+ id: string;
526
+ status: TaskStatus;
527
+ line: number;
528
+ }[];
479
529
  static parse(markdown: string): Task[];
480
530
  private static mapStatus;
481
531
  }
482
532
  //#endregion
533
+ //#region src/parsers/task-registry.d.ts
534
+ interface TaskReference {
535
+ id: string;
536
+ status: ReturnType<typeof TaskParser.references>[number]['status'];
537
+ line: number;
538
+ /** Source path relative to the supplied project root. */
539
+ path: string;
540
+ }
541
+ interface TaskRegistry {
542
+ current: TaskReference[];
543
+ archived: TaskReference[];
544
+ duplicateIds: string[];
545
+ warnings: string[];
546
+ /** False if a requested registry could not be inspected completely. */
547
+ complete: boolean;
548
+ }
549
+ /** Read current task IDs; opt into history for reporting or reserving a new ID. */
550
+ declare function readTaskRegistry(root: string, options?: {
551
+ history?: boolean;
552
+ }): TaskRegistry;
553
+ //#endregion
483
554
  //#region src/harness-codes.d.ts
484
555
  /**
485
556
  * Get a single harness entry by its id.
@@ -501,6 +572,7 @@ declare function listPreferredHarnesses(): Array<{
501
572
  id: string;
502
573
  harness: Harness;
503
574
  }>;
575
+ type TargetKind = 'flat' | 'skill';
504
576
  /**
505
577
  * A resolved target directory where workflow files will be written.
506
578
  * One per unique path, with the list of harness ids that share it.
@@ -510,15 +582,17 @@ interface ResolvedTarget {
510
582
  path: string;
511
583
  /** File extension to use (e.g. ".md", ".agent.md") */
512
584
  fileExtension: string;
585
+ /** Whether target receives flat files (e.g. session.md) or skill bundles (e.g. protocol-session/SKILL.md) */
586
+ kind: TargetKind;
513
587
  /** Ids of the harnesses that will read from this directory */
514
588
  usedBy: string[];
515
589
  }
516
590
  /**
517
591
  * Resolve the unique target directories for a set of harness ids.
518
592
  *
519
- * Harnesses that share the same `skillsDir` (e.g. Codex, OpenCode, KiloCode
520
- * all use `.agents/skills/`) are deduplicated: the directory appears once
521
- * in the output, with all the harness ids listed in `usedBy`.
593
+ * Harnesses that share the same `skillsDir` (e.g. Codex, OpenCode, KiloCode,
594
+ * Antigravity, Claude Code all use `.agents/skills/`) are deduplicated:
595
+ * the directory appears once in the output, with all the harness ids listed in `usedBy`.
522
596
  *
523
597
  * The `path` is returned relative to the project root (caller is responsible
524
598
  * for joining with the project cwd).
@@ -530,5 +604,5 @@ declare function resolveTargets(harnessIds: string[], cwd?: string): ResolvedTar
530
604
  */
531
605
  declare function getRawHarnessCodes(): HarnessCodes;
532
606
  //#endregion
533
- export { AGENT_FILE, AGENT_TEMPLATE, AUTONOMOS_DIR, AgentConfig, AgentContext, AgentParser, AgentSection, AncestorAgent, COMPLEXITIES, Complexity, DECISIONS_DIR, Harness, HarnessCodes, HarnessCodesSchema, HarnessSchema, Installer, InstallerSchema, LOCAL_AGENT_TEMPLATE, MANIFEST_FILE, Manifest, ManifestSchema, PRIORITIES, PROTOCOL_FILE, PROTOCOL_TEMPLATE, PROTOCOL_TEMPLATE_V2026_1, PROTOCOL_VERSION, Priority, ResolvedTarget, SPECS_DIR, TASKS_FILE, TASKS_TEMPLATE, Task, TaskParser, TaskStatus, WORKLOGS_DIR, createManifest, displayRelative, findAncestorAgents, findProjectRoot, generateAgentTemplate, generateLocalAgentTemplate, generateManifestContent, generateWorklogContent, getHarness, getRawHarnessCodes, isSamePath, listHarnesses, listPreferredHarnesses, mapTaskStatusToWorklogStatus, parseManifest, resolveTargets };
607
+ export { AGENT_FILE, AGENT_TEMPLATE, ARCHIVE_DIR, AUTONOMOS_DIR, AgentConfig, AgentContext, AgentParser, AgentSection, AncestorAgent, COMPLEXITIES, Complexity, DECISIONS_DIR, Harness, HarnessCodes, HarnessCodesSchema, HarnessSchema, Installer, InstallerSchema, LOCAL_AGENT_TEMPLATE, MANIFEST_FILE, Manifest, ManifestSchema, PRIORITIES, PROTOCOL_FILE, PROTOCOL_TEMPLATE, PROTOCOL_TEMPLATE_V2026_1, PROTOCOL_VERSION, Priority, ResolvedTarget, SPECS_DIR, TASKS_FILE, TASKS_TEMPLATE, TargetKind, Task, TaskParser, TaskReference, TaskRegistry, TaskStatus, WORKLOGS_DIR, createManifest, displayRelative, findAncestorAgents, findProjectRoot, generateAgentTemplate, generateLocalAgentTemplate, generateManifestContent, generateWorklogContent, getHarness, getRawHarnessCodes, isSamePath, listHarnesses, listPreferredHarnesses, mapTaskStatusToWorklogStatus, parseManifest, readTaskRegistry, resolveTargets };
534
608
  //# sourceMappingURL=index.d.mts.map
@@ -1 +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/project-root.ts","../src/parsers/task-parser.ts","../src/harness-codes.ts"],"mappings":"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"}
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/project-root.ts","../src/parsers/task-parser.ts","../src/parsers/task-registry.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{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.6.0-alpha`,d=`.autonomos`,f=`manifest.json`,p=`PROTOCOL.md`,m=`TASKS.md`,h=`AGENT.md`,ee=`worklogs`,g=`specs`,_=`decisions`,v=e.object({workflowsDir:e.string().optional(),targetDir:e.string().optional(),skillsDir:e.string().optional(),commandsDir:e.string().optional(),globalTargetDir:e.string().optional(),fileExtension:e.string()}).refine(e=>!!e.workflowsDir||!!e.targetDir||!!e.skillsDir,{message:"At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined"}),y=e.object({name:e.string().min(1),preferred:e.boolean(),installer:v}),b=e.object({platforms:e.record(e.string(),y)}),x=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`)}),S=[`🔴 Critical`,`🟠 High`,`🔵 Medium`,`⚪ Low`],C=[`S`,`M`,`L`,`XL`];function w(e=`Project`){return`---
1
+ import{z as e}from"zod";import{existsSync as t,lstatSync as n,readFileSync as r,readdirSync as i,statSync as a}from"node:fs";import{dirname as o,isAbsolute as s,join as c,relative as l,resolve as u,sep as d}from"node:path";import f from"js-yaml";const p=`0.7.0-alpha`,m=`.autonomos`,h=`manifest.json`,g=`PROTOCOL.md`,_=`TASKS.md`,v=`AGENT.md`,ee=`worklogs`,te=`specs`,y=`decisions`,b=`archive`,x=e.object({workflowsDir:e.string().optional(),targetDir:e.string().optional(),skillsDir:e.string().optional(),commandsDir:e.string().optional(),promptsDir:e.string().optional(),globalTargetDir:e.string().optional(),fileExtension:e.string(),_note:e.string().optional()}).refine(e=>!!e.workflowsDir||!!e.targetDir||!!e.skillsDir||!!e.commandsDir||!!e.promptsDir,{message:"At least one of `workflowsDir`, `targetDir`, `skillsDir`, `commandsDir`, or `promptsDir` must be defined"}),S=e.object({name:e.string().min(1),preferred:e.boolean(),installer:x}),C=e.object({platforms:e.record(e.string(),S)}),w=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`)}),T=[`🔴 Critical`,`🟠 High`,`🔵 Medium`,`⚪ Low`],E=[`S`,`M`,`L`,`XL`];function D(e=`Project`){return`---
2
2
  name: "${e}"
3
3
  type: "project"
4
4
  status: "active"
@@ -30,13 +30,13 @@ status: "active"
30
30
  ## ⚠️ Known Constraints
31
31
 
32
32
  *List any technical debts, missing features, or external limitations.*
33
- `}function T(e){return`# AGENT: ${e}
33
+ `}function O(e){return`# AGENT: ${e}
34
34
 
35
35
  - **Stack:** *(frameworks, libs specific to this module)*
36
36
  - **Conventions:** *(naming, exports, test patterns)*
37
37
  - **Constraints:** *(known issues, tech debt)*
38
- `}const te=w(),E=T(`module`);function D(e){let t=new Date().toISOString();return{protocolVersion:u,cliVersion:e,initializedAt:t,lastUpdated:t}}function O(e){return JSON.stringify(e,null,4)+`
39
- `}function k(e){let t=JSON.parse(e);return x.parse(t)}const A=`# AUTONOMOS PROTOCOL (v${u})
38
+ `}const ne=D(),re=O(`module`);function k(e){let t=new Date().toISOString();return{protocolVersion:p,cliVersion:e,initializedAt:t,lastUpdated:t}}function A(e){return JSON.stringify(e,null,4)+`
39
+ `}function j(e){let t=JSON.parse(e);return w.parse(t)}const M=`# AUTONOMOS PROTOCOL (v${p})
40
40
 
41
41
  > This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.
42
42
 
@@ -48,7 +48,7 @@ status: "active"
48
48
  | Start a task | Read the \`/task\` workflow |
49
49
  | Triage a problem or proposal | Read the optional \`/issue\` workflow |
50
50
  | Adopt existing project knowledge | Read the optional \`/adopt\` workflow |
51
- | Audit accumulated drift | Read the \`/reconcile\` workflow |
51
+ | Reconcile drift and archive history | Read the \`/reconcile\` workflow |
52
52
  | Design or critique a surface | Read the optional \`/design\` workflow |
53
53
  | End a session | Read the \`/crystallize\` workflow |
54
54
  | Get context | Read root \`AGENT.md\`, then only the selected scope's ancestor chain |
@@ -60,9 +60,10 @@ status: "active"
60
60
  | File | Location | Role |
61
61
  | --------------- | -------------------------- | ------------------------------------------------- |
62
62
  | \`AGENT.md\` | Root + any subdirectory | Durable guidance for its directory scope |
63
- | \`TASKS.md\` | \`.autonomos/TASKS.md\` | Single source of truth for task state |
63
+ | \`TASKS.md\` | \`.autonomos/TASKS.md\` | Current task state and optional Current direction |
64
64
  | \`ISSUES.md\` | \`.autonomos/ISSUES.md\` | Optional problem, proposal, and question intake |
65
65
  | \`worklogs/\` | \`.autonomos/worklogs/\` | Historical session evidence, not current guidance |
66
+ | \`archive/\` | \`.autonomos/archive/\` | Optional history, searched only when justified |
66
67
  | \`specs/\` | \`.autonomos/specs/\` | Optional project-owned normative target state |
67
68
  | \`decisions/\` | \`.autonomos/decisions/\` | Optional project-owned decision records (ADRs) |
68
69
  | \`DESIGN.md\` | Root or target scope | Optional project-owned visual/interaction direction |
@@ -78,7 +79,7 @@ The workflow supplies routing and evidence rules, not a universal visual style.
78
79
 
79
80
  ## AGENT.md Format Rules
80
81
 
81
- Store only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable \`AGENT.md\`; consolidate or replace obsolete entries instead of appending history.
82
+ Store only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable \`AGENT.md\`; consolidate or replace obsolete entries instead of appending history. Preserve valid subclaims in mixed paragraphs. Check the resulting text for completed-action narratives, task progress and unsupported prohibitions; these do not belong in operating guidance.
82
83
 
83
84
  **Root \`AGENT.md\`** — Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).
84
85
 
@@ -145,6 +146,35 @@ The protocol-facing name is **decision record**. **ADR** (Architecture Decision
145
146
 
146
147
  Only user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.
147
148
 
149
+ ## Current Context and Archival Lifecycle
150
+
151
+ - Current context must support ordinary work without archives. Keep applicable guidance, accepted requirements/decisions, unresolved work, dependencies and necessary next actions discoverable. Acceptance is independent of implementation; dated temporary directives remain active until lifted or their stated end condition is met.
152
+ - A completed task or resolved/declined issue is an archival candidate only when its own scope is settled and still-needed outcomes/constraints/references are retained in current context. Explicitly abandoned work may be archived with its reason, without claiming it was completed. A completed child does not satisfy unmet parent acceptance criteria.
153
+ - Record new task completion dates as \`Completed: YYYY-MM-DD\`; do not infer missing old dates from worklog filenames. Age, a checkbox, absent code or a newer statement alone is not proof of obsolescence.
154
+ - Group archival at coherent completed-work boundaries, not per task or calendar interval. No Sprint object or scheduled maintenance is required. Correct certain in-scope drift proactively during normal work; use \`/reconcile\` for investigation, consolidation and archival.
155
+ - Before moving history, consolidate current knowledge in its existing narrowest home. Optional \`Current direction\` in \`TASKS.md\` explains present aims, recent consequential outcomes and next work; rewrite it rather than append chronology. Keep progress out of \`AGENT.md\`.
156
+ - Create project-owned \`.autonomos/archive/README.md\` and meaningful batch directories on first use only. A batch can contain \`TASKS.md\`, \`ISSUES.md\`, \`worklogs/\` and provenance for retired guidance. Group/split batches by useful scope; there is no fixed age, size or mandatory per-record schema.
157
+ - Archive means move, not delete or rewrite conclusions. Preserve historical record content, identifiers and provenance; repair relative paths when necessary. Preserve original mixed-source text when retiring only some claims. Applicable specs/decisions stay current independently of execution records. Extraction into new normative artifacts still uses \`/adopt\`.
158
+ - The archive index maps batch topics to records, not a second task journal. Search by ID or subject only when a specific question requires history; neither archives nor their entire index are routine startup context. Keep only necessary dependency/outcome pointers in current records, not a permanent stub for every completed task.
159
+ - Archived task and issue IDs remain reserved. Before assigning an ID, search current and archived registries. With a CLI, \`readTaskRegistry(root, { history: true })\` exposes task references and duplicates; plain Markdown search works without it.
160
+ - Verify exact source text before edits, retained current knowledge, IDs and resolvable references after moves. Do not confuse tool annotations with file content or historical validation with a current observation. Re-read shared files before writing and preserve unrelated concurrent changes. Stop when a second pass yields no deterministic correction.
161
+ - \`autonomos status\` summarizes the current task registry; \`--history\` adds separate archived counts and read/collision diagnostics. Archived means historical, not necessarily completed. History uses batch \`TASKS.md\` files, not arbitrary worklog checklists.
162
+ - Archives are project-owned, like specs and decisions. Initialization, updates and integrity checks neither create empty archives nor overwrite, relocate or judge their contents. Installing a new protocol performs no automatic cleanup. Version-control policy stays project-owned; Git is not required for archival or retrieval.
163
+
164
+ Example (only files needed by a batch are created):
165
+
166
+ \`\`\`text
167
+ .autonomos/
168
+ TASKS.md
169
+ ISSUES.md
170
+ archive/
171
+ README.md
172
+ realtime-experiment-retirement/
173
+ TASKS.md
174
+ ISSUES.md
175
+ worklogs/
176
+ \`\`\`
177
+
148
178
  ## Task Format
149
179
 
150
180
  \`- [Status] **[ID]** Title \\\`Priority\\\` \\\`Complexity\\\`\`
@@ -161,21 +191,21 @@ Only user/project governance accepts a specification or decision as normative. A
161
191
  - **Language:** English unless AGENT.md says otherwise.
162
192
  - **Tone:** Technical, concise, fact-based.
163
193
  - **Continuity:** Refer to previous work as "we" or "the project".
164
- `,j=A,M=`# PROJECT TASKS & ROADMAP
194
+ `,N=M,P=`# PROJECT TASKS & ROADMAP
165
195
 
166
196
  > **LEGEND**
167
197
  > **Priority:** [🔴 Critical] [🟠 High] [🔵 Medium] [⚪ Low]
168
- > **Complexity:** [S] Small (1h), [M] Medium (4h), [L] Large (1-2 days), [XL] Huge (Planning req.)
198
+ > **Complexity:** [S] Small, [M] Medium, [L] Large, [XL] Huge (Planning required)
169
199
  > **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked
170
200
 
171
- ## 🚀 Active Sprint
201
+ ## 🚀 Current work
172
202
 
173
203
  - [ ] **[INIT-01]** Review project context and structure \`Priority: 🔵\` \`Complexity: S\`
174
204
 
175
205
  ## 🔮 Backlog
176
206
 
177
207
  *(Add future tasks here)*
178
- `;function N(e){let t=e.date??new Date().toISOString().split(`T`)[0];return`# WORKLOG: [${e.taskId}] ${e.taskName}
208
+ `;function F(e){let t=e.date??new Date().toISOString().split(`T`)[0];return`# WORKLOG: [${e.taskId}] ${e.taskName}
179
209
  **Date:** ${t}
180
210
  **Agent Status:** [${e.status}]
181
211
 
@@ -196,7 +226,7 @@ ${e.challenges.map(e=>` - ${e}`).join(`
196
226
  ## ⏭ Next Steps / Context for Successor
197
227
  ${e.nextSteps.map(e=>`- ${e}`).join(`
198
228
  `)}
199
- `}function P(e){switch(e){case`DONE`:return`Complete`;case`BLOCKED`:return`Blocked`;default:return`Partial`}}function F(e,n=process.cwd()){let c=s(n),l=I(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=L(z(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:R(e,c)})}return f}function I(e,t){return i(e)?e:a(t,e)}function L(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 R(e,t){let n=o(t,e);return n===``?`.`:n}function z(e){try{return n(e).isDirectory()}catch{return!1}}var B=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(`
229
+ `}function I(e){switch(e){case`DONE`:return`Complete`;case`BLOCKED`:return`Blocked`;default:return`Partial`}}function L(e,n=process.cwd()){let r=u(n),i=R(e,r),a=l(r,i);if(a.startsWith(`..`)||s(a))throw Error(`Target "${e}" is outside the project root "${r}". findAncestorAgents only handles paths within the project.`);let d=z(V(i)?i:o(i),r),f=[];for(let e of d){let n=c(e,v);t(n)&&f.push({dir:e,path:n,relativeDir:B(e,r)})}return f}function R(e,t){return s(e)?e:c(t,e)}function z(e,t){let n=l(t,e);if(n===``||n===`.`)return[t];let r=n.split(d).filter(e=>e!==``&&e!==`.`),i=[t],a=t;for(let e of r)a=c(a,e),i.push(a);return i}function B(e,t){let n=l(t,e);return n===``?`.`:n}function V(e){try{return a(e).isDirectory()}catch{return!1}}var H=class{static parse(e){let t=e,n={},r=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(r)try{n=f.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(`
200
230
  `).trim(),a.push(s)),s={title:e.replace(`## `,``).trim(),content:``},c=[];continue}s&&c.push(e)}return s&&(s.content=c.join(`
201
- `).trim(),a.push(s)),{title:o,sections:a,metadata:n}}};const V=[d,`.git`];function H(e){if(!e)return null;let n=s(e);for(;;){if(V.some(e=>t(a(n,e))))return n;let e=r(n);if(e===n)return null;n=e}}function U(e,t){return!e||!t?!1:s(e)===s(t)}function W(e,t){let n=o(t,e);return n===``||n===`.`?`.`:n.startsWith(`..${c}`)||n===`..`||i(n)?s(e):n}var G=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 K=b.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:{workflowsDir:`.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:{workflowsDir:`.claude/skills`,commandsDir:`.claude/commands`,fileExtension:`.md`}},codex:{name:`Codex`,preferred:!0,installer:{workflowsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.codex/skills`,_note:`OpenAI Codex. Uses the cross-tool .agents/skills/ standard.`}},antigravity:{name:`Antigravity`,preferred:!0,installer:{workflowsDir:`.agent/workflows`,fileExtension:`.md`,globalTargetDir:`~/.gemini/antigravity/skills`,_note:"Google Antigravity. Uses `.agent/workflows/` (not `.agent/skills/`). Singular `.agent/` (NOT the cross-tool `.agents/` standard). Cannot be deduplicated with the others."}},opencode:{name:`OpenCode`,preferred:!0,installer:{workflowsDir:`.agents/skills`,commandsDir:`.opencode/commands`,fileExtension:`.md`}},kilocode:{name:`KiloCode`,preferred:!0,installer:{workflowsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.kilocode/skills`}}}});function q(e){let t=K.platforms[e];if(!t){let t=Object.keys(K.platforms).join(`, `);throw Error(`Unknown harness: "${e}". Known harnesses: ${t}`)}return t}function J(){return Object.entries(K.platforms).map(([e,t])=>({id:e,harness:t}))}function Y(){return J().filter(({harness:e})=>e.preferred)}function X(e,t=`.`){let n=new Map;for(let r of e){let{installer:e}=q(r);Z(n,e,r,t)}return Array.from(n.values())}function Z(e,t,n,r){let i=t.fileExtension;t.workflowsDir?Q(e,$(r,t.workflowsDir),i,n):t.targetDir?Q(e,$(r,t.targetDir),i,n):t.skillsDir&&Q(e,$(r,t.skillsDir),i,n),t.commandsDir&&Q(e,$(r,t.commandsDir),i,n)}function Q(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 $(e,t){return e===`.`||e===``?t:t.startsWith(`/`)?`${e}${t}`:`${e}/${t}`}function ne(){return K}export{h as AGENT_FILE,te as AGENT_TEMPLATE,d as AUTONOMOS_DIR,B as AgentParser,C as COMPLEXITIES,_ as DECISIONS_DIR,b as HarnessCodesSchema,y as HarnessSchema,v as InstallerSchema,E as LOCAL_AGENT_TEMPLATE,f as MANIFEST_FILE,x as ManifestSchema,S as PRIORITIES,p as PROTOCOL_FILE,A as PROTOCOL_TEMPLATE,j as PROTOCOL_TEMPLATE_V2026_1,u as PROTOCOL_VERSION,g as SPECS_DIR,m as TASKS_FILE,M as TASKS_TEMPLATE,G as TaskParser,ee as WORKLOGS_DIR,D as createManifest,W as displayRelative,F as findAncestorAgents,H as findProjectRoot,w as generateAgentTemplate,T as generateLocalAgentTemplate,O as generateManifestContent,N as generateWorklogContent,q as getHarness,ne as getRawHarnessCodes,U as isSamePath,J as listHarnesses,Y as listPreferredHarnesses,P as mapTaskStatusToWorklogStatus,k as parseManifest,X as resolveTargets};
231
+ `).trim(),a.push(s)),{title:o,sections:a,metadata:n}}};const U=[m,`.git`];function W(e){if(!e)return null;let n=u(e);for(;;){if(U.some(e=>t(c(n,e))))return n;let e=o(n);if(e===n)return null;n=e}}function G(e,t){return!e||!t?!1:u(e)===u(t)}function K(e,t){let n=l(t,e);return n===``||n===`.`?`.`:n.startsWith(`..${d}`)||n===`..`||s(n)?u(e):n}var q=class{static references(e){let t=[],n;for(let[r,i]of e.split(/\r?\n/).entries()){let e=i.match(/^\s{0,3}(`{3,}|~{3,})/);if(e?.[1]){n?e[1][0]===n[0]&&e[1].length>=n.length&&!i.slice(e[0].length).trim()&&(n=void 0):n=e[1];continue}if(n)continue;let a=i.match(/^\s*- \[([ x/!])\] \*\*\[([^\]]+)\]\*\*/);a?.[1]&&a[2]?.trim()&&t.push({id:a[2].trim(),status:this.mapStatus(a[1]),line:r+1})}return t}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`}}};function J(e,t={}){let a={current:[],archived:[],duplicateIds:[],warnings:[],complete:!0};function o(t,n){a.complete=!1,a.warnings.push(`${l(e,t)}: ${n}`)}function s(t,i){try{if(!n(t).isFile()){o(t,`Expected a regular task registry; symbolic links are not followed`);return}i.push(...q.references(r(t,`utf8`)).map(n=>({...n,path:l(e,t)})))}catch(e){o(t,e instanceof Error?e.message:String(e))}}function u(e,t=!1){try{if(!n(e).isDirectory()){o(e,`Expected an archive directory; symbolic links are not followed`);return}for(let t of i(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))){let n=c(e,t.name);t.isSymbolicLink()?o(n,`Skipped symbolic link in archive`):t.isDirectory()?u(n):t.name===`TASKS.md`&&s(n,a.archived)}}catch(n){if(t&&n.code===`ENOENT`)return;o(e,n instanceof Error?n.message:String(n))}}let d=c(e,m);try{if(!n(d).isDirectory())return o(d,`Expected a regular project directory; symbolic links are not followed`),a}catch(e){return e.code!==`ENOENT`&&o(d,e instanceof Error?e.message:String(e)),a}let f=c(d,_);try{n(f),s(f,a.current)}catch(e){e.code!==`ENOENT`&&o(f,e instanceof Error?e.message:String(e))}t.history&&u(c(e,m,b),!0);let p=new Set,h=new Set;for(let e of[...a.current,...a.archived])p.has(e.id)&&h.add(e.id),p.add(e.id);return a.duplicateIds=[...h].sort(),a}const Y=C.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:{workflowsDir:`.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:{commandsDir:`.claude/commands`,skillsDir:`.agents/skills`,fileExtension:`.md`}},codex:{name:`Codex`,preferred:!0,installer:{promptsDir:`.codex/prompts`,skillsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.codex/prompts`,_note:`OpenAI Codex CLI. Slash commands live in .codex/prompts/, skills live in the cross-tool .agents/skills/ standard.`}},antigravity:{name:`Antigravity`,preferred:!0,installer:{workflowsDir:`.agents/workflows`,skillsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.gemini/config/workflows`,_note:`Google Antigravity. Workflows live in .agents/workflows/, skills live in the cross-tool .agents/skills/ standard.`}},opencode:{name:`OpenCode`,preferred:!0,installer:{commandsDir:`.opencode/commands`,skillsDir:`.agents/skills`,fileExtension:`.md`}},kilocode:{name:`KiloCode`,preferred:!0,installer:{workflowsDir:`.agents/workflows`,skillsDir:`.agents/skills`,fileExtension:`.md`,globalTargetDir:`~/.kilocode/skills`}}}});function X(e){let t=Y.platforms[e];if(!t){let t=Object.keys(Y.platforms).join(`, `);throw Error(`Unknown harness: "${e}". Known harnesses: ${t}`)}return t}function Z(){return Object.entries(Y.platforms).map(([e,t])=>({id:e,harness:t}))}function ie(){return Z().filter(({harness:e})=>e.preferred)}function ae(e,t=`.`){let n=new Map;for(let r of e){let{installer:e}=X(r);oe(n,e,r,t)}return Array.from(n.values())}function oe(e,t,n,r){let i=t.fileExtension;t.workflowsDir&&Q(e,$(r,t.workflowsDir),i,`flat`,n),t.commandsDir&&Q(e,$(r,t.commandsDir),i,`flat`,n),t.promptsDir&&Q(e,$(r,t.promptsDir),i,`flat`,n),t.targetDir&&Q(e,$(r,t.targetDir),i,`flat`,n),t.skillsDir&&Q(e,$(r,t.skillsDir),i,`skill`,n)}function Q(e,t,n,r,i){let a=e.get(t);a?a.usedBy.includes(i)||a.usedBy.push(i):e.set(t,{path:t,fileExtension:n,kind:r,usedBy:[i]})}function $(e,t){return e===`.`||e===``?t:t.startsWith(`/`)?`${e}${t}`:`${e}/${t}`}function se(){return Y}export{v as AGENT_FILE,ne as AGENT_TEMPLATE,b as ARCHIVE_DIR,m as AUTONOMOS_DIR,H as AgentParser,E as COMPLEXITIES,y as DECISIONS_DIR,C as HarnessCodesSchema,S as HarnessSchema,x as InstallerSchema,re as LOCAL_AGENT_TEMPLATE,h as MANIFEST_FILE,w as ManifestSchema,T as PRIORITIES,g as PROTOCOL_FILE,M as PROTOCOL_TEMPLATE,N as PROTOCOL_TEMPLATE_V2026_1,p as PROTOCOL_VERSION,te as SPECS_DIR,_ as TASKS_FILE,P as TASKS_TEMPLATE,q as TaskParser,ee as WORKLOGS_DIR,k as createManifest,K as displayRelative,L as findAncestorAgents,W as findProjectRoot,D as generateAgentTemplate,O as generateLocalAgentTemplate,A as generateManifestContent,F as generateWorklogContent,X as getHarness,se as getRawHarnessCodes,G as isSamePath,Z as listHarnesses,ie as listPreferredHarnesses,I as mapTaskStatusToWorklogStatus,j as parseManifest,J as readTaskRegistry,ae as resolveTargets};
202
232
  //# sourceMappingURL=index.mjs.map
@@ -1 +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/project-root.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.6.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\n/**\n * Optional project-owned directory for durable target-state specifications\n */\nexport const SPECS_DIR = 'specs'\n\n/**\n * Optional project-owned directory for technical decision records (ADRs)\n */\nexport const DECISIONS_DIR = 'decisions'\n","import { z } from 'zod'\n\n/**\n * Installer configuration for a single harness.\n *\n * At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined.\n *\n * - `workflowsDir`: Where the protocol workflow files are written.\n * Preferred field — used by most harnesses.\n * - `targetDir`: Single directory (legacy, like Cline's .clinerules/workflows/).\n * - `skillsDir`: Skills directory (legacy, for harnesses that don't distinguish\n * skills from workflows).\n * - `commandsDir`: Additional commands directory (optional).\n */\nexport const InstallerSchema = z\n .object({\n workflowsDir: z.string().optional(),\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(\n data => Boolean(data.workflowsDir) || Boolean(data.targetDir) || Boolean(data.skillsDir),\n {\n message: 'At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined',\n }\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- **Design:** If present, read root \\`DESIGN.md\\` before changing a user-facing surface; use \\`/design\\` for new direction, critique, or design-knowledge extraction.\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 * Generate a minimal local AGENT.md for subdirectories.\n * Free format by design — low friction encourages creation.\n * @param dirName - Name of the directory\n */\nexport function generateLocalAgentTemplate(dirName: string): string {\n return `# AGENT: ${dirName}\n\n- **Stack:** *(frameworks, libs specific to this module)*\n- **Conventions:** *(naming, exports, test patterns)*\n- **Constraints:** *(known issues, tech debt)*\n`\n}\n\n/**\n * Default root AGENT.md template\n */\nexport const AGENT_TEMPLATE = generateAgentTemplate()\n\n/**\n * Default local AGENT.md template\n */\nexport const LOCAL_AGENT_TEMPLATE = generateLocalAgentTemplate('module')\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 Protocol kernel template — v0.6\n *\n * Design principles (v0.6):\n * - PROTOCOL.md is a compact REFERENCE, not an executable workflow.\n * - All step-by-step instructions live in the workflow files.\n * - No duplication between PROTOCOL.md and workflows.\n * - Short enough that an LLM can re-scan it mid-session without cost.\n */\nexport const PROTOCOL_TEMPLATE = `# AUTONOMOS PROTOCOL (v${PROTOCOL_VERSION})\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the \\`/session\\` workflow |\n| Start a task | Read the \\`/task\\` workflow |\n| Triage a problem or proposal | Read the optional \\`/issue\\` workflow |\n| Adopt existing project knowledge | Read the optional \\`/adopt\\` workflow |\n| Audit accumulated drift | Read the \\`/reconcile\\` workflow |\n| Design or critique a surface | Read the optional \\`/design\\` workflow |\n| End a session | Read the \\`/crystallize\\` workflow |\n| Get context | Read root \\`AGENT.md\\`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume \\`[/]\\` or pick highest-priority \\`[ ]\\` |\n| Log session work | Create \\`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\\` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| \\`AGENT.md\\` | Root + any subdirectory | Durable guidance for its directory scope |\n| \\`TASKS.md\\` | \\`.autonomos/TASKS.md\\` | Single source of truth for task state |\n| \\`ISSUES.md\\` | \\`.autonomos/ISSUES.md\\` | Optional problem, proposal, and question intake |\n| \\`worklogs/\\` | \\`.autonomos/worklogs/\\` | Historical session evidence, not current guidance |\n| \\`specs/\\` | \\`.autonomos/specs/\\` | Optional project-owned normative target state |\n| \\`decisions/\\` | \\`.autonomos/decisions/\\` | Optional project-owned decision records (ADRs) |\n| \\`DESIGN.md\\` | Root or target scope | Optional project-owned visual/interaction direction |\n| \\`PROTOCOL.md\\` | \\`.autonomos/PROTOCOL.md\\` | This file — read-only reference |\n| \\`manifest.json\\` | \\`.autonomos/manifest.json\\` | Protocol version metadata |\n\n## Design Direction Boundary\n\n\\`DESIGN.md\\` is optional project-owned direction, not a managed protocol\nartifact. Use \\`/design\\` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable \\`AGENT.md\\`; consolidate or replace obsolete entries instead of appending history.\n\n**Root \\`AGENT.md\\`** — Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local \\`AGENT.md\\`** (in any subdirectory) — Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n\\`\\`\\`markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\\\*.test.ts)\n- Constraint: template changes require workflow test updates\n\\`\\`\\`\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional \\`ISSUES.md\\`, \\`specs/\\`, and \\`decisions/\\` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- \\`.autonomos/specs/\\` and \\`.autonomos/decisions/\\` are optional, project-owned, first-use directories; \\`init\\`, \\`update\\`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is \\`draft\\`, \\`accepted\\`, or \\`superseded\\`. Only \\`accepted\\` is normative; \\`superseded\\` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use \\`proposed\\`, \\`accepted\\`, or \\`superseded\\`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in \\`AGENT.md\\`, user/developer reference in \\`docs/\\`, execution state in \\`TASKS.md\\`, and historical evidence in \\`worklogs/\\`.\n- Read only relevant accepted records at task start. Use \\`/adopt\\` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n\\`\\`\\`markdown\n# SPEC-001 — Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n\\`\\`\\`\n\n\\`\\`\\`markdown\n# ADR-001 — Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n\\`\\`\\`\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Task Format\n\n\\`- [Status] **[ID]** Title \\\\\\`Priority\\\\\\` \\\\\\`Complexity\\\\\\`\\`\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| \\`[ ]\\` Todo | \\`🔴 Critical\\` | \\`S\\` Small |\n| \\`[/]\\` In Progress | \\`🟠 High\\` | \\`M\\` Medium |\n| \\`[x]\\` Done | \\`🔵 Medium\\` | \\`L\\` Large |\n| \\`[!]\\` Blocked | \\`⚪ Low\\` | \\`XL\\` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\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 { existsSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\n\nimport { AUTONOMOS_DIR } from '../constants'\n\n/**\n * Markers that identify the root of an Autonomos / git project.\n *\n * `.autonomos/` is a strong signal: if it exists, the project has already\n * been initialized with the protocol and the directory containing it is,\n * by definition, the project root.\n *\n * `.git/` is a weaker signal: it only tells us the directory is inside a\n * git working tree. We still stop at the first `.git/` we see, which is\n * good enough for the common monorepo case (the monorepo root contains\n * the `.git/`, package subdirectories do not).\n */\nconst PROJECT_MARKERS = [AUTONOMOS_DIR, '.git'] as const\n\n/**\n * Find the directory that owns this project by walking up from `startDir`\n * until we find a directory containing `.autonomos/` or `.git/`.\n *\n * Returns `null` if no such directory exists before we reach the\n * filesystem root.\n *\n * Notes on behavior:\n * - The search stops at the first directory that contains any of the\n * markers. For monorepos this is the monorepo root, not the package\n * directory the caller is sitting in.\n * - A directory containing `.git/` is preferred over walking further up:\n * this prevents leaking into a parent repository in nested-worktree\n * setups. Callers that need the absolute git toplevel can run\n * `git rev-parse --show-toplevel` themselves after this returns.\n *\n * @param startDir - Absolute path to start the search from.\n */\nexport function findProjectRoot(startDir: string): string | null {\n if (!startDir) return null\n const start = resolve(startDir)\n let current = start\n\n while (true) {\n if (PROJECT_MARKERS.some(marker => existsSync(join(current, marker)))) {\n return current\n }\n const parent = dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\n/**\n * Check whether two absolute paths refer to the same directory.\n *\n * Resolves `.` / `..` segments before comparing, so `/a/b` and\n * `/a/b/./` are considered the same.\n */\nexport function isSamePath(a: string, b: string): boolean {\n if (!a || !b) return false\n return resolve(a) === resolve(b)\n}\n\n/**\n * Render a path relative to another path, with one guarantee that the\n * default `path.relative` doesn't give us: we never return a value that\n * starts with `..`. If `target` is not under `base`, we return the\n * absolute resolved path of `target` so the caller can still show a\n * useful location.\n */\nexport function displayRelative(target: string, base: string): string {\n const rel = relative(base, target)\n if (rel === '' || rel === '.') return '.'\n if (rel.startsWith(`..${sep}`) || rel === '..' || isAbsolute(rel)) {\n return resolve(target)\n }\n return rel\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.workflowsDir) {\n addTarget(map, joinPath(cwd, installer.workflowsDir), ext, harnessId)\n } else if (installer.targetDir) {\n addTarget(map, joinPath(cwd, installer.targetDir), ext, harnessId)\n } else 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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"}
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/project-root.ts","../src/parsers/task-parser.ts","../src/parsers/task-registry.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.7.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\n/**\n * Optional project-owned directory for durable target-state specifications\n */\nexport const SPECS_DIR = 'specs'\n\n/**\n * Optional project-owned directory for technical decision records (ADRs)\n */\nexport const DECISIONS_DIR = 'decisions'\n\n/** Optional project-owned history, never loaded by default. */\nexport const ARCHIVE_DIR = 'archive'\n","import { z } from 'zod'\n\n/**\n * Installer configuration for a single harness.\n *\n * At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined.\n *\n * - `workflowsDir`: Where the protocol workflow files are written.\n * Preferred field — used by most harnesses.\n * - `targetDir`: Single directory (legacy, like Cline's .clinerules/workflows/).\n * - `skillsDir`: Skills directory (legacy, for harnesses that don't distinguish\n * skills from workflows).\n * - `commandsDir`: Additional commands directory (optional).\n */\nexport const InstallerSchema = z\n .object({\n workflowsDir: z.string().optional(),\n targetDir: z.string().optional(),\n skillsDir: z.string().optional(),\n commandsDir: z.string().optional(),\n promptsDir: z.string().optional(),\n globalTargetDir: z.string().optional(),\n fileExtension: z.string(),\n _note: z.string().optional(),\n })\n .refine(\n data =>\n Boolean(data.workflowsDir) ||\n Boolean(data.targetDir) ||\n Boolean(data.skillsDir) ||\n Boolean(data.commandsDir) ||\n Boolean(data.promptsDir),\n {\n message:\n 'At least one of `workflowsDir`, `targetDir`, `skillsDir`, `commandsDir`, or `promptsDir` must be defined',\n }\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- **Design:** If present, read root \\`DESIGN.md\\` before changing a user-facing surface; use \\`/design\\` for new direction, critique, or design-knowledge extraction.\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 * Generate a minimal local AGENT.md for subdirectories.\n * Free format by design — low friction encourages creation.\n * @param dirName - Name of the directory\n */\nexport function generateLocalAgentTemplate(dirName: string): string {\n return `# AGENT: ${dirName}\n\n- **Stack:** *(frameworks, libs specific to this module)*\n- **Conventions:** *(naming, exports, test patterns)*\n- **Constraints:** *(known issues, tech debt)*\n`\n}\n\n/**\n * Default root AGENT.md template\n */\nexport const AGENT_TEMPLATE = generateAgentTemplate()\n\n/**\n * Default local AGENT.md template\n */\nexport const LOCAL_AGENT_TEMPLATE = generateLocalAgentTemplate('module')\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 Protocol kernel template — v0.7\n *\n * Design principles (v0.7):\n * - PROTOCOL.md is a compact REFERENCE, not an executable workflow.\n * - All step-by-step instructions live in the workflow files.\n * - No duplication between PROTOCOL.md and workflows.\n * - Short enough that an LLM can re-scan it mid-session without cost.\n */\nexport const PROTOCOL_TEMPLATE = `# AUTONOMOS PROTOCOL (v${PROTOCOL_VERSION})\n\n> This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.\n\n## Quick Reference\n\n| Action | How |\n| -------------------------------- | ---------------------------------------------------------------------------------- |\n| Start a session | Read the \\`/session\\` workflow |\n| Start a task | Read the \\`/task\\` workflow |\n| Triage a problem or proposal | Read the optional \\`/issue\\` workflow |\n| Adopt existing project knowledge | Read the optional \\`/adopt\\` workflow |\n| Reconcile drift and archive history | Read the \\`/reconcile\\` workflow |\n| Design or critique a surface | Read the optional \\`/design\\` workflow |\n| End a session | Read the \\`/crystallize\\` workflow |\n| Get context | Read root \\`AGENT.md\\`, then only the selected scope's ancestor chain |\n| Resolve objective | Explicit user request first; otherwise resume \\`[/]\\` or pick highest-priority \\`[ ]\\` |\n| Log session work | Create \\`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\\` |\n\n## File Map\n\n| File | Location | Role |\n| --------------- | -------------------------- | ------------------------------------------------- |\n| \\`AGENT.md\\` | Root + any subdirectory | Durable guidance for its directory scope |\n| \\`TASKS.md\\` | \\`.autonomos/TASKS.md\\` | Current task state and optional Current direction |\n| \\`ISSUES.md\\` | \\`.autonomos/ISSUES.md\\` | Optional problem, proposal, and question intake |\n| \\`worklogs/\\` | \\`.autonomos/worklogs/\\` | Historical session evidence, not current guidance |\n| \\`archive/\\` | \\`.autonomos/archive/\\` | Optional history, searched only when justified |\n| \\`specs/\\` | \\`.autonomos/specs/\\` | Optional project-owned normative target state |\n| \\`decisions/\\` | \\`.autonomos/decisions/\\` | Optional project-owned decision records (ADRs) |\n| \\`DESIGN.md\\` | Root or target scope | Optional project-owned visual/interaction direction |\n| \\`PROTOCOL.md\\` | \\`.autonomos/PROTOCOL.md\\` | This file — read-only reference |\n| \\`manifest.json\\` | \\`.autonomos/manifest.json\\` | Protocol version metadata |\n\n## Design Direction Boundary\n\n\\`DESIGN.md\\` is optional project-owned direction, not a managed protocol\nartifact. Use \\`/design\\` when a surface needs direction, critique, or\ndesign-knowledge extraction; keep the project's identity and examples local.\nThe workflow supplies routing and evidence rules, not a universal visual style.\n\n## AGENT.md Format Rules\n\nStore only stable guidance that will affect different future tasks. Keep transient evidence in worklogs and operational explanations in component documentation. Use the narrowest applicable \\`AGENT.md\\`; consolidate or replace obsolete entries instead of appending history. Preserve valid subclaims in mixed paragraphs. Check the resulting text for completed-action narratives, task progress and unsupported prohibitions; these do not belong in operating guidance.\n\n**Root \\`AGENT.md\\`** — Must use the structured template (frontmatter + sections: Context, Workflow, Stack, Key Directories, Constraints).\n\n**Local \\`AGENT.md\\`** (in any subdirectory) — Free format. One line is enough if it is clear. What matters: the next session can use it. Example:\n\n\\`\\`\\`markdown\n# AGENT: packages/core\n\n- Stack: TypeScript, Vitest, tsdown\n- Conventions: exports via src/index.ts, tests co-located (\\\\*.test.ts)\n- Constraint: template changes require workflow test updates\n\\`\\`\\`\n\n## Issue, Specification, Decision, and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation; proposed directions remain hypotheses until an approach is accepted. Specifications describe accepted target behavior or requirements that may guide multiple tasks. A decision record (commonly ADR, Architecture Decision Record) captures one technical choice and its rationale. Tasks describe an accepted intervention and completion criteria. Use optional \\`ISSUES.md\\`, \\`specs/\\`, and \\`decisions/\\` only when they provide value; direct, clear changes may become tasks immediately. Link related issues, specs, decisions, and tasks in both directions.\n\n## Specification and Decision Rules\n\n- \\`.autonomos/specs/\\` and \\`.autonomos/decisions/\\` are optional, project-owned, first-use directories; \\`init\\`, \\`update\\`, and artifact-integrity checks do not create or overwrite them.\n- Keep one Markdown file per bounded specification or decision. Include status, scope, provenance, acceptance criteria or consequences, and replacement links where relevant; no parser or independent version is required initially.\n- Specification status is \\`draft\\`, \\`accepted\\`, or \\`superseded\\`. Only \\`accepted\\` is normative; \\`superseded\\` points to its successor. Acceptance does not mean implementation is complete.\n- Decision records use \\`proposed\\`, \\`accepted\\`, or \\`superseded\\`; they preserve rationale and alternatives rather than duplicating the full specification.\n- Keep stable agent operating rules in \\`AGENT.md\\`, user/developer reference in \\`docs/\\`, execution state in \\`TASKS.md\\`, and historical evidence in \\`worklogs/\\`.\n- Read only relevant accepted records at task start. Use \\`/adopt\\` to extract legacy knowledge; never rewrite historical worklogs, issues, or tasks to create current artifacts.\n\nThe protocol-facing name is **decision record**. **ADR** (Architecture Decision Record) is a common convention for the same kind of document, not a required external standard. Use these lightweight Markdown shapes as a starting point; they are conventions, not parser-enforced schemas:\n\n\\`\\`\\`markdown\n# SPEC-001 — Concise target-state title\n\n- Status: draft | accepted | superseded\n- Scope: component, capability, or boundary\n- Provenance: issue, discussion, or source links\n- Related decisions: ADR-001, ...\n- Superseded by: SPEC-002 (when applicable)\n\n## Intent\n\n## Requirements\n\n## Acceptance criteria\n\n## Out of scope\n\\`\\`\\`\n\n\\`\\`\\`markdown\n# ADR-001 — Concise decision title\n\n- Status: proposed | accepted | superseded\n- Scope: component or technical boundary\n- Provenance: issue, task, or investigation links\n- Related specs: SPEC-001, ...\n- Superseded by: ADR-002 (when applicable)\n\n## Context\n\n## Decision\n\n## Alternatives considered\n\n## Consequences\n\\`\\`\\`\n\nOnly user/project governance accepts a specification or decision as normative. Agents may draft and link records, but must not silently promote them; acceptance is separate from implementation completion.\n\n## Current Context and Archival Lifecycle\n\n- Current context must support ordinary work without archives. Keep applicable guidance, accepted requirements/decisions, unresolved work, dependencies and necessary next actions discoverable. Acceptance is independent of implementation; dated temporary directives remain active until lifted or their stated end condition is met.\n- A completed task or resolved/declined issue is an archival candidate only when its own scope is settled and still-needed outcomes/constraints/references are retained in current context. Explicitly abandoned work may be archived with its reason, without claiming it was completed. A completed child does not satisfy unmet parent acceptance criteria.\n- Record new task completion dates as \\`Completed: YYYY-MM-DD\\`; do not infer missing old dates from worklog filenames. Age, a checkbox, absent code or a newer statement alone is not proof of obsolescence.\n- Group archival at coherent completed-work boundaries, not per task or calendar interval. No Sprint object or scheduled maintenance is required. Correct certain in-scope drift proactively during normal work; use \\`/reconcile\\` for investigation, consolidation and archival.\n- Before moving history, consolidate current knowledge in its existing narrowest home. Optional \\`Current direction\\` in \\`TASKS.md\\` explains present aims, recent consequential outcomes and next work; rewrite it rather than append chronology. Keep progress out of \\`AGENT.md\\`.\n- Create project-owned \\`.autonomos/archive/README.md\\` and meaningful batch directories on first use only. A batch can contain \\`TASKS.md\\`, \\`ISSUES.md\\`, \\`worklogs/\\` and provenance for retired guidance. Group/split batches by useful scope; there is no fixed age, size or mandatory per-record schema.\n- Archive means move, not delete or rewrite conclusions. Preserve historical record content, identifiers and provenance; repair relative paths when necessary. Preserve original mixed-source text when retiring only some claims. Applicable specs/decisions stay current independently of execution records. Extraction into new normative artifacts still uses \\`/adopt\\`.\n- The archive index maps batch topics to records, not a second task journal. Search by ID or subject only when a specific question requires history; neither archives nor their entire index are routine startup context. Keep only necessary dependency/outcome pointers in current records, not a permanent stub for every completed task.\n- Archived task and issue IDs remain reserved. Before assigning an ID, search current and archived registries. With a CLI, \\`readTaskRegistry(root, { history: true })\\` exposes task references and duplicates; plain Markdown search works without it.\n- Verify exact source text before edits, retained current knowledge, IDs and resolvable references after moves. Do not confuse tool annotations with file content or historical validation with a current observation. Re-read shared files before writing and preserve unrelated concurrent changes. Stop when a second pass yields no deterministic correction.\n- \\`autonomos status\\` summarizes the current task registry; \\`--history\\` adds separate archived counts and read/collision diagnostics. Archived means historical, not necessarily completed. History uses batch \\`TASKS.md\\` files, not arbitrary worklog checklists.\n- Archives are project-owned, like specs and decisions. Initialization, updates and integrity checks neither create empty archives nor overwrite, relocate or judge their contents. Installing a new protocol performs no automatic cleanup. Version-control policy stays project-owned; Git is not required for archival or retrieval.\n\nExample (only files needed by a batch are created):\n\n\\`\\`\\`text\n.autonomos/\n TASKS.md\n ISSUES.md\n archive/\n README.md\n realtime-experiment-retirement/\n TASKS.md\n ISSUES.md\n worklogs/\n\\`\\`\\`\n\n## Task Format\n\n\\`- [Status] **[ID]** Title \\\\\\`Priority\\\\\\` \\\\\\`Complexity\\\\\\`\\`\n\n| Status | Priority | Complexity |\n| ----------------- | ------------- | ---------- |\n| \\`[ ]\\` Todo | \\`🔴 Critical\\` | \\`S\\` Small |\n| \\`[/]\\` In Progress | \\`🟠 High\\` | \\`M\\` Medium |\n| \\`[x]\\` Done | \\`🔵 Medium\\` | \\`L\\` Large |\n| \\`[!]\\` Blocked | \\`⚪ Low\\` | \\`XL\\` Huge |\n\n## Metadata Rules\n\n- **Language:** English unless AGENT.md says otherwise.\n- **Tone:** Technical, concise, fact-based.\n- **Continuity:** Refer to previous work as \"we\" or \"the project\".\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, [M] Medium, [L] Large, [XL] Huge (Planning required)\n> **Status:** [ ] Todo, [/] In Progress, [x] Done, [!] Blocked\n\n## 🚀 Current work\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 { existsSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\n\nimport { AUTONOMOS_DIR } from '../constants'\n\n/**\n * Markers that identify the root of an Autonomos / git project.\n *\n * `.autonomos/` is a strong signal: if it exists, the project has already\n * been initialized with the protocol and the directory containing it is,\n * by definition, the project root.\n *\n * `.git/` is a weaker signal: it only tells us the directory is inside a\n * git working tree. We still stop at the first `.git/` we see, which is\n * good enough for the common monorepo case (the monorepo root contains\n * the `.git/`, package subdirectories do not).\n */\nconst PROJECT_MARKERS = [AUTONOMOS_DIR, '.git'] as const\n\n/**\n * Find the directory that owns this project by walking up from `startDir`\n * until we find a directory containing `.autonomos/` or `.git/`.\n *\n * Returns `null` if no such directory exists before we reach the\n * filesystem root.\n *\n * Notes on behavior:\n * - The search stops at the first directory that contains any of the\n * markers. For monorepos this is the monorepo root, not the package\n * directory the caller is sitting in.\n * - A directory containing `.git/` is preferred over walking further up:\n * this prevents leaking into a parent repository in nested-worktree\n * setups. Callers that need the absolute git toplevel can run\n * `git rev-parse --show-toplevel` themselves after this returns.\n *\n * @param startDir - Absolute path to start the search from.\n */\nexport function findProjectRoot(startDir: string): string | null {\n if (!startDir) return null\n const start = resolve(startDir)\n let current = start\n\n while (true) {\n if (PROJECT_MARKERS.some(marker => existsSync(join(current, marker)))) {\n return current\n }\n const parent = dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\n/**\n * Check whether two absolute paths refer to the same directory.\n *\n * Resolves `.` / `..` segments before comparing, so `/a/b` and\n * `/a/b/./` are considered the same.\n */\nexport function isSamePath(a: string, b: string): boolean {\n if (!a || !b) return false\n return resolve(a) === resolve(b)\n}\n\n/**\n * Render a path relative to another path, with one guarantee that the\n * default `path.relative` doesn't give us: we never return a value that\n * starts with `..`. If `target` is not under `base`, we return the\n * absolute resolved path of `target` so the caller can still show a\n * useful location.\n */\nexport function displayRelative(target: string, base: string): string {\n const rel = relative(base, target)\n if (rel === '' || rel === '.') return '.'\n if (rel.startsWith(`..${sep}`) || rel === '..' || isAbsolute(rel)) {\n return resolve(target)\n }\n return rel\n}\n","import type { Complexity, Priority, Task, TaskStatus } from '../types'\n\nexport class TaskParser {\n /** Discover IDs/status without requiring optional priority or complexity metadata. */\n static references(markdown: string): { id: string; status: TaskStatus; line: number }[] {\n const references: { id: string; status: TaskStatus; line: number }[] = []\n let fence: string | undefined\n for (const [index, line] of markdown.split(/\\r?\\n/).entries()) {\n const marker = line.match(/^\\s{0,3}(`{3,}|~{3,})/)\n if (marker?.[1]) {\n if (!fence) fence = marker[1]\n else if (\n marker[1][0] === fence[0] &&\n marker[1].length >= fence.length &&\n !line.slice(marker[0].length).trim()\n )\n fence = undefined\n continue\n }\n if (fence) continue\n const match = line.match(/^\\s*- \\[([ x/!])\\] \\*\\*\\[([^\\]]+)\\]\\*\\*/)\n if (match?.[1] && match[2]?.trim()) {\n references.push({\n id: match[2].trim(),\n status: this.mapStatus(match[1]),\n line: index + 1,\n })\n }\n }\n return references\n }\n\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 { lstatSync, readFileSync, readdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\nimport { ARCHIVE_DIR, AUTONOMOS_DIR, TASKS_FILE } from '../constants'\nimport { TaskParser } from './task-parser'\n\nexport interface TaskReference {\n id: string\n status: ReturnType<typeof TaskParser.references>[number]['status']\n line: number\n /** Source path relative to the supplied project root. */\n path: string\n}\n\nexport interface TaskRegistry {\n current: TaskReference[]\n archived: TaskReference[]\n duplicateIds: string[]\n warnings: string[]\n /** False if a requested registry could not be inspected completely. */\n complete: boolean\n}\n\n/** Read current task IDs; opt into history for reporting or reserving a new ID. */\nexport function readTaskRegistry(root: string, options: { history?: boolean } = {}): TaskRegistry {\n const registry: TaskRegistry = {\n current: [],\n archived: [],\n duplicateIds: [],\n warnings: [],\n complete: true,\n }\n function warn(path: string, message: string): void {\n registry.complete = false\n registry.warnings.push(`${relative(root, path)}: ${message}`)\n }\n function read(path: string, target: TaskReference[]): void {\n try {\n const stat = lstatSync(path)\n if (!stat.isFile()) {\n warn(path, 'Expected a regular task registry; symbolic links are not followed')\n return\n }\n target.push(\n ...TaskParser.references(readFileSync(path, 'utf8')).map(task => ({\n ...task,\n path: relative(root, path),\n }))\n )\n } catch (error) {\n warn(path, error instanceof Error ? error.message : String(error))\n }\n }\n function scan(path: string, optional = false): void {\n try {\n const stat = lstatSync(path)\n if (!stat.isDirectory()) {\n warn(path, 'Expected an archive directory; symbolic links are not followed')\n return\n }\n for (const entry of readdirSync(path, { withFileTypes: true }).sort((a, b) =>\n a.name.localeCompare(b.name)\n )) {\n const child = join(path, entry.name)\n if (entry.isSymbolicLink()) warn(child, 'Skipped symbolic link in archive')\n else if (entry.isDirectory()) scan(child)\n else if (entry.name === TASKS_FILE) read(child, registry.archived)\n }\n } catch (error) {\n if (optional && (error as NodeJS.ErrnoException).code === 'ENOENT') return\n warn(path, error instanceof Error ? error.message : String(error))\n }\n }\n const autonomosPath = join(root, AUTONOMOS_DIR)\n try {\n if (!lstatSync(autonomosPath).isDirectory()) {\n warn(\n autonomosPath,\n 'Expected a regular project directory; symbolic links are not followed'\n )\n return registry\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n warn(autonomosPath, error instanceof Error ? error.message : String(error))\n }\n return registry\n }\n const currentPath = join(autonomosPath, TASKS_FILE)\n try {\n lstatSync(currentPath)\n read(currentPath, registry.current)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n warn(currentPath, error instanceof Error ? error.message : String(error))\n }\n }\n if (options.history) scan(join(root, AUTONOMOS_DIR, ARCHIVE_DIR), true)\n const seen = new Set<string>()\n const duplicates = new Set<string>()\n for (const task of [...registry.current, ...registry.archived]) {\n if (seen.has(task.id)) duplicates.add(task.id)\n seen.add(task.id)\n }\n registry.duplicateIds = [...duplicates].sort()\n return registry\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\nexport type TargetKind = 'flat' | 'skill'\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 /** Whether target receives flat files (e.g. session.md) or skill bundles (e.g. protocol-session/SKILL.md) */\n kind: TargetKind\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 * Antigravity, Claude Code all use `.agents/skills/`) are deduplicated:\n * the directory appears once 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.workflowsDir) {\n addTarget(map, joinPath(cwd, installer.workflowsDir), ext, 'flat', harnessId)\n }\n if (installer.commandsDir) {\n addTarget(map, joinPath(cwd, installer.commandsDir), ext, 'flat', harnessId)\n }\n if (installer.promptsDir) {\n addTarget(map, joinPath(cwd, installer.promptsDir), ext, 'flat', harnessId)\n }\n if (installer.targetDir) {\n addTarget(map, joinPath(cwd, installer.targetDir), ext, 'flat', harnessId)\n }\n if (installer.skillsDir) {\n addTarget(map, joinPath(cwd, installer.skillsDir), ext, 'skill', harnessId)\n }\n}\n\nfunction addTarget(\n map: Map<string, ResolvedTarget>,\n path: string,\n fileExtension: string,\n kind: TargetKind,\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, kind, 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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"}
@@ -1,40 +1,36 @@
1
1
  ---
2
2
  name: protocol-crystallize
3
- description: 'Mandatory close-out before ending a session. Forces durable knowledge capture.'
3
+ description: 'Close work with durable knowledge, truthful state and bounded current context.'
4
4
  ---
5
5
 
6
6
  # /crystallize — End session
7
7
 
8
- > **CRITICAL:** You MUST NOT ask the user what to crystallize. This is YOUR job. Reflect, decide, write. Then inform the user what you saved.
8
+ > **CRITICAL:** You MUST NOT ask the user what to crystallize. Reflect, decide, write, then report.
9
9
  > **Authority:** If the user limited the work to read-only or no changes, do not modify any artifact; deliver the substantive answer and report that crystallization was skipped.
10
10
 
11
11
  ## STEP 1 — Worklog
12
12
 
13
- Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md` containing:
13
+ Create `.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md`: work performed, decisions and reasons, files changed, validation and next steps.
14
14
 
15
- - What was done
16
- - Key decisions and why
17
- - Files modified
18
- - Next steps for the next session
15
+ ## STEP 2 — Consolidate knowledge
19
16
 
20
- ## STEP 2 — Route knowledge
17
+ For each candidate ask: **Would this still guide a different future task?** Does it already exist, replace a claim, or belong in a narrower scope?
21
18
 
22
- For each candidate ask: **Would this still guide a different future task?**
19
+ - Keep observations, measurements, chronology and completed actions in the worklog; update existing component documentation for operational explanation.
20
+ - Route stable operating guidance to the narrowest `AGENT.md`, target requirements to `specs/`, and decision rationale to `decisions/`; update existing knowledge instead of duplicating it.
21
+ - Consolidate or replace superseded and disproven guidance claim by claim, preserving valid restrictions in mixed paragraphs. Do not turn a current choice into a broader prohibition.
22
+ - Do not turn historical worklogs, issues, or tasks into current specs/decisions without `/adopt`. Never create an `AGENT.md` based on file count alone.
23
+ - Keep progress in `TASKS.md`; rewrite optional Current direction only when it helps the next session. Do not append a completed-task journal there or in `AGENT.md`.
23
24
 
24
- - **No:** keep observations, measurements, chronology, and completed actions in the worklog.
25
- - **Operational explanation:** update existing component documentation when within scope.
26
- - **Yes:** route stable operating guidance to the narrowest `AGENT.md`, target requirements to `specs/`, and decision rationale to `decisions/`; keep each non-duplicated.
25
+ ## STEP 3 — Close the work boundary
27
26
 
28
- Consolidate or replace superseded and disproven guidance; do not turn historical worklogs, issues, or tasks into current specs/decisions without `/adopt`. Never create an `AGENT.md` based on file count alone.
29
-
30
- ## STEP 3 — Task status
31
-
32
- Mark `[x]` only if complete, `[!]` only if an unresolved dependency prevents progress, or keep `[/]` for partial work.
27
+ Mark `[x]` only if complete, `[!]` only if an unresolved dependency prevents progress, or keep `[/]` for partial work. Record new completion dates; never fabricate old ones. Check linked issue acceptance separately.
28
+ At a coherent completed-work boundary, run a bounded `/reconcile` archival pass when eligible history needs moving. Do not reorganize archives mechanically after every task or by calendar age.
29
+ Verify the actual resulting text and links, not just the intended change; preserve unrelated concurrent edits.
33
30
 
34
31
  ## STEP 4 — User response
35
32
 
36
- First, deliver a self-contained answer to the original request: outcome, evidence, limitations, and relevant next step. Do not replace it with crystallization status.
37
-
33
+ First deliver a self-contained answer to the original request: outcome, evidence, limitations, and relevant next step.
38
34
  Then append this supplementary handoff:
39
35
 
40
36
  `Crystallization — Task: [x] / [/] / [!] — [ID] | Worklog: .autonomos/worklogs/... | AGENT.md updated: [yes / no — reason]`
@@ -11,7 +11,7 @@ description: 'Optional intake for problems, proposals, and questions before choo
11
11
  ## STEP 1 — Build context
12
12
 
13
13
  1. Read root and applicable root → target `AGENT.md` files.
14
- 2. Read `.autonomos/ISSUES.md` if it exists and search for duplicates.
14
+ 2. Read `.autonomos/ISSUES.md` if it exists and search for duplicates; targeted archived issue/ID lookup prevents duplicate intake and identifier reuse.
15
15
  3. Read related tasks or worklogs only when they provide evidence.
16
16
 
17
17
  ## STEP 2 — Record the signal
@@ -1,34 +1,35 @@
1
1
  ---
2
2
  name: protocol-reconcile
3
- description: 'Audit and safely reconcile accumulated drift across Autonomos artifacts.'
3
+ description: 'Investigate drift, consolidate current knowledge and archive settled work.'
4
4
  ---
5
5
 
6
- # /reconcile — Audit and repair drift
6
+ # /reconcile — Audit, repair and archive
7
7
 
8
- > Reconciliation is evidence-driven and bounded by user authority. Never guess through a semantic conflict or rewrite history to match the present.
8
+ > Stay within user authority, including read access. Read-only runs propose changes only; do not inspect unrelated host configuration, secrets or production.
9
9
 
10
- ## STEP 1 — Inventory and classify
10
+ ## STEP 1 — Bound and classify
11
11
 
12
- 1. Read root and applicable scoped `AGENT.md` files, then current tasks, optional issues, relevant worklogs, linked documentation, and any existing `specs/` or `decisions/`.
13
- 2. Classify each artifact as current guidance, current state, historical evidence, or version-pinned protocol content.
14
- 3. Check protocol integrity with `autonomos status`; repair managed artifacts only through `autonomos update` when authorized.
12
+ 1. Read root and applicable scoped `AGENT.md`, current tasks/issues and relevant accepted records. Follow the protocol's archival criteria; search history only for a specific question.
13
+ 2. Classify individual claims as current guidance, current state, historical evidence, or version-pinned protocol content; a paragraph may mix them.
14
+ 3. Check managed integrity with `autonomos status` when available; repair managed artifacts only through authorized `autonomos update`.
15
15
 
16
- ## STEP 2 — Detect drift
16
+ ## STEP 2 — Investigate
17
17
 
18
- Look for duplicates, contradictions, obsolete paths or technologies, misplaced knowledge, vague rules, broken references, and task/issue/worklog status mismatches.
18
+ Look for duplicates, contradictions, obsolete paths or technologies, misplaced knowledge, broken references, and task/issue acceptance mismatches.
19
+ Verify against authoritative repository source, configuration, tests, explicit decisions and targeted history. A configuration change is not a runtime observation; age, checkboxes and absent code alone do not prove obsolescence.
20
+ Classify findings as **certain**, **uncertain**, or **historical-only**.
19
21
 
20
- ## STEP 3 — Verify
22
+ ## STEP 3 — Consolidate and archive
21
23
 
22
- 1. Test each finding against authoritative repository source, configuration, tests, and current scoped documentation.
23
- 2. Use runtime or external evidence only when access is authorized and necessary.
24
- 3. Classify the result as **certain**, **uncertain**, or **historical-only**.
24
+ - **Certain:** make the smallest correction supported by evidence; preserve valid subclaims and applicable accepted requirements, decisions and temporary directives.
25
+ - **Uncertain:** do not mutate the disputed facts; leave a visible uncertainty and identify the smallest verification needed.
26
+ - **Historical-only:** preserve it outside default context when eligible; do not rewrite conclusions to match today.
27
+ - Apply the protocol's archival eligibility to coherent work batches. Completing a child task does not resolve unmet parent criteria. Consolidate still-needed knowledge in its existing narrowest home first.
28
+ - Use `/adopt` for history-to-artifact extraction into new specs/decisions; routine reconciliation may update existing guidance within authority.
29
+ - Move eligible records to `.autonomos/archive/<batch>/`, preserve content/provenance/IDs and repair references. Update the topic index; retain only necessary current dependencies/outcomes, not permanent per-completion stubs.
25
30
 
26
- ## STEP 4 — Reconcile
31
+ ## STEP 4 — Verify and report
27
32
 
28
- - **Certain:** make the smallest correction; consolidate duplicates, route misplaced content, and replace or remove disproven current guidance.
29
- - **Uncertain:** do not mutate the disputed facts; report evidence, conflict, and concrete resolution options to the user.
30
- - **Historical-only:** preserve it unless it exposes sensitive data or falsely claims to be current guidance.
31
- - Missing optional `specs/` or `decisions/` are adoption candidates; do not create them automatically.
32
- - Use `/adopt` for history-to-artifact extraction; keep `/reconcile` focused on bounded audit and correction.
33
-
34
- Record material corrections and validation in the task worklog. Re-run checks and stop when a second pass produces no deterministic changes.
33
+ Re-read exact source text before edits, preserve unrelated concurrent changes, and verify links, IDs, acceptance states and current-context continuity without archives.
34
+ Check the final proposed text for journals, duplicates and unsupported prohibitions; an explanation is not proof that the resulting text is correct.
35
+ Record material changes and checks in the task worklog. Stop when a second pass produces no deterministic changes; distinguish recorded validation from checks actually run.
@@ -10,7 +10,7 @@ description: 'Mandatory bootstrap for any new session. Invoke before any work be
10
10
  ## STEP 1 — Orient
11
11
 
12
12
  1. Read the root `AGENT.md`.
13
- 2. Read `.autonomos/TASKS.md`.
13
+ 2. Read `.autonomos/TASKS.md`, including Current direction when present. Archives are not bootstrap context; search them only for a specific question.
14
14
 
15
15
  RESPOND with a **3-line max** summary of relevant project context. Do not continue without this response.
16
16
 
@@ -14,7 +14,7 @@ description: 'Mandatory procedure before starting a new task. Invoke before touc
14
14
  1. From the target file/folder, walk up to the project root. Read every `AGENT.md` you find on that path (root → target).
15
15
  2. Read the linked issue when present; if resuming, read the task's most recent worklog.
16
16
  3. If present, read only relevant accepted specifications and decision records; drafts/proposals inform exploration, superseded records do not constrain work.
17
- 4. Do not load unrelated worklogs or context branches.
17
+ 4. Do not load unrelated worklogs or context branches. Search archives only to resolve a specific question; reserve new IDs against current and archived registries.
18
18
 
19
19
  ## STEP 2 — Declare plan
20
20
 
@@ -27,7 +27,7 @@ Mark the task `[/]` in `.autonomos/TASKS.md`, then work.
27
27
  ## During execution
28
28
 
29
29
  1. **Before every non-trivial decision:** consult the relevant AGENT.md.
30
- 2. Treat new information as a crystallization candidate, not an automatic `AGENT.md` entry.
30
+ 2. Treat new information as a crystallization candidate, not an automatic `AGENT.md` entry. Investigate and correct established in-scope drift proactively; preserve valid subclaims.
31
31
  3. Keep session evidence with the task; route durable guidance only during `/crystallize`.
32
32
 
33
33
  ## End of task
@@ -5,7 +5,7 @@ import { PROTOCOL_TEMPLATE } from '../templates/protocol'
5
5
 
6
6
  /**
7
7
  * Validates the content of all workflow files and the PROTOCOL_TEMPLATE.
8
- * These tests guard against regressions on the v0.6 design:
8
+ * These tests guard against regressions on the v0.7 design:
9
9
  * - No crystallization questions directed at the user
10
10
  * - No duplicated close-out procedures in session.md
11
11
  * - Scoped AGENT.md discovery (no CLI dependency in workflows)
@@ -116,7 +116,7 @@ describe('AGENT.md format rules — consistent across files', () => {
116
116
  // ---------------------------------------------------------------------------
117
117
  // 5. PROTOCOL_TEMPLATE — compact reference, no workflow duplication
118
118
  // ---------------------------------------------------------------------------
119
- describe('PROTOCOL_TEMPLATE — v0.6 design', () => {
119
+ describe('PROTOCOL_TEMPLATE — v0.7 design', () => {
120
120
  it('does not contain Phase 1/2/3 workflow steps', () => {
121
121
  expect(PROTOCOL_TEMPLATE).not.toContain('Phase 1:')
122
122
  expect(PROTOCOL_TEMPLATE).not.toContain('Phase 2:')
@@ -182,7 +182,7 @@ describe('Durable-memory lifecycle', () => {
182
182
  it('retires stale guidance and rejects arbitrary file-count heuristics', () => {
183
183
  expect(crystallize).toContain('Consolidate or replace superseded and disproven guidance')
184
184
  expect(crystallize).toContain(
185
- 'do not turn historical worklogs, issues, or tasks into current specs/decisions'
185
+ 'Do not turn historical worklogs, issues, or tasks into current specs/decisions'
186
186
  )
187
187
  expect(crystallize).toContain('Never create an `AGENT.md` based on file count alone')
188
188
  })
@@ -366,3 +366,37 @@ describe('Workflow brevity', () => {
366
366
  expect(lines).toBeLessThanOrEqual(maxLines)
367
367
  })
368
368
  })
369
+
370
+ describe('Archival and current-context continuity', () => {
371
+ it('keeps history out of bootstrap and preserves current requirements', () => {
372
+ expect(session).toContain('Archives are not bootstrap context')
373
+ expect(PROTOCOL_TEMPLATE).toContain(
374
+ 'Current context must support ordinary work without archives'
375
+ )
376
+ expect(PROTOCOL_TEMPLATE).toContain('dated temporary directives remain active')
377
+ expect(PROTOCOL_TEMPLATE).toContain('Applicable specs/decisions stay current independently')
378
+ expect(PROTOCOL_TEMPLATE).toContain(
379
+ 'A completed child does not satisfy unmet parent acceptance criteria'
380
+ )
381
+ })
382
+ it('preserves evidence, identifiers and project ownership without calendar-driven archival', () => {
383
+ expect(PROTOCOL_TEMPLATE).toContain('Archived task and issue IDs remain reserved')
384
+ expect(PROTOCOL_TEMPLATE).toContain('repair relative paths when necessary')
385
+ expect(PROTOCOL_TEMPLATE).toContain(
386
+ 'Installing a new protocol performs no automatic cleanup'
387
+ )
388
+ expect(reconcile).toContain('not permanent per-completion stubs')
389
+ expect(crystallize).toContain('Do not turn a current choice into a broader prohibition')
390
+ expect(crystallize).toContain(
391
+ 'Do not reorganize archives mechanically after every task or by calendar age'
392
+ )
393
+ })
394
+ it('checks actual output and preserves valid parts of mixed claims', () => {
395
+ expect(reconcile).toContain('Re-read exact source text before edits')
396
+ expect(reconcile).toContain('preserve valid subclaims')
397
+ expect(reconcile).toContain('Check the final proposed text')
398
+ expect(crystallize).toContain('claim by claim')
399
+ expect(task).toContain('reserve new IDs against current and archived registries')
400
+ expect(issue).toContain('identifier reuse')
401
+ })
402
+ })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autonomos/core",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "description": "SDK and core definitions for the Agent Protocol",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.mts",