@autonomos/core 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,8 +8,9 @@ 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`, etc.)
11
+ - **Constants**: Shared directory and file names (`.autonomos`, `manifest.json`, optional `specs/`, and `decisions/`)
12
12
  - **Templates**: Immutable templates for `PROTOCOL.md`, `TASKS.md`, `AGENT.md`, and `manifest.json`.
13
+ - **Knowledge boundaries**: Markdown-first conventions for optional specifications and decision records (ADR), without requiring a parser.
13
14
  - **Types**: TypeScript definitions for protocol entities (Tasks, Agents, Manifest).
14
15
  - **Parsers**: Tools for extracting structured data from markdown (e.g., `TaskParser`).
15
16
 
@@ -28,6 +29,7 @@ const tasks = TaskParser.parse(markdownContent)
28
29
  - `src/constants.ts`: Global constants and versioning.
29
30
  - `src/types.ts`: Core type definitions.
30
31
  - `src/templates/`: Protocol file templates.
32
+ - `src/workflows/`: Distributed harness workflow sources, including `/adopt` for reviewable legacy-knowledge migration.
31
33
  - `src/parsers/`: Logic for parsing protocol files.
32
34
 
33
35
  ## License
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.4.0-alpha";
8
+ declare const PROTOCOL_VERSION = "0.5.0-alpha";
9
9
  /**
10
10
  * Directory name for Autonomos configuration
11
11
  */
@@ -30,6 +30,14 @@ declare const AGENT_FILE = "AGENT.md";
30
30
  * Worklogs directory name
31
31
  */
32
32
  declare const WORKLOGS_DIR = "worklogs";
33
+ /**
34
+ * Optional project-owned directory for durable target-state specifications
35
+ */
36
+ declare const SPECS_DIR = "specs";
37
+ /**
38
+ * Optional project-owned directory for technical decision records (ADRs)
39
+ */
40
+ declare const DECISIONS_DIR = "decisions";
33
41
  //#endregion
34
42
  //#region src/schemas/harness-codes.d.ts
35
43
  /**
@@ -37,7 +45,7 @@ declare const WORKLOGS_DIR = "worklogs";
37
45
  *
38
46
  * At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined.
39
47
  *
40
- * - `workflowsDir`: Where session.md, task.md, crystallize.md are written.
48
+ * - `workflowsDir`: Where the protocol workflow files are written.
41
49
  * Preferred field — used by most harnesses.
42
50
  * - `targetDir`: Single directory (legacy, like Cline's .clinerules/workflows/).
43
51
  * - `skillsDir`: Skills directory (legacy, for harnesses that don't distinguish
@@ -347,19 +355,19 @@ declare function parseManifest(content: string): Manifest;
347
355
  //#endregion
348
356
  //#region src/templates/protocol.d.ts
349
357
  /**
350
- * The Protocol kernel template — v0.3
358
+ * The Protocol kernel template — v0.5
351
359
  *
352
- * Design principles (v0.3):
360
+ * Design principles (v0.5):
353
361
  * - PROTOCOL.md is a compact REFERENCE, not an executable workflow.
354
- * - All step-by-step instructions live in the 3 workflow files.
362
+ * - All step-by-step instructions live in the workflow files.
355
363
  * - No duplication between PROTOCOL.md and workflows.
356
364
  * - Short enough that an LLM can re-scan it mid-session without cost.
357
365
  */
358
- declare const PROTOCOL_TEMPLATE = "# AUTONOMOS PROTOCOL (v0.4.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| Audit accumulated drift | Read the `/reconcile` 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| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\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- 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 and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md` only when triage is useful; direct, clear changes may become tasks immediately. Link accepted issues and their tasks both ways.\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";
366
+ declare const PROTOCOL_TEMPLATE = "# AUTONOMOS PROTOCOL (v0.5.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| 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| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\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";
359
367
  /**
360
368
  * @deprecated Use PROTOCOL_TEMPLATE instead
361
369
  */
