@1aboveio/skills 1.0.8 → 1.0.10

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 (214) hide show
  1. package/.codex-plugin/plugin.json +13 -0
  2. package/.codex-plugin/resources.json +1827 -0
  3. package/README.md +22 -0
  4. package/package.json +9 -2
  5. package/skills/app-dev/airflow/SKILL.md +1 -1
  6. package/skills/app-dev/airflow/release-check.mjs +3 -1
  7. package/skills/app-dev/android-foundation/SKILL.md +1 -1
  8. package/skills/app-dev/android-foundation/release-check.mjs +3 -1
  9. package/skills/app-dev/app-debug/SKILL.md +1 -1
  10. package/skills/app-dev/app-debug/release-check.mjs +3 -1
  11. package/skills/app-dev/better-auth/SKILL.md +1 -1
  12. package/skills/app-dev/better-auth/release-check.mjs +3 -1
  13. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  14. package/skills/app-dev/data-catalog/release-check.mjs +3 -1
  15. package/skills/app-dev/data-quality/SKILL.md +1 -1
  16. package/skills/app-dev/data-quality/release-check.mjs +3 -1
  17. package/skills/app-dev/ios-foundation/SKILL.md +1 -1
  18. package/skills/app-dev/ios-foundation/release-check.mjs +3 -1
  19. package/skills/app-dev/monorepo/SKILL.md +1 -1
  20. package/skills/app-dev/monorepo/release-check.mjs +3 -1
  21. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  22. package/skills/app-dev/nextjs-fullstack/release-check.mjs +3 -1
  23. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  24. package/skills/app-dev/prisma-setup/release-check.mjs +3 -1
  25. package/skills/app-dev/pyspark/SKILL.md +1 -1
  26. package/skills/app-dev/pyspark/release-check.mjs +3 -1
  27. package/skills/app-dev/python-backend/SKILL.md +1 -1
  28. package/skills/app-dev/python-backend/release-check.mjs +3 -1
  29. package/skills/app-dev/shadcn/SKILL.md +1 -1
  30. package/skills/app-dev/shadcn/release-check.mjs +3 -1
  31. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  32. package/skills/app-dev/zod-v4/release-check.mjs +3 -1
  33. package/skills/cicd/cloud-build/SKILL.md +1 -1
  34. package/skills/cicd/cloud-build/release-check.mjs +3 -1
  35. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  36. package/skills/cicd/cloud-debug/release-check.mjs +3 -1
  37. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  38. package/skills/cicd/cloud-deploy/release-check.mjs +3 -1
  39. package/skills/cicd/docker/SKILL.md +1 -1
  40. package/skills/cicd/docker/release-check.mjs +3 -1
  41. package/skills/cicd/github-actions/SKILL.md +1 -1
  42. package/skills/cicd/github-actions/release-check.mjs +3 -1
  43. package/skills/cicd/github-flow/SKILL.md +1 -1
  44. package/skills/cicd/github-flow/release-check.mjs +3 -1
  45. package/skills/cicd/google-cloud/SKILL.md +1 -1
  46. package/skills/cicd/google-cloud/release-check.mjs +3 -1
  47. package/skills/cicd/mergify/SKILL.md +1 -1
  48. package/skills/cicd/mergify/release-check.mjs +3 -1
  49. package/skills/cicd/podman/SKILL.md +1 -1
  50. package/skills/cicd/podman/release-check.mjs +3 -1
  51. package/skills/content/article-review/SKILL.md +1 -1
  52. package/skills/content/article-review/release-check.mjs +3 -1
  53. package/skills/content/article-to-image/SKILL.md +1 -1
  54. package/skills/content/article-to-image/release-check.mjs +3 -1
  55. package/skills/content/flowchart-svg/SKILL.md +1 -1
  56. package/skills/content/flowchart-svg/release-check.mjs +3 -1
  57. package/skills/content/image-gen/SKILL.md +1 -1
  58. package/skills/content/image-gen/release-check.mjs +3 -1
  59. package/skills/content/mermaid/SKILL.md +1 -1
  60. package/skills/content/mermaid/release-check.mjs +3 -1
  61. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  62. package/skills/content/wechat-article-writer/release-check.mjs +3 -1
  63. package/skills/content/wechat-publisher/SKILL.md +1 -1
  64. package/skills/content/wechat-publisher/release-check.mjs +3 -1
  65. package/skills/content/wechat-search/SKILL.md +1 -1
  66. package/skills/content/wechat-search/release-check.mjs +3 -1
  67. package/skills/content/xai-search/SKILL.md +88 -13
  68. package/skills/content/xai-search/release-check.mjs +3 -1
  69. package/skills/content/xai-search/scripts/xai_search.sh +125 -149
  70. package/skills/core/distill-writing/SKILL.md +1 -1
  71. package/skills/core/distill-writing/release-check.mjs +3 -1
  72. package/skills/core/doc-to-md/SKILL.md +1 -1
  73. package/skills/core/doc-to-md/release-check.mjs +3 -1
  74. package/skills/core/editorial-review/SKILL.md +1 -1
  75. package/skills/core/editorial-review/release-check.mjs +3 -1
  76. package/skills/core/house-style/SKILL.md +1 -1
  77. package/skills/core/house-style/release-check.mjs +3 -1
  78. package/skills/core/plain-language/SKILL.md +1 -1
  79. package/skills/core/plain-language/release-check.mjs +3 -1
  80. package/skills/core/polish-cn/SKILL.md +1 -1
  81. package/skills/core/polish-cn/release-check.mjs +3 -1
  82. package/skills/core/reg-parser/SKILL.md +1 -1
  83. package/skills/core/reg-parser/release-check.mjs +3 -1
  84. package/skills/core/terminology/SKILL.md +1 -1
  85. package/skills/core/terminology/release-check.mjs +3 -1
  86. package/skills/core/write-doc/SKILL.md +1 -1
  87. package/skills/core/write-doc/release-check.mjs +3 -1
  88. package/skills/engineering/better-review/SKILL.md +1 -1
  89. package/skills/engineering/better-review/release-check.mjs +3 -1
  90. package/skills/engineering/contributing/SKILL.md +1 -1
  91. package/skills/engineering/contributing/release-check.mjs +3 -1
  92. package/skills/engineering/e2e-test/SKILL.md +1 -1
  93. package/skills/engineering/e2e-test/release-check.mjs +3 -1
  94. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  95. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  96. package/skills/engineering/engineering-runtime/release-check.mjs +3 -1
  97. package/skills/engineering/engineering-runtime/scripts/installation-resolver.mjs +191 -0
  98. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +51 -10
  99. package/skills/engineering/ensure-coverage/SKILL.md +1 -1
  100. package/skills/engineering/ensure-coverage/release-check.mjs +3 -1
  101. package/skills/engineering/golden-path/SKILL.md +1 -1
  102. package/skills/engineering/golden-path/release-check.mjs +3 -1
  103. package/skills/engineering/harness-runtime/SKILL.md +1 -1
  104. package/skills/engineering/harness-runtime/release-check.mjs +3 -1
  105. package/skills/engineering/resolve-issues/SKILL.md +1 -1
  106. package/skills/engineering/resolve-issues/references/preflight.md +7 -0
  107. package/skills/engineering/resolve-issues/references/shared-modules.md +27 -0
  108. package/skills/engineering/resolve-issues/references/task-plan.md +5 -1
  109. package/skills/engineering/resolve-issues/release-check.mjs +3 -1
  110. package/skills/engineering/resolve-issues/scripts/active-installation.mjs +32 -0
  111. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +3 -0
  112. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +17 -1
  113. package/skills/engineering/resolve-release/SKILL.md +1 -1
  114. package/skills/engineering/resolve-release/release-check.mjs +3 -1
  115. package/skills/engineering/rush-issues/SKILL.md +1 -1
  116. package/skills/engineering/rush-issues/release-check.mjs +3 -1
  117. package/skills/engineering/rush-release/SKILL.md +1 -1
  118. package/skills/engineering/rush-release/release-check.mjs +3 -1
  119. package/skills/engineering/test-quality/SKILL.md +1 -1
  120. package/skills/engineering/test-quality/release-check.mjs +3 -1
  121. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  122. package/skills/risk-compliance/compliance-audit/release-check.mjs +3 -1
  123. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  124. package/skills/risk-compliance/contract-compare/release-check.mjs +3 -1
  125. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  126. package/skills/risk-compliance/contract-review/release-check.mjs +3 -1
  127. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  128. package/skills/risk-compliance/doc-authenticity/release-check.mjs +3 -1
  129. package/skills/risk-compliance/fraud-analysis/SKILL.md +1 -1
  130. package/skills/risk-compliance/fraud-analysis/release-check.mjs +3 -1
  131. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  132. package/skills/risk-compliance/payment-analysis/release-check.mjs +3 -1
  133. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  134. package/skills/risk-compliance/similar-domain/release-check.mjs +3 -1
  135. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
  136. package/skills/risk-compliance/tld-detection/release-check.mjs +3 -1
  137. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +0 -436
  138. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +0 -36
  139. package/skills/app-dev/data-quality/scripts/data-quality.test.mjs +0 -12
  140. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +0 -637
  141. package/skills/cicd/github-flow/scripts/flow.test.mjs +0 -114
  142. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +0 -108
  143. package/skills/cicd/mergify/scripts/audit.test.mjs +0 -201
  144. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +0 -106
  145. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +0 -30
  146. package/skills/cicd/mergify/scripts/stack-push.test.mjs +0 -233
  147. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +0 -1826
  148. package/skills/content/image-gen/scripts/credentials.test.mjs +0 -212
  149. package/skills/content/image-gen/scripts/options.test.mjs +0 -245
  150. package/skills/content/xai-search/tests/smoke_test.sh +0 -36
  151. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +0 -244
  152. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +0 -165
  153. package/skills/engineering/better-review/scripts/pr-context.test.mjs +0 -168
  154. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +0 -587
  155. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +0 -414
  156. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +0 -96
  157. package/skills/engineering/contributing/scripts/persist-conventions.test.mjs +0 -118
  158. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +0 -106
  159. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +0 -117
  160. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +0 -69
  161. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +0 -98
  162. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +0 -71
  163. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +0 -59
  164. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +0 -76
  165. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +0 -68
  166. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +0 -95
  167. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +0 -288
  168. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +0 -96
  169. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +0 -96
  170. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +0 -47
  171. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +0 -86
  172. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +0 -447
  173. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +0 -552
  174. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +0 -289
  175. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +0 -119
  176. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +0 -1457
  177. package/skills/engineering/harness-runtime/discover-models.test.mjs +0 -363
  178. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +0 -967
  179. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +0 -829
  180. package/skills/engineering/harness-runtime/model-catalog.test.mjs +0 -366
  181. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +0 -280
  182. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +0 -346
  183. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +0 -88
  184. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +0 -264
  185. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +0 -79
  186. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +0 -107
  187. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +0 -14
  188. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +0 -149
  189. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +0 -915
  190. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +0 -156
  191. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +0 -448
  192. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +0 -217
  193. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +0 -91
  194. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +0 -1060
  195. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +0 -458
  196. package/skills/engineering/resolve-release/scripts/apply.test.mjs +0 -99
  197. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +0 -100
  198. package/skills/engineering/resolve-release/scripts/flow.test.mjs +0 -340
  199. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +0 -101
  200. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +0 -426
  201. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +0 -659
  202. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +0 -317
  203. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +0 -291
  204. package/skills/engineering/resolve-release/scripts/plan.test.mjs +0 -428
  205. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +0 -591
  206. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +0 -119
  207. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +0 -104
  208. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +0 -14
  209. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +0 -12
  210. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +0 -212
  211. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +0 -14
  212. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +0 -14
  213. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +0 -134
  214. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +0 -520
