@karmaniverous/jeeves-watcher-openclaw 0.14.10 → 0.14.11

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.
@@ -24,6 +24,20 @@ When editing files outside the workspace, use the bridge pattern: copy in → ed
24
24
 
25
25
  **Cross-channel sends:** Use the `message` tool with an explicit `target` to send to a different channel or DM.
26
26
 
27
+ ### Slack File Downloads
28
+
29
+ To download a Slack-hosted file, first try the `message` tool's `download-file` action. If that fails, fall back to a direct HTTP fetch using the bot token:
30
+
31
+ ```js
32
+ fetch(url_private_download, {
33
+ headers: { Authorization: 'Bearer ' + botToken },
34
+ });
35
+ ```
36
+
37
+ The bot token is at `channels.slack.accounts.default.botToken` in `openclaw.json`.
38
+
39
+ Never tell the user a file can't be downloaded until both methods have been tried.
40
+
27
41
  ### Plugin Lifecycle
28
42
 
29
43
  ```bash
package/dist/cli.js CHANGED
@@ -4749,6 +4749,9 @@ function requireRange () {
4749
4749
  }
4750
4750
 
4751
4751
  parseRange (range) {
4752
+ // strip build metadata so it can't bleed into the version
4753
+ range = range.replace(BUILDSTRIPRE, '');
4754
+
4752
4755
  // memoize range parsing for performance.
4753
4756
  // this is a very hot path, and fully deterministic.
4754
4757
  const memoOpts =
@@ -4874,6 +4877,7 @@ function requireRange () {
4874
4877
  const SemVer = requireSemver$1();
4875
4878
  const {
4876
4879
  safeRe: re,
4880
+ src,
4877
4881
  t,
4878
4882
  comparatorTrimReplace,
4879
4883
  tildeTrimReplace,
@@ -4881,6 +4885,9 @@ function requireRange () {
4881
4885
  } = requireRe();
4882
4886
  const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants();
4883
4887
 
4888
+ // unbounded global build-metadata stripper used by parseRange
4889
+ const BUILDSTRIPRE = new RegExp(src[t.BUILD], 'g');
4890
+
4884
4891
  const isNullSet = c => c.value === '<0.0.0-0';
4885
4892
  const isAny = c => c.value === '';
4886
4893
 
@@ -5932,7 +5939,7 @@ function requireSubset () {
5932
5939
  if (higher === c && higher !== gt) {
5933
5940
  return false
5934
5941
  }
5935
- } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
5942
+ } else if (gt.operator === '>=' && !c.test(gt.semver)) {
5936
5943
  return false
5937
5944
  }
5938
5945
  }
@@ -5950,7 +5957,7 @@ function requireSubset () {
5950
5957
  if (lower === c && lower !== lt) {
5951
5958
  return false
5952
5959
  }
5953
- } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
5960
+ } else if (lt.operator === '<=' && !c.test(lt.semver)) {
5954
5961
  return false
5955
5962
  }
5956
5963
  }
@@ -24475,14 +24482,14 @@ const SECTION_ORDER = [
24475
24482
  * Core library version, inlined at build time.
24476
24483
  *
24477
24484
  * @remarks
24478
- * The `0.5.9` placeholder is replaced by
24485
+ * The `0.5.10` placeholder is replaced by
24479
24486
  * `@rollup/plugin-replace` during the build with the actual version
24480
24487
  * from `package.json`. This ensures the correct version survives
24481
24488
  * when consumers bundle core into their own dist (where runtime
24482
24489
  * `import.meta.url`-based resolution would find the wrong package.json).
24483
24490
  */
24484
24491
  /** The core library version from package.json (inlined at build time). */
24485
- const CORE_VERSION = '0.5.9';
24492
+ const CORE_VERSION = '0.5.10';
24486
24493
 
24487
24494
  /**
24488
24495
  * Workspace and config root initialization.
@@ -24495,12 +24502,26 @@ const CORE_VERSION = '0.5.9';
24495
24502
  * - `{configRoot}/jeeves-{name}/` for each component
24496
24503
  */
24497
24504
  let state;
24505
+ const WINDOWS_DRIVE_RE = /^[a-zA-Z]:/;
24506
+ /**
24507
+ * Throw if a path looks like a Windows drive letter on a non-Windows platform.
24508
+ *
24509
+ * @param label - Human-readable name for the path (used in error messages).
24510
+ * @param value - The raw path string to validate.
24511
+ */
24512
+ function rejectWindowsDrivePath(label, value) {
24513
+ if (process.platform !== 'win32' && WINDOWS_DRIVE_RE.test(value)) {
24514
+ throw new Error(`jeeves-core: ${label} "${value}" looks like a Windows drive-letter path and will not resolve correctly on this platform.`);
24515
+ }
24516
+ }
24498
24517
  /**
24499
24518
  * Initialize the core library with workspace and config root paths.
24500
24519
  *
24501
24520
  * @param options - Workspace and config root paths.
24502
24521
  */
24503
24522
  function init(options) {
24523
+ rejectWindowsDrivePath('configRoot', options.configRoot);
24524
+ rejectWindowsDrivePath('workspacePath', options.workspacePath);
24504
24525
  state = {
24505
24526
  workspacePath: options.workspacePath,
24506
24527
  configRoot: options.configRoot,
@@ -26306,6 +26327,20 @@ When editing files outside the workspace, use the bridge pattern: copy in → ed
26306
26327
 
26307
26328
  **Cross-channel sends:** Use the \`message\` tool with an explicit \`target\` to send to a different channel or DM.
26308
26329
 
26330
+ ### Slack File Downloads
26331
+
26332
+ To download a Slack-hosted file, first try the \`message\` tool's \`download-file\` action. If that fails, fall back to a direct HTTP fetch using the bot token:
26333
+
26334
+ \`\`\`js
26335
+ fetch(url_private_download, {
26336
+ headers: { Authorization: 'Bearer ' + botToken },
26337
+ });
26338
+ \`\`\`
26339
+
26340
+ The bot token is at \`channels.slack.accounts.default.botToken\` in \`openclaw.json\`.
26341
+
26342
+ Never tell the user a file can't be downloaded until both methods have been tried.
26343
+
26309
26344
  ### Plugin Lifecycle
26310
26345
 
26311
26346
  \`\`\`bash
package/dist/index.js CHANGED
@@ -4748,6 +4748,9 @@ function requireRange () {
4748
4748
  }
4749
4749
 
4750
4750
  parseRange (range) {
4751
+ // strip build metadata so it can't bleed into the version
4752
+ range = range.replace(BUILDSTRIPRE, '');
4753
+
4751
4754
  // memoize range parsing for performance.
4752
4755
  // this is a very hot path, and fully deterministic.
4753
4756
  const memoOpts =
@@ -4873,6 +4876,7 @@ function requireRange () {
4873
4876
  const SemVer = requireSemver$1();
4874
4877
  const {
4875
4878
  safeRe: re,
4879
+ src,
4876
4880
  t,
4877
4881
  comparatorTrimReplace,
4878
4882
  tildeTrimReplace,
@@ -4880,6 +4884,9 @@ function requireRange () {
4880
4884
  } = requireRe();
4881
4885
  const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants();
4882
4886
 
4887
+ // unbounded global build-metadata stripper used by parseRange
4888
+ const BUILDSTRIPRE = new RegExp(src[t.BUILD], 'g');
4889
+
4883
4890
  const isNullSet = c => c.value === '<0.0.0-0';
4884
4891
  const isAny = c => c.value === '';
4885
4892
 
@@ -5931,7 +5938,7 @@ function requireSubset () {
5931
5938
  if (higher === c && higher !== gt) {
5932
5939
  return false
5933
5940
  }
5934
- } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
5941
+ } else if (gt.operator === '>=' && !c.test(gt.semver)) {
5935
5942
  return false
5936
5943
  }
5937
5944
  }
@@ -5949,7 +5956,7 @@ function requireSubset () {
5949
5956
  if (lower === c && lower !== lt) {
5950
5957
  return false
5951
5958
  }
5952
- } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
5959
+ } else if (lt.operator === '<=' && !c.test(lt.semver)) {
5953
5960
  return false
5954
5961
  }
5955
5962
  }
@@ -24554,14 +24561,14 @@ const PLATFORM_COMPONENTS = [
24554
24561
  * Core library version, inlined at build time.
24555
24562
  *
24556
24563
  * @remarks
24557
- * The `0.5.9` placeholder is replaced by
24564
+ * The `0.5.10` placeholder is replaced by
24558
24565
  * `@rollup/plugin-replace` during the build with the actual version
24559
24566
  * from `package.json`. This ensures the correct version survives
24560
24567
  * when consumers bundle core into their own dist (where runtime
24561
24568
  * `import.meta.url`-based resolution would find the wrong package.json).
24562
24569
  */
24563
24570
  /** The core library version from package.json (inlined at build time). */
24564
- const CORE_VERSION = '0.5.9';
24571
+ const CORE_VERSION = '0.5.10';
24565
24572
 
24566
24573
  /**
24567
24574
  * Workspace and config root initialization.
@@ -24574,12 +24581,26 @@ const CORE_VERSION = '0.5.9';
24574
24581
  * - `{configRoot}/jeeves-{name}/` for each component
24575
24582
  */
24576
24583
  let state;
24584
+ const WINDOWS_DRIVE_RE = /^[a-zA-Z]:/;
24585
+ /**
24586
+ * Throw if a path looks like a Windows drive letter on a non-Windows platform.
24587
+ *
24588
+ * @param label - Human-readable name for the path (used in error messages).
24589
+ * @param value - The raw path string to validate.
24590
+ */
24591
+ function rejectWindowsDrivePath(label, value) {
24592
+ if (process.platform !== 'win32' && WINDOWS_DRIVE_RE.test(value)) {
24593
+ throw new Error(`jeeves-core: ${label} "${value}" looks like a Windows drive-letter path and will not resolve correctly on this platform.`);
24594
+ }
24595
+ }
24577
24596
  /**
24578
24597
  * Initialize the core library with workspace and config root paths.
24579
24598
  *
24580
24599
  * @param options - Workspace and config root paths.
24581
24600
  */
24582
24601
  function init(options) {
24602
+ rejectWindowsDrivePath('configRoot', options.configRoot);
24603
+ rejectWindowsDrivePath('workspacePath', options.workspacePath);
24583
24604
  state = {
24584
24605
  workspacePath: options.workspacePath,
24585
24606
  configRoot: options.configRoot,
@@ -26688,6 +26709,20 @@ When editing files outside the workspace, use the bridge pattern: copy in → ed
26688
26709
 
26689
26710
  **Cross-channel sends:** Use the \`message\` tool with an explicit \`target\` to send to a different channel or DM.
26690
26711
 
26712
+ ### Slack File Downloads
26713
+
26714
+ To download a Slack-hosted file, first try the \`message\` tool's \`download-file\` action. If that fails, fall back to a direct HTTP fetch using the bot token:
26715
+
26716
+ \`\`\`js
26717
+ fetch(url_private_download, {
26718
+ headers: { Authorization: 'Bearer ' + botToken },
26719
+ });
26720
+ \`\`\`
26721
+
26722
+ The bot token is at \`channels.slack.accounts.default.botToken\` in \`openclaw.json\`.
26723
+
26724
+ Never tell the user a file can't be downloaded until both methods have been tried.
26725
+
26691
26726
  ### Plugin Lifecycle
26692
26727
 
26693
26728
  \`\`\`bash
@@ -397,7 +397,7 @@ Apply config changes atomically.
397
397
  Validates, writes to disk, and triggers configured reindex behavior. Returns validation errors if invalid. Config changes take full effect without service restart — including new/removed watch paths (filesystem watcher is rebuilt), inference rule changes, move detection settings, and gitignore filter updates.
398
398
 
399
399
  ### `watcher_reindex`
400
- Trigger a reindex operation. All scopes return a `plan` object showing blast area before execution begins.
400
+ Trigger a reindex operation. Non-prune scopes return a `plan` object showing blast area before execution begins. Live prune (non-dry-run) returns immediately without a plan.
401
401
 
402
402
  **Parameters:**
403
403
  - `scope` (string, optional) — Reindex scope. Default: `"rules"`. One of:
@@ -2,7 +2,7 @@
2
2
  "id": "jeeves-watcher-openclaw",
3
3
  "name": "Jeeves Watcher",
4
4
  "description": "Semantic search, metadata enrichment, and instance administration for a jeeves-watcher deployment.",
5
- "version": "0.14.10",
5
+ "version": "0.14.11",
6
6
  "skills": [
7
7
  "dist/skills/jeeves-watcher"
8
8
  ],
@@ -22,6 +22,21 @@
22
22
  }
23
23
  }
24
24
  },
25
+ "contracts": {
26
+ "tools": [
27
+ "watcher_status",
28
+ "watcher_config",
29
+ "watcher_config_apply",
30
+ "watcher_service",
31
+ "watcher_search",
32
+ "watcher_enrich",
33
+ "watcher_validate",
34
+ "watcher_reindex",
35
+ "watcher_scan",
36
+ "watcher_issues",
37
+ "watcher_walk"
38
+ ]
39
+ },
25
40
  "uiHints": {
26
41
  "apiUrl": {
27
42
  "label": "Watcher API URL",
package/package.json CHANGED
@@ -1,15 +1,32 @@
1
1
  {
2
- "name": "@karmaniverous/jeeves-watcher-openclaw",
3
- "version": "0.14.10",
4
2
  "author": "Jason Williscroft",
5
- "description": "OpenClaw plugin for jeeves-watcher — semantic search and metadata enrichment tools",
6
- "license": "BSD-3-Clause",
7
- "type": "module",
8
- "main": "dist/index.js",
9
- "types": "dist/index.d.ts",
10
3
  "bin": {
11
4
  "jeeves-watcher-openclaw": "./dist/cli.js"
12
5
  },
6
+ "bugs": {
7
+ "url": "https://github.com/karmaniverous/jeeves-watcher/issues"
8
+ },
9
+ "dependencies": {
10
+ "@karmaniverous/jeeves": "^0.5.11",
11
+ "@karmaniverous/jeeves-watcher-core": "^0.1.2"
12
+ },
13
+ "description": "OpenClaw plugin for jeeves-watcher — semantic search and metadata enrichment tools",
14
+ "devDependencies": {
15
+ "@dotenvx/dotenvx": "^1.69.1",
16
+ "@rollup/plugin-commonjs": "^29.0.2",
17
+ "@rollup/plugin-json": "^6.1.0",
18
+ "@rollup/plugin-node-resolve": "^16.0.3",
19
+ "@rollup/plugin-typescript": "^12.3.0",
20
+ "cross-env": "^10.1.0",
21
+ "knip": "^6.14.2",
22
+ "release-it": "^20.0.1",
23
+ "rollup": "^4.60.4",
24
+ "tslib": "^2.8.1",
25
+ "vitest": "^4.1.7"
26
+ },
27
+ "engines": {
28
+ "node": ">=22"
29
+ },
13
30
  "exports": {
14
31
  ".": {
15
32
  "import": {
@@ -23,17 +40,6 @@
23
40
  "content",
24
41
  "openclaw.plugin.json"
25
42
  ],
26
- "publishConfig": {
27
- "access": "public"
28
- },
29
- "repository": {
30
- "type": "git",
31
- "url": "git+https://github.com/karmaniverous/jeeves-watcher.git",
32
- "directory": "packages/openclaw"
33
- },
34
- "bugs": {
35
- "url": "https://github.com/karmaniverous/jeeves-watcher/issues"
36
- },
37
43
  "homepage": "https://github.com/karmaniverous/jeeves-watcher#readme",
38
44
  "keywords": [
39
45
  "openclaw",
@@ -41,76 +47,70 @@
41
47
  "jeeves-watcher",
42
48
  "semantic-search"
43
49
  ],
44
- "engines": {
45
- "node": ">=22"
46
- },
50
+ "license": "BSD-3-Clause",
51
+ "main": "dist/index.js",
52
+ "name": "@karmaniverous/jeeves-watcher-openclaw",
47
53
  "openclaw": {
48
54
  "extensions": [
49
55
  "./dist/index.js"
50
56
  ]
51
57
  },
52
- "devDependencies": {
53
- "@dotenvx/dotenvx": "^1.65.0",
54
- "@rollup/plugin-commonjs": "^29.0.2",
55
- "@rollup/plugin-json": "^6.1.0",
56
- "@rollup/plugin-node-resolve": "^16.0.3",
57
- "@rollup/plugin-typescript": "^12.3.0",
58
- "cross-env": "^10.1.0",
59
- "knip": "^6.13.1",
60
- "release-it": "^20.0.1",
61
- "rollup": "^4.60.3",
62
- "tslib": "^2.8.1",
63
- "vitest": "^4.1.6"
64
- },
65
- "scripts": {
66
- "build:plugin": "rimraf dist && cross-env NO_COLOR=1 rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
67
- "build:skills": "tsx scripts/build-skills.ts",
68
- "build": "npm run build:plugin && npm run build:skills && npm run build:content",
69
- "build:content": "node scripts/copy-content.mjs",
70
- "changelog": "git-cliff -o CHANGELOG.md",
71
- "lint": "eslint .",
72
- "lint:fix": "eslint --fix .",
73
- "release": "dotenvx run -f .env.local -- release-it",
74
- "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease",
75
- "test": "vitest run",
76
- "typecheck": "tsc"
58
+ "publishConfig": {
59
+ "access": "public"
77
60
  },
78
61
  "release-it": {
79
62
  "git": {
80
63
  "changelog": "npx git-cliff --unreleased --strip header",
81
64
  "commitMessage": "chore: release @karmaniverous/jeeves-watcher-openclaw v${version}",
82
- "tagName": "openclaw/${version}",
83
- "requireBranch": "main"
65
+ "requireBranch": "main",
66
+ "tagName": "openclaw/${version}"
84
67
  },
85
68
  "github": {
86
69
  "release": true
87
70
  },
88
71
  "hooks": {
72
+ "after:bump": [
73
+ "node -e \"const f='openclaw.plugin.json';const j=JSON.parse(require('fs').readFileSync(f,'utf8'));j.version='${version}';require('fs').writeFileSync(f,JSON.stringify(j,null,2)+'')\""
74
+ ],
89
75
  "after:init": [
90
76
  "npm run lint",
91
77
  "npm run typecheck",
92
78
  "npm run test",
93
79
  "npm run build"
94
80
  ],
95
- "before:npm:release": [
96
- "npx git-cliff -o CHANGELOG.md",
97
- "git add -A"
98
- ],
99
81
  "after:release": [
100
82
  "git switch -c release/openclaw/${version}",
101
83
  "git push -u origin release/openclaw/${version}",
102
84
  "git switch ${branchName}"
103
85
  ],
104
- "after:bump": [
105
- "node -e \"const f='openclaw.plugin.json';const j=JSON.parse(require('fs').readFileSync(f,'utf8'));j.version='${version}';require('fs').writeFileSync(f,JSON.stringify(j,null,2)+'')\""
86
+ "before:npm:release": [
87
+ "npx git-cliff -o CHANGELOG.md",
88
+ "git add -A"
106
89
  ]
107
90
  },
108
91
  "npm": {
109
92
  "publish": true
110
93
  }
111
94
  },
112
- "dependencies": {
113
- "@karmaniverous/jeeves": "^0.5.10",
114
- "@karmaniverous/jeeves-watcher-core": "^0.1.1"
115
- }
95
+ "repository": {
96
+ "directory": "packages/openclaw",
97
+ "type": "git",
98
+ "url": "git+https://github.com/karmaniverous/jeeves-watcher.git"
99
+ },
100
+ "scripts": {
101
+ "build": "npm run build:plugin && npm run build:skills && npm run build:content",
102
+ "build:content": "node scripts/copy-content.mjs",
103
+ "build:plugin": "rimraf dist && cross-env NO_COLOR=1 rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
104
+ "build:skills": "tsx scripts/build-skills.ts",
105
+ "changelog": "git-cliff -o CHANGELOG.md",
106
+ "lint": "eslint .",
107
+ "lint:fix": "eslint --fix .",
108
+ "release": "dotenvx run -f .env.local -- release-it",
109
+ "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease",
110
+ "test": "vitest run",
111
+ "typecheck": "tsc"
112
+ },
113
+ "type": "module",
114
+ "types": "dist/index.d.ts",
115
+ "version": "0.14.11"
116
116
  }