opendevbrowser 0.0.16 → 0.0.17

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 (210) hide show
  1. package/README.md +51 -27
  2. package/dist/browser/annotation-manager.d.ts +3 -0
  3. package/dist/browser/annotation-manager.d.ts.map +1 -1
  4. package/dist/browser/browser-manager.d.ts +6 -1
  5. package/dist/browser/browser-manager.d.ts.map +1 -1
  6. package/dist/browser/canvas-client.d.ts +53 -0
  7. package/dist/browser/canvas-client.d.ts.map +1 -0
  8. package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
  9. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  10. package/dist/browser/canvas-manager.d.ts +94 -0
  11. package/dist/browser/canvas-manager.d.ts.map +1 -0
  12. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  13. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  14. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  15. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  16. package/dist/browser/manager-types.d.ts +13 -1
  17. package/dist/browser/manager-types.d.ts.map +1 -1
  18. package/dist/browser/ops-browser-manager.d.ts +11 -1
  19. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  20. package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
  21. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  22. package/dist/canvas/code-sync/graph.d.ts +5 -0
  23. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  24. package/dist/canvas/code-sync/hash.d.ts +3 -0
  25. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  26. package/dist/canvas/code-sync/import.d.ts +18 -0
  27. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  28. package/dist/canvas/code-sync/manifest.d.ts +5 -0
  29. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  30. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  31. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  32. package/dist/canvas/code-sync/types.d.ts +152 -0
  33. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  34. package/dist/canvas/code-sync/write.d.ts +9 -0
  35. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  36. package/dist/canvas/document-store.d.ts +81 -0
  37. package/dist/canvas/document-store.d.ts.map +1 -0
  38. package/dist/canvas/export.d.ts +12 -0
  39. package/dist/canvas/export.d.ts.map +1 -0
  40. package/dist/canvas/repo-store.d.ts +10 -0
  41. package/dist/canvas/repo-store.d.ts.map +1 -0
  42. package/dist/canvas/surface-palette.d.ts +15 -0
  43. package/dist/canvas/surface-palette.d.ts.map +1 -0
  44. package/dist/canvas/types.d.ts +255 -0
  45. package/dist/canvas/types.d.ts.map +1 -0
  46. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  47. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  48. package/dist/{chunk-ST7CO5FA.js → chunk-5J3IFL3X.js} +11577 -13539
  49. package/dist/chunk-5J3IFL3X.js.map +1 -0
  50. package/dist/chunk-D633UO34.js +8149 -0
  51. package/dist/chunk-D633UO34.js.map +1 -0
  52. package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
  53. package/dist/chunk-TBUCZX4A.js +34 -0
  54. package/dist/chunk-TBUCZX4A.js.map +1 -0
  55. package/dist/chunk-V7KUDHDG.js +276 -0
  56. package/dist/chunk-V7KUDHDG.js.map +1 -0
  57. package/dist/chunk-Y2KL55OG.js +59 -0
  58. package/dist/chunk-Y2KL55OG.js.map +1 -0
  59. package/dist/cli/args.d.ts +3 -3
  60. package/dist/cli/args.d.ts.map +1 -1
  61. package/dist/cli/commands/annotate.d.ts +11 -0
  62. package/dist/cli/commands/annotate.d.ts.map +1 -1
  63. package/dist/cli/commands/canvas.d.ts +45 -0
  64. package/dist/cli/commands/canvas.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
  66. package/dist/cli/commands/devtools/screenshot.d.ts +1 -0
  67. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -1
  69. package/dist/cli/commands/dom/checked.d.ts.map +1 -1
  70. package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
  71. package/dist/cli/commands/dom/html.d.ts.map +1 -1
  72. package/dist/cli/commands/dom/text.d.ts.map +1 -1
  73. package/dist/cli/commands/dom/value.d.ts.map +1 -1
  74. package/dist/cli/commands/dom/visible.d.ts.map +1 -1
  75. package/dist/cli/commands/export/clone-component.d.ts +9 -0
  76. package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
  77. package/dist/cli/commands/export/clone-page.d.ts +8 -0
  78. package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
  79. package/dist/cli/commands/interact/check.d.ts.map +1 -1
  80. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  81. package/dist/cli/commands/interact/hover.d.ts.map +1 -1
  82. package/dist/cli/commands/interact/press.d.ts.map +1 -1
  83. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
  84. package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
  85. package/dist/cli/commands/interact/select.d.ts.map +1 -1
  86. package/dist/cli/commands/interact/type.d.ts.map +1 -1
  87. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
  88. package/dist/cli/commands/native.d.ts +12 -1
  89. package/dist/cli/commands/native.d.ts.map +1 -1
  90. package/dist/cli/commands/nav/goto.d.ts.map +1 -1
  91. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  92. package/dist/cli/commands/nav/wait.d.ts.map +1 -1
  93. package/dist/cli/commands/serve.d.ts +5 -0
  94. package/dist/cli/commands/serve.d.ts.map +1 -1
  95. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  96. package/dist/cli/commands/status.d.ts +5 -0
  97. package/dist/cli/commands/status.d.ts.map +1 -1
  98. package/dist/cli/daemon-commands.d.ts.map +1 -1
  99. package/dist/cli/help.d.ts +5 -0
  100. package/dist/cli/help.d.ts.map +1 -1
  101. package/dist/cli/index.js +724 -163
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  104. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  105. package/dist/cli/remote-manager.d.ts +3 -1
  106. package/dist/cli/remote-manager.d.ts.map +1 -1
  107. package/dist/cli/remote-relay.d.ts +2 -0
  108. package/dist/cli/remote-relay.d.ts.map +1 -1
  109. package/dist/cli/utils/parse.d.ts +1 -0
  110. package/dist/cli/utils/parse.d.ts.map +1 -1
  111. package/dist/core/bootstrap.d.ts.map +1 -1
  112. package/dist/core/types.d.ts +2 -0
  113. package/dist/core/types.d.ts.map +1 -1
  114. package/dist/fs-UMRKOBNN.js +7 -0
  115. package/dist/fs-UMRKOBNN.js.map +1 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +192 -67
  118. package/dist/index.js.map +1 -1
  119. package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
  120. package/dist/opendevbrowser.d.ts.map +1 -1
  121. package/dist/opendevbrowser.js +192 -67
  122. package/dist/opendevbrowser.js.map +1 -1
  123. package/dist/providers/index.d.ts.map +1 -1
  124. package/dist/providers/shopping/index.d.ts.map +1 -1
  125. package/dist/providers-G3LRHQXX.js +121 -0
  126. package/dist/providers-G3LRHQXX.js.map +1 -0
  127. package/dist/relay/protocol.d.ts +85 -3
  128. package/dist/relay/protocol.d.ts.map +1 -1
  129. package/dist/relay/relay-server.d.ts +14 -1
  130. package/dist/relay/relay-server.d.ts.map +1 -1
  131. package/dist/relay/relay-types.d.ts +3 -0
  132. package/dist/relay/relay-types.d.ts.map +1 -1
  133. package/dist/runtime-factory-BICHDPE7.js +13 -0
  134. package/dist/runtime-factory-BICHDPE7.js.map +1 -0
  135. package/dist/tools/annotate.d.ts.map +1 -1
  136. package/dist/tools/canvas.d.ts +4 -0
  137. package/dist/tools/canvas.d.ts.map +1 -0
  138. package/dist/tools/check.d.ts.map +1 -1
  139. package/dist/tools/click.d.ts.map +1 -1
  140. package/dist/tools/clone_component.d.ts.map +1 -1
  141. package/dist/tools/clone_page.d.ts.map +1 -1
  142. package/dist/tools/connect.d.ts.map +1 -1
  143. package/dist/tools/deps.d.ts +2 -0
  144. package/dist/tools/deps.d.ts.map +1 -1
  145. package/dist/tools/dom_get_html.d.ts.map +1 -1
  146. package/dist/tools/dom_get_text.d.ts.map +1 -1
  147. package/dist/tools/get_attr.d.ts.map +1 -1
  148. package/dist/tools/get_value.d.ts.map +1 -1
  149. package/dist/tools/goto.d.ts.map +1 -1
  150. package/dist/tools/hover.d.ts.map +1 -1
  151. package/dist/tools/index.d.ts.map +1 -1
  152. package/dist/tools/is_checked.d.ts.map +1 -1
  153. package/dist/tools/is_enabled.d.ts.map +1 -1
  154. package/dist/tools/is_visible.d.ts.map +1 -1
  155. package/dist/tools/launch.d.ts.map +1 -1
  156. package/dist/tools/macro_resolve.d.ts.map +1 -1
  157. package/dist/tools/perf.d.ts.map +1 -1
  158. package/dist/tools/press.d.ts.map +1 -1
  159. package/dist/tools/product_video_run.d.ts.map +1 -1
  160. package/dist/tools/research_run.d.ts.map +1 -1
  161. package/dist/tools/response.d.ts +4 -1
  162. package/dist/tools/response.d.ts.map +1 -1
  163. package/dist/tools/screenshot.d.ts.map +1 -1
  164. package/dist/tools/scroll.d.ts.map +1 -1
  165. package/dist/tools/scroll_into_view.d.ts.map +1 -1
  166. package/dist/tools/select.d.ts.map +1 -1
  167. package/dist/tools/shopping_run.d.ts.map +1 -1
  168. package/dist/tools/snapshot.d.ts.map +1 -1
  169. package/dist/tools/type.d.ts.map +1 -1
  170. package/dist/tools/uncheck.d.ts.map +1 -1
  171. package/dist/tools/wait.d.ts.map +1 -1
  172. package/dist/tools/workflow-runtime.d.ts +1 -2
  173. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  174. package/extension/canvas.html +636 -0
  175. package/extension/dist/annotate-content.css +15 -6
  176. package/extension/dist/annotate-content.js +119 -9
  177. package/extension/dist/annotation-payload.js +163 -0
  178. package/extension/dist/background.js +148 -18
  179. package/extension/dist/canvas/canvas-runtime.js +1061 -0
  180. package/extension/dist/canvas/model.js +213 -0
  181. package/extension/dist/canvas/viewport-fit.js +67 -0
  182. package/extension/dist/canvas-page.js +1801 -0
  183. package/extension/dist/ops/dom-bridge.js +116 -3
  184. package/extension/dist/ops/ops-runtime.js +508 -44
  185. package/extension/dist/ops/ops-session-store.js +21 -114
  186. package/extension/dist/ops/target-session-coordinator.js +157 -0
  187. package/extension/dist/popup.js +155 -31
  188. package/extension/dist/services/ConnectionManager.js +17 -0
  189. package/extension/dist/services/RelayClient.js +9 -0
  190. package/extension/dist/services/TabManager.js +35 -12
  191. package/extension/dist/types.js +2 -0
  192. package/extension/manifest.json +1 -1
  193. package/extension/popup.html +52 -0
  194. package/package.json +6 -4
  195. package/skills/AGENTS.md +5 -2
  196. package/skills/opendevbrowser-best-practices/SKILL.md +71 -3
  197. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  198. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +113 -17
  199. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  200. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  201. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  202. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  203. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
  204. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +7 -3
  205. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +26 -0
  206. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +82 -1
  207. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +225 -84
  208. package/dist/chunk-ST7CO5FA.js.map +0 -1
  209. /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
  210. /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
