hadara 0.2.0-rc.0 → 0.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +9 -8
  2. package/dist/agent/evidence.js +0 -0
  3. package/dist/agent/loop.js +0 -0
  4. package/dist/cli/actor.js +0 -0
  5. package/dist/cli/args.js +0 -0
  6. package/dist/cli/dashboard.js +0 -0
  7. package/dist/cli/debt.js +0 -0
  8. package/dist/cli/dev.js +0 -0
  9. package/dist/cli/doctor.js +2 -2
  10. package/dist/cli/errors.js +0 -0
  11. package/dist/cli/evidence-json.js +0 -0
  12. package/dist/cli/evidence.js +0 -0
  13. package/dist/cli/handoff.js +7 -2
  14. package/dist/cli/harness.js +0 -0
  15. package/dist/cli/hermes-json.js +0 -0
  16. package/dist/cli/hermes.js +0 -0
  17. package/dist/cli/init.js +30 -5
  18. package/dist/cli/install.js +0 -0
  19. package/dist/cli/main.js +2 -2
  20. package/dist/cli/mcp.js +0 -0
  21. package/dist/cli/package-smoke.js +0 -0
  22. package/dist/cli/policy-json.js +0 -0
  23. package/dist/cli/policy.js +0 -0
  24. package/dist/cli/protocol.js +0 -0
  25. package/dist/cli/release-artifact.js +0 -0
  26. package/dist/cli/release-dry-run.js +0 -0
  27. package/dist/cli/release-gate.js +0 -0
  28. package/dist/cli/release-publish.js +0 -0
  29. package/dist/cli/run-scaffold.js +1 -1
  30. package/dist/cli/run-state.js +0 -0
  31. package/dist/cli/run.js +0 -0
  32. package/dist/cli/smoke.js +0 -0
  33. package/dist/cli/status-json.js +0 -0
  34. package/dist/cli/status.js +0 -0
  35. package/dist/cli/task-json.js +0 -0
  36. package/dist/cli/task.js +0 -0
  37. package/dist/cli/tools.js +0 -0
  38. package/dist/cli/tui.js +0 -0
  39. package/dist/cli/version.js +0 -0
  40. package/dist/cli/write-preflight.js +0 -0
  41. package/dist/core/actor-context.js +0 -0
  42. package/dist/core/audit.js +0 -0
  43. package/dist/core/events.js +0 -0
  44. package/dist/core/fs.js +0 -0
  45. package/dist/core/next-action.js +0 -0
  46. package/dist/core/paths.js +0 -0
  47. package/dist/core/plan-context.js +0 -0
  48. package/dist/core/redaction.js +0 -0
  49. package/dist/core/schema.js +0 -0
  50. package/dist/core/workspace.js +0 -0
  51. package/dist/dev/docker-check.js +5 -3
  52. package/dist/evidence/evidence.js +0 -0
  53. package/dist/evidence/normalizer.js +0 -0
  54. package/dist/evidence/private-manifest.js +0 -0
  55. package/dist/evidence/semantics.js +0 -0
  56. package/dist/handoff/handoff-suggestion.js +2 -2
  57. package/dist/handoff/handoff.js +15 -1
  58. package/dist/harness/replay.js +0 -0
  59. package/dist/harness/validate.js +0 -0
  60. package/dist/hermes/context-export.js +0 -0
  61. package/dist/index.js +0 -0
  62. package/dist/mcp/server.js +0 -0
  63. package/dist/mcp/tool-dispatch.js +0 -0
  64. package/dist/mcp/tool-registry.js +0 -0
  65. package/dist/mcp/tool-schemas.js +0 -0
  66. package/dist/policy/command-risk.js +0 -0
  67. package/dist/policy/permission-matrix.js +0 -0
  68. package/dist/policy/policy.js +0 -0
  69. package/dist/policy/preflight.js +0 -0
  70. package/dist/policy/presets.js +0 -0
  71. package/dist/policy/tokenizer.js +0 -0
  72. package/dist/providers/fallback-executor.js +0 -0
  73. package/dist/providers/mock-provider.js +0 -0
  74. package/dist/providers/provider-contract.js +0 -0
  75. package/dist/providers/provider-preparation.js +0 -0
  76. package/dist/providers/scripted-provider.js +0 -0
  77. package/dist/schemas/active-run-projection.schema.json +0 -0
  78. package/dist/schemas/active-run-resume.schema.json +0 -0
  79. package/dist/schemas/actor-context.schema.json +0 -0
  80. package/dist/schemas/clean-checkout-smoke.schema.json +0 -0
  81. package/dist/schemas/context-export.schema.json +0 -0
  82. package/dist/schemas/dashboard-bootstrap.schema.json +0 -0
  83. package/dist/schemas/dashboard-core.schema.json +0 -0
  84. package/dist/schemas/dashboard-task-detail.schema.json +0 -0
  85. package/dist/schemas/dashboard-timeline.schema.json +0 -0
  86. package/dist/schemas/dev-docker-check.schema.json +15 -1
  87. package/dist/schemas/event.schema.json +0 -0
  88. package/dist/schemas/evidence-lint.schema.json +0 -0
  89. package/dist/schemas/evidence-list.schema.json +0 -0
  90. package/dist/schemas/evidence-migration-preview.schema.json +0 -0
  91. package/dist/schemas/feature-smoke.schema.json +0 -0
  92. package/dist/schemas/handoff-suggestion.schema.json +0 -0
  93. package/dist/schemas/install-plan.schema.json +0 -0
  94. package/dist/schemas/next-action.schema.json +0 -0
  95. package/dist/schemas/package-smoke.schema.json +0 -0
  96. package/dist/schemas/plan-context.schema.json +0 -0
  97. package/dist/schemas/private-evidence.schema.json +0 -0
  98. package/dist/schemas/protocol-consistency.schema.json +0 -0
  99. package/dist/schemas/protocol-remediation.schema.json +0 -0
  100. package/dist/schemas/provider-call.schema.json +0 -0
  101. package/dist/schemas/provider-config.schema.json +0 -0
  102. package/dist/schemas/release-artifact-manifest.schema.json +0 -0
  103. package/dist/schemas/release-artifact.schema.json +0 -0
  104. package/dist/schemas/release-dry-run.schema.json +0 -0
  105. package/dist/schemas/release-gate.schema.json +0 -0
  106. package/dist/schemas/release-publish.schema.json +0 -0
  107. package/dist/schemas/runtime-version.schema.json +0 -0
  108. package/dist/schemas/schema-index.json +0 -0
  109. package/dist/schemas/smoke-evidence-summary.schema.json +0 -0
  110. package/dist/schemas/task-audit-close.schema.json +0 -0
  111. package/dist/schemas/task-close.schema.json +0 -0
  112. package/dist/schemas/task-complete-flow.schema.json +0 -0
  113. package/dist/schemas/task-create.schema.json +0 -0
  114. package/dist/schemas/task-finish.schema.json +0 -0
  115. package/dist/schemas/task-next.schema.json +0 -0
  116. package/dist/schemas/task-ready.schema.json +0 -0
  117. package/dist/schemas/task-upgrade-scaffold.schema.json +0 -0
  118. package/dist/schemas/task-workbench.schema.json +12 -0
  119. package/dist/schemas/tools-list.schema.json +0 -0
  120. package/dist/schemas/write-preflight.schema.json +0 -0
  121. package/dist/services/active-run-state.js +0 -0
  122. package/dist/services/capability-registry.js +0 -0
  123. package/dist/services/clean-checkout-smoke.js +0 -0
  124. package/dist/services/dashboard-bootstrap.js +0 -0
  125. package/dist/services/dashboard-cache.js +0 -0
  126. package/dist/services/dashboard-core.js +0 -0
  127. package/dist/services/dashboard-heavy-projection.js +0 -0
  128. package/dist/services/dashboard-projection-store.js +0 -0
  129. package/dist/services/dashboard-refresh.js +0 -0
  130. package/dist/services/dashboard-task-detail.js +2 -0
  131. package/dist/services/dashboard-task-projection.js +0 -0
  132. package/dist/services/dashboard-timeline.js +0 -0
  133. package/dist/services/evidence-lint.js +1 -1
  134. package/dist/services/evidence-list.js +1 -1
  135. package/dist/services/evidence-migration.js +0 -0
  136. package/dist/services/feature-smoke.js +0 -0
  137. package/dist/services/handoff-summary-parser.js +0 -0
  138. package/dist/services/harness-service.js +0 -0
  139. package/dist/services/install-plan.js +0 -0
  140. package/dist/services/markdown-table.js +0 -0
  141. package/dist/services/operational-debt.js +0 -0
  142. package/dist/services/operations-status-service.js +5 -1
  143. package/dist/services/package-smoke.js +0 -0
  144. package/dist/services/policy-service.js +0 -0
  145. package/dist/services/project-read-model.js +0 -0
  146. package/dist/services/protocol-consistency.js +0 -0
  147. package/dist/services/protocol-profile.js +0 -0
  148. package/dist/services/protocol-remediation.js +0 -0
  149. package/dist/services/release-artifact-evidence.js +0 -0
  150. package/dist/services/release-artifact.js +0 -0
  151. package/dist/services/release-diagnostics.js +0 -0
  152. package/dist/services/release-dry-run.js +0 -0
  153. package/dist/services/release-evidence-validation.js +0 -0
  154. package/dist/services/release-evidence.js +0 -0
  155. package/dist/services/release-provider-advisories.js +0 -0
  156. package/dist/services/release-publish.js +0 -0
  157. package/dist/services/release-readiness-summary.js +0 -0
  158. package/dist/services/release-target-configuration.js +0 -0
  159. package/dist/services/release-targets.js +0 -0
  160. package/dist/services/runtime-version.js +0 -0
  161. package/dist/services/smoke-evidence.js +0 -0
  162. package/dist/services/task-read-model.js +2 -2
  163. package/dist/services/task-workbench.js +39 -0
  164. package/dist/services/tools-list.js +0 -0
  165. package/dist/services/workbench-next-actions.js +0 -0
  166. package/dist/services/write-preflight.js +0 -0
  167. package/dist/task/lifecycle-next-actions.js +0 -0
  168. package/dist/task/task-capsule.js +29 -0
  169. package/dist/task/task-close.js +0 -0
  170. package/dist/task/task-complete-flow.js +0 -0
  171. package/dist/task/task-create.js +0 -0
  172. package/dist/task/task-finish.js +1 -1
  173. package/dist/task/task-next.js +0 -0
  174. package/dist/task/task-ready.js +0 -0
  175. package/dist/task/task-templates.js +0 -0
  176. package/dist/task/task-upgrade-scaffold.js +0 -0
  177. package/dist/tools/fake-shell.js +0 -0
  178. package/dist/tui/cache.js +0 -0
  179. package/dist/tui/constants.js +0 -0
  180. package/dist/tui/layout.js +0 -0
  181. package/dist/tui/markdown.js +0 -0
  182. package/dist/tui/read-model-worker.js +0 -0
  183. package/dist/tui/read-model.js +4 -1
  184. package/dist/tui/snapshot.js +0 -0
  185. package/dist/tui/state.js +0 -0
  186. package/dist/tui/terminal.js +0 -0
  187. package/dist/tui/theme.js +0 -0
  188. package/package.json +1 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