@@ -1,187 +1,163 @@
1
1
  #!/usr/bin/env bash
2
- # xAI Search CLI - Search X (Twitter) and Web using xAI Responses API
3
- # Usage:
4
- # xai_search.sh x "query" [--handles user1,user2] [--from YYYY-MM-DD] [--to YYYY-MM-DD]
5
- # xai_search.sh web "query" [--domains domain1,domain2]
6
-
2
+ # xAI Search CLI - native X/Web tools through the Responses API.
7
3
  set -euo pipefail
8
4
 
9
- # Get API key from config or environment
10
- if [[ -z "${XAI_API_KEY:-}" ]]; then
11
- # Try to get from OpenClaw skill config
12
- if command -v jq &>/dev/null && [[ -f ~/.openclaw/openclaw.json ]]; then
13
- XAI_API_KEY=$(jq -r '.skills.entries["xai-search"].apiKey // empty' ~/.openclaw/openclaw.json 2>/dev/null || true)
14
- fi
15
- fi
16
-
17
- if [[ -z "${XAI_API_KEY:-}" ]]; then
18
- echo "ERROR: XAI_API_KEY not set. Set environment variable or configure in openclaw.json" >&2
19
- exit 1
20
- fi
5
+ usage() {
6
+ printf '%s\n' \
7
+ 'Usage: xai_search.sh {x|web} "query" [options]' \
8
+ '' \
9
+ ' --handles user1,user2 X only; at most 20 handles' \
10
+ ' --from YYYY-MM-DD X only; inclusive UTC midnight' \
11
+ ' --to YYYY-MM-DD X only; exclusive UTC midnight' \
12
+ ' --domains d1,d2 Web only; at most 5 domains' \
13
+ ' --model MODEL Default: grok-4-1-fast-reasoning' \
14
+ ' --json Raw JSON instead of text and citation URLs' \
15
+ ' --help Show this help' \
16
+ '' \
17
+ 'XAI_BASE_URL defaults to https://api.x.ai/v1; trailing slashes are removed.' \
18
+ 'Requests go only to <base>/responses (HTTPS); redirects are not followed.' \
19
+ 'XAI_API_KEY overrides skills.entries["xai-search"].apiKey in ~/.openclaw/openclaw.json.' \
20
+ 'For Sub2API, use its public /v1 base, a Grok-group key, and --model with an available model (e.g. grok-4.5).' \
21
+ 'Native search requires Responses, not REST Chat Completions or legacy search_parameters.' \
22
+ 'Handle/date filters do not constrain thread fetches. CSV entries must be nonempty.' \
23
+ 'Sub2API search-call surcharges are not exact upstream fetched-post/profile cost reconciliation.'
24
+ }
21
25
 
