@anweat/dsh-browser 0.2.2 → 0.2.3
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/CHANGELOG.md +103 -0
- package/README.en.md +153 -0
- package/README.md +99 -766
- package/cordis.patch.yml +1 -1
- package/lib/automation-assets-rpc.js +34 -4
- package/lib/automation-assets-rpc.js.map +1 -1
- package/package.json +36 -33
- package/scripts/check-docs-links.mjs +115 -0
- package/scripts/dump-prompts.mjs +1 -1
package/cordis.patch.yml
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# dsh plugin --profile <name> add @anweat/dsh-browser
|
|
4
4
|
# then boot the profile (the web profile has HMR disabled, so a restart applies it).
|
|
5
5
|
#
|
|
6
|
-
# Supports DSH 0.2.0-rc.2
|
|
6
|
+
# Supports DSH 0.2.0-rc.2, 0.2.1-rc.2 to rc.5 and 0.2.2-rc.1 (the 0.2.2 line; see the peer ranges in package.json).
|
|
7
7
|
#
|
|
8
8
|
# Login state: prefer named `authProfiles` with explicit `allowedDomains` (see
|
|
9
9
|
# README). `storageStatePath` remains as a legacy global fallback.
|
|
@@ -45,6 +45,25 @@ function expectedRevision(payload) {
|
|
|
45
45
|
throw new Error('expectedRevision must be an integer');
|
|
46
46
|
return value;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The Context to read the Host's `connection` service through.
|
|
50
|
+
*
|
|
51
|
+
* `connection.rpc.handle` mounts the Web route with `owner.webServer.register(route)`, where `owner` is the Context
|
|
52
|
+
* the `rpc` getter captured (`this.ctx`) when the service was read. On cordis 4.0.x any Context could do that. On
|
|
53
|
+
* cordis 4.1 (DSH 0.2.2) the service getter resolves `webServer` against the Connection plugin's own definition site,
|
|
54
|
+
* whose `inject` list does not include `webServer`, so `rpc.handle` throws `cannot get property "webServer" without
|
|
55
|
+
* inject` (DSH master still has this code). The throw happened inside an inject callback and nothing reported it: the
|
|
56
|
+
* channel was never mounted and every `/dsh-browser-assets/*` call from the settings card came back HTTP 405.
|
|
57
|
+
* Reading `connection` through a derived Context that carries the already-injected `webServer` as its own property
|
|
58
|
+
* makes `owner.webServer` resolve there. `Context.extend` is public API, no private Host member is involved, and the
|
|
59
|
+
* route, the envelope, the authentication fence and the Peer scope are the Host's own. The technique is from
|
|
60
|
+
* anweat/dsh-browser#49 (@shuaigekda); it is used on every host, 4.0.x included, so there is one code path.
|
|
61
|
+
* Replacing the root Context with plain `connectionCtx` is not enough.
|
|
62
|
+
*/
|
|
63
|
+
function connectionWithWebServer(connectionCtx) {
|
|
64
|
+
const withWebServer = connectionCtx.extend({ webServer: connectionCtx.get('webServer') });
|
|
65
|
+
return withWebServer.connection;
|
|
66
|
+
}
|
|
48
67
|
/** `promptsStatus` answers the settings card's "prompt text" section: the overrides in force, diagnostics and the L0 estimate. */
|
|
49
68
|
export function registerAutomationAssetRpc(ctx, store, service, promptsStatus) {
|
|
50
69
|
ctx.inject(['connection', 'webServer'], (connectionCtx) => {
|
|
@@ -53,9 +72,8 @@ export function registerAutomationAssetRpc(ctx, store, service, promptsStatus) {
|
|
|
53
72
|
// transport owns envelope decoding, the admission/authentication fence, the
|
|
54
73
|
// cancellation signal, and the Peer scope the handler receives — none of
|
|
55
74
|
// which a manual route can reconstruct.
|
|
56
|
-
// The
|
|
57
|
-
//
|
|
58
|
-
const connection = connectionCtx.root.connection;
|
|
75
|
+
// The registrar mounts its Web route through the Context that read it (see connectionWithWebServer);
|
|
76
|
+
// the plugin effect owns cleanup.
|
|
59
77
|
const handler = async (endpoint, rawPayload) => {
|
|
60
78
|
try {
|
|
61
79
|
// The transport hands the handler the endpoint relative to the channel,
|
|
@@ -163,7 +181,19 @@ export function registerAutomationAssetRpc(ctx, store, service, promptsStatus) {
|
|
|
163
181
|
return { ok: false, error: { code: 'bad-request', message: stripAnsi(String(error instanceof Error ? error.message : error)).slice(0, 500), details } };
|
|
164
182
|
}
|
|
165
183
|
};
|
|
166
|
-
connectionCtx.effect(() =>
|
|
184
|
+
connectionCtx.effect(() => {
|
|
185
|
+
try {
|
|
186
|
+
return connectionWithWebServer(connectionCtx).rpc.handle(CHANNEL, handler);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
// An inject callback's throw is not reported by the Host (this is how the cordis 4.1 failure stayed invisible),
|
|
190
|
+
// so say it ourselves: the card still renders, but every `/dsh-browser-assets/*` request is HTTP 405.
|
|
191
|
+
const message = `dsh-browser: settings-card RPC channel ${CHANNEL} was not mounted (${stripAnsi(String(error instanceof Error ? error.message : error))}); the card's assets, prompts, policy and runtime panels will not load`;
|
|
192
|
+
// console, not ctx.logger: the Host's logger was observed dropping this at its default level (nothing reached the log).
|
|
193
|
+
console.warn(message);
|
|
194
|
+
return () => { };
|
|
195
|
+
}
|
|
196
|
+
}, 'dsh-browser: automation asset RPC channel');
|
|
167
197
|
});
|
|
168
198
|
}
|
|
169
199
|
//# sourceMappingURL=automation-assets-rpc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAIjE,OAAO,EAAE,sBAAsB,EAA+E,MAAM,wBAAwB,CAAA;AAE5I,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,SAAS,MAAM,CAAC,OAAgB;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAC3H,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC1G,OAAO,OAAkC,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,OAAgC,EAAE,IAAY;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAA;IAC9H,OAAO,KAAK,CAAA;AACd,CAAC;AAED,iHAAiH;AACjH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACF;IAAtC,YAAY,OAAe,EAAW,OAAgC;QACpE,KAAK,CAAC,OAAO,CAAC,CAAA;QADsB,YAAO,GAAP,OAAO,CAAyB;QAEpE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAA;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACjH,OAAO,KAAK,CAAA;AACd,CAAC;AAED,kIAAkI;AAClI,MAAM,UAAU,0BAA0B,CAAC,GAAY,EAAE,KAA2B,EAAE,OAAuB,EAAE,aAA6B;IAC1I,GAAG,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE;QACxD,4EAA4E;QAC5E,uEAAuE;QACvE,4EAA4E;QAC5E,yEAAyE;QACzE,wCAAwC;QACxC,
|
|
1
|
+
{"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anweat/dsh-browser",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Browser runtime plugin for DeepSeek Harness (scoped @anweat) — ships Playwright and Patchright, uses your system Chrome / Edge (or a Playwright Chromium you install), optionally drives OpenCLI site adapters, exposes a `browser` service and interactive browser tools.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
"assets",
|
|
24
24
|
"cordis.patch.yml",
|
|
25
25
|
"README.md",
|
|
26
|
+
"README.en.md",
|
|
27
|
+
"CHANGELOG.md",
|
|
26
28
|
"AUDIT.md",
|
|
27
29
|
"scripts",
|
|
28
30
|
"LICENSE"
|
|
@@ -31,17 +33,17 @@
|
|
|
31
33
|
"node": "^22.19 || >=24"
|
|
32
34
|
},
|
|
33
35
|
"peerDependencies": {
|
|
34
|
-
"@deepseek-ai/cordis": "~4.0.4",
|
|
35
|
-
"@deepseek-ai/dsh-tools": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
36
|
-
"@deepseek-ai/dsh-client-connection": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
37
|
-
"@deepseek-ai/dsh-client-locale": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
38
|
-
"@deepseek-ai/dsh-client-store": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
39
|
-
"@deepseek-ai/dsh-client-ui-renderer": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
40
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
41
|
-
"@deepseek-ai/dsh-client-ui-primitives": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
42
|
-
"@deepseek-ai/dsh-client-ui-plugin-manager": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
43
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
44
|
-
"@deepseek-ai/dsh-settings": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0",
|
|
36
|
+
"@deepseek-ai/cordis": "~4.0.4 || ~4.1.0",
|
|
37
|
+
"@deepseek-ai/dsh-tools": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
38
|
+
"@deepseek-ai/dsh-client-connection": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
39
|
+
"@deepseek-ai/dsh-client-locale": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
40
|
+
"@deepseek-ai/dsh-client-store": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
41
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
42
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
43
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
44
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
45
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
46
|
+
"@deepseek-ai/dsh-settings": ">=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
|
|
45
47
|
"@deepseek-ai/schemastery": ">=3.18.2 <4",
|
|
46
48
|
"@jackwener/opencli": ">=1.8.0 <2"
|
|
47
49
|
},
|
|
@@ -91,22 +93,22 @@
|
|
|
91
93
|
"playwright": "^1.60.0"
|
|
92
94
|
},
|
|
93
95
|
"devDependencies": {
|
|
94
|
-
"@deepseek-ai/cordis": "4.0
|
|
95
|
-
"@deepseek-ai/dsh-agent": "0.2.
|
|
96
|
-
"@deepseek-ai/dsh-llm": "0.2.
|
|
97
|
-
"@deepseek-ai/dsh-scope": "0.2.
|
|
98
|
-
"@deepseek-ai/dsh-session": "0.2.
|
|
99
|
-
"@deepseek-ai/dsh-session-projection": "0.2.
|
|
100
|
-
"@deepseek-ai/dsh-system-prompt": "0.2.
|
|
101
|
-
"@deepseek-ai/dsh-user-approval": "0.2.
|
|
102
|
-
"@deepseek-ai/dsh-tools": "0.2.
|
|
103
|
-
"@deepseek-ai/dsh-client-connection": "0.2.
|
|
104
|
-
"@deepseek-ai/dsh-client-locale": "0.2.
|
|
105
|
-
"@deepseek-ai/dsh-client-store": "0.2.
|
|
106
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.2.
|
|
107
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.
|
|
108
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.
|
|
109
|
-
"@deepseek-ai/dsh-settings": "0.2.
|
|
96
|
+
"@deepseek-ai/cordis": "4.1.0",
|
|
97
|
+
"@deepseek-ai/dsh-agent": "0.2.2-rc.1",
|
|
98
|
+
"@deepseek-ai/dsh-llm": "0.2.2-rc.1",
|
|
99
|
+
"@deepseek-ai/dsh-scope": "0.2.2-rc.1",
|
|
100
|
+
"@deepseek-ai/dsh-session": "0.2.2-rc.1",
|
|
101
|
+
"@deepseek-ai/dsh-session-projection": "0.2.2-rc.1",
|
|
102
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.2-rc.1",
|
|
103
|
+
"@deepseek-ai/dsh-user-approval": "0.2.2-rc.1",
|
|
104
|
+
"@deepseek-ai/dsh-tools": "0.2.2-rc.1",
|
|
105
|
+
"@deepseek-ai/dsh-client-connection": "0.2.2-rc.1",
|
|
106
|
+
"@deepseek-ai/dsh-client-locale": "0.2.2-rc.1",
|
|
107
|
+
"@deepseek-ai/dsh-client-store": "0.2.2-rc.1",
|
|
108
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.2-rc.1",
|
|
109
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.2-rc.1",
|
|
110
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
|
|
111
|
+
"@deepseek-ai/dsh-settings": "0.2.2-rc.1",
|
|
110
112
|
"@deepseek-ai/schemastery": "3.18.5",
|
|
111
113
|
"@types/react": "~18.3.1",
|
|
112
114
|
"@types/react-dom": "~18.3.1",
|
|
@@ -115,10 +117,10 @@
|
|
|
115
117
|
"tsdown": "^0.22.2",
|
|
116
118
|
"typescript": "^5.6.0",
|
|
117
119
|
"@types/node": "^22.0.0",
|
|
118
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.2.
|
|
119
|
-
"@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.2-rc.1",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.2-rc.1",
|
|
120
122
|
"clsx": "^2.0.0",
|
|
121
|
-
"@deepseek-ai/dsh-working-directory": "0.2.
|
|
123
|
+
"@deepseek-ai/dsh-working-directory": "0.2.2-rc.1",
|
|
122
124
|
"@jackwener/opencli": "^1.8.7"
|
|
123
125
|
},
|
|
124
126
|
"dsh": {
|
|
@@ -156,7 +158,8 @@
|
|
|
156
158
|
"measure:tools": "node scripts/measure-tool-surface.mjs",
|
|
157
159
|
"prompts:dump": "node scripts/dump-prompts.mjs",
|
|
158
160
|
"test:client-bundle": "node scripts/check-client-bundle.mjs",
|
|
159
|
-
"verify": "pnpm run typecheck && pnpm run test:peers && pnpm run build && pnpm test && pnpm run test:client-bundle",
|
|
160
|
-
"test:peers": "node test/compat/check-peer-ranges.js"
|
|
161
|
+
"verify": "pnpm run typecheck && pnpm run test:peers && pnpm run build && pnpm test && pnpm run test:client-bundle && pnpm run docs:check",
|
|
162
|
+
"test:peers": "node test/compat/check-peer-ranges.js",
|
|
163
|
+
"docs:check": "node scripts/check-docs-links.mjs"
|
|
161
164
|
}
|
|
162
165
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Documentation checks (no dependencies):
|
|
4
|
+
* 1. every relative Markdown link, and its #anchor, points at something that exists;
|
|
5
|
+
* 2. every absolute link into this repository's master branch
|
|
6
|
+
* (https://github.com/anweat/dsh-browser/blob|tree/master/<path>) points at a path that exists;
|
|
7
|
+
* 3. README.md and README.en.md have the same number of second-level headings.
|
|
8
|
+
*
|
|
9
|
+
* Anchors follow GitHub's slug rules (lower case, punctuation dropped, spaces to hyphens, -1 / -2 for repeats).
|
|
10
|
+
* Links inside fenced code blocks and inline code are ignored. node_modules, lib and .git are not scanned.
|
|
11
|
+
* Usage: node scripts/check-docs-links.mjs
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import fs from 'node:fs'
|
|
15
|
+
import path from 'node:path'
|
|
16
|
+
import { fileURLToPath } from 'node:url'
|
|
17
|
+
|
|
18
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
|
19
|
+
const REPO_PREFIX = /^https:\/\/github\.com\/anweat\/dsh-browser\/(?:blob|tree)\/master\/([^#?]*)/
|
|
20
|
+
const SKIP_DIRS = new Set(['node_modules', 'lib', '.git', 'dist'])
|
|
21
|
+
|
|
22
|
+
function walk(dir, out = []) {
|
|
23
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
24
|
+
if (SKIP_DIRS.has(entry.name)) continue
|
|
25
|
+
const full = path.join(dir, entry.name)
|
|
26
|
+
if (entry.isDirectory()) walk(full, out)
|
|
27
|
+
else if (entry.name.endsWith('.md')) out.push(full)
|
|
28
|
+
}
|
|
29
|
+
return out
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Lines of a Markdown file outside fenced code blocks, with their 1-based numbers. */
|
|
33
|
+
function proseLines(text) {
|
|
34
|
+
const lines = []
|
|
35
|
+
let fence = null
|
|
36
|
+
text.split('\n').forEach((line, index) => {
|
|
37
|
+
const marker = /^\s*(```+|~~~+)/.exec(line)
|
|
38
|
+
if (marker) {
|
|
39
|
+
if (fence === null) fence = marker[1][0]
|
|
40
|
+
else if (marker[1][0] === fence) fence = null
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
if (fence === null) lines.push({ line, number: index + 1 })
|
|
44
|
+
})
|
|
45
|
+
return lines
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const stripInlineCode = line => line.replace(/`[^`]*`/g, match => ' '.repeat(match.length))
|
|
49
|
+
|
|
50
|
+
function slugify(heading) {
|
|
51
|
+
return heading
|
|
52
|
+
.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1')
|
|
53
|
+
.replace(/[`*_~]/g, match => (match === '_' ? '_' : ''))
|
|
54
|
+
.trim()
|
|
55
|
+
.toLowerCase()
|
|
56
|
+
.replace(/[^\p{L}\p{M}\p{N}\p{Pc}\- ]/gu, '')
|
|
57
|
+
.replace(/ /g, '-')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const anchorCache = new Map()
|
|
61
|
+
function anchorsOf(file) {
|
|
62
|
+
if (anchorCache.has(file)) return anchorCache.get(file)
|
|
63
|
+
const seen = new Map()
|
|
64
|
+
const anchors = new Set()
|
|
65
|
+
for (const { line } of proseLines(fs.readFileSync(file, 'utf8'))) {
|
|
66
|
+
const match = /^(#{1,6})\s+(.*?)\s*#*\s*$/.exec(line)
|
|
67
|
+
if (!match) continue
|
|
68
|
+
const base = slugify(match[2])
|
|
69
|
+
const count = seen.get(base) ?? 0
|
|
70
|
+
seen.set(base, count + 1)
|
|
71
|
+
anchors.add(count === 0 ? base : `${base}-${count}`)
|
|
72
|
+
}
|
|
73
|
+
anchorCache.set(file, anchors)
|
|
74
|
+
return anchors
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const problems = []
|
|
78
|
+
const rel = file => path.relative(root, file)
|
|
79
|
+
|
|
80
|
+
for (const file of walk(root)) {
|
|
81
|
+
for (const { line, number } of proseLines(fs.readFileSync(file, 'utf8'))) {
|
|
82
|
+
for (const match of stripInlineCode(line).matchAll(/!?\[[^\]]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g)) {
|
|
83
|
+
const target = match[1]
|
|
84
|
+
const where = `${rel(file)}:${number}`
|
|
85
|
+
const repo = REPO_PREFIX.exec(target)
|
|
86
|
+
if (repo) {
|
|
87
|
+
const repoPath = decodeURIComponent(repo[1]).replace(/\/$/, '')
|
|
88
|
+
if (repoPath && !fs.existsSync(path.join(root, repoPath))) problems.push(`${where}: ${target} -> ${repoPath} does not exist in the repository`)
|
|
89
|
+
continue
|
|
90
|
+
}
|
|
91
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(target)) continue
|
|
92
|
+
const [pathPart, anchor] = target.split('#')
|
|
93
|
+
const resolved = pathPart === '' ? file : path.resolve(path.dirname(file), decodeURIComponent(pathPart))
|
|
94
|
+
if (!fs.existsSync(resolved)) { problems.push(`${where}: ${target} -> ${rel(resolved)} does not exist`); continue }
|
|
95
|
+
if (anchor !== undefined && anchor !== '' && resolved.endsWith('.md') && fs.statSync(resolved).isFile()) {
|
|
96
|
+
if (!anchorsOf(resolved).has(decodeURIComponent(anchor).toLowerCase())) problems.push(`${where}: ${target} -> no heading "#${anchor}" in ${rel(resolved)}`)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function h2Count(name) {
|
|
103
|
+
const file = path.join(root, name)
|
|
104
|
+
if (!fs.existsSync(file)) { problems.push(`${name} is missing`); return -1 }
|
|
105
|
+
return proseLines(fs.readFileSync(file, 'utf8')).filter(({ line }) => /^## /.test(line)).length
|
|
106
|
+
}
|
|
107
|
+
const zh = h2Count('README.md')
|
|
108
|
+
const en = h2Count('README.en.md')
|
|
109
|
+
if (zh >= 0 && en >= 0 && zh !== en) problems.push(`README.md has ${zh} second-level headings but README.en.md has ${en}`)
|
|
110
|
+
|
|
111
|
+
if (problems.length > 0) {
|
|
112
|
+
console.error(`documentation check failed (${problems.length}):\n` + problems.map(problem => ' ' + problem).join('\n'))
|
|
113
|
+
process.exit(1)
|
|
114
|
+
}
|
|
115
|
+
console.log(`documentation check passed (${walk(root).length} Markdown files, ${zh} second-level headings in each README)`)
|
package/scripts/dump-prompts.mjs
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// { tools, rootGuide, rootNote, groups, actions, errorHints, skill }
|
|
6
6
|
//
|
|
7
7
|
// Copy the output, delete what you want to keep as is, reword the rest, and put it under
|
|
8
|
-
// `prompts:` in your profile config (see
|
|
8
|
+
// `prompts:` in your profile config (see docs/guide/prompts.md). Pasted back unchanged it
|
|
9
9
|
// changes nothing: blank `notes`, `rootNote`, `skill.bodyFile` and `skill.append` mean "none".
|
|
10
10
|
//
|
|
11
11
|
// Usage: node scripts/dump-prompts.mjs [--compact]
|