- <img alt="Release candidate" src="https://img.shields.io/badge/release-0.2.0--rc.0-blue">
8
+ <img alt="Release candidate" src="https://img.shields.io/badge/release-0.2.0--rc.1-blue">
9
9
  <img alt="Node.js" src="https://img.shields.io/badge/node-%3E%3D22-brightgreen">
10
10
  <img alt="License" src="https://img.shields.io/badge/license-MIT-lightgrey">
11
11
  </p>
@@ -23,10 +23,10 @@ This repository is both the HADARA source checkout and the HADARA protocol works
23
23
  The current source checkout targets:
24
24
 
25
25
  ```text
26
- hadara@0.2.0-rc.0
26
+ hadara@0.2.0-rc.1
27
27
  ```
28
28
 
29
- T-0268 refreshed package smoke, clean-checkout smoke, release artifact, release dry-run, and publish dry-run evidence for `0.2.0-rc.0`. T-0269 is the approval-gated publish capsule for this RC.
29
+ T-0275 refreshes package smoke, clean-checkout smoke, release artifact, release dry-run, and publish dry-run evidence for `0.2.0-rc.1`. T-0269 prepared the previous `0.2.0-rc.0` publish path, but rc.1 supersedes it after the installed-package recycle fixes.
30
30
 
31
31
  Current publish boundaries:
32
32
 
@@ -34,7 +34,8 @@ Current publish boundaries:
34
34
  |---|---|
35
35
  | npm package | Primary release target. |
36
36
  | `hadara@0.1.0-rc.0` | Published first RC. |
37
- | `hadara@0.2.0-rc.0` | Current source and publish-candidate version. |
37
+ | `hadara@0.2.0-rc.0` | Superseded internal publish candidate after recycle findings. |
38
+ | `hadara@0.2.0-rc.1` | Current source and publish-candidate version. |
38
39
  | GitHub Release | Secondary target, still approval-gated. |
39
40
  | Docker image | Deferred. |
40
41
  | PyPI/Python package | Advisory preview only. |
@@ -49,7 +50,7 @@ Requires Node.js 22.
49
50
  Install the current RC:
50
51
 
51
52
  ```bash
52
- npm install -g hadara@0.2.0-rc.0
53
+ npm install -g hadara@0.2.0-rc.1
53
54
  hadara doctor --json
54
55
  hadara task list --json
55
56
  hadara tools list --json
@@ -58,11 +59,11 @@ hadara tools list --json
58
59
  Run without a global install:
59
60
 
60
61
  ```bash
61
- npx hadara@0.2.0-rc.0 doctor --json
62
- npx hadara@0.2.0-rc.0 tools list --json
62
+ npx hadara@0.2.0-rc.1 doctor --json
63
+ npx hadara@0.2.0-rc.1 tools list --json
63
64
  ```
64
65
 
65
- Previous RC: `hadara@0.1.0-rc.0` remains available on npm for comparison or rollback, but new installs should use the current RC once it is published.
66
+ Previous published RC: `hadara@0.1.0-rc.0` remains available on npm for comparison or rollback, but new installs should use the current RC once it is published.
66
67
 
67
68
  ## What HADARA Gives You
68
69
 
File without changes
File without changes
package/dist/cli/actor.js CHANGED
File without changes
package/dist/cli/args.js CHANGED
File without changes
File without changes
package/dist/cli/debt.js CHANGED
File without changes
package/dist/cli/dev.js CHANGED
File without changes
@@ -11,7 +11,7 @@ function createDoctorReport(paths, nodeVersion = process.version) {
11
11
  const checks = [
12
12
  pathCheck('docs', paths.projectDocsDir),
13
13
  pathCheck('tasks', paths.projectTasksDir),
14
- pathCheck('project-context', paths.projectHadaraDir)
14
+ pathCheck('project-context', `${paths.projectContextDir}/HADARA_CONTEXT.md`)
15
15
  ];
16
16
  return {
17
17
  schemaVersion: 'hadara.doctor.v1',
@@ -63,6 +63,6 @@ function formatCheckLabel(id) {
63
63
  if (id === 'tasks')
64
64
  return 'tasks/: ';
65
65
  if (id === 'project-context')
66
- return '.hadara/: ';
66
+ return '.hadara/context/HADARA_CONTEXT.md: ';
67
67
  return `${id}: `;
68
68
  }
File without changes
File without changes
File without changes
@@ -27,7 +27,12 @@ function handleHandoffCommand(input) {
27
27
  const taskId = (0, args_1.getStringOption)(input.args, '--task');
28
28
  const summary = (0, args_1.getStringOption)(input.args, '--summary');
29
29
  const nextStep = (0, args_1.getStringOption)(input.args, '--next');
30
- const filePath = (0, handoff_1.updateHandoff)({ projectRoot: input.projectRoot, taskId, summary, nextStep });
31
- console.log(`[HADARA] Handoff updated: ${filePath}`);
30
+ const report = (0, handoff_1.updateHandoff)({ projectRoot: input.projectRoot, taskId, summary, nextStep });
31
+ if (input.jsonOutput) {
32
+ console.log(JSON.stringify(report, null, 2));
33
+ }
34
+ else {
35
+ console.log(`[HADARA] Handoff updated: ${report.target.path}`);
36
+ }
32
37
  return true;
33
38
  }
File without changes
File without changes
File without changes
package/dist/cli/init.js CHANGED
@@ -58,17 +58,37 @@ const INIT_PROFILE_SPECS = {
58
58
  }
59
59
  }
60
60
  };
61
- function initProject(projectRoot, profile = 'standard') {
61
+ function initProject(projectRoot, profile = 'standard', options = {}) {
62
62
  const normalizedProfile = parseInitProfile(profile);
63
63
  const spec = INIT_PROFILE_SPECS[normalizedProfile];
64
64
  const paths = (0, paths_1.resolveHadaraPaths)({ projectRoot });
65
65
  (0, fs_1.ensureDir)(paths.projectDocsDir);
66
66
  (0, fs_1.ensureDir)(paths.projectTasksDir);
67
+ const actions = [];
67
68
  for (const file of createGeneratedScaffoldFiles(normalizedProfile)) {
69
+ const absolutePath = node_path_1.default.join(projectRoot, file.path);
70
+ const existed = node_fs_1.default.existsSync(absolutePath);
68
71
  (0, fs_1.writeFileIfMissing)(node_path_1.default.join(projectRoot, file.path), file.content);
72
+ actions.push({
73
+ action: 'init-doc',
74
+ path: file.path,
75
+ status: existed ? 'exists' : 'created',
76
+ summary: existed ? `${file.path} already existed and was not overwritten.` : `${file.path} was created.`
77
+ });
78
+ }
79
+ const report = {
80
+ schemaVersion: 'hadara.init.v1',
81
+ command: 'init',
82
+ ok: true,
83
+ profile: normalizedProfile,
84
+ actions,
85
+ issues: []
86
+ };
87
+ if (!options.silent) {
88
+ console.log(`[HADARA] Initialized project: ${projectRoot}`);
89
+ console.log(`[HADARA] Init profile: ${normalizedProfile}`);
69
90
  }
70
- console.log(`[HADARA] Initialized project: ${projectRoot}`);
71
- console.log(`[HADARA] Init profile: ${normalizedProfile}`);
91
+ return report;
72
92
  }
73
93
  function parseInitProfile(value) {
74
94
  if (value === 'basic' || value === 'standard' || value === 'governed')
@@ -106,7 +126,9 @@ function handleInitCommand(input) {
106
126
  printInitFollowUpReport(report, input.jsonOutput);
107
127
  return true;
108
128
  }
109
- initProject(input.projectRoot, (0, args_1.getStringOption)(input.args, '--profile', 'standard') ?? 'standard');
129
+ const report = initProject(input.projectRoot, (0, args_1.getStringOption)(input.args, '--profile', 'standard') ?? 'standard', { silent: input.jsonOutput });
130
+ if (input.jsonOutput)
131
+ console.log(JSON.stringify(report, null, 2));
110
132
  return true;
111
133
  }
112
134
  function getInitFollowUpMode(args) {
@@ -160,7 +182,7 @@ function createInitDoctorReport(projectRoot) {
160
182
  issues.push({ severity: 'warning', code: 'INIT_BROAD_DATA_IGNORE', path: '.gitignore', message: 'Top-level data/ is ignored; generated init should only ignore HADARA local/private state.' });
161
183
  }
162
184
  const sop = readProjectText(projectRoot, 'docs/IMPLEMENTATION_SOP.md');
163
- if (sop !== null && /minimal|full|hadara-protocol/.test(sop)) {
185
+ if (sop !== null && mentionsLegacyInitProfile(sop)) {
164
186
  issues.push({ severity: 'warning', code: 'INIT_OLD_PROFILE_NAME', path: 'docs/IMPLEMENTATION_SOP.md', message: 'SOP mentions old init profile names.' });
165
187
  }
166
188
  issues.push(...detectProfileMetadataMismatches(projectRoot));
@@ -185,6 +207,9 @@ function createInitDoctorReport(projectRoot) {
185
207
  issues
186
208
  };
187
209
  }
210
+ function mentionsLegacyInitProfile(content) {
211
+ return /(?:initialized with|profile(?:\s+name)?|init profile)\s+(?:the\s+)?`?(minimal|full|hadara-protocol)`?/i.test(content);
212
+ }
188
213
  function createInitUpgradeReport(projectRoot, profile, mode) {
189
214
  const actions = [];
190
215
  const issues = [];
File without changes
package/dist/cli/main.js CHANGED
@@ -41,7 +41,7 @@ function printHelp() {
41
41
  console.log(`HADARA bootstrap CLI