22
- if ! command -v jq &>/dev/null; then
23
- echo "ERROR: jq is required but not installed. Install jq to use this script." >&2
24
- exit 1
25
- fi
26
+ fail() { printf 'ERROR: %s\n' "$1" >&2; exit "${2:-2}"; }
26
27
 
28
+ if [[ "${1:-}" == --help || "${1:-}" == -h ]]; then usage; exit 0; fi
27
29
  MODE="${1:-}"
28
30
  QUERY="${2:-}"
29
-
30
- if [[ -z "$MODE" || -z "$QUERY" ]]; then
31
- echo "Usage:" >&2
32
- echo " xai_search.sh x \"query\" [options] # Search X (Twitter)" >&2
33
- echo " xai_search.sh web \"query\" [options] # Search the web" >&2
34
- echo "" >&2
35
- echo "Options:" >&2
36
- echo " --handles user1,user2 Only search posts from these handles (X only)" >&2
37
- echo " --from YYYY-MM-DD Start date" >&2
38
- echo " --to YYYY-MM-DD End date" >&2
39
- echo " --domains d1,d2 Only search these domains (web only)" >&2
40
- echo " --model MODEL Model to use (default: grok-4-1-fast-reasoning)" >&2
41
- echo " --json Output raw JSON response" >&2
42
- exit 2
43
- fi
44
-
31
+ if [[ -z "$MODE" || -z "$QUERY" ]]; then usage >&2; exit 2; fi
32
+ [[ "$MODE" == x || "$MODE" == web ]] || fail "mode must be 'web' or 'x'"
45
33
  shift 2
