hadara 0.3.3 → 0.3.4-rc.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.
@@ -597,6 +597,29 @@ exports.HADARA_COMMAND_REGISTRY = [
597
597
  related: ['evidence.add-command', 'evidence.lint'],
598
598
  conflictsWith: []
599
599
  },
600
+ {
601
+ id: 'evidence.summary',
602
+ command: 'hadara evidence summary --task <task-id> [--limit <n>] [--include-private] [--json]',
603
+ summary: 'Show compact evidence ids, latest evidence, and latest close evidence for copy/paste into docs and resolution markers.',
604
+ canonical: true,
605
+ appearsInDefaultHelp: false,
606
+ family: 'capsule-lifecycle',
607
+ scope: 'evidence',
608
+ lifecycleStage: 'evidence',
609
+ requiredness: 'conditional',
610
+ writeBoundary: 'read-only',
611
+ readOnly: true,
612
+ risk: 'low',
613
+ actor: 'agent-worker',
614
+ status: 'stable',
615
+ schemaVersion: 'hadara.evidence.summary.v1',
616
+ docs: ['docs/IMPLEMENTATION_SOP.md', 'docs/specs/0.3.4/agent-ux/00_Agent_UX_Hardening_Spec.md'],
617
+ implementationFiles: ['src/cli/evidence.ts', 'src/services/evidence-summary.ts'],
618
+ testFiles: ['tests/unit/evidence-summary.test.ts', 'tests/unit/evidence-json.test.ts'],
619
+ examples: [example('Copy latest close evidence id', 'hadara evidence summary --task T-0001 --json', 'After finalize or close evidence append.')],
620
+ related: ['evidence.list', 'evidence.add-command', 'task.finalize'],
621
+ conflictsWith: []
622
+ },
600
623
  {
601
624
  id: 'evidence.lint',
602
625
  command: 'hadara evidence lint --task <task-id> [--json]',
@@ -1253,6 +1276,27 @@ exports.HADARA_COMMAND_REGISTRY = [
1253
1276
  related: ['handoff.update'],
1254
1277
  conflictsWith: []
1255
1278
  }),
1279
+ commandEntry({
1280
+ id: 'handoff.stale-problems',
1281
+ command: 'hadara handoff stale-problems [--json]',
1282
+ summary: 'Report advisory stale candidates in `docs/AGENT_HANDOFF.md` Current Known Problems.',
1283
+ canonical: true,
1284
+ appearsInDefaultHelp: false,
1285
+ family: 'capsule-lifecycle',
1286
+ scope: 'docs',
1287
+ lifecycleStage: 'handoff',
1288
+ requiredness: 'conditional',
1289
+ writeBoundary: 'read-only',
1290
+ readOnly: true,
1291
+ risk: 'low',
1292
+ actor: 'agent-worker',
1293
+ status: 'stable',
1294
+ schemaVersion: 'hadara.handoff.staleProblems.v1',
1295
+ docs: ['docs/AGENT_HANDOFF.md'],
1296
+ examples: [example('Find stale known problems', 'hadara handoff stale-problems --json', 'When reviewing whether handoff known-problem rows were resolved by later tasks or releases.')],
1297
+ related: ['handoff.suggest', 'handoff.update', 'task.audit-close'],
1298
+ conflictsWith: []
1299
+ }),
1256
1300
  commandEntry({
1257
1301
  id: 'write.preflight',
1258
1302
  command: 'hadara write preflight <command...> [--json]',
@@ -1641,6 +1685,56 @@ exports.HADARA_COMMAND_REGISTRY = [
1641
1685
  }
1642
1686
  ]
1643
1687
  }),