42
42
 
43
43
  Usage:
44
- hadara init [--project <path>] [--profile basic|standard|governed]
44
+ hadara init [--project <path>] [--profile basic|standard|governed] [--json]
45
45
  hadara init doctor [--json]
46
46
  hadara init upgrade --profile basic|standard|governed [--execute] [--json]
47
47
  hadara init register-doc --path <path> --when <text> --purpose <text> [--require-exists] [--execute] [--json]
@@ -73,7 +73,7 @@ Usage:
73
73
  hadara protocol doctor --scope docs|profile|all [--json]
74
74
  hadara protocol remediate --fix task-board-row|decisions-table-frame|project-state-profile|evidence-jsonl [--task <task-id>] [--profile basic|standard|governed] [--execute --before-hash <hash>] [--json]
75
75
  hadara tools list [--json]
76
- hadara handoff update --task <task-id> [--summary <text>] [--next <text>]
76
+ hadara handoff update --task <task-id> [--summary <text>] [--next <text>] [--json]
77
77
  hadara handoff suggest --task <task-id> [--json]
78
78
  hadara write preflight <command...> [--json]
79
79
  hadara policy check-shell <command> [--mode readonly|assisted|trusted|auto|release]
package/dist/cli/mcp.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -21,7 +21,7 @@ function scaffoldRunScenario(projectRoot, input) {
21
21
  finishReason: 'tool_call'
22
22
  },