46
34
 
47
- # Parse options
48
35
  HANDLES=""
49
36
  FROM_DATE=""
50
37
  TO_DATE=""
51
38
  DOMAINS=""
52
39
  MODEL="grok-4-1-fast-reasoning"
53
40
  RAW_JSON=0
54
-
55
41
  while [[ $# -gt 0 ]]; do
56
- case $1 in
57
- --handles)
58
- HANDLES="$2"
59
- shift 2
60
- ;;
61
- --from)
62
- FROM_DATE="$2"
63
- shift 2
64
- ;;
65
- --to)
66
- TO_DATE="$2"
67
- shift 2
68
- ;;
69
- --domains)
70
- DOMAINS="$2"
71
- shift 2
72
- ;;
73
- --model)
74
- MODEL="$2"
75
- shift 2
76
- ;;
77
- --json)
78
- RAW_JSON=1
79
- shift
80
- ;;
81
- *)
82
- echo "Unknown option: $1" >&2
83
- exit 2
84
- ;;
42
+ case "$1" in
43
+ --handles|--from|--to|--domains|--model)
44
+ [[ $# -ge 2 && -n "${2//[[:space:]]/}" && "$2" != --* ]] || fail "$1 requires a value"
45
+ case "$1" in
46
+ --handles) HANDLES="$2" ;;
47
+ --from) FROM_DATE="$2" ;;
48
+ --to) TO_DATE="$2" ;;
49
+ --domains) DOMAINS="$2" ;;
50
+ --model) MODEL="$2" ;;
51
+ esac
52
+ shift 2 ;;
53
+ --json) RAW_JSON=1; shift ;;
54
+ *) fail 'Unknown option (use --help)' ;;
85
55
  esac