362
- declare const PROTOCOL_TEMPLATE_V2026_1 = "# AUTONOMOS PROTOCOL (v0.4.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| Audit accumulated drift | Read the `/reconcile` 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| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\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- 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 and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation. Tasks describe an accepted intervention and completion criteria. Use optional `ISSUES.md` only when triage is useful; direct, clear changes may become tasks immediately. Link accepted issues and their tasks both ways.\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";
370
+ declare const PROTOCOL_TEMPLATE_V2026_1 = "# AUTONOMOS PROTOCOL (v0.5.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| 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| `PROTOCOL.md` | `.autonomos/PROTOCOL.md` | This file \u2014 read-only reference |\n| `manifest.json` | `.autonomos/manifest.json` | Protocol version metadata |\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";
363
371
  //#endregion
364
372
  //#region src/templates/tasks.d.ts
365
373
  /**
@@ -522,5 +530,5 @@ declare function resolveTargets(harnessIds: string[], cwd?: string): ResolvedTar
522
530
  */
523
531
  declare function getRawHarnessCodes(): HarnessCodes;
524
532
  //#endregion
525
- export { AGENT_FILE, AGENT_TEMPLATE, AUTONOMOS_DIR, AgentConfig, AgentContext, AgentParser, AgentSection, AncestorAgent, COMPLEXITIES, Complexity, 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, 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 };
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 };
526
534
  //# 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/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.4.0-alpha`,d=`.autonomos`,f=`manifest.json`,p=`PROTOCOL.md`,m=`TASKS.md`,h=`AGENT.md`,g=`worklogs`,_=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"}),v=e.object({name:e.string().min(1),preferred:e.boolean(),installer:_}),y=e.object({platforms:e.record(e.string(),v)}),b=e.object({protocolVersion:e.string().describe(`Version of the Agent Protocol specification`),cliVersion:e.string().describe(`Version of the CLI that last updated this project`),initializedAt:e.string().datetime().describe(`ISO timestamp of project initialization`),lastUpdated:e.string().datetime().describe(`ISO timestamp of last protocol update`)}),x=[`🔴 Critical`,`🟠 High`,`🔵 Medium`,`⚪ Low`],S=[`S`,`M`,`L`,`XL`];function C(e=`Project`){return`---
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.5.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`---
2
2
  name: "${e}"
3
3
  type: "project"
4
4
  status: "active"
@@ -29,39 +29,42 @@ status: "active"
29
29
  ## ⚠️ Known Constraints
30
30
 
31
31
  *List any technical debts, missing features, or external limitations.*
32
- `}function w(e){return`# AGENT: ${e}
32
+ `}function T(e){return`# AGENT: ${e}
33
33
 
34
34
  - **Stack:** *(frameworks, libs specific to this module)*
35
35
  - **Conventions:** *(naming, exports, test patterns)*
36
36
  - **Constraints:** *(known issues, tech debt)*
37
- `}const T=C(),E=w(`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)+`
38
- `}function k(e){let t=JSON.parse(e);return b.parse(t)}const A=`# AUTONOMOS PROTOCOL (v${u})
37
+ `}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)+`
38
+ `}function k(e){let t=JSON.parse(e);return x.parse(t)}const A=`# AUTONOMOS PROTOCOL (v${u})
39
39
 
40
40
  > This file defines the project's AI workflow contract. The workflows execute it. Do not duplicate workflow steps here.
41
41
 
42
42
  ## Quick Reference
43
43
 
44
- | Action | How |
45
- |---|---|
46
- | Start a session | Read the \`/session\` workflow |
47
- | Start a task | Read the \`/task\` workflow |
48
- | Triage a problem or proposal | Read the optional \`/issue\` workflow |
49
- | Audit accumulated drift | Read the \`/reconcile\` workflow |
50
- | End a session | Read the \`/crystallize\` workflow |
51
- | Get context | Read root \`AGENT.md\`, then only the selected scope's ancestor chain |
52
- | Resolve objective | Explicit user request first; otherwise resume \`[/]\` or pick highest-priority \`[ ]\` |
53
- | Log session work | Create \`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\` |
44
+ | Action | How |
45
+ | -------------------------------- | ---------------------------------------------------------------------------------- |
46
+ | Start a session | Read the \`/session\` workflow |
47
+ | Start a task | Read the \`/task\` workflow |
48
+ | Triage a problem or proposal | Read the optional \`/issue\` workflow |
49
+ | Adopt existing project knowledge | Read the optional \`/adopt\` workflow |
50
+ | Audit accumulated drift | Read the \`/reconcile\` workflow |
51
+ | End a session | Read the \`/crystallize\` workflow |
52
+ | Get context | Read root \`AGENT.md\`, then only the selected scope's ancestor chain |
53
+ | Resolve objective | Explicit user request first; otherwise resume \`[/]\` or pick highest-priority \`[ ]\` |
54
+ | Log session work | Create \`.autonomos/worklogs/YYYY-MM-DD-[TASK_ID].md\` |
54
55
 
55
56
  ## File Map
56
57
 
57
- | File | Location | Role |
58
- |---|---|---|
59
- | \`AGENT.md\` | Root + any subdirectory | Durable guidance for its directory scope |
60
- | \`TASKS.md\` | \`.autonomos/TASKS.md\` | Single source of truth for task state |
61
- | \`ISSUES.md\` | \`.autonomos/ISSUES.md\` | Optional problem, proposal, and question intake |
62
- | \`worklogs/\` | \`.autonomos/worklogs/\` | Historical session evidence, not current guidance |
63
- | \`PROTOCOL.md\` | \`.autonomos/PROTOCOL.md\` | This file — read-only reference |
64
- | \`manifest.json\` | \`.autonomos/manifest.json\` | Protocol version metadata |
58
+ | File | Location | Role |
59
+ | --------------- | -------------------------- | ------------------------------------------------- |
60
+ | \`AGENT.md\` | Root + any subdirectory | Durable guidance for its directory scope |
61
+ | \`TASKS.md\` | \`.autonomos/TASKS.md\` | Single source of truth for task state |
62
+ | \`ISSUES.md\` | \`.autonomos/ISSUES.md\` | Optional problem, proposal, and question intake |
63
+ | \`worklogs/\` | \`.autonomos/worklogs/\` | Historical session evidence, not current guidance |
64
+ | \`specs/\` | \`.autonomos/specs/\` | Optional project-owned normative target state |
65
+ | \`decisions/\` | \`.autonomos/decisions/\` | Optional project-owned decision records (ADRs) |
66
+ | \`PROTOCOL.md\` | \`.autonomos/PROTOCOL.md\` | This file — read-only reference |
67
+ | \`manifest.json\` | \`.autonomos/manifest.json\` | Protocol version metadata |
65
68
 
66
69
  ## AGENT.md Format Rules
67
70
 
@@ -73,25 +76,75 @@ Store only stable guidance that will affect different future tasks. Keep transie
73
76
 
74
77
  \`\`\`markdown
75
78
  # AGENT: packages/core
79
+
76
80
  - Stack: TypeScript, Vitest, tsdown
77
- - Conventions: exports via src/index.ts, tests co-located (*.test.ts)
81
+ - Conventions: exports via src/index.ts, tests co-located (\\*.test.ts)
78
82
  - Constraint: template changes require workflow test updates
79
83
  \`\`\`
80
84
 
81
- ## Issue and Task Rules
85
+ ## Issue, Specification, Decision, and Task Rules
86
+
87
+ Issues 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.
88
+
89
+ ## Specification and Decision Rules
90
+
91
+ - \`.autonomos/specs/\` and \`.autonomos/decisions/\` are optional, project-owned, first-use directories; \`init\`, \`update\`, and artifact-integrity checks do not create or overwrite them.
92
+ - 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.
93
+ - Specification status is \`draft\`, \`accepted\`, or \`superseded\`. Only \`accepted\` is normative; \`superseded\` points to its successor. Acceptance does not mean implementation is complete.
94
+ - Decision records use \`proposed\`, \`accepted\`, or \`superseded\`; they preserve rationale and alternatives rather than duplicating the full specification.
95
+ - Keep stable agent operating rules in \`AGENT.md\`, user/developer reference in \`docs/\`, execution state in \`TASKS.md\`, and historical evidence in \`worklogs/\`.
96
+ - 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.
97
+
98
+ The 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:
99
+
100
+ \`\`\`markdown
101
+ # SPEC-001 — Concise target-state title
102
+
103
+ - Status: draft | accepted | superseded
104
+ - Scope: component, capability, or boundary
105
+ - Provenance: issue, discussion, or source links
106
+ - Related decisions: ADR-001, ...
107
+ - Superseded by: SPEC-002 (when applicable)
108
+
109
+ ## Intent
110
+
111
+ ## Requirements
112
+
113
+ ## Acceptance criteria
114
+
115
+ ## Out of scope
116
+ \`\`\`
117
+
118
+ \`\`\`markdown
119
+ # ADR-001 — Concise decision title
120
+
121
+ - Status: proposed | accepted | superseded
122
+ - Scope: component or technical boundary
123
+ - Provenance: issue, task, or investigation links
124
+ - Related specs: SPEC-001, ...
125
+ - Superseded by: ADR-002 (when applicable)
126
+
127
+ ## Context
128
+
129
+ ## Decision
130
+
131
+ ## Alternatives considered
132
+
133
+ ## Consequences
134
+ \`\`\`
82
135
 
83
- Issues describe evidence, impact, and a desired outcome without choosing implementation. Tasks describe an accepted intervention and completion criteria. Use optional \`ISSUES.md\` only when triage is useful; direct, clear changes may become tasks immediately. Link accepted issues and their tasks both ways.
136
+ 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.
84
137
 
85
138
  ## Task Format
86
139
 
87
140
  \`- [Status] **[ID]** Title \\\`Priority\\\` \\\`Complexity\\\`\`
88
141
 
89
- | Status | Priority | Complexity |
90
- |---|---|---|
91
- | \`[ ]\` Todo | \`🔴 Critical\` | \`S\` Small |
92
- | \`[/]\` In Progress | \`🟠 High\` | \`M\` Medium |
93
- | \`[x]\` Done | \`🔵 Medium\` | \`L\` Large |
94
- | \`[!]\` Blocked | \`⚪ Low\` | \`XL\` Huge |
142
+ | Status | Priority | Complexity |
143
+ | ----------------- | ------------- | ---------- |
144
+ | \`[ ]\` Todo | \`🔴 Critical\` | \`S\` Small |
145
+ | \`[/]\` In Progress | \`🟠 High\` | \`M\` Medium |
146
+ | \`[x]\` Done | \`🔵 Medium\` | \`L\` Large |
147
+ | \`[!]\` Blocked | \`⚪ Low\` | \`XL\` Huge |
95
148
 
96
149
  ## Metadata Rules
97
150
 
@@ -135,5 +188,5 @@ ${e.nextSteps.map(e=>`- ${e}`).join(`
135
188
  `)}
136
189
  `}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(`
137
190
  `).trim(),a.push(s)),s={title:e.replace(`## `,``).trim(),content:``},c=[];continue}s&&c.push(e)}return s&&(s.content=c.join(`
138
- `).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=y.parse({$schema:`./harness-codes.schema.json`,_comment:"Autonomos harness codes. Each entry tells `autonomos init` where to write the protocol workflow files. The shape is intentionally minimal: only what the installer needs. To add a new harness, add an entry here. To remove one, delete it. The schema is enforced at load time by Zod (see schemas/harness-codes.ts).",platforms:{cline:{name:`Cline`,preferred:!0,installer:{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 ee(){return K}export{h as AGENT_FILE,T as AGENT_TEMPLATE,d as AUTONOMOS_DIR,B as AgentParser,S as COMPLEXITIES,y as HarnessCodesSchema,v as HarnessSchema,_ as InstallerSchema,E as LOCAL_AGENT_TEMPLATE,f as MANIFEST_FILE,b as ManifestSchema,x as PRIORITIES,p as PROTOCOL_FILE,A as PROTOCOL_TEMPLATE,j as PROTOCOL_TEMPLATE_V2026_1,u as PROTOCOL_VERSION,m as TASKS_FILE,M as TASKS_TEMPLATE,G as TaskParser,g as WORKLOGS_DIR,D as createManifest,W as displayRelative,F as findAncestorAgents,H as findProjectRoot,C as generateAgentTemplate,w as generateLocalAgentTemplate,O as generateManifestContent,N as generateWorklogContent,q as getHarness,ee as getRawHarnessCodes,U as isSamePath,J as listHarnesses,Y as listPreferredHarnesses,P as mapTaskStatusToWorklogStatus,k as parseManifest,X as resolveTargets};
191
+ `).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};
139
192
  //# 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.4.0-alpha'\n\n/**\n * Directory name for Autonomos configuration\n */\nexport const AUTONOMOS_DIR = '.autonomos'\n\n/**\n * Manifest filename\n */\nexport const MANIFEST_FILE = 'manifest.json'\n\n/**\n * Protocol filename\n */\nexport const PROTOCOL_FILE = 'PROTOCOL.md'\n\n/**\n * Tasks filename\n */\nexport const TASKS_FILE = 'TASKS.md'\n\n/**\n * Agent context filename (at project root)\n */\nexport const AGENT_FILE = 'AGENT.md'\n\n/**\n * Worklogs directory name\n */\nexport const WORKLOGS_DIR = 'worklogs'\n","import { z } from 'zod'\n\n/**\n * Installer configuration for a single harness.\n *\n * At least one of `workflowsDir`, `targetDir`, or `skillsDir` must be defined.\n *\n * - `workflowsDir`: Where session.md, task.md, crystallize.md 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\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.3\n *\n * Design principles (v0.3):\n * - PROTOCOL.md is a compact REFERENCE, not an executable workflow.\n * - All step-by-step instructions live in the 3 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| Audit accumulated drift | Read the \\`/reconcile\\` 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| \\`PROTOCOL.md\\` | \\`.autonomos/PROTOCOL.md\\` | This file — read-only reference |\n| \\`manifest.json\\` | \\`.autonomos/manifest.json\\` | Protocol version metadata |\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- 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 and Task Rules\n\nIssues describe evidence, impact, and a desired outcome without choosing implementation. Tasks describe an accepted intervention and completion criteria. Use optional \\`ISSUES.md\\` only when triage is useful; direct, clear changes may become tasks immediately. Link accepted issues and their tasks both ways.\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/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.5.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\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.5\n *\n * Design principles (v0.5):\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| 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| \\`PROTOCOL.md\\` | \\`.autonomos/PROTOCOL.md\\` | This file — read-only reference |\n| \\`manifest.json\\` | \\`.autonomos/manifest.json\\` | Protocol version metadata |\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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"}
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: protocol-adopt
3
+ description: 'Adopt optional specifications and decision records without rewriting project history.'
4
+ ---
5
+
6
+ # /adopt — Organize project knowledge
7
+
8
+ > This is an explicit, reviewable migration. It never expands user authority.
9
+
10
+ ## STEP 1 — Establish scope
11
+
12
+ 1. Confirm the target area and read root → target `AGENT.md` files.
13
+ 2. Read `.autonomos/PROTOCOL.md`, relevant issues, tasks, worklogs, and candidate Markdown.
14
+ 3. Keep the inventory bounded; do not load unrelated context branches.
15
+
16
+ ## STEP 2 — Classify sources
17
+
18
+ - Target behavior or requirements → `.autonomos/specs/`
19
+ - One technical choice and its rationale → `.autonomos/decisions/`
20
+ - Stable operating guidance → `AGENT.md`
21
+ - User/developer reference → `docs/`
22
+ - Historical or uncertain material → preserve and report
23
+
24
+ ## STEP 3 — Propose before writing
25
+
26
+ Create a source → destination map with scope, provenance, confidence, and conflicts.
27
+ Do not rewrite `worklogs/`, `ISSUES.md`, `TASKS.md`, or managed protocol artifacts.
28
+
29
+ ## STEP 4 — Confirm and apply
30
+
31
+ Show the map and unresolved conflicts to the user before writing.
32
+ After approval, create or update only approved project-owned artifacts.
33
+ Copy and link by default; move or remove sources only with explicit approval.
34
+ Keep extracted specifications `draft` and decisions `proposed` until accepted.
35
+
36
+ ## STEP 5 — Verify
37
+
38
+ Check links, duplicates, scope, status, and acceptance criteria.
39
+ Record the migration in a new worklog, then run `/reconcile` for a second pass.
@@ -23,9 +23,9 @@ For each candidate ask: **Would this still guide a different future task?**
23
23
 
24
24
  - **No:** keep observations, measurements, chronology, and completed actions in the worklog.
25
25
  - **Operational explanation:** update existing component documentation when within scope.
26
- - **Yes:** add only stable, normative, non-duplicated guidance to the narrowest applicable `AGENT.md`.
26
+ - **Yes:** route stable operating guidance to the narrowest `AGENT.md`, target requirements to `specs/`, and decision rationale to `decisions/`; keep each non-duplicated.
27
27
 
28
- Consolidate or replace superseded entries; remove disproven guidance. Never create an `AGENT.md` based on file count alone.
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
29
 
30
30
  ## STEP 3 — Task status
31
31
 
@@ -6,6 +6,7 @@ description: 'Optional intake for problems, proposals, and questions before choo
6
6
  # /issue — Capture and triage
7
7
 
8
8
  > Use this workflow only when the need or solution requires triage. A direct, clear, authorized change may start as a task.
9
+ > Proposed directions remain hypotheses until an approach is accepted.
9
10
 
10
11
  ## STEP 1 — Build context
11
12
 
@@ -34,4 +35,5 @@ Merge duplicate evidence into the existing issue instead of creating another.
34
35
 
35
36
  - **Open:** preserve the signal; do not create a task before an approach is accepted.
36
37
  - **Accepted:** create one or more scoped tasks through `/task` and link both directions.
38
+ If the outcome spans tasks, create or link a specification; record each consequential technical choice separately.
37
39
  - **Resolved/declined:** record the outcome and concise rationale; preserve the issue as history.
@@ -9,7 +9,7 @@ description: 'Audit and safely reconcile accumulated drift across Autonomos arti
9
9
 
10
10
  ## STEP 1 — Inventory and classify
11
11
 
12
- 1. Read root and applicable scoped `AGENT.md` files, then current tasks, optional issues, relevant worklogs, and linked documentation.
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
13
  2. Classify each artifact as current guidance, current state, historical evidence, or version-pinned protocol content.
14
14
  3. Check protocol integrity with `autonomos status`; repair managed artifacts only through `autonomos update` when authorized.
15
15
 
@@ -28,5 +28,7 @@ Look for duplicates, contradictions, obsolete paths or technologies, misplaced k
28
28
  - **Certain:** make the smallest correction; consolidate duplicates, route misplaced content, and replace or remove disproven current guidance.
29
29
  - **Uncertain:** do not mutate the disputed facts; report evidence, conflict, and concrete resolution options to the user.
30
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.
31
33
 
32
34
  Record material corrections and validation in the task worklog. Re-run checks and stop when a second pass produces no deterministic changes.
@@ -13,7 +13,8 @@ description: 'Mandatory procedure before starting a new task. Invoke before touc
13
13
 
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
- 3. Do not load unrelated worklogs or context branches.
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
18
 
18
19
  ## STEP 2 — Declare plan
19
20
 
@@ -5,11 +5,12 @@ 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.3 design:
8
+ * These tests guard against regressions on the v0.5 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)
12
12
  * - Durable-memory admission, placement, and retirement
13
+ * - Project-owned specifications, decision records, and safe adoption
13
14
  * - Workflows are short enough to fit in LLM working memory
14
15
  */
15
16
 
@@ -22,6 +23,7 @@ const crystallize = loadWorkflow('protocol-crystallize.md')
22
23
  const task = loadWorkflow('protocol-task.md')
23
24
  const issue = loadWorkflow('protocol-issue.md')
24
25
  const reconcile = loadWorkflow('protocol-reconcile.md')
26
+ const adopt = loadWorkflow('protocol-adopt.md')
25
27
 
26
28
  // ---------------------------------------------------------------------------
27
29
  // 1. Crystallization — agent-directed, never asks the user
@@ -113,7 +115,7 @@ describe('AGENT.md format rules — consistent across files', () => {
113
115
  // ---------------------------------------------------------------------------
114
116
  // 5. PROTOCOL_TEMPLATE — compact reference, no workflow duplication
115
117
  // ---------------------------------------------------------------------------
116
- describe('PROTOCOL_TEMPLATE — v0.3 design', () => {
118
+ describe('PROTOCOL_TEMPLATE — v0.5 design', () => {
117
119
  it('does not contain Phase 1/2/3 workflow steps', () => {
118
120
  expect(PROTOCOL_TEMPLATE).not.toContain('Phase 1:')
119
121
  expect(PROTOCOL_TEMPLATE).not.toContain('Phase 2:')
@@ -124,6 +126,7 @@ describe('PROTOCOL_TEMPLATE — v0.3 design', () => {
124
126
  expect(PROTOCOL_TEMPLATE).toContain('/session')
125
127
  expect(PROTOCOL_TEMPLATE).toContain('/task')
126
128
  expect(PROTOCOL_TEMPLATE).toContain('/issue')
129
+ expect(PROTOCOL_TEMPLATE).toContain('/adopt')
127
130
  expect(PROTOCOL_TEMPLATE).toContain('/reconcile')
128
131
  expect(PROTOCOL_TEMPLATE).toContain('/crystallize')
129
132
  })
@@ -168,13 +171,16 @@ describe('Durable-memory lifecycle', () => {
168
171
  expect(crystallize).toContain('Would this still guide a different future task?')
169
172
  expect(crystallize).toContain('observations, measurements, chronology')
170
173
  expect(crystallize).toContain('existing component documentation')
171
- expect(crystallize).toContain('stable, normative, non-duplicated guidance')
172
- expect(crystallize).toContain('narrowest applicable `AGENT.md`')
174
+ expect(crystallize).toContain('stable operating guidance')
175
+ expect(crystallize).toContain('target requirements to `specs/`')
176
+ expect(crystallize).toContain('decision rationale to `decisions/`')
173
177
  })
174
178
 
175
179
  it('retires stale guidance and rejects arbitrary file-count heuristics', () => {
176
- expect(crystallize).toContain('Consolidate or replace superseded entries')
177
- expect(crystallize).toContain('remove disproven guidance')
180
+ expect(crystallize).toContain('Consolidate or replace superseded and disproven guidance')
181
+ expect(crystallize).toContain(
182
+ 'do not turn historical worklogs, issues, or tasks into current specs/decisions'
183
+ )
178
184
  expect(crystallize).toContain('Never create an `AGENT.md` based on file count alone')
179
185
  })
180
186
  })
@@ -205,7 +211,38 @@ describe('Issue intake and task separation', () => {
205
211
  })
206
212
 
207
213
  // ---------------------------------------------------------------------------
208
- // 8. Evidence-aware reconciliation
214
+ // 8. Project-owned specifications, decisions, and adoption
215
+ // ---------------------------------------------------------------------------
216
+ describe('Project knowledge boundaries and adoption', () => {
217
+ it('defines optional specifications and decision records without automation', () => {
218
+ expect(PROTOCOL_TEMPLATE).toContain('`.autonomos/specs/`')
219
+ expect(PROTOCOL_TEMPLATE).toContain('`.autonomos/decisions/`')
220
+ expect(PROTOCOL_TEMPLATE).toContain('do not create or overwrite them')
221
+ expect(PROTOCOL_TEMPLATE).toContain(
222
+ 'no parser or independent version is required initially'
223
+ )
224
+ expect(PROTOCOL_TEMPLATE).toContain('Acceptance does not mean implementation is complete')
225
+ })
226
+
227
+ it('routes accepted target state separately from decisions and history', () => {
228
+ expect(task).toContain('accepted specifications and decision records')
229
+ expect(issue).toContain('Proposed directions remain hypotheses')
230
+ expect(crystallize).toContain('target requirements to `specs/`')
231
+ expect(crystallize).toContain('decision rationale to `decisions/`')
232
+ expect(reconcile).toContain('Use `/adopt` for history-to-artifact extraction')
233
+ })
234
+
235
+ it('requires a reviewable, additive adoption pass', () => {
236
+ expect(adopt).toContain('source → destination map')
237
+ expect(adopt).toContain('Show the map and unresolved conflicts to the user before writing')
238
+ expect(adopt).toContain('Do not rewrite `worklogs/`, `ISSUES.md`, `TASKS.md`')
239
+ expect(adopt).toContain('Copy and link by default')
240
+ expect(adopt).toContain('run `/reconcile` for a second pass')
241
+ })
242
+ })
243
+
244
+ // ---------------------------------------------------------------------------
245
+ // 9. Evidence-aware reconciliation
209
246
  // ---------------------------------------------------------------------------
210
247
  describe('Evidence-aware reconciliation', () => {
211
248
  it('classifies current, historical, and version-pinned artifacts', () => {
@@ -230,7 +267,7 @@ describe('Evidence-aware reconciliation', () => {
230
267
  })
231
268
 
232
269
  // ---------------------------------------------------------------------------
233
- // 9. User authority and truthful lifecycle status
270
+ // 10. User authority and truthful lifecycle status
234
271
  // ---------------------------------------------------------------------------
235
272
  describe('User authority and lifecycle status', () => {
236
273
  it('keeps answer-only, read-only, and diagnostic requests non-mutating', () => {
@@ -258,7 +295,7 @@ describe('User authority and lifecycle status', () => {
258
295
  })
259
296
 
260
297
  // ---------------------------------------------------------------------------
261
- // 10. Workflow brevity — each must be concise enough for LLM working memory
298
+ // 11. Workflow brevity — each must be concise enough for LLM working memory
262
299
  // ---------------------------------------------------------------------------
263
300
  describe('Workflow brevity', () => {
264
301
  const maxLines = 35 // allowing some margin over the 30-line target
@@ -292,4 +329,10 @@ describe('Workflow brevity', () => {
292
329
  const lines = body.trim().split('\n').length
293
330
  expect(lines).toBeLessThanOrEqual(maxLines)
294
331
  })
332
+
333
+ it(`adopt.md is ≤${maxLines} lines (excluding frontmatter)`, () => {
334
+ const body = adopt.replace(/^---[\s\S]*?---\n/, '')
335
+ const lines = body.trim().split('\n').length
336
+ expect(lines).toBeLessThanOrEqual(maxLines)
337
+ })
295
338
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autonomos/core",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "SDK and core definitions for the Agent Protocol",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.mts",