@open-agent-toolkit/cli 0.2.4 → 0.2.6

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 (106) hide show
  1. package/assets/docs/cli-utilities/configuration.md +40 -0
  2. package/assets/docs/cli-utilities/tool-packs.md +31 -0
  3. package/assets/docs/workflows/projects/artifacts.md +27 -0
  4. package/assets/docs/workflows/projects/implementation-execution.md +30 -5
  5. package/assets/docs/workflows/skills/explainer-kit.md +125 -0
  6. package/assets/docs/workflows/skills/index.md +4 -0
  7. package/assets/migration/pjm-restructure.md +12 -0
  8. package/assets/public-package-versions.json +4 -4
  9. package/assets/skills/explainer-kit/SKILL.md +95 -0
  10. package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
  11. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
  12. package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
  13. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
  14. package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
  15. package/assets/skills/explainer-kit/palettes/ember.json +37 -0
  16. package/assets/skills/explainer-kit/palettes/forest.json +37 -0
  17. package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
  18. package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
  19. package/assets/skills/explainer-kit/palettes/violet.json +37 -0
  20. package/assets/skills/explainer-kit/profiles/clean.json +42 -0
  21. package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
  22. package/assets/skills/explainer-kit/profiles/technical.json +39 -0
  23. package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
  24. package/assets/skills/explainer-kit/recipes/program-recap.json +34 -0
  25. package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
  26. package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
  27. package/assets/skills/explainer-kit/references/contracts.md +101 -0
  28. package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
  29. package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
  30. package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
  31. package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
  32. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
  33. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
  34. package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
  35. package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
  36. package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
  37. package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
  38. package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
  39. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
  40. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
  41. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
  42. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
  43. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
  44. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
  45. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
  46. package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
  47. package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
  48. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
  49. package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
  50. package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
  51. package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
  52. package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
  53. package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
  54. package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
  55. package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
  56. package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
  57. package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
  58. package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
  59. package/assets/skills/explainer-kit/templates/house-style.html +218 -0
  60. package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
  61. package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
  62. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
  63. package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
  64. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
  65. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
  66. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
  67. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
  68. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
  69. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
  70. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
  71. package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
  72. package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
  73. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
  74. package/assets/skills/oat-project-complete/SKILL.md +166 -28
  75. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
  76. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  77. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +84 -9
  78. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
  79. package/assets/skills/oat-project-next/SKILL.md +31 -11
  80. package/assets/skills/oat-project-plan/SKILL.md +30 -1
  81. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
  82. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
  83. package/assets/skills/oat-project-summary/SKILL.md +20 -1
  84. package/assets/templates/state.md +4 -1
  85. package/dist/commands/config/index.d.ts.map +1 -1
  86. package/dist/commands/config/index.js +232 -1
  87. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  88. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  89. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  90. package/dist/commands/project/archive/archive-utils.d.ts +12 -0
  91. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  92. package/dist/commands/project/archive/archive-utils.js +320 -8
  93. package/dist/commands/project/archive/index.d.ts.map +1 -1
  94. package/dist/commands/project/archive/index.js +1 -0
  95. package/dist/commands/project/archive/push-runner.d.ts +1 -0
  96. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  97. package/dist/commands/project/archive/push-runner.js +9 -2
  98. package/dist/config/oat-config.d.ts +26 -0
  99. package/dist/config/oat-config.d.ts.map +1 -1
  100. package/dist/config/oat-config.js +88 -0
  101. package/dist/config/resolve.d.ts.map +1 -1
  102. package/dist/config/resolve.js +18 -0
  103. package/dist/validation/project-state.d.ts +3 -0
  104. package/dist/validation/project-state.d.ts.map +1 -1
  105. package/dist/validation/project-state.js +91 -0
  106. package/package.json +2 -2
@@ -0,0 +1,180 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+
4
+ import { writeJsonAtomic } from './fs-safe.mjs';
5
+
6
+ const APPROVAL_PATH = 'source/content-approval.json';
7
+ const MODES = new Set(['interactive', 'unattended']);
8
+ const DECISIONS = new Map([
9
+ ['approve', 'approved'],
10
+ ['approved', 'approved'],
11
+ ['reject', 'rejected'],
12
+ ['rejected', 'rejected'],
13
+ ]);
14
+
15
+ export async function resolveContentApproval(run, mode, reviewedSource) {
16
+ assertRun(run);
17
+ if (!MODES.has(mode)) {
18
+ throw new Error('Content approval mode must be interactive or unattended.');
19
+ }
20
+
21
+ const previous = await readPrevious(run);
22
+ let record;
23
+ if (mode === 'unattended') {
24
+ const provenance =
25
+ reviewedSource ?? approvedSourceProvenance(run.request.factBase);
26
+ assertProvenance(provenance);
27
+ record = {
28
+ schemaVersion: 'explainer-kit.content-approval/v1',
29
+ runId: run.runId,
30
+ mode,
31
+ status: 'approved',
32
+ reviewedSource: structuredClone(provenance),
33
+ attempts: previous?.attempts ?? [],
34
+ };
35
+ } else if (reviewedSource === undefined) {
36
+ record = previous ?? {
37
+ schemaVersion: 'explainer-kit.content-approval/v1',
38
+ runId: run.runId,
39
+ mode,
40
+ status: 'pending',
41
+ attempts: [],
42
+ };
43
+ } else {
44
+ const decision = normalizeDecision(reviewedSource.decision);
45
+ const attempt = interactiveAttempt(reviewedSource, decision);
46
+ record = {
47
+ schemaVersion: 'explainer-kit.content-approval/v1',
48
+ runId: run.runId,
49
+ mode,
50
+ status: decision,
51
+ attempts: [...(previous?.attempts ?? []), attempt],
52
+ ...(decision === 'approved' && {
53
+ reviewedSource: structuredClone(
54
+ reviewedSource.source ?? {
55
+ kind: 'human-review',
56
+ locator: 'source/content',
57
+ },
58
+ ),
59
+ }),
60
+ };
61
+ if (record.reviewedSource) {
62
+ assertProvenance(record.reviewedSource);
63
+ }
64
+ }
65
+
66
+ await writeJsonAtomic(run.runRoot, APPROVAL_PATH, record);
67
+ return {
68
+ status: record.status,
69
+ canResume: record.status === 'approved',
70
+ path: APPROVAL_PATH,
71
+ record,
72
+ };
73
+ }
74
+
75
+ async function readPrevious(run) {
76
+ try {
77
+ const previous = JSON.parse(
78
+ await readFile(join(run.runRoot, APPROVAL_PATH), 'utf8'),
79
+ );
80
+ if (
81
+ previous.schemaVersion !== 'explainer-kit.content-approval/v1' ||
82
+ previous.runId !== run.runId
83
+ ) {
84
+ throw new Error('Content approval record does not belong to this run.');
85
+ }
86
+ return previous;
87
+ } catch (error) {
88
+ if (error?.code === 'ENOENT') return null;
89
+ throw error;
90
+ }
91
+ }
92
+
93
+ function interactiveAttempt(source, status) {
94
+ if (!isObject(source)) {
95
+ throw new TypeError('Interactive approval requires a review decision.');
96
+ }
97
+ if (
98
+ typeof source.reviewedAt !== 'string' ||
99
+ Number.isNaN(Date.parse(source.reviewedAt))
100
+ ) {
101
+ throw new Error('Interactive approval requires a valid reviewedAt value.');
102
+ }
103
+ if (
104
+ source.reviewer !== undefined &&
105
+ (typeof source.reviewer !== 'string' || source.reviewer.length === 0)
106
+ ) {
107
+ throw new Error(
108
+ 'Interactive approval reviewer must be a non-empty string.',
109
+ );
110
+ }
111
+ const corrections = source.corrections ?? [];
112
+ if (
113
+ !Array.isArray(corrections) ||
114
+ corrections.some(
115
+ (correction) =>
116
+ typeof correction !== 'string' || correction.trim().length === 0,
117
+ )
118
+ ) {
119
+ throw new Error('Approval corrections must be non-empty strings.');
120
+ }
121
+ if (status === 'rejected' && corrections.length === 0) {
122
+ throw new Error('Rejected content approval requires corrections.');
123
+ }
124
+ return {
125
+ decision: status === 'approved' ? 'approve' : 'reject',
126
+ reviewedAt: source.reviewedAt,
127
+ ...(source.reviewer && { reviewer: source.reviewer }),
128
+ corrections: [...corrections],
129
+ };
130
+ }
131
+
132
+ function normalizeDecision(decision) {
133
+ const normalized = DECISIONS.get(decision);
134
+ if (!normalized) {
135
+ throw new Error('Review decision must be approve or reject.');
136
+ }
137
+ return normalized;
138
+ }
139
+
140
+ function approvedSourceProvenance(factBase) {
141
+ if (factBase?.mode === 'supplied') {
142
+ return {
143
+ kind: 'approved-fact-base',
144
+ locator: factBase.path,
145
+ };
146
+ }
147
+ return {
148
+ kind: 'approved-source-set',
149
+ locator: `federated:${factBase?.sources?.length ?? 0}`,
150
+ };
151
+ }
152
+
153
+ function assertProvenance(value) {
154
+ if (
155
+ !isObject(value) ||
156
+ typeof value.kind !== 'string' ||
157
+ value.kind.length === 0 ||
158
+ typeof value.locator !== 'string' ||
159
+ value.locator.length === 0
160
+ ) {
161
+ throw new Error(
162
+ 'Reviewed source provenance requires non-empty kind and locator values.',
163
+ );
164
+ }
165
+ }
166
+
167
+ function assertRun(run) {
168
+ if (
169
+ !isObject(run) ||
170
+ typeof run.runId !== 'string' ||
171
+ typeof run.runRoot !== 'string' ||
172
+ !isObject(run.request)
173
+ ) {
174
+ throw new TypeError('Run must be returned by initializeRun().');
175
+ }
176
+ }
177
+
178
+ function isObject(value) {
179
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
180
+ }