86
56
  done
87
57
 
88
- # Convert comma-delimited list to JSON array.
58
+ command -v jq &>/dev/null || fail 'jq is required but not installed.' 1
59
+ command -v curl &>/dev/null || fail 'curl is required but not installed.' 1
60
+
89
61
  csv_to_json_array() {
90
- local csv="$1"
91
- if [[ -z "$csv" ]]; then
92
- jq -cn '[]'
93
- else
94
- jq -cn --arg csv "$csv" '$csv | split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))'
95
- fi
62
+ jq -cen --arg csv "$1" --argjson max "$2" '
63
+ $csv | split(",") | map(gsub("^\\s+|\\s+$"; ""))
64
+ | select(length <= $max and all(.[]; length > 0))
65
+ ' 2>/dev/null
96
66
  }
97
67
 
98
- if [[ "$MODE" != "web" && "$MODE" != "x" ]]; then
99
- echo "ERROR: mode must be 'web' or 'x'" >&2
100
- exit 2
101
- fi
68
+ # Validate the calendar without depending on GNU/BSD date parsing differences.
69
+ valid_date() {
70
+ jq -en --arg date "$1" '
71
+ $date | capture("\\A(?<y>[0-9]{4})-(?<m>[0-9]{2})-(?<d>[0-9]{2})\\z")
72
+ | (.y|tonumber) as $y | (.m|tonumber) as $m | (.d|tonumber) as $d
73
+ | [31, (if ($y%400 == 0 or ($y%4 == 0 and $y%100 != 0)) then 29 else 28 end),
74
+ 31,30,31,30,31,31,30,31,30,31] as $days
75
+ | $y >= 1 and $m >= 1 and $m <= 12 and $d >= 1 and $d <= $days[$m-1]
76
+ ' >/dev/null 2>&1
77
+ }
102
78
 
103
- TOOLS_JSON=""
104
- if [[ "$MODE" == "web" ]]; then
79
+ [[ -z "$FROM_DATE" ]] || valid_date "$FROM_DATE" || fail '--from requires a valid YYYY-MM-DD calendar date'
80
+ [[ -z "$TO_DATE" ]] || valid_date "$TO_DATE" || fail '--to requires a valid YYYY-MM-DD calendar date'
81
+
82
+ if [[ "$MODE" == web ]]; then
105
83
  if [[ -n "$DOMAINS" ]]; then
106
- DOMAIN_ARRAY=$(csv_to_json_array "$DOMAINS")
107
- TOOLS_JSON=$(jq -cn --argjson domains "$DOMAIN_ARRAY" '[{type:"web_search", allowed_domains:$domains}]')
84
+ DOMAIN_ARRAY=$(csv_to_json_array "$DOMAINS" 5) || fail '--domains requires 1 to 5 nonempty CSV entries'
85
+ TOOLS_JSON=$(jq -cn --argjson domains "$DOMAIN_ARRAY" '[{type:"web_search", filters:{allowed_domains:$domains}}]')
108
86
  else
109
87
  TOOLS_JSON='[{"type":"web_search"}]'
110
88
  fi
111
89
  else