@@ -14,6 +14,7 @@ Usage:
14
14
 
15
15
  Examples:
16
16
  ./skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh
17
+ ./skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh canvas-pack
17
18
  ./skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh opendevbrowser-shopping
18
19
  HELP
19
20
  }
@@ -27,19 +28,99 @@ skills=(
27
28
  "opendevbrowser-research:ISSUE-06 ISSUE-09 ISSUE-10 ISSUE-12"
28
29
  )
29
30
 
31
+ canvas_issue_ids=(
32
+ "CANVAS-01"
33
+ "CANVAS-02"
34
+ "CANVAS-03"
35
+ "CANVAS-04"
36
+ "CANVAS-05"
37
+ "CANVAS-06"
38
+ "CANVAS-07"
39
+ )
40
+
30
41
  status=0
31
42
  target="${1:-all}"
32
43
 
44
+ check_canvas_pack() {
45
+ local root="$1"
46
+ local status_ref="$2"
47
+ local playbook="$root/artifacts/canvas-governance-playbook.md"
48
+ local command_ref="$root/artifacts/command-channel-reference.md"
49
+ local skill_file="$root/SKILL.md"
50
+ local feedback_eval="$root/assets/templates/canvas-feedback-eval.json"
51
+ local blocker_checklist="$root/assets/templates/canvas-blocker-checklist.json"
52
+ local robustness_checklist="$root/assets/templates/robustness-checklist.json"
53
+
54
+ for file_path in "$playbook" "$command_ref" "$skill_file" "$feedback_eval" "$blocker_checklist" "$robustness_checklist"; do
55
+ if [[ ! -f "$file_path" ]]; then
56
+ echo "[canvas-pack] missing file: $file_path" >&2
57
+ printf -v "$status_ref" '%s' 1
58
+ return
59
+ fi
60
+ done
61
+
62
+ for marker in \
63
+ "Canvas Governance Handshake" \
64
+ "artifacts/canvas-governance-playbook.md" \
65
+ "assets/templates/canvas-feedback-eval.json"; do
66
+ if ! grep -Fq "$marker" "$skill_file"; then
67
+ echo "[canvas-pack] SKILL.md missing marker: $marker" >&2
68
+ printf -v "$status_ref" '%s' 1
69
+ fi
70
+ done
71
+
72
+ for marker in \
73
+ "canvas.session.open" \
74
+ "canvas.plan.set" \
75
+ "canvas.feedback.poll" \
76
+ "plan_required"; do
77
+ if ! grep -Fq "$marker" "$command_ref"; then
78
+ echo "[canvas-pack] command/channel reference missing marker: $marker" >&2
79
+ printf -v "$status_ref" '%s' 1
80
+ fi
81
+ done
82
+
83
+ for issue_id in "${canvas_issue_ids[@]}"; do
84
+ if ! grep -Fq "$issue_id" "$playbook"; then
85
+ echo "[canvas-pack] playbook missing issue id: $issue_id" >&2
86
+ printf -v "$status_ref" '%s' 1
87
+ fi
88
+ done
89
+
90
+ if ! node -e '
91
+ const fs = require("fs");
92
+ const [feedbackPath, blockerPath, robustnessPath, ...expected] = process.argv.slice(1);
93
+ const feedback = JSON.parse(fs.readFileSync(feedbackPath, "utf8"));
94
+ const blockers = JSON.parse(fs.readFileSync(blockerPath, "utf8"));
95
+ const robustness = JSON.parse(fs.readFileSync(robustnessPath, "utf8"));
96
+ const feedbackIds = new Set(feedback.requiredIssueClasses || []);
97
+ const blockerIds = new Set((blockers.blockers || []).map((entry) => entry.auditId));
98
+ const robustnessIds = new Set((((robustness.canvas || {}).issueClasses) || []).map((entry) => entry.auditId));
99
+ const missing = expected.filter((id) => !feedbackIds.has(id) || !blockerIds.has(id) || !robustnessIds.has(id));
100
+ if (missing.length > 0) {
101
+ console.error(`[canvas-pack] missing canvas audit ids in JSON templates: ${missing.join(", ")}`);
102
+ process.exit(1);
103
+ }
104
+ ' "$feedback_eval" "$blocker_checklist" "$robustness_checklist" "${canvas_issue_ids[@]}"; then
105
+ printf -v "$status_ref" '%s' 1
106
+ fi
107
+ }
108
+
33
109
  if [[ "$target" == "-h" || "$target" == "--help" ]]; then
