@1aboveio/skills 1.0.7 → 1.0.9

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 (224) 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 +92 -34
  8. package/skills/app-dev/android-foundation/assets/android-ci-job.yml +13 -7
  9. package/skills/app-dev/android-foundation/references/ci.md +23 -13
  10. package/skills/app-dev/android-foundation/references/delivery-focus.md +29 -0
  11. package/skills/app-dev/android-foundation/references/diagnosis.md +136 -0
  12. package/skills/app-dev/android-foundation/references/gotchas.md +20 -11
  13. package/skills/app-dev/android-foundation/references/setup.md +15 -6
  14. package/skills/app-dev/android-foundation/release-check.mjs +3 -1
  15. package/skills/app-dev/android-foundation/scripts/device-run.sh +148 -42
  16. package/skills/app-dev/app-debug/SKILL.md +1 -1
  17. package/skills/app-dev/app-debug/release-check.mjs +3 -1
  18. package/skills/app-dev/better-auth/SKILL.md +1 -1
  19. package/skills/app-dev/better-auth/release-check.mjs +3 -1
  20. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  21. package/skills/app-dev/data-catalog/release-check.mjs +3 -1
  22. package/skills/app-dev/data-quality/SKILL.md +1 -1
  23. package/skills/app-dev/data-quality/release-check.mjs +3 -1
  24. package/skills/app-dev/ios-foundation/SKILL.md +1 -1
  25. package/skills/app-dev/ios-foundation/release-check.mjs +3 -1
  26. package/skills/app-dev/monorepo/SKILL.md +1 -1
  27. package/skills/app-dev/monorepo/release-check.mjs +3 -1
  28. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  29. package/skills/app-dev/nextjs-fullstack/release-check.mjs +3 -1
  30. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  31. package/skills/app-dev/prisma-setup/release-check.mjs +3 -1
  32. package/skills/app-dev/pyspark/SKILL.md +1 -1
  33. package/skills/app-dev/pyspark/release-check.mjs +3 -1
  34. package/skills/app-dev/python-backend/SKILL.md +1 -1
  35. package/skills/app-dev/python-backend/release-check.mjs +3 -1
  36. package/skills/app-dev/shadcn/SKILL.md +1 -1
  37. package/skills/app-dev/shadcn/release-check.mjs +3 -1
  38. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  39. package/skills/app-dev/zod-v4/release-check.mjs +3 -1
  40. package/skills/cicd/cloud-build/SKILL.md +1 -1
  41. package/skills/cicd/cloud-build/release-check.mjs +3 -1
  42. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  43. package/skills/cicd/cloud-debug/release-check.mjs +3 -1
  44. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  45. package/skills/cicd/cloud-deploy/release-check.mjs +3 -1
  46. package/skills/cicd/docker/SKILL.md +1 -1
  47. package/skills/cicd/docker/release-check.mjs +3 -1
  48. package/skills/cicd/github-actions/SKILL.md +1 -1
  49. package/skills/cicd/github-actions/release-check.mjs +3 -1
  50. package/skills/cicd/github-flow/SKILL.md +1 -1
  51. package/skills/cicd/github-flow/release-check.mjs +3 -1
  52. package/skills/cicd/google-cloud/SKILL.md +1 -1
  53. package/skills/cicd/google-cloud/release-check.mjs +3 -1
  54. package/skills/cicd/mergify/SKILL.md +1 -1
  55. package/skills/cicd/mergify/release-check.mjs +3 -1
  56. package/skills/cicd/podman/SKILL.md +1 -1
  57. package/skills/cicd/podman/release-check.mjs +3 -1
  58. package/skills/content/article-review/SKILL.md +1 -1
  59. package/skills/content/article-review/release-check.mjs +3 -1
  60. package/skills/content/article-to-image/SKILL.md +1 -1
  61. package/skills/content/article-to-image/release-check.mjs +3 -1
  62. package/skills/content/flowchart-svg/SKILL.md +1 -1
  63. package/skills/content/flowchart-svg/release-check.mjs +3 -1
  64. package/skills/content/image-gen/SKILL.md +1 -1
  65. package/skills/content/image-gen/release-check.mjs +3 -1
  66. package/skills/content/mermaid/SKILL.md +1 -1
  67. package/skills/content/mermaid/release-check.mjs +3 -1
  68. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  69. package/skills/content/wechat-article-writer/release-check.mjs +3 -1
  70. package/skills/content/wechat-publisher/SKILL.md +1 -1
  71. package/skills/content/wechat-publisher/release-check.mjs +3 -1
  72. package/skills/content/wechat-search/SKILL.md +1 -1
  73. package/skills/content/wechat-search/release-check.mjs +3 -1
  74. package/skills/content/xai-search/SKILL.md +88 -13
  75. package/skills/content/xai-search/release-check.mjs +3 -1
  76. package/skills/content/xai-search/scripts/xai_search.sh +125 -149
  77. package/skills/core/distill-writing/SKILL.md +1 -1
  78. package/skills/core/distill-writing/release-check.mjs +3 -1
  79. package/skills/core/doc-to-md/SKILL.md +1 -1
  80. package/skills/core/doc-to-md/release-check.mjs +3 -1
  81. package/skills/core/editorial-review/SKILL.md +1 -1
  82. package/skills/core/editorial-review/release-check.mjs +3 -1
  83. package/skills/core/house-style/SKILL.md +1 -1
  84. package/skills/core/house-style/release-check.mjs +3 -1
  85. package/skills/core/plain-language/SKILL.md +1 -1
  86. package/skills/core/plain-language/release-check.mjs +3 -1
  87. package/skills/core/polish-cn/SKILL.md +1 -1
  88. package/skills/core/polish-cn/release-check.mjs +3 -1
  89. package/skills/core/reg-parser/SKILL.md +1 -1
  90. package/skills/core/reg-parser/release-check.mjs +3 -1
  91. package/skills/core/terminology/SKILL.md +1 -1
  92. package/skills/core/terminology/release-check.mjs +3 -1
  93. package/skills/core/write-doc/SKILL.md +1 -1
  94. package/skills/core/write-doc/release-check.mjs +3 -1
  95. package/skills/engineering/better-review/SKILL.md +1 -1
  96. package/skills/engineering/better-review/release-check.mjs +3 -1
  97. package/skills/engineering/contributing/SKILL.md +1 -1
  98. package/skills/engineering/contributing/release-check.mjs +3 -1
  99. package/skills/engineering/e2e-test/SKILL.md +1 -1
  100. package/skills/engineering/e2e-test/release-check.mjs +3 -1
  101. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  102. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  103. package/skills/engineering/engineering-runtime/release-check.mjs +3 -1
  104. package/skills/engineering/engineering-runtime/scripts/installation-resolver.mjs +191 -0
  105. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +51 -10
  106. package/skills/engineering/ensure-coverage/SKILL.md +1 -1
  107. package/skills/engineering/ensure-coverage/release-check.mjs +3 -1
  108. package/skills/engineering/golden-path/SKILL.md +1 -1
  109. package/skills/engineering/golden-path/release-check.mjs +3 -1
  110. package/skills/engineering/harness-runtime/SKILL.md +1 -1
  111. package/skills/engineering/harness-runtime/release-check.mjs +3 -1
  112. package/skills/engineering/resolve-issues/SKILL.md +11 -20
  113. package/skills/engineering/resolve-issues/references/delivery-progress.md +63 -0
  114. package/skills/engineering/resolve-issues/references/expire.md +24 -11
  115. package/skills/engineering/resolve-issues/references/implementation.md +9 -1
  116. package/skills/engineering/resolve-issues/references/preflight.md +7 -0
  117. package/skills/engineering/resolve-issues/references/shared-modules.md +27 -0
  118. package/skills/engineering/resolve-issues/references/task-plan.md +12 -5
  119. package/skills/engineering/resolve-issues/release-check.mjs +3 -1
  120. package/skills/engineering/resolve-issues/scripts/active-installation.mjs +32 -0
  121. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +3 -0
  122. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +17 -1
  123. package/skills/engineering/resolve-release/SKILL.md +1 -1
  124. package/skills/engineering/resolve-release/release-check.mjs +3 -1
  125. package/skills/engineering/rush-issues/SKILL.md +5 -2
  126. package/skills/engineering/rush-issues/release-check.mjs +3 -1
  127. package/skills/engineering/rush-release/SKILL.md +1 -1
  128. package/skills/engineering/rush-release/release-check.mjs +3 -1
  129. package/skills/engineering/test-quality/SKILL.md +1 -1
  130. package/skills/engineering/test-quality/release-check.mjs +3 -1
  131. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  132. package/skills/risk-compliance/compliance-audit/release-check.mjs +3 -1
  133. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  134. package/skills/risk-compliance/contract-compare/release-check.mjs +3 -1
  135. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  136. package/skills/risk-compliance/contract-review/release-check.mjs +3 -1
  137. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  138. package/skills/risk-compliance/doc-authenticity/release-check.mjs +3 -1
  139. package/skills/risk-compliance/fraud-analysis/SKILL.md +1 -1
  140. package/skills/risk-compliance/fraud-analysis/release-check.mjs +3 -1
  141. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  142. package/skills/risk-compliance/payment-analysis/release-check.mjs +3 -1
  143. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  144. package/skills/risk-compliance/similar-domain/release-check.mjs +3 -1
  145. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
  146. package/skills/risk-compliance/tld-detection/release-check.mjs +3 -1
  147. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +0 -172
  148. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +0 -36
  149. package/skills/app-dev/data-quality/scripts/data-quality.test.mjs +0 -12
  150. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +0 -637
  151. package/skills/cicd/github-flow/scripts/flow.test.mjs +0 -114
  152. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +0 -108
  153. package/skills/cicd/mergify/scripts/audit.test.mjs +0 -201
  154. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +0 -106
  155. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +0 -30
  156. package/skills/cicd/mergify/scripts/stack-push.test.mjs +0 -233
  157. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +0 -1826
  158. package/skills/content/image-gen/scripts/credentials.test.mjs +0 -212
  159. package/skills/content/image-gen/scripts/options.test.mjs +0 -245
  160. package/skills/content/xai-search/tests/smoke_test.sh +0 -36
  161. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +0 -244
  162. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +0 -165
  163. package/skills/engineering/better-review/scripts/pr-context.test.mjs +0 -168
  164. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +0 -587
  165. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +0 -414
  166. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +0 -96
  167. package/skills/engineering/contributing/scripts/persist-conventions.test.mjs +0 -118
  168. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +0 -106
  169. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +0 -117
  170. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +0 -69
  171. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +0 -98
  172. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +0 -71
  173. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +0 -59
  174. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +0 -76
  175. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +0 -68
  176. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +0 -95
  177. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +0 -288
  178. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +0 -96
  179. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +0 -96
  180. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +0 -47
  181. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +0 -86
  182. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +0 -447
  183. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +0 -552
  184. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +0 -289
  185. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +0 -119
  186. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +0 -1457
  187. package/skills/engineering/harness-runtime/discover-models.test.mjs +0 -363
  188. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +0 -967
  189. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +0 -829
  190. package/skills/engineering/harness-runtime/model-catalog.test.mjs +0 -366
  191. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +0 -280
  192. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +0 -346
  193. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +0 -88
  194. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +0 -264
  195. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +0 -79
  196. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +0 -107
  197. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +0 -14
  198. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +0 -149
  199. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +0 -915
  200. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +0 -156
  201. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +0 -448
  202. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +0 -217
  203. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +0 -91
  204. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +0 -1060
  205. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +0 -458
  206. package/skills/engineering/resolve-release/scripts/apply.test.mjs +0 -99
  207. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +0 -100
  208. package/skills/engineering/resolve-release/scripts/flow.test.mjs +0 -340
  209. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +0 -101
  210. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +0 -426
  211. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +0 -659
  212. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +0 -317
  213. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +0 -291
  214. package/skills/engineering/resolve-release/scripts/plan.test.mjs +0 -428
  215. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +0 -591
  216. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +0 -119
  217. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +0 -104
  218. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +0 -14
  219. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +0 -12
  220. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +0 -212
  221. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +0 -14
  222. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +0 -14
  223. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +0 -134
  224. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +0 -520