112
- HANDLE_ARRAY=$(csv_to_json_array "$HANDLES")
113
- TOOLS_JSON=$(jq -cn \
114
- --argjson handles "$HANDLE_ARRAY" \
115
- --arg from "$FROM_DATE" \
116
- --arg to "$TO_DATE" \
117
- '[{
118
- type: "x_search",
119
- allowed_x_handles: (if ($handles | length) > 0 then $handles else null end),
120
- from_date: (if $from != "" then $from else null end),
121
- to_date: (if $to != "" then $to else null end)
122
- }]')
90
+ HANDLE_ARRAY='[]'
91
+ if [[ -n "$HANDLES" ]]; then
92
+ HANDLE_ARRAY=$(csv_to_json_array "$HANDLES" 20) || fail '--handles requires 1 to 20 nonempty CSV entries'
93
+ fi
94
+ TOOLS_JSON=$(jq -cn --argjson handles "$HANDLE_ARRAY" --arg from "$FROM_DATE" --arg to "$TO_DATE" '
95
+ [{type:"x_search"}
96
+ + (if ($handles|length) > 0 then {allowed_x_handles:$handles} else {} end)
97
+ + (if $from != "" then {from_date:$from} else {} end)
98
+ + (if $to != "" then {to_date:$to} else {} end)]')
123
99
  fi
124
100
 
125
- REQUEST_JSON=$(jq -cn \
126
- --arg model "$MODEL" \
127
- --arg input "$QUERY" \
128
- --argjson tools "$TOOLS_JSON" \
129
- '{
130
- model: $model,
131
- input: $input,
132
- tools: $tools,
133
- tool_choice: "required"
134
- }')
135
-
136
- RESPONSE=$(curl -sS https://api.x.ai/v1/responses \
137
- -H "Authorization: Bearer $XAI_API_KEY" \
138
- -H "Content-Type: application/json" \
139
- -d "$REQUEST_JSON")
140
-
141
- ERROR=$(echo "$RESPONSE" | jq -r '.error.message // .error // empty' 2>/dev/null || true)
142
- if [[ -n "$ERROR" ]]; then
143
- echo "ERROR: $ERROR" >&2
144
- exit 1
101
+ BASE_URL="${XAI_BASE_URL-https://api.x.ai/v1}"
102
+ while [[ "$BASE_URL" == */ ]]; do BASE_URL="${BASE_URL%/}"; done
103
+ if ! jq -en --arg base "$BASE_URL" '$base | test("\\Ahttps://[^/@?#\\s]+(/[^?#\\s]*)?\\z")' >/dev/null; then
104
+ fail 'XAI_BASE_URL must be an HTTPS API base without credentials, query, or fragment'
145
105
  fi
146
106
 
147
- if [[ "$RAW_JSON" -eq 1 ]]; then
148
- echo "$RESPONSE" | jq '.'
149
- exit 0
107
+ if [[ -z "${XAI_API_KEY:-}" && -f "$HOME/.openclaw/openclaw.json" ]]; then
108
+ XAI_API_KEY=$(jq -r '.skills.entries["xai-search"].apiKey // empty' "$HOME/.openclaw/openclaw.json" 2>/dev/null || true)
109
+ fi
110
+ [[ -n "${XAI_API_KEY:-}" ]] || fail 'XAI_API_KEY not set. Set environment variable or configure in openclaw.json' 1
111
+ [[ "$XAI_API_KEY" != *$'\r'* && "$XAI_API_KEY" != *$'\n'* ]] || fail 'API key must not contain line breaks' 1
112
+
113
+ REQUEST_JSON=$(jq -cn --arg model "$MODEL" --arg input "$QUERY" --argjson tools "$TOOLS_JSON" \
114
+ '{model:$model, input:$input, tools:$tools, tool_choice:"required"}')
115
+
116
+ # Keep the key out of curl argv and private response files out of other users' reach.
117
+ umask 077
118
+ WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/xai-search.XXXXXXXX")
119
+ trap 'rm -rf "$WORK_DIR"' EXIT
120
+ printf 'Authorization: Bearer %s\nContent-Type: application/json\n' "$XAI_API_KEY" > "$WORK_DIR/headers"
121
+ if HTTP_STATUS=$(curl --disable --silent --show-error --globoff --proto '=https' \
122
+ --url "$BASE_URL/responses" --header "@$WORK_DIR/headers" \
123
+ --data "$REQUEST_JSON" --output "$WORK_DIR/response" --write-out '%{http_code}' 2>/dev/null); then
124
+ :
125
+ else
126
+ CURL_STATUS=$?
127
+ fail "API transport failed (curl exit $CURL_STATUS); check endpoint and connectivity" 1
150
128
  fi
151
129
 
152
- OUTPUT_TEXT=$(echo "$RESPONSE" | jq -r '
153
- if (.output_text // "") != "" then
154
- .output_text
155
- else
156
- [
157
- .output[]?
158
- | select(.type == "message" and .role == "assistant")
159
- | .content[]?
160
- | if .type == "output_text" or .type == "text" then (.text // "") else empty end
161
- ] | join("\n")
162
- end
163
- ' 2>/dev/null || true)
130
+ # Decode before redaction so JSON escapes cannot hide an echoed credential.
131
+ if ! RESPONSE=$(jq -cs --arg key "$XAI_API_KEY" '
132
+ if length == 1 and (.[0] | type == "object") then
133
+ .[0] | walk(
134
+ if type == "string" then split($key) | join("[REDACTED]")
135
+ elif type == "object" then with_entries(.key |= (split($key) | join("[REDACTED]")))
136
+ else . end)
137
+ else error("Expected one response object") end
138
+ ' "$WORK_DIR/response" 2>/dev/null); then
139
+ fail "API returned malformed or non-JSON response (HTTP $HTTP_STATUS)" 1
140
+ fi
141
+ ERROR=$(printf '%s' "$RESPONSE" | jq -r 'if .error then (.error | if type == "object" then (.message // "upstream error") else tostring end) else empty end' 2>/dev/null)
142
+ if [[ ! "$HTTP_STATUS" =~ ^2[0-9][0-9]$ ]]; then
143
+ fail "API HTTP $HTTP_STATUS: ${ERROR:-request failed}" 1
144
+ fi
145
+ [[ -z "$ERROR" ]] || fail "API error: $ERROR" 1
164
146
 
165
- if [[ -z "${OUTPUT_TEXT// }" ]]; then
166
- echo "ERROR: No response text from API" >&2
167
- exit 1
147
+ if [[ "$RAW_JSON" -eq 1 ]]; then
148
+ printf '%s' "$RESPONSE" | jq '.'
149
+ exit 0
168
150
  fi
169
151
 
170
- echo "$OUTPUT_TEXT"
171
-
172
- SOURCES=$(echo "$RESPONSE" | jq -r '
173
- [
174
- .output[]?
175
- | select(.type == "message" and .role == "assistant")
176
- | .content[]?
177
- | .annotations[]?
178
- | select(.type == "url_citation")
179
- | .url?
180
- ] | unique | .[]?
152
+ OUTPUT_TEXT=$(printf '%s' "$RESPONSE" | jq -r '
153
+ if (.output_text // "") != "" then .output_text
154
+ else [.output[]? | select(.type == "message" and .role == "assistant")
155
+ | .content[]? | if .type == "output_text" or .type == "text" then (.text // "") else empty end] | join("\n") end
181
156
  ' 2>/dev/null || true)
182
-
183
- if [[ -n "$SOURCES" ]]; then
184
- echo ""
185
- echo "Sources:"
186
- echo "$SOURCES"
187
- fi
157
+ [[ -n "${OUTPUT_TEXT//[[:space:]]/}" ]] || fail 'No response text from API' 1
158
+ printf '%s\n' "$OUTPUT_TEXT"
159
+ SOURCES=$(printf '%s' "$RESPONSE" | jq -r '
160
+ [.output[]? | select(.type == "message" and .role == "assistant") | .content[]?
161
+ | .annotations[]? | select(.type == "url_citation") | .url?] | unique | .[]?
162
+ ' 2>/dev/null || true)
163
+ if [[ -n "$SOURCES" ]]; then printf '\nSources:\n%s\n' "$SOURCES"; fi
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: distill-writing
3
3
  description: "Learn a house writing style from approved sample documents, or save an explicitly stated project document preference, into WRITING.md and writing/templates/. Use for sample-based style learning, house-style setup or refresh, and requests such as 'remember this for future PRDs' or 'make this our report default', including handoffs from write-doc or plain-language. Preserve manual edits and separate document types. NOT for drafting a document (write-doc) or saving chat-only preferences (plain-language)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Distill a writing style
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: doc-to-md
3
3
  description: "Convert documents (PDF, DOCX, PPTX, XLSX, images) to Markdown so agents can read them. Use as the preprocessing step whenever binary files need to enter agent context — contract review, compliance audit, document analysis, evidence review."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # doc-to-md
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: editorial-review
3
3
  description: "Review a document or generated report for what it says (does the reader get the answer, is the argument sound, is anything unsupported, obvious or repeated), then fix the content. Use to review, tighten or clarify a doc or report, and as the review step of write-doc and the report skills. NOT for Chinese wording (polish-cn) or code review (better-review)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Editorial review
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -3,7 +3,7 @@ name: house-style
3
3
  description: "Shared reference the writing skills read by path: WRITING.md lookup and precedence, template choice, gap markers, template shape, the bundled templates, and the default English and Chinese style guides. Never select or invoke it as a task."
4
4
  disable-model-invocation: true
5
5
  user-invocable: false
6
- release-version: 0.43.1
6
+ release-version: 0.44.1
7
7
  ---
8
8
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
9
9
  # House style
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: plain-language
3
3
  description: "Session mode: every reply and status line in plain language — lead with the point, everyday words, full sentences, no filler — in English or Chinese, until turned off. Enable by default when the project has an applicable WRITING.md, even without a slash command. Use for /plain-language, 'talk plainly', '说人话', and explicit requests to remember project reply preferences; /plain-language init persists the default and loading instructions. Save reply rules only under Agent replies; route document preferences to distill-writing. Ordinary mode toggles remain session-only. Turn off with '/plain-language off' or 'normal mode'. NOT for writing a document (write-doc) or reviewing one (editorial-review)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Plain language
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: polish-cn
3
3
  description: "Polish the Chinese wording of a finished document or report, with a script proving every number, date, identifier, link and protected term is unchanged; prefers a Chinese model and records which ran. Use for '中文润色' or as a report skill's last step. NOT for cutting or restructuring content (editorial-review) or translating (write-doc)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Polish Chinese
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -2,7 +2,7 @@
2
2
  name: reg-parser
3
3
  version: 1.1.0
4
4
  description: "Parse regulatory/scheme documents into structured outputs: convert a regulation (AML, VARS, PCI-DSS, KYC, GDPR) into an audit-ready compliance checklist, or trace contract clauses to a mandate source. Suggest proactively when a regulation PDF accompanies a contract review or compliance task. NOT general summarization (doc-to-md), or writing the gap analysis or policy from the checklist (write-doc)."
5
- release-version: 0.43.1
5
+ release-version: 0.44.1
6
6
  ---
7
7
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
8
8
  # reg-parser
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: terminology
3
3
  description: "Build and keep a project's TERMINOLOGY.md: the preferred term per concept in English, 简体 and 繁體, and the terms to avoid. Use to set it up from the project's documents, when the user settles or corrects a term, or when another writing skill needs the format. NOT for writing documents (write-doc) or the code domain model (domain-modeling)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Terminology
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: write-doc
3
3
  description: "Write or edit documents and compliance reports in the project's house style: BRD, PRD, gap analysis, technical spec, integration guide, proposal, policy, risk procedure, audit report, external assessment, management report or Visa VARS Review Report; English, Chinese or bilingual. Use automatically whenever asked to draft, write, revise or edit a document, without needing a slash command, including 'write up the findings'. Route explicit requests to remember a writing preference to its persistence owner. Markdown by default; export when requested. NOT for ordinary chat replies (plain-language), learning style from samples or preference-only saves (distill-writing), performing an audit (compliance-audit), or WeChat articles (wechat-article-writer)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Write a document
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -4,7 +4,7 @@ description: "Slash/explicit-only (/better-review). Single-agent adversarial rev
4
4
  disable-model-invocation: true
5
5
  dependencies:
6
6
  - engineering-runtime
7
- release-version: 0.43.1
7
+ release-version: 0.44.1
8
8
  ---
9
9
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
10
10
  # Better Review
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: contributing
3
3
  description: "The conventions a repo's CONTRIBUTING.md holds, starting with tracker routing: which tracker an issue belongs in (GitHub for engineering, Linear for product), duplicate search, and linking back to the source requirement. Use before creating any issue, spec, epic, ticket or sub-issue on GitHub or Linear, including inside /to-spec, /to-tickets and /triage, and whenever work that started from a Linear issue turns into engineering work. Also writes the rules as the Issue tracking section of the repo's CONTRIBUTING.md. NOT for delivering a PR (github-flow) or splitting work into slices (to-tickets)."
4
- release-version: 0.43.1
4
+ release-version: 0.44.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Contributing
@@ -2,7 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
- import { dirname, join } from 'node:path';
5
+ import { dirname, join, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -46,6 +46,8 @@ function writeCache(path, value) {
46
46
 
47
47
  function main(now = Date.now()) {
48
48
  if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const bundle = readJson(join(resolve(here, '../../..'), 'package.json'));
50
+ if (bundle.name === '@1aboveio/skills' && bundle.nativeCodex?.schemaVersion === 1) return;
49
51
  const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
52
  const name = frontmatterValue(skill, 'name');
51
53
  const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));