34
110
  usage
35
111
  exit 0
36
112
  fi
37
113
 
38
114
  found_target=0
115
+ if [[ "$target" == "all" || "$target" == "canvas-pack" ]]; then
116
+ found_target=1
117
+ check_canvas_pack "$root" status
118
+ fi
119
+
39
120
  for entry in "${skills[@]}"; do
40
121
  skill="${entry%%:*}"
41
122
  expected="${entry#*:}"
42
- if [[ "$target" != "all" && "$skill" != "$target" ]]; then
123
+ if [[ "$target" != "all" && "$target" != "canvas-pack" && "$skill" != "$target" ]]; then
43
124
  continue
44
125
  fi
45
126
  found_target=1
@@ -4,90 +4,231 @@ set -euo pipefail
4
4
  skill_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
5
  skill_file="$skill_root/SKILL.md"
6
6
 
7
- required_paths=(
8
- "artifacts/provider-workflows.md"
9
- "artifacts/parity-gates.md"
10
- "artifacts/debug-trace-playbook.md"
11
- "artifacts/fingerprint-tiers.md"
12
- "artifacts/macro-workflows.md"
13
- "artifacts/browser-agent-known-issues-matrix.md"
14
- "artifacts/command-channel-reference.md"
15
- "assets/templates/mode-flag-matrix.json"
16
- "assets/templates/ops-request-envelope.json"
17
- "assets/templates/cdp-forward-envelope.json"
18
- "assets/templates/robustness-checklist.json"
19
- "assets/templates/surface-audit-checklist.json"
20
- "scripts/odb-workflow.sh"
21
- "scripts/run-robustness-audit.sh"
7
+ node - "$skill_root" "$skill_file" <<'NODE'
8
+ const fs = require("node:fs");
9
+ const path = require("node:path");
10
+
11
+ const [skillRoot, skillFile] = process.argv.slice(2);
12
+
13
+ const requiredPaths = [
14
+ "artifacts/provider-workflows.md",
15
+ "artifacts/parity-gates.md",
16
+ "artifacts/debug-trace-playbook.md",
17
+ "artifacts/fingerprint-tiers.md",
18
+ "artifacts/macro-workflows.md",
19
+ "artifacts/browser-agent-known-issues-matrix.md",
20
+ "artifacts/command-channel-reference.md",
21
+ "artifacts/canvas-governance-playbook.md",
22
+ "assets/templates/mode-flag-matrix.json",
23
+ "assets/templates/ops-request-envelope.json",
24
+ "assets/templates/cdp-forward-envelope.json",
25
+ "assets/templates/robustness-checklist.json",
26
+ "assets/templates/surface-audit-checklist.json",
27
+ "assets/templates/canvas-handshake-example.json",
28
+ "assets/templates/canvas-generation-plan.v1.json",
29
+ "assets/templates/canvas-feedback-eval.json",
30
+ "assets/templates/canvas-blocker-checklist.json",
31
+ "scripts/odb-workflow.sh",
32
+ "scripts/run-robustness-audit.sh",
22
33
  "scripts/validate-skill-assets.sh"
23
- )
34
+ ];
35
+
36
+ const jsonTemplates = [
37
+ "assets/templates/mode-flag-matrix.json",
38
+ "assets/templates/ops-request-envelope.json",
39
+ "assets/templates/cdp-forward-envelope.json",
40
+ "assets/templates/robustness-checklist.json",
41
+ "assets/templates/surface-audit-checklist.json",
42
+ "assets/templates/canvas-handshake-example.json",
43
+ "assets/templates/canvas-generation-plan.v1.json",
44
+ "assets/templates/canvas-feedback-eval.json",
45
+ "assets/templates/canvas-blocker-checklist.json"
46
+ ];
47
+
48
+ const executableScripts = [
49
+ "scripts/odb-workflow.sh",
50
+ "scripts/run-robustness-audit.sh",
51
+ "scripts/validate-skill-assets.sh"
52
+ ];
53
+
54
+ const skillDocMarkers = [
55
+ "npx opendevbrowser --help",
56
+ "npx opendevbrowser help",
57
+ "56 CLI commands, 49 tools, 38 `/ops` commands, 26 `/canvas` commands",
58
+ "mutationPolicy.allowedBeforePlan",
59
+ "canvas.code.bind",
60
+ "canvas.code.resolve",
61
+ "bound_app_runtime",
62
+ "annotate --stored"
63
+ ];
24
64
 
