@moreih29/nexus-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/conformance/README.md +5 -1
- package/conformance/examples/plan.extension.schema.example.json +25 -0
- package/conformance/lifecycle/agent-complete.json +2 -1
- package/conformance/lifecycle/agent-resume.json +2 -1
- package/conformance/lifecycle/agent-spawn.json +7 -4
- package/conformance/lifecycle/session-end.json +3 -2
- package/conformance/lifecycle/session-start.json +5 -3
- package/conformance/scenarios/full-plan-cycle.json +3 -3
- package/conformance/schema/fixture.schema.json +3 -3
- package/conformance/state-schemas/agent-tracker.schema.json +10 -5
- package/conformance/state-schemas/history.schema.json +11 -1
- package/conformance/state-schemas/plan.schema.json +5 -0
- package/conformance/state-schemas/runtime.schema.json +13 -4
- package/conformance/state-schemas/tasks.schema.json +5 -0
- package/conformance/tools/plan-decide.json +7 -7
- package/conformance/tools/plan-start.json +1 -1
- package/conformance/tools/task-add.json +1 -1
- package/conformance/tools/task-close.json +2 -0
- package/docs/consumer-implementation-guide.md +1 -1
- package/docs/nexus-outputs-contract.md +10 -0
- package/docs/nexus-tools-contract.md +12 -2
- package/manifest.json +55 -55
- package/package.json +5 -1
- package/scripts/.gitkeep +0 -0
- package/scripts/conformance-coverage.ts +466 -0
- package/scripts/import-from-claude-nexus.ts +403 -0
- package/scripts/lib/frontmatter.ts +71 -0
- package/scripts/lib/lint.ts +216 -0
- package/scripts/lib/structure.ts +159 -0
- package/scripts/lib/validate.ts +668 -0
- package/scripts/validate.ts +90 -0
package/conformance/README.md
CHANGED
|
@@ -170,6 +170,7 @@ Assertions are key/value objects where keys are JSONPath expressions and values
|
|
|
170
170
|
| `"$.field": { "type": "number", "min": 1 }` | Numeric value >= 1 |
|
|
171
171
|
| `"$.field": { "type": "string", "minLength": 5 }` | String with minimum length |
|
|
172
172
|
| `".nexus/state/plan.json": null` | File must not exist |
|
|
173
|
+
| `".nexus/state/artifacts/findings.md": {}` | File must exist; content not inspected (use for non-JSON artifacts like .md, .txt, binary files) |
|
|
173
174
|
|
|
174
175
|
For `state_files`, a `null` value at the file path key means the file must be absent. A `null` value at a JSONPath key within a file assertion means that field must be `null`.
|
|
175
176
|
|
|
@@ -240,7 +241,10 @@ A conformance test runner does the following for each fixture:
|
|
|
240
241
|
- For multi-step scenarios: iterate `steps` in order, calling each `action` (or triggering each `event`) and evaluating `assert_return` and `assert_state` after each step before proceeding.
|
|
241
242
|
4. **Evaluate postconditions**:
|
|
242
243
|
- Check `postcondition.return_value` assertions against the tool's return value.
|
|
243
|
-
- Check `postcondition.state_files` assertions against the actual file system state.
|
|
244
|
+
- Check `postcondition.state_files` assertions against the actual file system state. For each entry in `state_files`:
|
|
245
|
+
- Value is `null` → assert the file does NOT exist.
|
|
246
|
+
- Value is an empty object `{}` → assert the file EXISTS; do NOT parse content (use for non-JSON artifacts: .md, .txt, binary).
|
|
247
|
+
- Value is a non-empty object `{...}` → parse file as JSON and evaluate each JSONPath assertion against the parsed content.
|
|
244
248
|
- If `postcondition.error` is `true`, the tool call must have produced an error.
|
|
245
249
|
- If `postcondition.error_contains` is set, the error message must contain that substring.
|
|
246
250
|
5. **Report** pass/fail per `test_id`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "conformance/examples/plan.extension.schema.example.json",
|
|
4
|
+
"title": "Example: Harness-local plan state extension",
|
|
5
|
+
"description": "Non-normative reference example of a harness-local extension schema for plan.json. Harnesses MAY add supplemental fields via {base}.extension.json files in .nexus/state/{harness-id}/. Consumers replace harness_specific_field_example with their own fields. See docs/nexus-outputs-contract.md §Harness-local State Extension for the pattern definition.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["extends"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"extends": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"const": "conformance/state-schemas/plan.schema.json",
|
|
13
|
+
"description": "Reference to the parent common-schema this extension supplements"
|
|
14
|
+
},
|
|
15
|
+
"harness_id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
18
|
+
"description": "Identifier of the harness that produced this extension file"
|
|
19
|
+
},
|
|
20
|
+
"harness_specific_field_example": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Placeholder — replace with your harness's actual extension fields as needed"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
".nexus/state/runtime.json": {
|
|
7
7
|
"teams_enabled": true,
|
|
8
8
|
"session_started_at": "2026-04-13T00:00:00.000Z",
|
|
9
|
-
"
|
|
9
|
+
"harness_id": "claude-nexus",
|
|
10
|
+
"harness_version": "0.25.0"
|
|
10
11
|
},
|
|
11
12
|
".nexus/state/agent-tracker.json": []
|
|
12
13
|
}
|
|
@@ -14,7 +15,8 @@
|
|
|
14
15
|
"event": {
|
|
15
16
|
"type": "agent_spawn",
|
|
16
17
|
"params": {
|
|
17
|
-
"
|
|
18
|
+
"harness_id": "claude-nexus",
|
|
19
|
+
"agent_name": "architect",
|
|
18
20
|
"agent_id": "uuid-eng01"
|
|
19
21
|
},
|
|
20
22
|
"description": "Harness spawns an agent instance and records its initial state in the agent registry"
|
|
@@ -23,7 +25,8 @@
|
|
|
23
25
|
"state_files": {
|
|
24
26
|
".nexus/state/agent-tracker.json": {
|
|
25
27
|
"$.length": 1,
|
|
26
|
-
"$[0].
|
|
28
|
+
"$[0].harness_id": "claude-nexus",
|
|
29
|
+
"$[0].agent_name": "architect",
|
|
27
30
|
"$[0].agent_id": "uuid-eng01",
|
|
28
31
|
"$[0].started_at": { "type": "iso8601" },
|
|
29
32
|
"$[0].resume_count": 0,
|
|
@@ -33,7 +36,7 @@
|
|
|
33
36
|
},
|
|
34
37
|
"covers": {
|
|
35
38
|
"state_schemas": {
|
|
36
|
-
"agent-tracker.schema.json": ["
|
|
39
|
+
"agent-tracker.schema.json": ["harness_id", "agent_name", "agent_id", "started_at", "resume_count", "status"]
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
".nexus/state/runtime.json": {
|
|
7
7
|
"teams_enabled": true,
|
|
8
8
|
"session_started_at": "2026-04-13T00:00:00.000Z",
|
|
9
|
-
"
|
|
9
|
+
"harness_id": "claude-nexus",
|
|
10
|
+
"harness_version": "0.25.0"
|
|
10
11
|
},
|
|
11
12
|
".nexus/state/agent-tracker.json": []
|
|
12
13
|
}
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
},
|
|
24
25
|
"covers": {
|
|
25
26
|
"state_schemas": {
|
|
26
|
-
"runtime.schema.json": ["teams_enabled", "session_started_at", "
|
|
27
|
+
"runtime.schema.json": ["teams_enabled", "session_started_at", "harness_id", "harness_version"],
|
|
27
28
|
"agent-tracker.schema.json": []
|
|
28
29
|
},
|
|
29
30
|
"description": "Covers deletion aspect of the full runtime/agent-tracker lifecycle — absence of both files after session_end"
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"type": "session_start",
|
|
12
12
|
"params": {
|
|
13
13
|
"teams_enabled": true,
|
|
14
|
-
"
|
|
14
|
+
"harness_id": "claude-nexus",
|
|
15
|
+
"harness_version": "0.25.0"
|
|
15
16
|
},
|
|
16
17
|
"description": "Harness session hook fires at startup, injecting runtime configuration and initializing the agent registry"
|
|
17
18
|
},
|
|
@@ -20,7 +21,8 @@
|
|
|
20
21
|
".nexus/state/runtime.json": {
|
|
21
22
|
"$.teams_enabled": true,
|
|
22
23
|
"$.session_started_at": { "type": "iso8601" },
|
|
23
|
-
"$.
|
|
24
|
+
"$.harness_id": "claude-nexus",
|
|
25
|
+
"$.harness_version": { "type": "string", "minLength": 1 }
|
|
24
26
|
},
|
|
25
27
|
".nexus/state/agent-tracker.json": {
|
|
26
28
|
"$.length": 0
|
|
@@ -29,7 +31,7 @@
|
|
|
29
31
|
},
|
|
30
32
|
"covers": {
|
|
31
33
|
"state_schemas": {
|
|
32
|
-
"runtime.schema.json": ["teams_enabled", "session_started_at", "
|
|
34
|
+
"runtime.schema.json": ["schema_version", "teams_enabled", "session_started_at", "harness_id", "harness_version"],
|
|
33
35
|
"agent-tracker.schema.json": []
|
|
34
36
|
}
|
|
35
37
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"description": "End-to-end lifecycle scenario: plan/task/history state transitions and each tool's return value across 5 sequential invocations."
|
|
17
17
|
},
|
|
18
|
-
"uncovered_params": ["research_summary", "issue_id", "
|
|
18
|
+
"uncovered_params": ["research_summary", "issue_id", "decision", "title", "context", "deps"],
|
|
19
19
|
"precondition": {
|
|
20
20
|
"state_files": {
|
|
21
21
|
".nexus/state/plan.json": null,
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"tool": "plan_decide",
|
|
57
57
|
"params": {
|
|
58
58
|
"issue_id": 1,
|
|
59
|
-
"
|
|
59
|
+
"decision": "Keep .nexus/state/ as the canonical location. Documented in state-schemas README."
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
"assert_return": {
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"tool": "plan_decide",
|
|
79
79
|
"params": {
|
|
80
80
|
"issue_id": 2,
|
|
81
|
-
"
|
|
81
|
+
"decision": "Ship a one-shot migration script as a standalone npm script. Document in RELEASING.md."
|
|
82
82
|
}
|
|
83
83
|
},
|
|
84
84
|
"assert_return": {
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"properties": {
|
|
113
113
|
"state_files": {
|
|
114
114
|
"type": "object",
|
|
115
|
-
"description": "Map of file path to content object
|
|
115
|
+
"description": "Map of file path to content object. null = file must not exist; empty object {} = file must exist but content is not inspected (use for non-JSON artifacts like .md, .txt, binary files); non-empty object = precondition content written as-is (typically JSON).",
|
|
116
116
|
"additionalProperties": {
|
|
117
117
|
"oneOf": [
|
|
118
118
|
{ "type": "object" },
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
},
|
|
172
172
|
"params": {
|
|
173
173
|
"type": "object",
|
|
174
|
-
"description": "Optional event-specific parameters (e.g.
|
|
174
|
+
"description": "Optional event-specific parameters (e.g. harness_id, agent_name, and agent_id for agent_spawn)",
|
|
175
175
|
"additionalProperties": true
|
|
176
176
|
},
|
|
177
177
|
"description": {
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
"properties": {
|
|
188
188
|
"state_files": {
|
|
189
189
|
"type": "object",
|
|
190
|
-
"description": "Map of file path to assertion object
|
|
190
|
+
"description": "Map of file path to assertion object. null = file must not exist after the action; empty object {} = file must exist but content is not inspected (use for non-JSON artifacts like .md, .txt, binary files); non-empty object = JSONPath assertions on parsed JSON content.",
|
|
191
191
|
"additionalProperties": {
|
|
192
192
|
"oneOf": [
|
|
193
193
|
{
|
|
@@ -2,17 +2,22 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "conformance/state-schemas/agent-tracker.schema.json",
|
|
4
4
|
"title": "Nexus Agent Tracker",
|
|
5
|
-
"description": "Schema for .nexus/state/agent-tracker.json — registry of spawned agent instances tracked across a session",
|
|
5
|
+
"description": "Schema for .nexus/state/agent-tracker.json — registry of spawned agent instances tracked across a session. No schema_version field: this file is session-scoped and deleted on session end — migration anchor not required.",
|
|
6
6
|
"type": "array",
|
|
7
7
|
"items": {
|
|
8
8
|
"type": "object",
|
|
9
9
|
"additionalProperties": false,
|
|
10
|
-
"required": ["
|
|
10
|
+
"required": ["harness_id", "agent_name", "agent_id", "started_at", "resume_count", "status"],
|
|
11
11
|
"properties": {
|
|
12
|
-
"
|
|
12
|
+
"harness_id": {
|
|
13
13
|
"type": "string",
|
|
14
|
-
"
|
|
15
|
-
"description": "
|
|
14
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
15
|
+
"description": "Identifier of the harness that spawned this agent."
|
|
16
|
+
},
|
|
17
|
+
"agent_name": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
20
|
+
"description": "Neutral agent id as defined in nexus-core agents/{id}/meta.yml (e.g. 'architect', 'engineer')."
|
|
16
21
|
},
|
|
17
22
|
"agent_id": {
|
|
18
23
|
"type": "string",
|
|
@@ -7,14 +7,24 @@
|
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["cycles"],
|
|
9
9
|
"properties": {
|
|
10
|
+
"schema_version": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^\\d+\\.\\d+$",
|
|
13
|
+
"description": "nexus-core version that introduced this schema shape (e.g. '0.5'). Optional in v0.5.0 — candidate for required in v1.0.0 (Phase 2 entry)."
|
|
14
|
+
},
|
|
10
15
|
"cycles": {
|
|
11
16
|
"type": "array",
|
|
12
17
|
"description": "Chronologically ordered list of completed execution cycles",
|
|
13
18
|
"items": {
|
|
14
19
|
"type": "object",
|
|
15
20
|
"additionalProperties": false,
|
|
16
|
-
"required": ["completed_at", "branch", "plan", "tasks"],
|
|
21
|
+
"required": ["completed_at", "branch", "plan", "tasks", "schema_version"],
|
|
17
22
|
"properties": {
|
|
23
|
+
"schema_version": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"pattern": "^\\d+\\.\\d+$",
|
|
26
|
+
"description": "Version tag recorded at the time this cycle was archived. Required for every cycle as history.json accumulates across nexus-core versions."
|
|
27
|
+
},
|
|
18
28
|
"completed_at": {
|
|
19
29
|
"type": "string",
|
|
20
30
|
"format": "date-time",
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["id", "topic", "issues", "created_at"],
|
|
9
9
|
"properties": {
|
|
10
|
+
"schema_version": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^\\d+\\.\\d+$",
|
|
13
|
+
"description": "nexus-core version that introduced this schema shape (e.g. '0.5'). Optional in v0.5.0 — candidate for required in v1.0.0 (Phase 2 entry)."
|
|
14
|
+
},
|
|
10
15
|
"id": {
|
|
11
16
|
"type": "number",
|
|
12
17
|
"minimum": 1,
|
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
"description": "Schema for .nexus/state/runtime.json — ephemeral runtime configuration written by the harness at session start",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
|
-
"required": ["teams_enabled", "session_started_at", "
|
|
8
|
+
"required": ["teams_enabled", "session_started_at", "harness_id", "harness_version"],
|
|
9
9
|
"properties": {
|
|
10
|
+
"schema_version": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^\\d+\\.\\d+$",
|
|
13
|
+
"description": "nexus-core version that introduced this schema shape (e.g. '0.5'). Optional in v0.5.0 — candidate for required in v1.0.0 (Phase 2 entry)."
|
|
14
|
+
},
|
|
10
15
|
"teams_enabled": {
|
|
11
16
|
"type": "boolean",
|
|
12
17
|
"description": "Whether multi-agent team orchestration is active in this session"
|
|
@@ -16,10 +21,14 @@
|
|
|
16
21
|
"format": "date-time",
|
|
17
22
|
"description": "ISO 8601 timestamp when the current harness session was started"
|
|
18
23
|
},
|
|
19
|
-
"
|
|
24
|
+
"harness_id": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
27
|
+
"description": "Identifier of the harness that owns this runtime state (e.g. 'claude-nexus', 'opencode-nexus'). Free string — nexus-core does not enumerate harnesses."
|
|
28
|
+
},
|
|
29
|
+
"harness_version": {
|
|
20
30
|
"type": "string",
|
|
21
|
-
"
|
|
22
|
-
"description": "Version string of the harness plugin that wrote this file"
|
|
31
|
+
"description": "Semver-like version string of the harness plugin that wrote this file."
|
|
23
32
|
}
|
|
24
33
|
}
|
|
25
34
|
}
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["goal", "decisions", "tasks"],
|
|
9
9
|
"properties": {
|
|
10
|
+
"schema_version": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^\\d+\\.\\d+$",
|
|
13
|
+
"description": "nexus-core version that introduced this schema shape (e.g. '0.5'). Optional in v0.5.0 — candidate for required in v1.0.0 (Phase 2 entry)."
|
|
14
|
+
},
|
|
10
15
|
"goal": {
|
|
11
16
|
"type": "string",
|
|
12
17
|
"minLength": 1,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"test_id": "plan_decide_happy_path",
|
|
4
|
-
"description": "plan_decide marks an issue as decided and records the decision
|
|
4
|
+
"description": "plan_decide marks an issue as decided and records the decision text on the issue object",
|
|
5
5
|
"covers": {
|
|
6
6
|
"state_schemas": {
|
|
7
7
|
"plan.schema.json": ["issues[].status", "issues[].decision"]
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"plan_decide": ["decided", "allComplete", "remaining"]
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
|
-
"uncovered_params": ["issue_id", "
|
|
13
|
+
"uncovered_params": ["issue_id", "decision"],
|
|
14
14
|
"precondition": {
|
|
15
15
|
"state_files": {
|
|
16
16
|
".nexus/state/plan.json": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"tool": "plan_decide",
|
|
38
38
|
"params": {
|
|
39
39
|
"issue_id": 1,
|
|
40
|
-
"
|
|
40
|
+
"decision": "Use declarative JSON with JSONPath assertions. Harness-neutral tool names only."
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"postcondition": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"plan.schema.json": []
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
-
"uncovered_params": ["issue_id", "
|
|
66
|
+
"uncovered_params": ["issue_id", "decision"],
|
|
67
67
|
"precondition": {
|
|
68
68
|
"state_files": {
|
|
69
69
|
".nexus/state/plan.json": null
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"tool": "plan_decide",
|
|
74
74
|
"params": {
|
|
75
75
|
"issue_id": 1,
|
|
76
|
-
"
|
|
76
|
+
"decision": "Some decision"
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
"postcondition": {
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"plan.schema.json": ["issues[].how_agents", "issues[].how_agents[]", "issues[].how_summary", "issues[].how_agent_ids"]
|
|
91
91
|
}
|
|
92
92
|
},
|
|
93
|
-
"uncovered_params": ["issue_id"],
|
|
93
|
+
"uncovered_params": ["issue_id", "decision"],
|
|
94
94
|
"precondition": {
|
|
95
95
|
"state_files": {
|
|
96
96
|
".nexus/state/plan.json": {
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"tool": "plan_decide",
|
|
113
113
|
"params": {
|
|
114
114
|
"issue_id": 1,
|
|
115
|
-
"
|
|
115
|
+
"decision": "Declarative JSON with JSONPath assertions, harness-neutral.",
|
|
116
116
|
"how_agents": ["architect", "postdoc"],
|
|
117
117
|
"how_summary": {
|
|
118
118
|
"architect": "JSONPath assertions provide harness-agnostic verifiability.",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "plan_start creates plan.json with correct structure when given a topic, issues, and research_summary",
|
|
5
5
|
"covers": {
|
|
6
6
|
"state_schemas": {
|
|
7
|
-
"plan.schema.json": ["id", "topic", "issues[].id", "issues[].title", "issues[].status", "research_summary", "created_at"]
|
|
7
|
+
"plan.schema.json": ["schema_version", "id", "topic", "issues[].id", "issues[].title", "issues[].status", "research_summary", "created_at"]
|
|
8
8
|
},
|
|
9
9
|
"return_value": {
|
|
10
10
|
"plan_start": ["created", "plan_id", "topic", "issueCount"]
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "task_add creates tasks.json with the new task when no tasks.json existed, assigning id=1 and status=pending",
|
|
5
5
|
"covers": {
|
|
6
6
|
"state_schemas": {
|
|
7
|
-
"tasks.schema.json": ["tasks[].id", "tasks[].title", "tasks[].status", "tasks[].deps", "tasks[].approach", "tasks[].acceptance", "tasks[].risk", "tasks[].context", "tasks[].created_at"]
|
|
7
|
+
"tasks.schema.json": ["schema_version", "tasks[].id", "tasks[].title", "tasks[].status", "tasks[].deps", "tasks[].approach", "tasks[].acceptance", "tasks[].risk", "tasks[].context", "tasks[].created_at"]
|
|
8
8
|
},
|
|
9
9
|
"return_value": {
|
|
10
10
|
"task_add": ["task"]
|
|
@@ -555,7 +555,7 @@ Identify the equivalent events in your harness's plugin system and implement the
|
|
|
555
555
|
**When it fires:** Lead spawns a subagent to execute a task.
|
|
556
556
|
|
|
557
557
|
**Expected consumer behavior:**
|
|
558
|
-
- Record the new agent entry in `agent-tracker.json`: `{
|
|
558
|
+
- Record the new agent entry in `agent-tracker.json`: `{ harness_id, agent_name, agent_id, task_id, started_at }`.
|
|
559
559
|
- Inject the knowledge index into the subagent's initial context: the list of files in `.nexus/memory/`, `.nexus/context/`, and `.nexus/rules/` so the agent knows what project knowledge is available.
|
|
560
560
|
- Apply capability restrictions: resolve `effective_capabilities` for this agent type and configure the subagent's tool access accordingly (see §6).
|
|
561
561
|
- Apply the resume evaluation: check `owner_reuse_policy` on the task and the agent's `resume_tier` to determine whether to spawn fresh or resume a prior session (see §10).
|
|
@@ -238,6 +238,16 @@ Nexus 산출물은 생성 책임 주체에 따라 세 카테고리로 분류된
|
|
|
238
238
|
|
|
239
239
|
(루트 레벨 `edit-tracker.json`/`reopen-tracker.json`은 legacy carve-out으로 v0.3.x 이하 호환 유지)
|
|
240
240
|
|
|
241
|
+
### Reference example
|
|
242
|
+
|
|
243
|
+
`conformance/examples/plan.extension.schema.example.json`에 non-normative 참조 예시가 있다. 이 파일은 다음 요소를 보여준다:
|
|
244
|
+
|
|
245
|
+
- `extends` 필드 (const: 부모 schema 경로)로 extension이 참조하는 common schema를 명시
|
|
246
|
+
- `additionalProperties: false` — 확장 schema에서도 엄격 적용
|
|
247
|
+
- `harness_id` 필드와 harness-specific field placeholder
|
|
248
|
+
|
|
249
|
+
consumer는 이 파일을 starting point로 삼아 자신의 실제 extension 필드로 교체한다.
|
|
250
|
+
|
|
241
251
|
---
|
|
242
252
|
|
|
243
253
|
## Conformance 의무와의 연결
|
|
@@ -102,7 +102,17 @@ Mutates the issue list of the active planning session. Supports four discrete ac
|
|
|
102
102
|
|
|
103
103
|
### Return Value
|
|
104
104
|
|
|
105
|
-
All responses include an `issue` field containing the affected `PlanIssue` object.
|
|
105
|
+
All responses include an `issue` field containing the affected `PlanIssue` object.
|
|
106
|
+
|
|
107
|
+
The `issue` object contains:
|
|
108
|
+
|
|
109
|
+
| Field | Type | Presence |
|
|
110
|
+
|-------|------|----------|
|
|
111
|
+
| `id` | `number` | always |
|
|
112
|
+
| `title` | `string` | on `add`, `edit`, `reopen` |
|
|
113
|
+
| `status` | `"pending" \| "decided"` | on `add`, `reopen` |
|
|
114
|
+
|
|
115
|
+
The discriminating field varies by action:
|
|
106
116
|
|
|
107
117
|
| Action | Discriminating Field | Value |
|
|
108
118
|
|--------|----------------------|-------|
|
|
@@ -140,7 +150,7 @@ Records a decision for a specific issue and marks it as `"decided"`. Triggered b
|
|
|
140
150
|
| Name | Type | Required | Description |
|
|
141
151
|
|------|------|----------|-------------|
|
|
142
152
|
| `issue_id` | `number` | yes | Identifier of the issue being decided |
|
|
143
|
-
| `
|
|
153
|
+
| `decision` | `string` | yes | Decision text to record against the issue |
|
|
144
154
|
| `how_agents` | `string[]` | no | Names of HOW agents that contributed analysis |
|
|
145
155
|
| `how_summary` | `Record<string, string>` | no | Per-agent key position summaries |
|
|
146
156
|
| `how_agent_ids` | `Record<string, string>` | no | Agent name to agent-instance ID mapping for future resume |
|
package/manifest.json
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"nexus_core_version": "0.
|
|
3
|
-
"nexus_core_commit": "
|
|
2
|
+
"nexus_core_version": "0.5.0",
|
|
3
|
+
"nexus_core_commit": "4da9b345dce867d9b7b60f8b04076a1a3dc3818a",
|
|
4
4
|
"schema_contract_version": "2.0",
|
|
5
5
|
"agents": [
|
|
6
|
+
{
|
|
7
|
+
"name": "designer",
|
|
8
|
+
"description": "UX/UI design — evaluates user experience, interaction patterns, and how users will experience the product",
|
|
9
|
+
"task": "UI/UX design, interaction patterns, user experience",
|
|
10
|
+
"alias_ko": "디자이너",
|
|
11
|
+
"category": "how",
|
|
12
|
+
"resume_tier": "persistent",
|
|
13
|
+
"model_tier": "high",
|
|
14
|
+
"capabilities": [
|
|
15
|
+
"no_file_edit",
|
|
16
|
+
"no_task_create",
|
|
17
|
+
"no_task_update"
|
|
18
|
+
],
|
|
19
|
+
"id": "designer",
|
|
20
|
+
"body_hash": "sha256:88ac56147d0e5bdf23fa591ce570a9c2d0eb1338df4ec2219f6238ddfcb65df4"
|
|
21
|
+
},
|
|
6
22
|
{
|
|
7
23
|
"name": "architect",
|
|
8
24
|
"description": "Technical design — evaluates How, reviews architecture, advises on implementation approach",
|
|
@@ -35,10 +51,10 @@
|
|
|
35
51
|
"body_hash": "sha256:f04d15249601b14046e7e40a4475defb289436c4474afbd89986964f8c3e7c2f"
|
|
36
52
|
},
|
|
37
53
|
{
|
|
38
|
-
"name": "
|
|
39
|
-
"description": "
|
|
40
|
-
"task": "
|
|
41
|
-
"alias_ko": "
|
|
54
|
+
"name": "strategist",
|
|
55
|
+
"description": "Business strategy — evaluates market positioning, competitive landscape, and business viability of decisions",
|
|
56
|
+
"task": "Business strategy, market analysis, competitive positioning",
|
|
57
|
+
"alias_ko": "전략가",
|
|
42
58
|
"category": "how",
|
|
43
59
|
"resume_tier": "persistent",
|
|
44
60
|
"model_tier": "high",
|
|
@@ -47,8 +63,8 @@
|
|
|
47
63
|
"no_task_create",
|
|
48
64
|
"no_task_update"
|
|
49
65
|
],
|
|
50
|
-
"id": "
|
|
51
|
-
"body_hash": "sha256:
|
|
66
|
+
"id": "strategist",
|
|
67
|
+
"body_hash": "sha256:0254b4144a22c66209bd68119553d9057a4fb7f9b1ff7ebb9878687d99583465"
|
|
52
68
|
},
|
|
53
69
|
{
|
|
54
70
|
"name": "engineer",
|
|
@@ -64,37 +80,6 @@
|
|
|
64
80
|
"id": "engineer",
|
|
65
81
|
"body_hash": "sha256:3d58b1b490c2f93cace2eedd0f04ec000f84514388eb086768cf53f8fa33db01"
|
|
66
82
|
},
|
|
67
|
-
{
|
|
68
|
-
"name": "strategist",
|
|
69
|
-
"description": "Business strategy — evaluates market positioning, competitive landscape, and business viability of decisions",
|
|
70
|
-
"task": "Business strategy, market analysis, competitive positioning",
|
|
71
|
-
"alias_ko": "전략가",
|
|
72
|
-
"category": "how",
|
|
73
|
-
"resume_tier": "persistent",
|
|
74
|
-
"model_tier": "high",
|
|
75
|
-
"capabilities": [
|
|
76
|
-
"no_file_edit",
|
|
77
|
-
"no_task_create",
|
|
78
|
-
"no_task_update"
|
|
79
|
-
],
|
|
80
|
-
"id": "strategist",
|
|
81
|
-
"body_hash": "sha256:0254b4144a22c66209bd68119553d9057a4fb7f9b1ff7ebb9878687d99583465"
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"name": "researcher",
|
|
85
|
-
"description": "Independent investigation — conducts web searches, gathers evidence, and reports findings with citations",
|
|
86
|
-
"task": "Web search, independent investigation",
|
|
87
|
-
"alias_ko": "리서처",
|
|
88
|
-
"category": "do",
|
|
89
|
-
"resume_tier": "persistent",
|
|
90
|
-
"model_tier": "standard",
|
|
91
|
-
"capabilities": [
|
|
92
|
-
"no_file_edit",
|
|
93
|
-
"no_task_create"
|
|
94
|
-
],
|
|
95
|
-
"id": "researcher",
|
|
96
|
-
"body_hash": "sha256:fc79bafec05503327bd51a0b84b6e642d304bd79c45b78db6448b112793c143e"
|
|
97
|
-
},
|
|
98
83
|
{
|
|
99
84
|
"name": "postdoc",
|
|
100
85
|
"description": "Research methodology and synthesis — designs investigation approach, evaluates evidence quality, writes synthesis documents",
|
|
@@ -126,6 +111,21 @@
|
|
|
126
111
|
"id": "tester",
|
|
127
112
|
"body_hash": "sha256:4dd04e1c93ff9c0c9fa6aebb60ece3f9719e82f9714b13feea01b6163633caec"
|
|
128
113
|
},
|
|
114
|
+
{
|
|
115
|
+
"name": "researcher",
|
|
116
|
+
"description": "Independent investigation — conducts web searches, gathers evidence, and reports findings with citations",
|
|
117
|
+
"task": "Web search, independent investigation",
|
|
118
|
+
"alias_ko": "리서처",
|
|
119
|
+
"category": "do",
|
|
120
|
+
"resume_tier": "persistent",
|
|
121
|
+
"model_tier": "standard",
|
|
122
|
+
"capabilities": [
|
|
123
|
+
"no_file_edit",
|
|
124
|
+
"no_task_create"
|
|
125
|
+
],
|
|
126
|
+
"id": "researcher",
|
|
127
|
+
"body_hash": "sha256:fc79bafec05503327bd51a0b84b6e642d304bd79c45b78db6448b112793c143e"
|
|
128
|
+
},
|
|
129
129
|
{
|
|
130
130
|
"name": "writer",
|
|
131
131
|
"description": "Technical writing — transforms research findings, code, and analysis into clear documents and presentations for the intended audience",
|
|
@@ -156,15 +156,17 @@
|
|
|
156
156
|
"body_hash": "sha256:6c8d1a36626d4034209ff83780dec6238297ec4710612441b2ef09daac714ca8"
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
|
-
"name": "nx-
|
|
160
|
-
"description": "
|
|
161
|
-
"summary": "
|
|
162
|
-
"
|
|
159
|
+
"name": "nx-plan",
|
|
160
|
+
"description": "Structured multi-perspective analysis to decompose issues, align on decisions, and produce an enriched plan before execution. Plan only — does not execute.",
|
|
161
|
+
"summary": "Structured planning — subagent-based analysis, deliberate decisions, produce execution plan",
|
|
162
|
+
"triggers": [
|
|
163
|
+
"plan"
|
|
164
|
+
],
|
|
163
165
|
"harness_docs_refs": [
|
|
164
|
-
"
|
|
166
|
+
"resume_invocation"
|
|
165
167
|
],
|
|
166
|
-
"id": "nx-
|
|
167
|
-
"body_hash": "sha256:
|
|
168
|
+
"id": "nx-plan",
|
|
169
|
+
"body_hash": "sha256:85b858089bd3dc276be61baa3f5265bc107a85470f169983e710fecb404bb4b1"
|
|
168
170
|
},
|
|
169
171
|
{
|
|
170
172
|
"name": "nx-sync",
|
|
@@ -177,17 +179,15 @@
|
|
|
177
179
|
"body_hash": "sha256:a7b0ae8f13ebcd10e52361d0ada1570ff0c47933f731deec07e95539c63e6946"
|
|
178
180
|
},
|
|
179
181
|
{
|
|
180
|
-
"name": "nx-
|
|
181
|
-
"description": "
|
|
182
|
-
"summary": "
|
|
183
|
-
"
|
|
184
|
-
"plan"
|
|
185
|
-
],
|
|
182
|
+
"name": "nx-init",
|
|
183
|
+
"description": "Project onboarding — scan, mission, essentials, context generation",
|
|
184
|
+
"summary": "Project onboarding — scan, mission, essentials, context generation",
|
|
185
|
+
"manual_only": true,
|
|
186
186
|
"harness_docs_refs": [
|
|
187
|
-
"
|
|
187
|
+
"instruction_file"
|
|
188
188
|
],
|
|
189
|
-
"id": "nx-
|
|
190
|
-
"body_hash": "sha256:
|
|
189
|
+
"id": "nx-init",
|
|
190
|
+
"body_hash": "sha256:3c8230ecc0f87c541ec0ff80492a28f28bf173d0b9781901adadfae69a54b8ed"
|
|
191
191
|
}
|
|
192
192
|
],
|
|
193
193
|
"vocabulary": {
|