23
23
  {
24
- match: input.stdout,
24
+ match: '"status":"completed"',
25
25
  response: `Scaffolded fake-shell command completed: ${input.command}`
26
26
  }
27
27
  ];
File without changes
package/dist/cli/run.js CHANGED
File without changes
package/dist/cli/smoke.js CHANGED
File without changes
File without changes
File without changes
File without changes
package/dist/cli/task.js CHANGED
File without changes
package/dist/cli/tools.js CHANGED
File without changes
package/dist/cli/tui.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/core/fs.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -60,8 +60,10 @@ function createDevDockerCheckReport(projectRoot, options = {}, runner = defaultR
60
60
  issues.push({
61
61
  severity: 'error',
62
62
  code: 'DEV_DOCKER_CHECK_STEP_FAILED',
63
- message: `Docker validation step failed: ${step.id}. Raw subprocess logs are intentionally omitted from the JSON report.`,
64
- stepId: step.id
63
+ message: `Docker validation step failed: ${step.id}${typeof result.exitCode === 'number' ? ` (exit code ${result.exitCode})` : ''}. Raw subprocess logs are intentionally omitted from the JSON report.`,
64
+ stepId: step.id,
65
+ ...(typeof result.exitCode === 'number' ? { exitCode: result.exitCode } : {}),
66
+ debugHint: `Rerun dev docker-check without --json, or inspect the Docker container step ${step.id}; JSON reports keep subprocess logs private.`
65
67
  });
66
68
  blocked = true;
67
69
  }