25
- json_templates=(
26
- "assets/templates/mode-flag-matrix.json"
27
- "assets/templates/ops-request-envelope.json"
28
- "assets/templates/cdp-forward-envelope.json"
65
+ const commandRefMarkers = [
66
+ "CLI commands: `56`",
67
+ "Plugin tools: `49`",
68
+ "`/ops` command names: `38`",
69
+ "`/canvas` command names: `26`",
70
+ "docs/SURFACE_REFERENCE.md",
71
+ "npx opendevbrowser help",
72
+ "canvas.session.open",
73
+ "canvas.session.attach",
74
+ "canvas.feedback.poll",
75
+ "canvas.code.bind",
76
+ "canvas.code.resolve",
77
+ "canvas.tab.sync",
78
+ "canvas.overlay.sync",
79
+ "feedback.heartbeat",
80
+ "governanceRequirements",
81
+ "generationPlanRequirements",
82
+ "mutationPolicy",
83
+ "code-sync",
84
+ "parity",
85
+ "plan_required",
86
+ "annotate --stored",
87
+ "storage",
88
+ "opencode",
89
+ "codex",
90
+ "claudecode",
91
+ "ampcli"
92
+ ];
93
+
94
+ const workflowMarkers = [
95
+ "canvas-preflight",
96
+ "canvas-feedback-eval"
97
+ ];
98
+
99
+ const canvasPlaybookMarkers = [
100
+ "canvas.session.open",
101
+ "canvas.plan.set",
102
+ "canvas.feedback.poll",
103
+ "CANVAS-01",
104
+ "CANVAS-07"
105
+ ];
106
+
107
+ const canvasTemplateMarkers = [
108
+ "CANVAS-01",
109
+ "CANVAS-02",
110
+ "CANVAS-03",
111
+ "CANVAS-04",
112
+ "CANVAS-05",
113
+ "CANVAS-06",
114
+ "CANVAS-07"
115
+ ];
116
+
117
+ const templateMarkerPaths = [
118
+ "assets/templates/canvas-feedback-eval.json",
119
+ "assets/templates/canvas-blocker-checklist.json",
29
120
  "assets/templates/robustness-checklist.json"
30
- "assets/templates/surface-audit-checklist.json"
31
- )
32
-
33
- command_ref_markers=(
34
- 'CLI commands: `55`'
35
- 'Plugin tools: `48`'
36
- '`/ops` command names: `38`'
37
- 'docs/SURFACE_REFERENCE.md'
38
- 'opencode'
39
- 'codex'
40
- 'claudecode'
41
- 'ampcli'
42
- )
43
-
44
- status=0
45
-
46
- for rel_path in "${required_paths[@]}"; do
47
- full_path="$skill_root/$rel_path"
48
- if [[ ! -f "$full_path" ]]; then
49
- echo "Missing required asset: $rel_path" >&2
50
- status=1
51
- fi
52
- done
53
-
54
- for rel_path in "scripts/odb-workflow.sh" "scripts/run-robustness-audit.sh" "scripts/validate-skill-assets.sh"; do
55
- full_path="$skill_root/$rel_path"
56
- if [[ -f "$full_path" && ! -x "$full_path" ]]; then
57
- echo "Script is not executable: $rel_path" >&2
58
- status=1
59
- fi
60
- done
61
-
62
- for rel_path in "${json_templates[@]}"; do
63
- full_path="$skill_root/$rel_path"
64
- if [[ -f "$full_path" ]]; then
65
- if ! node -e 'const fs=require("fs"); JSON.parse(fs.readFileSync(process.argv[1], "utf8"));' "$full_path" >/dev/null 2>&1; then
66
- echo "Invalid JSON template: $rel_path" >&2
67
- status=1
68
- fi
69
- fi
70
- done
71
-
72
- for rel_path in "${required_paths[@]}"; do
73
- if ! grep -Fq "$rel_path" "$skill_file"; then
74
- echo "SKILL.md missing reference: $rel_path" >&2
75
- status=1
76
- fi
77
- done
78
-
79
- command_ref_path="$skill_root/artifacts/command-channel-reference.md"
80
- if [[ -f "$command_ref_path" ]]; then
81
- for marker in "${command_ref_markers[@]}"; do
82
- if ! grep -Fq "$marker" "$command_ref_path"; then
83
- echo "Command/channel reference missing marker: $marker" >&2
84
- status=1
85
- fi
86
- done
87
- fi
88
-
89
- if [[ $status -ne 0 ]]; then
90
- exit $status
91
- fi
92
-
93
- echo "Skill assets validated: ${#required_paths[@]} files referenced/present, ${#json_templates[@]} JSON templates parsed."
121
+ ];
122
+
123
+ const surfaceAuditPath = "assets/templates/surface-audit-checklist.json";
124
+ const surfaceAuditMarkers = [
125
+ "\"cliCommands\": 56",
126
+ "\"tools\": 49",
127
+ "\"opsCommands\": 38",
128
+ "\"canvasCommands\": 26",
129
+ "Canvas command names documented",
130
+ "Canvas code-sync surface documented",
131
+ "Annotation send/copy semantics documented"
132
+ ];
133
+
134
+ const failures = [];
135
+
136
+ const readUtf8 = (relPath) => fs.readFileSync(path.join(skillRoot, relPath), "utf8");
137
+ const hasMarker = (content, marker) => content.includes(marker);
138
+
139
+ for (const relPath of requiredPaths) {
140
+ if (!fs.existsSync(path.join(skillRoot, relPath))) {
141
+ failures.push(`Missing required asset: ${relPath}`);
142
+ }
143
+ }
144
+
145
+ for (const relPath of executableScripts) {
146
+ const fullPath = path.join(skillRoot, relPath);
147
+ if (!fs.existsSync(fullPath)) continue;
148
+ const mode = fs.statSync(fullPath).mode & 0o111;
149
+ if (mode === 0) {
150
+ failures.push(`Script is not executable: ${relPath}`);
151
+ }
152
+ }
153
+
154
+ for (const relPath of jsonTemplates) {
155
+ const fullPath = path.join(skillRoot, relPath);
156
+ if (!fs.existsSync(fullPath)) continue;
157
+ try {
158
+ JSON.parse(fs.readFileSync(fullPath, "utf8"));
159
+ } catch {
160
+ failures.push(`Invalid JSON template: ${relPath}`);
161
+ }
162
+ }
163
+
164
+ const skillDoc = fs.readFileSync(skillFile, "utf8");
165
+ for (const relPath of requiredPaths) {
166
+ if (!hasMarker(skillDoc, relPath)) {
167
+ failures.push(`SKILL.md missing reference: ${relPath}`);
168
+ }
169
+ }
170
+ for (const marker of skillDocMarkers) {
171
+ if (!hasMarker(skillDoc, marker)) {
172
+ failures.push(`SKILL.md missing marker: ${marker}`);
173
+ }
174
+ }
175
+
176
+ const commandRefPath = "artifacts/command-channel-reference.md";
177
+ if (fs.existsSync(path.join(skillRoot, commandRefPath))) {
178
+ const commandRef = readUtf8(commandRefPath);
179
+ for (const marker of commandRefMarkers) {
180
+ if (!hasMarker(commandRef, marker)) {
181
+ failures.push(`Command/channel reference missing marker: ${marker}`);
182
+ }
183
+ }
184
+ }
185
+
186
+ const workflowPath = "scripts/odb-workflow.sh";
187
+ if (fs.existsSync(path.join(skillRoot, workflowPath))) {
188
+ const workflow = readUtf8(workflowPath);
189
+ for (const marker of workflowMarkers) {
190
+ if (!hasMarker(workflow, marker)) {
191
+ failures.push(`Workflow router missing marker: ${marker}`);
192
+ }
193
+ }
194
+ }
195
+
196
+ const canvasPlaybookPath = "artifacts/canvas-governance-playbook.md";
197
+ if (fs.existsSync(path.join(skillRoot, canvasPlaybookPath))) {
198
+ const canvasPlaybook = readUtf8(canvasPlaybookPath);
199
+ for (const marker of canvasPlaybookMarkers) {
200
+ if (!hasMarker(canvasPlaybook, marker)) {
201
+ failures.push(`Canvas playbook missing marker: ${marker}`);
202
+ }
203
+ }
204
+ }
205
+
206
+ if (fs.existsSync(path.join(skillRoot, surfaceAuditPath))) {
207
+ const surfaceAudit = readUtf8(surfaceAuditPath);
208
+ for (const marker of surfaceAuditMarkers) {
209
+ if (!hasMarker(surfaceAudit, marker)) {
210
+ failures.push(`Surface audit checklist missing marker: ${marker}`);
211
+ }
212
+ }
213
+ }
214
+
215
+ for (const relPath of templateMarkerPaths) {
216
+ const fullPath = path.join(skillRoot, relPath);
217
+ if (!fs.existsSync(fullPath)) continue;
218
+ const content = fs.readFileSync(fullPath, "utf8");
219
+ for (const marker of canvasTemplateMarkers) {
220
+ if (!hasMarker(content, marker)) {
221
+ failures.push(`Canvas template missing marker (${marker}): ${relPath}`);
222
+ }
223
+ }
224
+ }
225
+
226
+ if (failures.length > 0) {
227
+ for (const failure of failures) {
228
+ console.error(failure);
229
+ }
230
+ process.exit(1);
231
+ }
232
+
233
+ console.log(`Skill assets validated: ${requiredPaths.length} files referenced/present, ${jsonTemplates.length} JSON templates parsed.`);
234
+ NODE