agentic-engineering-harness 0.6.0 → 0.6.2
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 +8 -3
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/assets.d.ts +13 -0
- package/dist/core/assets.js +115 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/init.js +4 -10
- package/dist/core/init.js.map +1 -1
- package/dist/entry.js +33 -1
- package/dist/entry.js.map +1 -1
- package/dist/paseo/runtime.d.ts +31 -0
- package/dist/paseo/runtime.js +158 -0
- package/dist/paseo/runtime.js.map +1 -0
- package/dist/paseo/sdk.d.ts +79 -0
- package/dist/paseo/sdk.js +161 -0
- package/dist/paseo/sdk.js.map +1 -0
- package/dist/paseo/sdkResolve.d.ts +17 -0
- package/dist/paseo/sdkResolve.js +70 -0
- package/dist/paseo/sdkResolve.js.map +1 -0
- package/dist/paseo/start.d.ts +7 -1
- package/dist/paseo/start.js +40 -42
- package/dist/paseo/start.js.map +1 -1
- package/dist/toolchain/setup.js +2 -0
- package/dist/toolchain/setup.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/workers/agentPrompt.js +24 -29
- package/dist/workers/agentPrompt.js.map +1 -1
- package/dist/workers/paseo.d.ts +0 -1
- package/dist/workers/paseo.js +39 -27
- package/dist/workers/paseo.js.map +1 -1
- package/docs/PASEO.md +53 -20
- package/docs/PUBLISHING.md +53 -44
- package/package.json +86 -11
package/docs/PASEO.md
CHANGED
|
@@ -1,35 +1,68 @@
|
|
|
1
1
|
# Paseo Integration
|
|
2
2
|
|
|
3
|
-
Paseo is AEH's default interactive orchestration surface.
|
|
3
|
+
Paseo is AEH's default interactive orchestration surface. The integration separates **Paseo communication/session lifecycle** from **AEH deterministic workflow ownership**.
|
|
4
|
+
|
|
5
|
+
## SDK-first control plane
|
|
6
|
+
|
|
7
|
+
AEH uses Paseo's published TypeScript client package, `@getpaseo/client`, as the primary control surface for agent creation, follow-up turns, status lookup and directory queries. Paseo currently documents that package as public but **not yet a stable public SDK**, so AEH deliberately resolves the copy bundled with the active `@getpaseo/cli` installation first instead of independently selecting a client version.
|
|
8
|
+
|
|
9
|
+
The resolver supports normal PATH installations and mise-managed npm tools. In particular, mise may expose a shim through `command -v`; AEH also asks `mise which paseo` for the real binary and `mise where npm:@getpaseo/cli` for the synthetic npm installation root, then resolves `@getpaseo/client` from that package tree. A direct project-level SDK import is retained only as a compatibility fallback.
|
|
10
|
+
|
|
11
|
+
The CLI remains responsible for daemon bootstrap/recovery and is retained as a compatibility fallback when the SDK cannot be resolved or connected:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
AEH
|
|
15
|
+
├── daemon/bootstrap/recovery -> Paseo CLI
|
|
16
|
+
└── normal agent lifecycle -> @getpaseo/client bundled with active CLI
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Set `AEH_PASEO_FORCE_CLI=1` only when the compatibility path is deliberately required. `PASEO_DAEMON_URL` overrides the default SDK endpoint `ws://127.0.0.1:6767/ws`; `PASEO_DAEMON_PASSWORD` supplies daemon authentication when configured.
|
|
20
|
+
|
|
21
|
+
A system-prompt-only idle agent is an SDK-only invariant. If the SDK is unavailable, AEH refuses to degrade that lead creation into a CLI user turn because doing so would expose the bootstrap as conversational input.
|
|
4
22
|
|
|
5
23
|
## Conversational lead
|
|
6
24
|
|
|
7
|
-
|
|
25
|
+
`aeh start` creates the lead as an idle Paseo agent. The AEH bootstrap is passed through the SDK's `systemPrompt`; it is no longer sent as the first user message and there is no synthetic `AEH READY` turn.
|
|
8
26
|
|
|
9
|
-
-
|
|
10
|
-
- send follow-up prompts;
|
|
11
|
-
- inspect agent status/activity;
|
|
12
|
-
- cancel/archive/update agent lifecycle;
|
|
13
|
-
- use `/paseo` for the current tool reference;
|
|
14
|
-
- use `/paseo-handoff` when responsibility moves to a fresh agent.
|
|
27
|
+
The bootstrap is intentionally thin. `AGENTS.md`, `.harness/skills/engineering-workflow/SKILL.md`, and the resolved AEH agent topology are authoritative for roles, charters, permissions and delegation. This avoids duplicating a role map inside every Paseo conversation and prevents prompt/configuration drift.
|
|
15
28
|
|
|
16
|
-
|
|
29
|
+
When the lead is running inside Paseo and Paseo exposes its orchestration tools, it may still use the native/MCP conversational surface and `/paseo-handoff`. Deterministic Harness-owned work, however, is created externally by AEH through the SDK.
|
|
17
30
|
|
|
18
|
-
##
|
|
31
|
+
## Independent AEH agents
|
|
19
32
|
|
|
20
|
-
AEH
|
|
33
|
+
AEH-managed workers are created without the Paseo SDK `parent` option. A worker may be placed in a delivery workspace, but workspace placement does not establish parentage. This makes each worker a top-level Paseo agent rather than a child whose lifecycle belongs to the current lead conversation.
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
Workflow ownership is represented by labels instead:
|
|
23
36
|
|
|
24
37
|
```text
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
38
|
+
aeh.project=<project>
|
|
39
|
+
aeh.kind=lead|worker
|
|
40
|
+
aeh.role=<logical-agent>
|
|
41
|
+
aeh.task=<task-id> # workers
|
|
42
|
+
aeh.profile=<profile> # when selected
|
|
43
|
+
aeh.generation=<n> # leads
|
|
28
44
|
```
|
|
29
45
|
|
|
30
|
-
|
|
46
|
+
The shared Paseo runtime exposes list/inspect primitives over those labels. This lets AEH determine which logical agent is active for a task without scraping assistant prose or relying on parent/child nesting. The same labels survive lead context rotation, so a fresh lead can correlate existing workers with durable AEH run state.
|
|
47
|
+
|
|
48
|
+
### Observe active agents
|
|
49
|
+
|
|
50
|
+
Use the top-level AEH command to inspect the live Paseo directory. The project label is applied automatically; filters are additive:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
aeh paseo agents
|
|
54
|
+
aeh paseo agents --status working
|
|
55
|
+
aeh paseo agents --kind worker --role backend-implementer
|
|
56
|
+
aeh paseo agents --task TASK-123 --json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The tabular view reports status, logical role, task, kind, stable Paseo agent ID and title. `--json` returns the same normalized fields plus the complete AEH label set. This is the preferred way to answer which AEH agent is currently working without depending on Paseo parent/subagent nesting.
|
|
60
|
+
|
|
61
|
+
## Runtime consolidation
|
|
62
|
+
|
|
63
|
+
Lead startup, `PaseoWorkerExecutor`, and generic `agentPrompt` execution all use the same managed Paseo runtime. That runtime owns SDK-first create/run/probe/list behavior and the CLI fallback. Individual worker paths should not add new hand-written `paseo run/send/wait/logs` loops.
|
|
31
64
|
|
|
32
|
-
|
|
65
|
+
Structured output is passed through the SDK `outputSchema` field. The compatibility CLI path continues to negotiate `--output-schema` and background capabilities dynamically.
|
|
33
66
|
|
|
34
67
|
## Session policy
|
|
35
68
|
|
|
@@ -42,7 +75,7 @@ orchestration:
|
|
|
42
75
|
```
|
|
43
76
|
|
|
44
77
|
```bash
|
|
45
|
-
aeh start # fresh lead
|
|
78
|
+
aeh start # fresh idle lead
|
|
46
79
|
aeh start --resume # explicit compatible reuse
|
|
47
80
|
```
|
|
48
81
|
|
|
@@ -52,10 +85,10 @@ Workspaces and durable AEH state remain reusable even though normal conversation
|
|
|
52
85
|
|
|
53
86
|
Default pressure policy is 70/80/90 percent. `aeh context guard` consumes a context ratio only when Paseo exposes a usable field; AEH does not guess.
|
|
54
87
|
|
|
55
|
-
At the handoff threshold it writes a deterministic `.harness/paseo/handoffs/*.json` artifact. From a managed Paseo lead it also creates the replacement lead automatically and bootstraps it from the handoff artifact and referenced sealed/run/audit/delivery state.
|
|
88
|
+
At the handoff threshold it writes a deterministic `.harness/paseo/handoffs/*.json` artifact. From a managed Paseo lead it also creates the replacement lead automatically and bootstraps it from the handoff artifact and referenced sealed/run/audit/delivery state. Workers remain independent top-level agents associated through AEH labels and durable task/run state rather than lead parentage.
|
|
56
89
|
|
|
57
90
|
## Trust boundary
|
|
58
91
|
|
|
59
|
-
Paseo owns communication
|
|
92
|
+
Paseo owns communication, process and session lifecycle. It is not normative engineering truth. AEH TaskContracts, seals, deterministic reports, evidence graphs and quality gates continue to decide acceptance.
|
|
60
93
|
|
|
61
94
|
For stronger direct process isolation configure Podman sandboxing where appropriate; Paseo orchestration and worker sandboxing remain separate policy axes.
|
package/docs/PUBLISHING.md
CHANGED
|
@@ -2,41 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
The package name is `agentic-engineering-harness` and the public CLI commands are `aeh` and `engineering-harness`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`package.json` is the single source of truth for the AEH version. Runtime CLI version output imports that package metadata; source files and CI must not maintain separate hard-coded version strings.
|
|
6
6
|
|
|
7
7
|
## Preflight
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Every release candidate must pass:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npm run release:check
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
This
|
|
15
|
+
This runs typecheck, the complete test suite, build and `npm pack --dry-run`.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
## Automatic releases from `main`
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
`.github/workflows/publish.yml` is the single npm publishing workflow. A push to `main` starts an idempotent release pipeline unless the repository variable below is set:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
AEH_AUTO_PUBLISH=false
|
|
21
23
|
```
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
The workflow performs the following steps:
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
1. installs dependencies with `npm ci`;
|
|
28
|
+
2. checks whether the current `package.json` version is already present on npm;
|
|
29
|
+
3. if the current version is unpublished, it publishes that exact version first;
|
|
30
|
+
4. otherwise it derives the next semantic version from commits since the latest `v*` tag:
|
|
31
|
+
- a breaking Conventional Commit (`type!:` or `BREAKING CHANGE:`) -> major;
|
|
32
|
+
- `feat:` -> minor;
|
|
33
|
+
- every other change -> patch;
|
|
34
|
+
5. synchronizes `package.json` and `package-lock.json` with `npm version --no-git-tag-version`;
|
|
35
|
+
6. runs `npm run release:check` on the exact candidate;
|
|
36
|
+
7. commits the version metadata as `chore(release): vX.Y.Z [skip ci]` and creates the matching Git tag;
|
|
37
|
+
8. publishes the package to npm with provenance;
|
|
38
|
+
9. creates the GitHub Release for the tag.
|
|
26
39
|
|
|
27
|
-
|
|
40
|
+
The release commit/tag is pushed with GitHub's repository token. GitHub does not recursively trigger ordinary push workflows for pushes created with that `GITHUB_TOKEN`, so the version commit does not create an infinite publish loop.
|
|
28
41
|
|
|
29
|
-
|
|
42
|
+
The repository must allow the workflow identity to write the release metadata commit/tag. If branch rules forbid direct writes to `main`, grant the GitHub Actions identity the appropriate bypass/write permission or set `AEH_AUTO_PUBLISH=false` until the repository rule is adjusted. Source validation remains independent of publication.
|
|
30
43
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
npm
|
|
34
|
-
|
|
44
|
+
## Manual release control
|
|
45
|
+
|
|
46
|
+
`publish-npm` also supports `workflow_dispatch`. The `bump` input can be:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
auto # Conventional Commit-derived bump
|
|
50
|
+
current # publish current version only if it is not already published
|
|
51
|
+
patch
|
|
52
|
+
minor
|
|
53
|
+
major
|
|
35
54
|
```
|
|
36
55
|
|
|
37
|
-
|
|
56
|
+
Manual dispatch is useful for retrying an external npm/OIDC failure or deliberately overriding the automatic bump classification. A `current` retry is also able to recreate a missing GitHub Release when the npm version and matching Git tag already exist; it will not fabricate a missing tag for an already-published package.
|
|
38
57
|
|
|
39
|
-
|
|
58
|
+
## npm authentication
|
|
59
|
+
|
|
60
|
+
The preferred steady-state path is npm Trusted Publishing with GitHub Actions OIDC. Configure the npm package Trusted Publisher with:
|
|
40
61
|
|
|
41
62
|
```text
|
|
42
63
|
Provider: GitHub Actions
|
|
@@ -46,39 +67,21 @@ Workflow filename: publish.yml
|
|
|
46
67
|
Allowed action: npm publish
|
|
47
68
|
```
|
|
48
69
|
|
|
49
|
-
The workflow
|
|
50
|
-
|
|
51
|
-
For the strongest steady-state posture, after the OIDC flow has been proven once, disallow traditional publish tokens for the package and retain 2FA on the maintainer account.
|
|
70
|
+
The workflow grants `id-token: write`, which is required for OIDC. Modern npm clients can exchange the GitHub OIDC identity for short-lived publish authorization, avoiding a long-lived npm write token.
|
|
52
71
|
|
|
53
|
-
|
|
72
|
+
For bootstrap or compatibility, the workflow also accepts an optional GitHub Actions secret named `NPM_TOKEN`. If present, it is exported only for the `npm publish` step. Once Trusted Publishing is verified, prefer removing the long-lived token.
|
|
54
73
|
|
|
55
|
-
|
|
56
|
-
2. Ensure the CLI dispatcher reports the same version.
|
|
57
|
-
3. Merge only after CI `release:check` passes.
|
|
58
|
-
4. Create/publish a GitHub Release tagged exactly:
|
|
74
|
+
If the package has never been published and npm does not permit Trusted Publisher configuration before first publication, perform one maintainer-authenticated bootstrap publish, then configure the Trusted Publisher above. The automatic workflow will subsequently see that version as published and continue normal semantic versioning.
|
|
59
75
|
|
|
60
|
-
|
|
61
|
-
v<package.json version>
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
For example:
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
v0.4.16
|
|
68
|
-
```
|
|
76
|
+
## Version policy
|
|
69
77
|
|
|
70
|
-
|
|
71
|
-
- check out the release commit;
|
|
72
|
-
- use Node 24 on a GitHub-hosted runner;
|
|
73
|
-
- verify that the release tag exactly matches `package.json`;
|
|
74
|
-
- run `npm run release:check` again;
|
|
75
|
-
- execute `npm publish` using npm Trusted Publishing/OIDC.
|
|
78
|
+
The repository currently starts this release line at `0.6.1`. After that, normal merges do not require a human to edit the version manually. The release workflow owns the release metadata bump.
|
|
76
79
|
|
|
77
|
-
If the
|
|
80
|
+
If a PR intentionally changes the package version to a version that is not yet on npm, that repository version wins: the next `main` publication ships it before any further automatic increment. This makes explicit release corrections and recovery deterministic.
|
|
78
81
|
|
|
79
82
|
## What enters the npm tarball
|
|
80
83
|
|
|
81
|
-
The `files` allowlist in `package.json` publishes
|
|
84
|
+
The `files` allowlist in `package.json` publishes:
|
|
82
85
|
|
|
83
86
|
```text
|
|
84
87
|
dist/
|
|
@@ -92,7 +95,7 @@ docs/
|
|
|
92
95
|
|
|
93
96
|
plus npm-required package metadata such as `package.json`, README and LICENSE.
|
|
94
97
|
|
|
95
|
-
|
|
98
|
+
Packaged `skills/` and core `policies/` are runtime control-plane assets. `aeh init`, `aeh setup`, and `aeh start` reconcile those package assets into the consumer repository's `.harness` directory. `.harness/managed-assets.json` is versioned project state: it records hashes so missing or untouched files can be restored/upgraded, retired untouched assets can be removed, and project-local modifications remain protected as overrides.
|
|
96
99
|
|
|
97
100
|
## Consumer installation
|
|
98
101
|
|
|
@@ -103,8 +106,14 @@ npm install --save-dev agentic-engineering-harness
|
|
|
103
106
|
npm exec aeh -- init --setup
|
|
104
107
|
```
|
|
105
108
|
|
|
106
|
-
|
|
109
|
+
After the repository has been initialized, a normal:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm exec aeh -- start
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
reconciles managed Harness assets before loading the agent topology and starting Paseo.
|
|
107
116
|
|
|
108
117
|
## Failure policy
|
|
109
118
|
|
|
110
|
-
|
|
119
|
+
A registry/OIDC/permission failure is an external delivery failure, not a reason to rewrite validated engineering history. The release workflow is retry-safe: if the version commit/tag exists but npm publication failed, a manual rerun with `current` will attempt the same unpublished version rather than incrementing it again. If npm publication succeeded but GitHub Release creation failed, a `current` rerun can repair the release from the existing matching tag.
|
package/package.json
CHANGED
|
@@ -1,18 +1,93 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-engineering-harness",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "OSS-first engineering harness for deterministic, spec-driven, issue-driven, audit-governed and orchestration-first multi-agent software delivery.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
"bin": {
|
|
7
|
+
"engineering-harness": "./dist/entry.js",
|
|
8
|
+
"aeh": "./dist/entry.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"templates",
|
|
13
|
+
"presets",
|
|
14
|
+
"policies",
|
|
15
|
+
"schemas",
|
|
16
|
+
"skills",
|
|
17
|
+
"docs"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.json",
|
|
21
|
+
"dev": "tsx src/entry.ts",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
25
|
+
"check": "npm run typecheck && npm test && npm run build",
|
|
26
|
+
"release:check": "npm run check && npm pack --dry-run",
|
|
27
|
+
"release:resolve": "node scripts/release-version.mjs"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@opentelemetry/api": "^1.9.0",
|
|
34
|
+
"commander": "^14.0.1",
|
|
35
|
+
"minimatch": "^10.0.3",
|
|
36
|
+
"yaml": "^2.8.1",
|
|
37
|
+
"zod": "^4.0.17"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^24.2.1",
|
|
41
|
+
"tsx": "^4.20.3",
|
|
42
|
+
"typescript": "^5.9.2",
|
|
43
|
+
"vitest": "^3.2.4"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/JamesMorales04/agentic-engineering-harness.git"
|
|
48
|
+
},
|
|
13
49
|
"homepage": "https://github.com/JamesMorales04/agentic-engineering-harness#readme",
|
|
14
|
-
"bugs": {
|
|
15
|
-
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/JamesMorales04/agentic-engineering-harness/issues"
|
|
52
|
+
},
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
},
|
|
16
56
|
"license": "Apache-2.0",
|
|
17
|
-
"keywords": [
|
|
57
|
+
"keywords": [
|
|
58
|
+
"ai-agents",
|
|
59
|
+
"codex",
|
|
60
|
+
"opencode",
|
|
61
|
+
"paseo",
|
|
62
|
+
"openspec",
|
|
63
|
+
"sdd",
|
|
64
|
+
"audit",
|
|
65
|
+
"code-review",
|
|
66
|
+
"github-issues",
|
|
67
|
+
"issue-driven-development",
|
|
68
|
+
"quick-contract",
|
|
69
|
+
"gherkin",
|
|
70
|
+
"agent-routing",
|
|
71
|
+
"agent-presets",
|
|
72
|
+
"orchestration",
|
|
73
|
+
"context-handoff",
|
|
74
|
+
"mcp",
|
|
75
|
+
"github-delivery",
|
|
76
|
+
"worktrees",
|
|
77
|
+
"multi-model",
|
|
78
|
+
"multi-worker",
|
|
79
|
+
"distributed-workers",
|
|
80
|
+
"quality-convergence",
|
|
81
|
+
"evidence-graph",
|
|
82
|
+
"policy-bundles",
|
|
83
|
+
"sandbox",
|
|
84
|
+
"toolchain",
|
|
85
|
+
"mise",
|
|
86
|
+
"bootstrap",
|
|
87
|
+
"human-on-exception",
|
|
88
|
+
"deterministic-validation",
|
|
89
|
+
"engineering-harness",
|
|
90
|
+
"slsa",
|
|
91
|
+
"opentelemetry"
|
|
92
|
+
]
|
|
18
93
|
}
|