@@ -125,7 +127,7 @@ function formatDevDockerCheckReport(report) {
125
127
  for (const step of report.steps)
126
128
  lines.push(`${step.status}\t${step.id}\t${step.summary}`);
127
129
  for (const issue of report.issues)
128
- lines.push(`[${issue.severity}] ${issue.code}: ${issue.message}`);
130
+ lines.push(`[${issue.severity}] ${issue.code}: ${issue.message}${typeof issue.exitCode === 'number' ? ` exitCode=${issue.exitCode}` : ''}`);
129
131
  return lines.join('\n');
130
132
  }
131
133
  function buildSteps(focusedTests, runFullCheck, syncDistRequested, syncDistAllowed) {
File without changes
File without changes
File without changes
File without changes
@@ -73,7 +73,7 @@ function readTaskSnapshot(projectRoot, taskId, issues) {
73
73
  function createSections(task, targetBeforeHash, executeRequested) {
74
74
  const displayName = [task.taskId, task.title].filter(Boolean).join(' ');
75
75
  const evidence = task.evidenceSummary ?? 'Review task evidence and validation records.';
76
- const nextTask = executeRequested ? 'Remove --execute and review this suggestion report.' : 'Run `hadara task next --json` and create the next Phase 6 capsule.';
76
+ const nextTask = executeRequested ? 'Remove --execute and review this suggestion report.' : 'Run `hadara task next --json` and create or select the next capsule.';
77
77
  return [
78
78
  section({
79
79
  id: 'current-state',
@@ -108,7 +108,7 @@ function createSections(task, targetBeforeHash, executeRequested) {
108
108
  action: 'replace-row',
109
109
  summary: 'Point the next step at task discovery rather than applying this report automatically.',
110
110
  targetBeforeHash,
111
- suggestedReplacementMarkdown: `| Select the next task with \`hadara task next --json\`. | Continue Phase 6 in order after ${task.taskId}. | Required reading: Phase 6 spec, \`docs/CLI_JSON_CONTRACT.md\`, \`docs/TASK_WORKFLOW_COMMANDS.md\`. |`
111
+ suggestedReplacementMarkdown: `| Select the next task with \`hadara task next --json\`. | Continue project work after ${task.taskId} using the current Task Board and handoff. | Required reading: \`docs/AGENT_HANDOFF.md\`, \`docs/TASK_BOARD.md\`, and \`docs/TASK_WORKFLOW_COMMANDS.md\`. |`
112
112
  }),
113
113
  section({
114
114
  id: 'validation-baseline',
@@ -45,5 +45,19 @@ ${input.nextStep ?? 'Read PROJECT_STATE.md, TASK_BOARD.md, and the active Task C
45
45
  Attach test logs, command outputs, and diff summaries under the active Task Capsule.
46
46
  `;
47
47
  node_fs_1.default.writeFileSync(filePath, content, 'utf8');
48
- return filePath;
48
+ return {
49
+ schemaVersion: 'hadara.handoff.update.v1',
50
+ command: 'handoff.update',
51
+ ok: true,
52
+ target: {
53
+ path: 'docs/AGENT_HANDOFF.md',
54
+ writeBoundary: 'shared-doc'
55
+ },
56
+ input: {
57
+ taskId: input.taskId ?? null,
58
+ summaryProvided: typeof input.summary === 'string',
59
+ nextStepProvided: typeof input.nextStep === 'string'
60
+ },
61
+ issues: []
62
+ };
49
63
  }
File without changes
File without changes
File without changes
package/dist/index.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -111,6 +111,20 @@
111
111
  "environmentSecretsIncluded": { "const": false }
112
112
  }
113
113
  },
114
- "issues": { "type": "array", "items": { "type": "object", "additionalProperties": true } }
114
+ "issues": {
115
+ "type": "array",
116
+ "items": {
117
+ "type": "object",
118
+ "additionalProperties": true,
119
+ "properties": {
120
+ "severity": { "enum": ["error", "warning", "info"] },
121
+ "code": { "type": "string" },
122
+ "message": { "type": "string" },
123
+ "stepId": { "type": "string" },
124
+ "exitCode": { "type": "number" },
125
+ "debugHint": { "type": "string" }
126
+ }
127
+ }
128
+ }
115
129
  }
116
130
  }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -29,6 +29,7 @@
29
29
  }
30
30
  ],
31
31
  "additive": [
32
+ "state.readiness",
32
33
  "sources.*",
33
34
  "nextActions.*"
34
35
  ],
@@ -67,6 +68,17 @@
67
68
  "properties": {
68
69
  "closeState": { "enum": ["not-closed", "closed", "closed-valid", "close-evidence-found-invalid", "close-evidence-malformed"] },
69
70
  "ready": { "type": "boolean" },
71
+ "readiness": {
72
+ "type": "object",
73
+ "additionalProperties": true,
74
+ "required": ["status", "currentReady", "closeProofValid", "summary"],
75
+ "properties": {
76
+ "status": { "enum": ["ready", "current-blocked", "closed-valid-current-blocked", "missing-task"] },
77
+ "currentReady": { "type": "boolean" },
78
+ "closeProofValid": { "type": "boolean" },
79
+ "summary": { "type": "string" }
80
+ }
81
+ },
70
82
  "closeEvidenceFound": { "type": "boolean" },
71
83
  "closedValid": { "type": "boolean" },
72
84
  "closed": { "type": "boolean" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes