@open-agent-toolkit/cli 0.2.5 → 0.2.7

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 (104) 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/skills/explainer-kit.md +125 -0
  5. package/assets/docs/workflows/skills/index.md +4 -0
  6. package/assets/migration/pjm-restructure.md +12 -0
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/explainer-kit/SKILL.md +95 -0
  9. package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
  10. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
  11. package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
  12. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
  13. package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
  14. package/assets/skills/explainer-kit/palettes/ember.json +37 -0
  15. package/assets/skills/explainer-kit/palettes/forest.json +37 -0
  16. package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
  17. package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
  18. package/assets/skills/explainer-kit/palettes/violet.json +37 -0
  19. package/assets/skills/explainer-kit/profiles/clean.json +42 -0
  20. package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
  21. package/assets/skills/explainer-kit/profiles/technical.json +39 -0
  22. package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
  23. package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
  24. package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
  25. package/assets/skills/explainer-kit/references/contracts.md +101 -0
  26. package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
  27. package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
  28. package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
  29. package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
  30. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
  31. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
  32. package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
  33. package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
  34. package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
  35. package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
  36. package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
  37. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
  38. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
  39. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
  40. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
  41. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
  42. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
  43. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
  44. package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
  45. package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
  46. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
  47. package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
  48. package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
  49. package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
  50. package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
  51. package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
  52. package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
  53. package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
  54. package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
  55. package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
  56. package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
  57. package/assets/skills/explainer-kit/templates/house-style.html +218 -0
  58. package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
  59. package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
  60. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
  61. package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
  62. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
  63. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
  64. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
  65. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
  66. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
  67. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
  68. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
  69. package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
  70. package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
  71. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
  72. package/assets/skills/oat-project-complete/SKILL.md +166 -28
  73. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
  74. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  75. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -0
  76. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
  77. package/assets/skills/oat-project-plan/SKILL.md +30 -1
  78. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
  79. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
  80. package/assets/skills/oat-project-summary/SKILL.md +20 -1
  81. package/assets/skills/oat-wave-execute/SKILL.md +1 -1
  82. package/dist/commands/config/index.d.ts.map +1 -1
  83. package/dist/commands/config/index.js +232 -1
  84. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  85. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  86. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  87. package/dist/commands/project/archive/archive-utils.d.ts +12 -0
  88. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  89. package/dist/commands/project/archive/archive-utils.js +320 -8
  90. package/dist/commands/project/archive/index.d.ts.map +1 -1
  91. package/dist/commands/project/archive/index.js +1 -0
  92. package/dist/commands/project/archive/push-runner.d.ts +1 -0
  93. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  94. package/dist/commands/project/archive/push-runner.js +9 -2
  95. package/dist/config/oat-config.d.ts +26 -0
  96. package/dist/config/oat-config.d.ts.map +1 -1
  97. package/dist/config/oat-config.js +88 -0
  98. package/dist/config/resolve.d.ts.map +1 -1
  99. package/dist/config/resolve.js +18 -0
  100. package/dist/validation/project-state.d.ts +3 -0
  101. package/dist/validation/project-state.d.ts.map +1 -1
  102. package/dist/validation/project-state.js +91 -0
  103. package/package.json +2 -2
  104. /package/assets/skills/{oat-wave-execute/assets/program-recap.recipe.json → explainer-kit/recipes/program-recap.json} +0 -0
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "ember",
3
+ "modes": {
4
+ "light": {
5
+ "surface": {
6
+ "canvas": "#fffbeb",
7
+ "panel": "#fef3c7",
8
+ "elevated": "#fde68a"
9
+ },
10
+ "ink": { "primary": "#451a03", "muted": "#713f12", "inverse": "#ffffff" },
11
+ "accent": { "primary": "#9a3412", "secondary": "#92400e" },
12
+ "status": {
13
+ "success": "#166534",
14
+ "warning": "#854d0e",
15
+ "danger": "#991b1b",
16
+ "info": "#1e40af"
17
+ },
18
+ "diagramSeries": ["#9a3412", "#92400e", "#166534", "#1e40af"]
19
+ },
20
+ "dark": {
21
+ "surface": {
22
+ "canvas": "#431407",
23
+ "panel": "#7c2d12",
24
+ "elevated": "#78350f"
25
+ },
26
+ "ink": { "primary": "#fff7ed", "muted": "#fed7aa", "inverse": "#431407" },
27
+ "accent": { "primary": "#fdba74", "secondary": "#fcd34d" },
28
+ "status": {
29
+ "success": "#86efac",
30
+ "warning": "#fde047",
31
+ "danger": "#fca5a5",
32
+ "info": "#93c5fd"
33
+ },
34
+ "diagramSeries": ["#fdba74", "#fcd34d", "#86efac", "#93c5fd"]
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "forest",
3
+ "modes": {
4
+ "light": {
5
+ "surface": {
6
+ "canvas": "#f7fee7",
7
+ "panel": "#ecfccb",
8
+ "elevated": "#d9f99d"
9
+ },
10
+ "ink": { "primary": "#052e16", "muted": "#365314", "inverse": "#ffffff" },
11
+ "accent": { "primary": "#166534", "secondary": "#3f6212" },
12
+ "status": {
13
+ "success": "#166534",
14
+ "warning": "#854d0e",
15
+ "danger": "#991b1b",
16
+ "info": "#1e40af"
17
+ },
18
+ "diagramSeries": ["#166534", "#3f6212", "#854d0e", "#1e40af"]
19
+ },
20
+ "dark": {
21
+ "surface": {
22
+ "canvas": "#052e16",
23
+ "panel": "#14532d",
24
+ "elevated": "#365314"
25
+ },
26
+ "ink": { "primary": "#f7fee7", "muted": "#d9f99d", "inverse": "#052e16" },
27
+ "accent": { "primary": "#86efac", "secondary": "#bef264" },
28
+ "status": {
29
+ "success": "#86efac",
30
+ "warning": "#fde047",
31
+ "danger": "#fca5a5",
32
+ "info": "#93c5fd"
33
+ },
34
+ "diagramSeries": ["#86efac", "#bef264", "#fde047", "#93c5fd"]
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "neutral",
3
+ "modes": {
4
+ "light": {
5
+ "surface": {
6
+ "canvas": "#ffffff",
7
+ "panel": "#f3f4f6",
8
+ "elevated": "#e5e7eb"
9
+ },
10
+ "ink": { "primary": "#111827", "muted": "#4b5563", "inverse": "#ffffff" },
11
+ "accent": { "primary": "#374151", "secondary": "#4b5563" },
12
+ "status": {
13
+ "success": "#166534",
14
+ "warning": "#854d0e",
15
+ "danger": "#991b1b",
16
+ "info": "#1e40af"
17
+ },
18
+ "diagramSeries": ["#374151", "#1e40af", "#166534", "#854d0e"]
19
+ },
20
+ "dark": {
21
+ "surface": {
22
+ "canvas": "#111827",
23
+ "panel": "#1f2937",
24
+ "elevated": "#374151"
25
+ },
26
+ "ink": { "primary": "#f9fafb", "muted": "#d1d5db", "inverse": "#111827" },
27
+ "accent": { "primary": "#d1d5db", "secondary": "#e5e7eb" },
28
+ "status": {
29
+ "success": "#86efac",
30
+ "warning": "#fde047",
31
+ "danger": "#fca5a5",
32
+ "info": "#93c5fd"
33
+ },
34
+ "diagramSeries": ["#d1d5db", "#93c5fd", "#86efac", "#fde047"]
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "ocean",
3
+ "modes": {
4
+ "light": {
5
+ "surface": {
6
+ "canvas": "#f8fafc",
7
+ "panel": "#e2e8f0",
8
+ "elevated": "#cbd5e1"
9
+ },
10
+ "ink": { "primary": "#0f172a", "muted": "#334155", "inverse": "#ffffff" },
11
+ "accent": { "primary": "#075985", "secondary": "#155e75" },
12
+ "status": {
13
+ "success": "#166534",
14
+ "warning": "#854d0e",
15
+ "danger": "#991b1b",
16
+ "info": "#075985"
17
+ },
18
+ "diagramSeries": ["#075985", "#155e75", "#166534", "#854d0e"]
19
+ },
20
+ "dark": {
21
+ "surface": {
22
+ "canvas": "#082f49",
23
+ "panel": "#0c4a6e",
24
+ "elevated": "#164e63"
25
+ },
26
+ "ink": { "primary": "#f0f9ff", "muted": "#bae6fd", "inverse": "#082f49" },
27
+ "accent": { "primary": "#7dd3fc", "secondary": "#67e8f9" },
28
+ "status": {
29
+ "success": "#86efac",
30
+ "warning": "#fde047",
31
+ "danger": "#fca5a5",
32
+ "info": "#bae6fd"
33
+ },
34
+ "diagramSeries": ["#7dd3fc", "#67e8f9", "#86efac", "#fde047"]
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "violet",
3
+ "modes": {
4
+ "light": {
5
+ "surface": {
6
+ "canvas": "#faf5ff",
7
+ "panel": "#f3e8ff",
8
+ "elevated": "#e9d5ff"
9
+ },
10
+ "ink": { "primary": "#2e1065", "muted": "#581c87", "inverse": "#ffffff" },
11
+ "accent": { "primary": "#6b21a8", "secondary": "#5b21b6" },
12
+ "status": {
13
+ "success": "#166534",
14
+ "warning": "#854d0e",
15
+ "danger": "#991b1b",
16
+ "info": "#1e40af"
17
+ },
18
+ "diagramSeries": ["#6b21a8", "#5b21b6", "#166534", "#854d0e"]
19
+ },
20
+ "dark": {
21
+ "surface": {
22
+ "canvas": "#2e1065",
23
+ "panel": "#4c1d95",
24
+ "elevated": "#581c87"
25
+ },
26
+ "ink": { "primary": "#faf5ff", "muted": "#e9d5ff", "inverse": "#2e1065" },
27
+ "accent": { "primary": "#d8b4fe", "secondary": "#c4b5fd" },
28
+ "status": {
29
+ "success": "#86efac",
30
+ "warning": "#fde047",
31
+ "danger": "#fca5a5",
32
+ "info": "#93c5fd"
33
+ },
34
+ "diagramSeries": ["#d8b4fe", "#c4b5fd", "#86efac", "#fde047"]
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "clean",
3
+ "typography": {
4
+ "sans": ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
5
+ "serif": ["ui-serif", "Georgia", "serif"],
6
+ "mono": ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
7
+ "scale": {
8
+ "caption": "0.875rem",
9
+ "body": "1rem",
10
+ "title": "1.5rem",
11
+ "display": "2.25rem"
12
+ },
13
+ "lineHeight": { "caption": 1.4, "body": 1.6, "title": 1.25, "display": 1.1 }
14
+ },
15
+ "spacing": {
16
+ "unit": 4,
17
+ "scale": { "xs": 4, "sm": 8, "md": 16, "lg": 24, "xl": 40 }
18
+ },
19
+ "geometry": { "radius": { "sm": 4, "md": 8, "lg": 12 }, "borderWidth": 1 },
20
+ "elevation": {
21
+ "shadows": {
22
+ "low": "0 1px 2px rgb(0 0 0 / 0.08)",
23
+ "high": "0 12px 28px rgb(0 0 0 / 0.16)"
24
+ }
25
+ },
26
+ "density": "comfortable",
27
+ "motion": {
28
+ "enabled": true,
29
+ "durationMs": { "fast": 120, "normal": 200, "slow": 320 },
30
+ "easing": {
31
+ "standard": "ease",
32
+ "emphasized": "cubic-bezier(0.2, 0, 0, 1)"
33
+ },
34
+ "reducedMotion": "disable-nonessential"
35
+ },
36
+ "diagrams": {
37
+ "lineWidth": 2,
38
+ "nodeGap": 32,
39
+ "arrowStyle": "straight",
40
+ "labelTreatment": "boxed"
41
+ }
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "editorial",
3
+ "typography": {
4
+ "sans": ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
5
+ "serif": ["Charter", "Bitstream Charter", "Georgia", "serif"],
6
+ "mono": ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
7
+ "scale": {
8
+ "caption": "0.875rem",
9
+ "body": "1.0625rem",
10
+ "title": "1.75rem",
11
+ "display": "2.75rem"
12
+ },
13
+ "lineHeight": { "caption": 1.5, "body": 1.7, "title": 1.2, "display": 1.05 }
14
+ },
15
+ "spacing": {
16
+ "unit": 5,
17
+ "scale": { "xs": 5, "sm": 10, "md": 20, "lg": 30, "xl": 50 }
18
+ },
19
+ "geometry": { "radius": { "sm": 2, "md": 4, "lg": 8 }, "borderWidth": 1 },
20
+ "elevation": {
21
+ "shadows": {
22
+ "low": "0 1px 3px rgb(0 0 0 / 0.1)",
23
+ "high": "0 16px 36px rgb(0 0 0 / 0.18)"
24
+ }
25
+ },
26
+ "density": "spacious",
27
+ "motion": {
28
+ "enabled": true,
29
+ "durationMs": { "fast": 150, "normal": 240, "slow": 400 },
30
+ "easing": {
31
+ "standard": "ease-out",
32
+ "emphasized": "cubic-bezier(0.16, 1, 0.3, 1)"
33
+ },
34
+ "reducedMotion": "disable-nonessential"
35
+ },
36
+ "diagrams": {
37
+ "lineWidth": 1.5,
38
+ "nodeGap": 40,
39
+ "arrowStyle": "curved",
40
+ "labelTreatment": "inline"
41
+ }
42
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "technical",
3
+ "typography": {
4
+ "sans": ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
5
+ "serif": ["ui-serif", "Georgia", "serif"],
6
+ "mono": ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
7
+ "scale": {
8
+ "caption": "0.8125rem",
9
+ "body": "0.9375rem",
10
+ "title": "1.375rem",
11
+ "display": "2rem"
12
+ },
13
+ "lineHeight": { "caption": 1.35, "body": 1.5, "title": 1.2, "display": 1.1 }
14
+ },
15
+ "spacing": {
16
+ "unit": 3,
17
+ "scale": { "xs": 3, "sm": 6, "md": 12, "lg": 18, "xl": 30 }
18
+ },
19
+ "geometry": { "radius": { "sm": 2, "md": 4, "lg": 6 }, "borderWidth": 1 },
20
+ "elevation": {
21
+ "shadows": {
22
+ "low": "0 1px 2px rgb(0 0 0 / 0.12)",
23
+ "high": "0 8px 20px rgb(0 0 0 / 0.2)"
24
+ }
25
+ },
26
+ "density": "compact",
27
+ "motion": {
28
+ "enabled": false,
29
+ "durationMs": { "fast": 0, "normal": 0, "slow": 0 },
30
+ "easing": { "standard": "linear", "emphasized": "linear" },
31
+ "reducedMotion": "disable-nonessential"
32
+ },
33
+ "diagrams": {
34
+ "lineWidth": 2,
35
+ "nodeGap": 24,
36
+ "arrowStyle": "straight",
37
+ "labelTreatment": "boxed"
38
+ }
39
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "explainer-kit.recipe/v1",
3
+ "id": "engineer-tour",
4
+ "version": "1",
5
+ "sourceRoles": [
6
+ {
7
+ "role": "codebase",
8
+ "required": true,
9
+ "accepts": ["directory", "git"],
10
+ "minBindings": 1,
11
+ "maxBindings": 1
12
+ }
13
+ ],
14
+ "requiredNarrative": [
15
+ "orientation",
16
+ "architecture",
17
+ "execution-flow",
18
+ "key-code",
19
+ "validation"
20
+ ],
21
+ "artifacts": [
22
+ {
23
+ "id": "engineer-tour",
24
+ "type": "explainer",
25
+ "template": "engineer-tour",
26
+ "required": true
27
+ }
28
+ ],
29
+ "discoveryLimits": {
30
+ "consecutiveNoNewFindingsRounds": 2,
31
+ "maxRounds": 8
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "explainer-kit.recipe/v1",
3
+ "id": "project-explainer",
4
+ "version": "1",
5
+ "sourceRoles": [
6
+ {
7
+ "role": "project",
8
+ "required": true,
9
+ "accepts": ["file", "directory", "git", "github"],
10
+ "minBindings": 1,
11
+ "maxBindings": 1
12
+ }
13
+ ],
14
+ "requiredNarrative": [
15
+ "planned-architecture",
16
+ "decisions",
17
+ "risks",
18
+ "phases",
19
+ "validation-approach"
20
+ ],
21
+ "artifacts": [
22
+ {
23
+ "id": "project-explainer",
24
+ "type": "hub",
25
+ "template": "house-style",
26
+ "required": true
27
+ }
28
+ ],
29
+ "discoveryLimits": {
30
+ "consecutiveNoNewFindingsRounds": 2,
31
+ "maxRounds": 8
32
+ }
33
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "schemaVersion": "explainer-kit.recipe/v1",
3
+ "id": "project-recap",
4
+ "version": "1",
5
+ "sourceRoles": [
6
+ {
7
+ "role": "project",
8
+ "required": true,
9
+ "accepts": ["file", "directory", "git", "github"],
10
+ "minBindings": 1,
11
+ "maxBindings": 1
12
+ }
13
+ ],
14
+ "requiredNarrative": [
15
+ "original-request",
16
+ "key-agent-decisions",
17
+ "as-built-architecture",
18
+ "implementation-record",
19
+ "validation-evidence",
20
+ "outcome"
21
+ ],
22
+ "artifacts": [
23
+ {
24
+ "id": "project-recap",
25
+ "type": "hub",
26
+ "template": "house-style",
27
+ "required": true
28
+ }
29
+ ],
30
+ "discoveryLimits": {
31
+ "consecutiveNoNewFindingsRounds": 2,
32
+ "maxRounds": 8
33
+ }
34
+ }
@@ -0,0 +1,101 @@
1
+ # Core run contract
2
+
3
+ `scripts/run.mjs` is the config-blind orchestration entry point. It reads only
4
+ the explicit `ExplainerRunRequestV1`, bundled skill assets, and source paths
5
+ named by that request. It does not search for `.oat`, user configuration,
6
+ provider configuration, vaults, or destinations.
7
+
8
+ ## Invocation
9
+
10
+ Programmatic callers import `runExplainer(request, options)`. Command-line
11
+ callers use:
12
+
13
+ ```bash
14
+ node scripts/run.mjs --request request.json
15
+ ```
16
+
17
+ Federated runs require a provider-neutral critic callback. A command-line
18
+ caller supplies one with `--critic-module critic.mjs`; the module exports
19
+ `critic(request)` or a default function. The callback receives reconciled
20
+ claims, sources, overrides, and the freshness policy. It returns:
21
+
22
+ ```json
23
+ {
24
+ "criticId": "skeptical-pass",
25
+ "executedAt": "2026-07-17T20:00:00Z",
26
+ "findings": []
27
+ }
28
+ ```
29
+
30
+ No provider name, command, credential, or dispatch protocol is part of this
31
+ contract.
32
+
33
+ ## Explicit source forms
34
+
35
+ - `factBase.mode: supplied` points to a valid `FactBaseV1` JSON file. The core
36
+ performs only the lightweight consistency and freshness check and never
37
+ invokes the critic.
38
+ - `factBase.mode: federated` names explicit source bindings. File locators
39
+ contain JSON with a `claims` array of `{ "id", "text", "locator"? }`.
40
+ Non-file bindings require a caller-supplied `sourceLoader(source)` callback.
41
+ Every binding names its recipe `role` and `sourceSetId`. Multiple documents
42
+ may share one source-set ID; recipe cardinality counts distinct sets, not
43
+ documents. The core validates these bindings before loading facts, then
44
+ reconciles the loaded claims and invokes the critic exactly once.
45
+
46
+ An unattended request asserts that its explicit source artifacts are already
47
+ approved. It does not prompt. Interactive review and same-run approval/resume
48
+ are introduced separately and are not part of this contract.
49
+
50
+ ## Pipeline and retained package
51
+
52
+ The core executes:
53
+
54
+ 1. validate request and recipe
55
+ 2. reconcile or check the fact base
56
+ 3. apply bounded discovery and create recipe content
57
+ 4. resolve one theme
58
+ 5. render typed artifacts
59
+ 6. run structural and optional browser QA
60
+ 7. write the manifest and build record
61
+
62
+ The run package retains `source/fact-base.json`, `source/fact-base.md`,
63
+ `source/content/*.md`, `theme.resolved.json`, rendered `site/` files,
64
+ `manifest.json`, and `build-record.json` as far as each stage succeeds. A stage
65
+ failure records a structured error and recovery action without deleting earlier
66
+ outputs. Raw art direction is omitted unless the request explicitly opts in.
67
+
68
+ When a caller supplies `discover({ round, recipe, factBase })`, the callback
69
+ returns the findings added in that round. The core stops after two consecutive
70
+ empty rounds and always stops at the recipe's `maxRounds`.
71
+
72
+ ## Optional seams
73
+
74
+ Durability and publishing are never implicit.
75
+
76
+ - `durability.strategy: none` invokes neither seam.
77
+ - `durability.strategy: commit` invokes the explicit `durability` callback.
78
+ Caller-created commit evidence is subsequently verified with
79
+ `record-durability.mjs`; the core never creates commits. The first evidence
80
+ commit must contain every path and byte hash in `manifest.immutableHashes`:
81
+ fact-base JSON and Markdown, all content Markdown, the resolved theme, and
82
+ every built artifact retained in the package. Mutable `manifest.json` and
83
+ `build-record.json` remain excluded for the separate evidence update.
84
+ - `durability.strategy: publish` invokes the explicit `publish` callback with
85
+ the complete publish request. A verified receipt is subsequently recorded as
86
+ durability evidence.
87
+
88
+ CLI callers provide these callbacks only with `--durability-module` and
89
+ `--publish-module`. Building remains `built-not-durable` until evidence is
90
+ verified. Publishing remains independently human-gated by the caller.
91
+
92
+ ## Result
93
+
94
+ `runExplainer` returns the run root, manifest path, build-record path, outcome,
95
+ warnings, and bounded-discovery summary. Input validation and unsupported
96
+ recipes reject before output mutation. Failures after initialization return a
97
+ `failed` result with paths to the retained record and intermediates.
98
+
99
+ V1 readers reject unknown schema majors and unknown contract fields. Relative
100
+ record paths are run-root confined, hashes use `sha256:<hex>`, and command
101
+ metadata uses argv arrays rather than shell strings.
@@ -0,0 +1,94 @@
1
+ # S3 static destination contract
2
+
3
+ The `s3-static` connector publishes only files declared as built artifacts in a
4
+ validated manifest. Publishing is human-gated:
5
+
6
+ ```bash
7
+ node scripts/publish.mjs \
8
+ --request /path/to/publish-request.json \
9
+ --receipt /path/to/publish-receipt.json \
10
+ --confirm-publish
11
+ ```
12
+
13
+ The request uses `explainer-kit.publish-request/v1`. Credentials come only from
14
+ the standard AWS credential chain or the request's optional profile. Never put
15
+ access keys, secret keys, session tokens, or SSO tokens in a request.
16
+
17
+ ## Corresponding roots
18
+
19
+ `s3Uri` and `publicBaseUrl` must identify corresponding roots. Both are
20
+ normalized without trailing slashes. For a path `P` relative to `siteRoot`, the
21
+ connector writes `<s3Uri>/P` and verifies `<publicBaseUrl>/P`.
22
+
23
+ For example:
24
+
25
+ | Input | Value |
26
+ | ----------------------- | --------------------------------------------------------------- |
27
+ | `siteRoot` | `/tmp/run/site` |
28
+ | manifest `renderedPath` | `site/initiatives/demo/index.html` |
29
+ | `s3Uri` | `s3://example-bucket/published` |
30
+ | `publicBaseUrl` | `https://cdn.example.com/published` |
31
+ | object | `s3://example-bucket/published/initiatives/demo/index.html` |
32
+ | public URL | `https://cdn.example.com/published/initiatives/demo/index.html` |
33
+
34
+ Use explicit `index.html` URLs. Directory redirects are not portable evidence.
35
+ The destination must serve uploaded bytes at the corresponding public path.
36
+
37
+ ## Safety and ordering
38
+
39
+ The connector validates the request, manifest, paths, hashes, and duplicate
40
+ site-relative paths before network access. It then:
41
+
42
+ 1. uploads a sentinel whose path contains the run ID and a random 128-bit
43
+ suffix;
44
+ 2. verifies the sentinel with `head-object`;
45
+ 3. fetches that exact sentinel through the public root;
46
+ 4. deletes only that sentinel;
47
+ 5. uploads or idempotently skips each declared artifact;
48
+ 6. verifies object metadata, content type, and SHA-256 of the exact response
49
+ bytes from each public artifact URL; and
50
+ 7. atomically writes `explainer-kit.publish-receipt/v1`.
51
+
52
+ If public sentinel verification fails, no artifact is uploaded. The connector
53
+ attempts sentinel cleanup and emits no successful receipt.
54
+
55
+ Publishing is additive. The implementation uses individual `put-object`,
56
+ `head-object`, and sentinel-only `delete-object` operations. It never performs
57
+ root-wide synchronization, never passes a delete flag, never walks or uploads
58
+ undeclared files, and never deletes an artifact object. Existing declared
59
+ objects with matching hash and metadata are skipped; changed declared objects
60
+ may be replaced.
61
+
62
+ ## Metadata
63
+
64
+ Every upload sets metadata explicitly:
65
+
66
+ | File | Content type |
67
+ | ------- | ------------------------------------------------- |
68
+ | `.html` | `text/html; charset=utf-8` |
69
+ | `.json` | `application/json` |
70
+ | `.css` | `text/css; charset=utf-8` |
71
+ | `.js` | `text/javascript; charset=utf-8` |
72
+ | `.svg` | `image/svg+xml` |
73
+ | `.txt` | `text/plain; charset=utf-8` |
74
+ | other | manifest media type or `application/octet-stream` |
75
+
76
+ Artifacts use `Cache-Control: public, max-age=300`. The connector stores the
77
+ SHA-256 digest as object metadata for idempotency and verifies content type,
78
+ cache control, and digest after upload. Public verification hashes response
79
+ bytes without text decoding, so binary artifacts and stale wrong-byte 200
80
+ responses are covered.
81
+
82
+ ## Failures and retries
83
+
84
+ Authentication and permission failures stop immediately. The connector does
85
+ not run `aws sso login`, retry with another profile, expose AWS diagnostics, or
86
+ persist credentials. Refresh credentials separately and rerun after approval.
87
+
88
+ Only transient individual object-operation failures receive bounded retries.
89
+ Input, authorization, root-correspondence, metadata, and public-verification
90
+ failures are not retried. A failed publish preserves the local package.
91
+
92
+ Public roots must be credential-free HTTPS URLs with no username, password,
93
+ query, or fragment. Invalid roots fail before AWS or HTTP operations and are
94
+ never persisted in receipts.