@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.
- package/.codex-plugin/plugin.json +13 -0
- package/.codex-plugin/resources.json +1827 -0
- package/README.md +22 -0
- package/package.json +9 -2
- package/skills/app-dev/airflow/SKILL.md +1 -1
- package/skills/app-dev/airflow/release-check.mjs +3 -1
- package/skills/app-dev/android-foundation/SKILL.md +92 -34
- package/skills/app-dev/android-foundation/assets/android-ci-job.yml +13 -7
- package/skills/app-dev/android-foundation/references/ci.md +23 -13
- package/skills/app-dev/android-foundation/references/delivery-focus.md +29 -0
- package/skills/app-dev/android-foundation/references/diagnosis.md +136 -0
- package/skills/app-dev/android-foundation/references/gotchas.md +20 -11
- package/skills/app-dev/android-foundation/references/setup.md +15 -6
- package/skills/app-dev/android-foundation/release-check.mjs +3 -1
- package/skills/app-dev/android-foundation/scripts/device-run.sh +148 -42
- package/skills/app-dev/app-debug/SKILL.md +1 -1
- package/skills/app-dev/app-debug/release-check.mjs +3 -1
- package/skills/app-dev/better-auth/SKILL.md +1 -1
- package/skills/app-dev/better-auth/release-check.mjs +3 -1
- package/skills/app-dev/data-catalog/SKILL.md +1 -1
- package/skills/app-dev/data-catalog/release-check.mjs +3 -1
- package/skills/app-dev/data-quality/SKILL.md +1 -1
- package/skills/app-dev/data-quality/release-check.mjs +3 -1
- package/skills/app-dev/ios-foundation/SKILL.md +1 -1
- package/skills/app-dev/ios-foundation/release-check.mjs +3 -1
- package/skills/app-dev/monorepo/SKILL.md +1 -1
- package/skills/app-dev/monorepo/release-check.mjs +3 -1
- package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
- package/skills/app-dev/nextjs-fullstack/release-check.mjs +3 -1
- package/skills/app-dev/prisma-setup/SKILL.md +1 -1
- package/skills/app-dev/prisma-setup/release-check.mjs +3 -1
- package/skills/app-dev/pyspark/SKILL.md +1 -1
- package/skills/app-dev/pyspark/release-check.mjs +3 -1
- package/skills/app-dev/python-backend/SKILL.md +1 -1
- package/skills/app-dev/python-backend/release-check.mjs +3 -1
- package/skills/app-dev/shadcn/SKILL.md +1 -1
- package/skills/app-dev/shadcn/release-check.mjs +3 -1
- package/skills/app-dev/zod-v4/SKILL.md +1 -1
- package/skills/app-dev/zod-v4/release-check.mjs +3 -1
- package/skills/cicd/cloud-build/SKILL.md +1 -1
- package/skills/cicd/cloud-build/release-check.mjs +3 -1
- package/skills/cicd/cloud-debug/SKILL.md +1 -1
- package/skills/cicd/cloud-debug/release-check.mjs +3 -1
- package/skills/cicd/cloud-deploy/SKILL.md +1 -1
- package/skills/cicd/cloud-deploy/release-check.mjs +3 -1
- package/skills/cicd/docker/SKILL.md +1 -1
- package/skills/cicd/docker/release-check.mjs +3 -1
- package/skills/cicd/github-actions/SKILL.md +1 -1
- package/skills/cicd/github-actions/release-check.mjs +3 -1
- package/skills/cicd/github-flow/SKILL.md +1 -1
- package/skills/cicd/github-flow/release-check.mjs +3 -1
- package/skills/cicd/google-cloud/SKILL.md +1 -1
- package/skills/cicd/google-cloud/release-check.mjs +3 -1
- package/skills/cicd/mergify/SKILL.md +1 -1
- package/skills/cicd/mergify/release-check.mjs +3 -1
- package/skills/cicd/podman/SKILL.md +1 -1
- package/skills/cicd/podman/release-check.mjs +3 -1
- package/skills/content/article-review/SKILL.md +1 -1
- package/skills/content/article-review/release-check.mjs +3 -1
- package/skills/content/article-to-image/SKILL.md +1 -1
- package/skills/content/article-to-image/release-check.mjs +3 -1
- package/skills/content/flowchart-svg/SKILL.md +1 -1
- package/skills/content/flowchart-svg/release-check.mjs +3 -1
- package/skills/content/image-gen/SKILL.md +1 -1
- package/skills/content/image-gen/release-check.mjs +3 -1
- package/skills/content/mermaid/SKILL.md +1 -1
- package/skills/content/mermaid/release-check.mjs +3 -1
- package/skills/content/wechat-article-writer/SKILL.md +1 -1
- package/skills/content/wechat-article-writer/release-check.mjs +3 -1
- package/skills/content/wechat-publisher/SKILL.md +1 -1
- package/skills/content/wechat-publisher/release-check.mjs +3 -1
- package/skills/content/wechat-search/SKILL.md +1 -1
- package/skills/content/wechat-search/release-check.mjs +3 -1
- package/skills/content/xai-search/SKILL.md +88 -13
- package/skills/content/xai-search/release-check.mjs +3 -1
- package/skills/content/xai-search/scripts/xai_search.sh +125 -149
- package/skills/core/distill-writing/SKILL.md +1 -1
- package/skills/core/distill-writing/release-check.mjs +3 -1
- package/skills/core/doc-to-md/SKILL.md +1 -1
- package/skills/core/doc-to-md/release-check.mjs +3 -1
- package/skills/core/editorial-review/SKILL.md +1 -1
- package/skills/core/editorial-review/release-check.mjs +3 -1
- package/skills/core/house-style/SKILL.md +1 -1
- package/skills/core/house-style/release-check.mjs +3 -1
- package/skills/core/plain-language/SKILL.md +1 -1
- package/skills/core/plain-language/release-check.mjs +3 -1
- package/skills/core/polish-cn/SKILL.md +1 -1
- package/skills/core/polish-cn/release-check.mjs +3 -1
- package/skills/core/reg-parser/SKILL.md +1 -1
- package/skills/core/reg-parser/release-check.mjs +3 -1
- package/skills/core/terminology/SKILL.md +1 -1
- package/skills/core/terminology/release-check.mjs +3 -1
- package/skills/core/write-doc/SKILL.md +1 -1
- package/skills/core/write-doc/release-check.mjs +3 -1
- package/skills/engineering/better-review/SKILL.md +1 -1
- package/skills/engineering/better-review/release-check.mjs +3 -1
- package/skills/engineering/contributing/SKILL.md +1 -1
- package/skills/engineering/contributing/release-check.mjs +3 -1
- package/skills/engineering/e2e-test/SKILL.md +1 -1
- package/skills/engineering/e2e-test/release-check.mjs +3 -1
- package/skills/engineering/engineering-runtime/SKILL.md +1 -1
- package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
- package/skills/engineering/engineering-runtime/release-check.mjs +3 -1
- package/skills/engineering/engineering-runtime/scripts/installation-resolver.mjs +191 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +51 -10
- package/skills/engineering/ensure-coverage/SKILL.md +1 -1
- package/skills/engineering/ensure-coverage/release-check.mjs +3 -1
- package/skills/engineering/golden-path/SKILL.md +1 -1
- package/skills/engineering/golden-path/release-check.mjs +3 -1
- package/skills/engineering/harness-runtime/SKILL.md +1 -1
- package/skills/engineering/harness-runtime/release-check.mjs +3 -1
- package/skills/engineering/resolve-issues/SKILL.md +11 -20
- package/skills/engineering/resolve-issues/references/delivery-progress.md +63 -0
- package/skills/engineering/resolve-issues/references/expire.md +24 -11
- package/skills/engineering/resolve-issues/references/implementation.md +9 -1
- package/skills/engineering/resolve-issues/references/preflight.md +7 -0
- package/skills/engineering/resolve-issues/references/shared-modules.md +27 -0
- package/skills/engineering/resolve-issues/references/task-plan.md +12 -5
- package/skills/engineering/resolve-issues/release-check.mjs +3 -1
- package/skills/engineering/resolve-issues/scripts/active-installation.mjs +32 -0
- package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +3 -0
- package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +17 -1
- package/skills/engineering/resolve-release/SKILL.md +1 -1
- package/skills/engineering/resolve-release/release-check.mjs +3 -1
- package/skills/engineering/rush-issues/SKILL.md +5 -2
- package/skills/engineering/rush-issues/release-check.mjs +3 -1
- package/skills/engineering/rush-release/SKILL.md +1 -1
- package/skills/engineering/rush-release/release-check.mjs +3 -1
- package/skills/engineering/test-quality/SKILL.md +1 -1
- package/skills/engineering/test-quality/release-check.mjs +3 -1
- package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
- package/skills/risk-compliance/compliance-audit/release-check.mjs +3 -1
- package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
- package/skills/risk-compliance/contract-compare/release-check.mjs +3 -1
- package/skills/risk-compliance/contract-review/SKILL.md +1 -1
- package/skills/risk-compliance/contract-review/release-check.mjs +3 -1
- package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
- package/skills/risk-compliance/doc-authenticity/release-check.mjs +3 -1
- package/skills/risk-compliance/fraud-analysis/SKILL.md +1 -1
- package/skills/risk-compliance/fraud-analysis/release-check.mjs +3 -1
- package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
- package/skills/risk-compliance/payment-analysis/release-check.mjs +3 -1
- package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
- package/skills/risk-compliance/similar-domain/release-check.mjs +3 -1
- package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
- package/skills/risk-compliance/tld-detection/release-check.mjs +3 -1
- package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +0 -172
- package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +0 -36
- package/skills/app-dev/data-quality/scripts/data-quality.test.mjs +0 -12
- package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +0 -637
- package/skills/cicd/github-flow/scripts/flow.test.mjs +0 -114
- package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +0 -108
- package/skills/cicd/mergify/scripts/audit.test.mjs +0 -201
- package/skills/cicd/mergify/scripts/entrypoints.test.mjs +0 -106
- package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +0 -30
- package/skills/cicd/mergify/scripts/stack-push.test.mjs +0 -233
- package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +0 -1826
- package/skills/content/image-gen/scripts/credentials.test.mjs +0 -212
- package/skills/content/image-gen/scripts/options.test.mjs +0 -245
- package/skills/content/xai-search/tests/smoke_test.sh +0 -36
- package/skills/core/polish-cn/scripts/polish-cn.test.mjs +0 -244
- package/skills/core/reg-parser/scripts/reg-parser.test.mjs +0 -165
- package/skills/engineering/better-review/scripts/pr-context.test.mjs +0 -168
- package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +0 -587
- package/skills/engineering/better-review/scripts/scan-diff.test.mjs +0 -414
- package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +0 -96
- package/skills/engineering/contributing/scripts/persist-conventions.test.mjs +0 -118
- package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +0 -106
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +0 -117
- package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +0 -69
- package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +0 -98
- package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +0 -71
- package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +0 -59
- package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +0 -76
- package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +0 -68
- package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +0 -95
- package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +0 -288
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +0 -96
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +0 -96
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +0 -47
- package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +0 -86
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +0 -447
- package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +0 -552
- package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +0 -289
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +0 -119
- package/skills/engineering/golden-path/scripts/golden-path.test.mjs +0 -1457
- package/skills/engineering/harness-runtime/discover-models.test.mjs +0 -363
- package/skills/engineering/harness-runtime/harness-runtime.test.mjs +0 -967
- package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +0 -829
- package/skills/engineering/harness-runtime/model-catalog.test.mjs +0 -366
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +0 -280
- package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +0 -346
- package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +0 -88
- package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +0 -264
- package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +0 -79
- package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +0 -107
- package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +0 -14
- package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +0 -149
- package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +0 -915
- package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +0 -156
- package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +0 -448
- package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +0 -217
- package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +0 -91
- package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +0 -1060
- package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +0 -458
- package/skills/engineering/resolve-release/scripts/apply.test.mjs +0 -99
- package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +0 -100
- package/skills/engineering/resolve-release/scripts/flow.test.mjs +0 -340
- package/skills/engineering/resolve-release/scripts/green-head.test.mjs +0 -101
- package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +0 -426
- package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +0 -659
- package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +0 -317
- package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +0 -291
- package/skills/engineering/resolve-release/scripts/plan.test.mjs +0 -428
- package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +0 -591
- package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +0 -119
- package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +0 -104
- package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +0 -14
- package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +0 -12
- package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +0 -212
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +0 -14
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +0 -14
- package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +0 -134
- 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:
|
|
12
|
-
release-version: 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.
|
|
22
|
-
2.
|
|
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` |
|
|
48
|
-
| `--to YYYY-MM-DD` | `x` |
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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 -
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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 [[ "$
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
' 2>/dev/null
|
|
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 [[
|
|
166
|
-
|
|
167
|
-
exit
|
|
147
|
+
if [[ "$RAW_JSON" -eq 1 ]]; then
|
|
148
|
+
printf '%s' "$RESPONSE" | jq '.'
|
|
149
|
+
exit 0
|
|
168
150
|
fi
|
|
169
151
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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'));
|