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.
- package/README.md +17 -9
- package/dist/cli/dashboard.js +13 -6
- package/dist/cli/evidence.js +42 -0
- package/dist/cli/handoff.js +13 -0
- package/dist/cli/init.js +20 -2
- package/dist/cli/main.js +3 -0
- package/dist/cli/package-smoke.js +33 -1
- package/dist/cli/release-closeout.js +22 -0
- package/dist/context/context-pack.js +91 -7
- package/dist/context/session-start.js +39 -0
- package/dist/core/schema.js +8 -0
- package/dist/handoff/handoff-stale-problems.js +150 -0
- package/dist/schemas/context-pack.schema.json +23 -0
- package/dist/schemas/evidence-summary.schema.json +73 -0
- package/dist/schemas/handoff-stale-problems.schema.json +64 -0
- package/dist/schemas/package-recycle.schema.json +150 -0
- package/dist/schemas/release-closeout.schema.json +39 -0
- package/dist/schemas/schema-index.json +28 -0
- package/dist/schemas/session-start.schema.json +30 -0
- package/dist/schemas/smoke-evidence-summary.schema.json +1 -1
- package/dist/services/capability-registry.js +115 -0
- package/dist/services/dashboard-bootstrap.js +3 -3
- package/dist/services/evidence-summary.js +66 -0
- package/dist/services/package-recycle.js +709 -0
- package/dist/services/release-closeout.js +136 -0
- package/dist/task/task-finalize.js +36 -5
- package/dist/task/task-lifecycle.js +6 -6
- package/package.json +1 -1
|
@@ -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
|
|
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
|
+
}
|