@@ -8,8 +8,8 @@ metadata:
8
8
  apiKey:
9
9
  type: secret
10
10
  required: true
11
- description: xAI API key (get from console.x.ai)
12
- release-version: 0.43.0
11
+ description: API key for direct xAI or the explicitly configured Responses gateway
12
+ release-version: 0.44.0
13
13
  ---
14
14
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
15
15
  # xAI Search (X/Twitter + Web)
@@ -18,10 +18,48 @@ Search X (formerly Twitter) and the web in real time using xAI's Grok live-searc
18
18
 
19
19
  ## Prerequisites
20
20
 
21
- 1. **Get xAI API key** from [console.x.ai](https://console.x.ai)
22
- 2. Configure in OpenClaw: `skills.entries.xai-search.apiKey`, or set `XAI_API_KEY` in the environment.
21
+ 1. Choose direct xAI or a Responses-compatible gateway, as below.
22
+ 2. Set `XAI_API_KEY`, or configure `skills.entries["xai-search"].apiKey` in
23
+ `~/.openclaw/openclaw.json`. A nonempty environment key takes precedence.
23
24
  3. `jq` and `curl` must be available.
24
25
 
26
+ ## Endpoint and credentials
27
+
28
+ With no new configuration, requests still go to `https://api.x.ai/v1/responses`
29
+ with the default model `grok-4-1-fast-reasoning`. Get a direct xAI key from
30
+ [console.x.ai](https://console.x.ai).
31
+
32
+ ```bash
33
+ export XAI_API_KEY='<direct-xai-key>'
34
+ scripts/xai_search.sh x "latest xAI announcements"
35
+ ```
36
+
37
+ For Sub2API, use the deployment's **public HTTPS API base ending in `/v1`**, not
38
+ an internal OAuth proxy URL. Use a **Sub2API API key assigned to a Grok group**,
39
+ not the direct xAI key. Select a model that this group/account actually exposes:
40
+
41
+ ```bash
42
+ export XAI_BASE_URL='https://sub2api.example.com/v1'
43
+ export XAI_API_KEY='<sub2api-grok-group-key>'
44
+ scripts/xai_search.sh x "latest xAI announcements" --model grok-4.5
45
+ ```
46
+
47
+ The example hostname is a placeholder for your deployment. `grok-4.5` is an
48
+ example supported by the inspected Sub2API checkout, not an entitlement promise.
49
+ Model mappings and available names depend on the deployment and subscription
50
+ account; do not assume every public xAI model is available.
51
+
52
+ `XAI_BASE_URL` defaults to `https://api.x.ai/v1`. The CLI removes all trailing
53
+ slashes and appends `/responses` exactly once, so configure an API base, not a full
54
+ Responses URL. An explicitly empty base is invalid. Bases must use HTTPS and
55
+ must not contain URL credentials, query parameters, or fragments. The selected
56
+ key goes only to this endpoint: there is no automatic direct-xAI fallback and
57
+ redirects are not followed. Unset `XAI_BASE_URL` and restore a direct key to
58
+ return to direct xAI. Keep keys out of prompts, command output, and committed files.
59
+
60
+ Native `x_search` and `web_search` require **Responses**. Do not use REST Chat
61
+ Completions or removed `search_parameters` for this workflow.
62
+
25
63
  ## Invocation
26
64
 
27
65
  Run the bundled script. Pass the skill directory's absolute path or `cd` into it first — the script lives at `scripts/xai_search.sh` relative to this SKILL.md.
@@ -43,21 +81,36 @@ scripts/xai_search.sh web "AI research" --domains arxiv.org,openai.com
43
81
 
44
82
  | Parameter | Applies to | Description |
45
83
  |-----------|------------|-------------|
46
- | `--handles user1,user2` | `x` | Restrict to posts from these handles |
47
- | `--from YYYY-MM-DD` | `x` | Start date (inclusive) |
48
- | `--to YYYY-MM-DD` | `x` | End date (inclusive) |
49
- | `--domains d1,d2` | `web` | Restrict to these domains |
84
+ | `--handles user1,user2` | `x` | Restrict to posts from these handles; at most 20 |
85
+ | `--from YYYY-MM-DD` | `x` | Inclusive start at UTC midnight |
86
+ | `--to YYYY-MM-DD` | `x` | Exclusive end at UTC midnight |
87
+ | `--domains d1,d2` | `web` | Restrict to these domains; at most 5 |
50
88
  | `--model MODEL` | both | Override model (default: `grok-4-1-fast-reasoning`) |
51
89
  | `--json` | both | Print the raw JSON response instead of formatted text + sources |
90
+ | `--help` | both | Show configuration, date boundaries, and limits without credentials |
91
+
92
+ For example, `--from 2026-01-01 --to 2026-02-01` includes January 1 at
93
+ 00:00 UTC through, but not including, February 1 at 00:00 UTC. Dates must be real
94
+ calendar dates in `YYYY-MM-DD` form. **Handle/date filters do not constrain thread
95
+ fetches.** CSV entries are trimmed; empty or whitespace-only entries and lists
96
+ above the limit are rejected before a request. Options that take values require
97
+ a nonempty value. Web domains are sent as `tools[].filters.allowed_domains`.
52
98
 
53
99
  The script prints the assistant's text answer followed by a `Sources:` block of cited URLs.
100
+ `--json` preserves the response JSON instead. Any echoed API key is redacted in
101
+ both modes. HTTP errors, transport failures, malformed/non-JSON responses, and
102
+ formatted responses without text exit nonzero; upstream HTML and curl diagnostics
103
+ are not printed because they may contain credentials.
104
+
105
+ ## Models and billing
54
106
 
55
- ## Models
107
+ `--model` overrides the unchanged direct default `grok-4-1-fast-reasoning`.
108
+ Choose the exact name exposed by your direct account or gateway's model mapping.
109
+ A gateway key and model must belong to the configured Grok group.
56
110
 
57
- | Model | Description |
58
- |-------|-------------|
59
- | `grok-4-1-fast-reasoning` | Default. Fast reasoning variant, 2M context, strong tool calling. |
60
- | `grok-4-1-fast-non-reasoning` | Same family, no chain-of-thought; cheaper for simple lookups. |
111
+ Sub2API may charge a search-call surcharge. Those call counts need not match
112
+ current upstream X pricing based on fetched posts/profiles, so do not use them
113
+ as exact upstream cost reconciliation.
61
114
 
62
115
  ## API Usage (curl)
63
116
 
@@ -73,6 +126,28 @@ curl https://api.x.ai/v1/responses \
73
126
  }'
74
127
  ```
75
128
 
129
+ ## Verification
130
+
131
+ The public CLI tests are offline, use a temporary HOME and a PATH-injected curl
132
+ stand-in, and need no real key or network:
133
+
134
+ ```bash
135
+ node --test skills/utils/xai-search/scripts/xai_search.test.mjs
136
+ ```
137
+
138
+ Do not run a live smoke implicitly. It makes paid requests and requires explicit
139
+ opt-in plus a non-secret account label. Set the endpoint, key, and model for the
140
+ account being tested, then run from the skill directory:
141
+
142
+ ```bash
143
+ XAI_LIVE_SMOKE=1 XAI_SMOKE_ACCOUNT='my-grok-group' XAI_SMOKE_MODEL='grok-4.5' \
144
+ bash tests/smoke_test.sh
145
+ ```
146
+
147
+ The smoke prints the tested account label and model. Offline capture proves the
148
+ client request, not live account entitlement, filter enforcement, or citation
149
+ fidelity. Those remain unverified until an explicitly authorized live test.
150
+
76
151
  ## Related Skills
77
152
 
78
153
  - `gemini` skill (when installed) — alternative for general research
@@ -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,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.0
4
+ release-version: 0.44.0
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.0
4
+ release-version: 0.44.0
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.0
4
+ release-version: 0.44.0
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.0
6
+ release-version: 0.44.0
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.0
4
+ release-version: 0.44.0
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.0
4
+ release-version: 0.44.0
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'));