1688
+ commandEntry({
1689
+ id: 'package.recycle',
1690
+ command: 'hadara package recycle [--execute] [--package <specifier>] [--expected-version <version>] [--json]',
1691
+ summary: 'Preview or execute installed-package recycle validation from the package registry.',
1692
+ canonical: true,
1693
+ appearsInDefaultHelp: false,
1694
+ family: 'release-package',
1695
+ scope: 'package',
1696
+ lifecycleStage: 'ready',
1697
+ requiredness: 'release-only',
1698
+ writeBoundary: 'external-subprocess',
1699
+ readOnly: false,
1700
+ risk: 'medium',
1701
+ actor: 'release-operator',
1702
+ status: 'stable',
1703
+ schemaVersion: 'hadara.packageRecycle.v1',
1704
+ implementationFiles: ['src/cli/package-smoke.ts', 'src/services/package-recycle.ts'],
1705
+ testFiles: ['tests/unit/package-recycle.test.ts'],
1706
+ docs: ['docs/RELEASE_READINESS.md', 'docs/CLI_JSON_CONTRACT.md'],
1707
+ examples: [
1708
+ example('Preview installed-package recycle', 'hadara package recycle --package hadara@latest --expected-version 0.3.3 --json', 'Before running registry-backed consumer install validation.'),
1709
+ example('Execute installed-package recycle', 'hadara package recycle --execute --package hadara@latest --expected-version 0.3.3 --task T-XXXX --attach-evidence --json', 'After an npm publish when verifying consumer install paths.')
1710
+ ],
1711
+ related: ['package.smoke', 'release.closeout', 'release.publish'],
1712
+ conflictsWith: [],
1713
+ capabilitySurfaces: [
1714
+ {
1715
+ name: 'hadara package recycle --json',
1716
+ category: 'read',
1717
+ stable: true,
1718
+ readOnly: true,
1719
+ enabledByDefault: true,
1720
+ availability: 'default',
1721
+ risk: 'low',
1722
+ schemaVersion: 'hadara.packageRecycle.v1',
1723
+ notes: 'Read-only installed-package recycle dry-run planner.'
1724
+ },
1725
+ {
1726
+ name: 'hadara package recycle --execute --json',
1727
+ category: 'execute',
1728
+ stable: true,
1729
+ readOnly: false,
1730
+ enabledByDefault: true,
1731
+ availability: 'default',
1732
+ risk: 'medium',
1733
+ schemaVersion: 'hadara.packageRecycle.v1',
1734
+ notes: 'Explicit npm registry and isolated-prefix consumer package validation.'
1735
+ }
1736
+ ]
1737
+ }),
1644
1738
  commandEntry({
1645
1739
  id: 'release.dry-run',
1646
1740
  command: 'hadara release dry-run [--json]',
@@ -1664,6 +1758,27 @@ exports.HADARA_COMMAND_REGISTRY = [
1664
1758
  related: ['release.gate', 'release.publish', 'release.artifact'],
1665
1759
  conflictsWith: []
1666
1760
  }),
1761
+ commandEntry({
1762
+ id: 'release.closeout',
1763
+ command: 'hadara release closeout --version <version> --task <task-id> [--json]',
1764
+ summary: 'Plan release closeout document updates without writing files.',
1765
+ canonical: true,
1766
+ appearsInDefaultHelp: false,
1767
+ family: 'release-package',
1768
+ scope: 'release',
1769
+ lifecycleStage: 'ready',
1770
+ requiredness: 'release-only',
1771
+ writeBoundary: 'read-only',
1772
+ readOnly: true,
1773
+ risk: 'low',
1774
+ actor: 'release-operator',
1775
+ status: 'stable',
1776
+ schemaVersion: 'hadara.releaseCloseout.v1',
1777
+ docs: ['docs/RELEASE_READINESS.md', 'docs/RELEASE_NOTES.md', 'docs/PROJECT_STATE.md', 'docs/AGENT_HANDOFF.md'],
1778
+ examples: [example('Plan release closeout', 'hadara release closeout --version 0.3.4 --task T-0418 --json', 'After publish/recycle work when aligning release state docs.')],
1779
+ related: ['release.dry-run', 'release.publish', 'release.gate'],
1780
+ conflictsWith: []
1781
+ }),
1667
1782
  commandEntry({
1668
1783
  id: 'release.publish',
1669
1784
  command: 'hadara release publish [--mode dry-run|execute] [--json]',
@@ -9,7 +9,7 @@ const task_read_model_1 = require("./task-read-model");
9
9
  const task_workbench_1 = require("./task-workbench");
10
10
  function createDashboardBootstrapReport(projectRoot, input = {}, now = new Date()) {
11
11
  const generatedAt = now.toISOString();
12
- const core = input.tier === 'core';
12
+ const core = input.tier !== 'full';
13
13
  const status = (0, operations_status_service_1.createOpsStatusReport)(projectRoot, { includeDebt: !core });
14
14
  const tasks = (0, task_read_model_1.createTaskListReport)(projectRoot);
15
15
  // Reuse the already-computed status/tasks so the timeline does not re-run the
@@ -34,8 +34,8 @@ function createDashboardBootstrapReport(projectRoot, input = {}, now = new Date(
34
34
  project: (0, dashboard_cache_1.createDashboardProjectReference)(projectRoot)
35
35
  },
36
36
  cache: (0, dashboard_cache_1.disabledDashboardCacheMetadata)(selectedTaskId
37
- ? (0, dashboard_cache_1.createDashboardCacheKey)(projectRoot, 'bootstrap', 'selected', selectedTaskId)
38
- : (0, dashboard_cache_1.createDashboardCacheKey)(projectRoot, 'bootstrap'), generatedAt),
37
+ ? (0, dashboard_cache_1.createDashboardCacheKey)(projectRoot, 'bootstrap', core ? 'core' : 'full', 'selected', selectedTaskId)
38
+ : (0, dashboard_cache_1.createDashboardCacheKey)(projectRoot, 'bootstrap', core ? 'core' : 'full'), generatedAt),
39
39
  tier: core ? 'core' : 'full',
40
40
  status,
41
41
  taskSummary: {
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEvidenceSummaryReport = createEvidenceSummaryReport;
4
+ const evidence_list_1 = require("./evidence-list");
5
+ function createEvidenceSummaryReport(projectRoot, input) {
6
+ const list = (0, evidence_list_1.createEvidenceListReport)(projectRoot, {
7
+ taskId: input.taskId,
8
+ limit: input.limit,
9
+ includePrivate: input.includePrivate
10
+ });
11
+ const records = list.records.map(toSummaryRecord);
12
+ const latest = latestByTime(records);
13
+ const latestCloseEvidence = latestByTime(records.filter(isCloseEvidence));
14
+ const durableIds = records.filter((record) => record.idStability === 'durable').map((record) => record.id);
15
+ return {
16
+ schemaVersion: 'hadara.evidence.summary.v1',
17
+ command: 'evidence.summary',
18
+ ok: list.ok,
19
+ readOnly: true,
20
+ taskId: input.taskId,
21
+ summary: {
22
+ count: records.length,
23
+ durableCount: durableIds.length,
24
+ unstableCount: records.length - durableIds.length,
25
+ privateIncluded: input.includePrivate === true,
26
+ latestId: latest?.id ?? null,
27
+ latestCloseEvidenceId: latestCloseEvidence?.id ?? null
28
+ },
29
+ records,
30
+ latest,
31
+ latestCloseEvidence,
32
+ copyHints: {
33
+ latestId: latest?.id ?? null,
34
+ latestCloseEvidenceId: latestCloseEvidence?.id ?? null,
35
+ durableIds
36
+ },
37
+ issues: list.issues
38
+ };
39
+ }
40
+ function toSummaryRecord(record) {
41
+ return {
42
+ id: record.id,
43
+ time: record.time,
44
+ category: record.category,
45
+ outcome: record.outcome,
46
+ visibility: record.visibility,
47
+ summary: record.summary,
48
+ tags: record.tags,
49
+ sourceLine: record.sourceLine,
50
+ idSource: record.idSource,
51
+ idStability: record.idStability,
52
+ persistedSchemaVersion: record.persistedSchemaVersion
53
+ };
54
+ }
55
+ function latestByTime(records) {
56
+ if (records.length === 0)
57
+ return null;
58
+ return records.reduce((latest, record) => (record.time >= latest.time ? record : latest), records[0]);
59
+ }
60
+ function isCloseEvidence(record) {
61
+ if (record.tags.includes('close-proof'))
62
+ return true;
63
+ if (record.category === 'audit' && /close/i.test(record.summary))
64
+ return true;
65
+ return false;
66
+ }