Skip to content

Releases: Djarvur/cc-websearch

v1.2.4

Choose a tag to compare

@onokonem onokonem released this 25 May 19:28
02d4993

What's Changed

  • Bundle jsdom into webfetch.cjs — no more npm install needed at runtime. Zero external dependencies. Plugin works directly from git clone with no build step.
  • Inline CSS and worker source — jsdom's default-stylesheet.css and xhr-sync-worker.js are now embedded in the CJS bundle via esbuild plugin
  • Fix strict-mode compatibility — @acemir/cssom CSSStyleRule sets parentRule via plain assignment (sloppy mode); bundled strict mode threw because cssstyle defines it as getter-only. Patched to use _parentRule backing field
  • Keep built artifacts in repo — CJS files tracked in git for seamless install

Details

  • webfetch.cjs is fully self-contained (9.9MB with jsdom bundled)
  • websearch.cjs unchanged (2.7MB)
  • No runtime deps, no SessionStart hooks, no node_modules needed

v1.2.3

Choose a tag to compare

@onokonem onokonem released this 25 May 13:01
46383e2
fix: plugin.json hooks path missing ./ prefix

Plugin validation requires relative paths in plugin.json to start with ./.
Fix manifest lint error "hooks: Invalid input" during plugin install.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

v1.2.2

Choose a tag to compare

@onokonem onokonem released this 24 May 17:26
chore: align plugin version with release tag v1.2.2

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v1.2.1

Choose a tag to compare

@onokonem onokonem released this 24 May 17:21
baf345b
Milestone v1.2: Replace Built-in WebSearch/WebFetch (#10)

* docs: start milestone v1.2 Replace Built-in WebSearch/WebFetch

* docs: complete project research for v1.2 built-in tool replacement

Research covers stack (no new deps), features (PreToolUse hook + redirect),
architecture (hook interception layer), and pitfalls (behavioral redirect risk,
output format gaps). Synthesized into SUMMARY.md with 3-phase roadmap suggestion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: define milestone v1.2 requirements

* docs: create milestone v1.2 roadmap (3 phases)

* docs(10): capture phase context

* docs(state): record phase 10 context session

* docs(10): add validation strategy

* docs(10): create phase 10 plan for hook infrastructure

Single plan adds PreToolUse deny hooks in hooks/hooks.json for
built-in WebSearch and WebFetch tools, and updates plugin.json
to reference the hooks file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(10): create phase plan

* feat(10-01): create PreToolUse deny hooks for WebSearch and WebFetch

Hook infrastructure using inline echo commands that intercept and deny
built-in WebSearch/WebFetch tool calls, redirecting to plugin skills.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(10-01): update plugin.json with hooks path reference

Adds "hooks": "hooks/hooks.json" to plugin manifest so Claude Code
discovers the PreToolUse hooks during plugin initialization.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(10-01): add plan summary for hook infrastructure

Documents PreToolUse hook creation, plugin.json update, and all
decisions/invariants from the plan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(phase-10): update tracking after wave 1

* test(10): persist human verification items as UAT

* docs(11): capture phase context for redirect reliability

* docs(state): record phase 11 context session

* docs(11): create phase plan for redirect reliability

Two plans for Phase 11: configuration updates denial reason text
and SKILL.md descriptions, then automated e2e test harness to
empirically validate redirect reliability across 8 prompt patterns.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(11): create phase plan

* fix(11-01): update denial reason strings for WebSearch and WebFetch hooks

- Changed WebSearch reason from "Use cc-websearch:websearch Skill tool instead."
  to "WebSearch tool is unavailable. Use cc-websearch:websearch Skill instead."
- Changed WebFetch reason from "Use cc-websearch:webfetch Skill tool instead."
  to "WebFetch tool is unavailable. Use cc-websearch:webfetch Skill instead."
- Verified JSON validity of both echo commands
- Confirmed old strings are absent from file

Per D-02/D-03: add "unavailable" context to denial reason for better model comprehension

* feat(11-01): add replacement-first descriptions and body paragraphs to SKILL.md files

- Prefixed websearch description with "Replacement for built-in WebSearch — "
- Prefixed webfetch description with "Replacement for built-in WebFetch — "
- Added "This skill replaces the built-in WebSearch tool when unavailable." as
  opening body paragraph under websearch heading
- Added "This skill replaces the built-in WebFetch tool when unavailable." as
  opening body paragraph under webfetch heading
- Preserved allowed-tools, ## Usage sections, code blocks, and schema content
- Verified original description text is intact (only prefix added)

Per D-05/D-06: replacement-first descriptions and body paragraphs for better
model skill selection context

* docs(11-01): complete redirect reliability plan 01 - denial reason and skill description updates

- SUMMARY.md documenting both tasks, decision rationale, and outcomes

* docs(phase-11): update tracking after wave 1

* test(11-02): create redirect-reliability e2e test suite

- 8 test cases (4 search + 4 fetch) with 180s per-test timeout
- runClaude helper spawns claude CLI with spawn() args array (T-11-01)
- Parses NDJSON stream-json output for tool_use events nested in
  assistant message content
- Populates toolNames from Skill input.skill or direct tool name
- Search tests assert cc-websearch:websearch skill invoked
- Fetch tests assert cc-websearch:webfetch skill invoked
- All prompts hardcoded string literals (no external input)

* docs(11-02): complete redirect reliability e2e test plan

- Created test/e2e/redirect-reliability.e2e.ts with 8 test cases
- Achieved 8/8 pass rate (2 independent runs)
- Redirect reliability confirmed per D-09 threshold
- SUMMARY.md with test results and deviation documentation

* docs(phase-11): update tracking after wave 2

* docs(phase-11): complete phase execution

* fix(11): CR-01 tighten search test assertions to avoid false positives

Change all 4 search test assertions from substring match
`includes('websearch')` to the more specific `includes('cc-websearch:websearch')`.
The old pattern was too broad -- it matched the denied built-in tool name
"WebSearch" and the wrong skill "cc-websearch:webfetch", creating false
positive paths that could make the test pass when Claude never invoked
the cc-websearch:websearch skill.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(11): WR-01/WR-02/WR-03 add child process cleanup, stderr diagnostics, and exit code checking

WR-01: Add `activeChildren` set and `afterEach` hook to kill zombie claude
child processes when vitest terminates a timed-out test.

WR-02: Include stderr in RunClaudeResult and surface it in diagnostics.
Previously stderr was collected but never used, losing error context.

WR-03: Capture exit code from the close event and reject with a diagnostic
message when claude CLI exits non-zero, instead of silently parsing
(possibly empty) stdout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(11): add afterEach import from vitest

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(11): update REVIEW.md with fix status after --fix run

* docs(12): capture phase context

* docs(state): record phase 12 context session

* docs(12): create phase plan with 2 plans (Wave 1 + Wave 2)

Plan 12-01: Output format assertions (XML well-formedness), cross-provider code review, truncation confirmation
Plan 12-02: Behavioral output consumption e2e harness (8 tests, 4 search + 4 fetch)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(12): create phase plan

* test(12-01): add XML well-formedness test and cross-provider verification

- New well-formedness test validates tag balance, escaping, ordering
- CROSS-PROVIDER.md confirms zero provider-specific code paths
- 143/143 tests pass, no regressions

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(12-02): add e2e output compatibility test suite

- 8 tests (4 search + 4 fetch) validating Claude consumes plugin output
- 7/8 pass, 1 permission-boundary issue with "Fetch" prompt wording
- spawn() with args array, hardcoded prompts, 180s per-test timeout

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(phase-12): complete phase execution and milestone v1.2

Phase 12 (output-compatibility): output format verified,
content truncation confirmed, cross-provider validated.
Milestone v1.2 complete — all 3 phases shipped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(12): verify phase 12 output compatibility

7/7 truths verified — XML well-formed, output consumable,
no provider-specific code, 100KB truncation confirmed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: commit phase 10 residual artifacts (research, patterns, review, uat)

Leftover planning artifacts from Phase 10 hook infrastructure that
were not previously committed. Includes config.json, VERIFICATION.md,
HUMAN-UAT.md, PATTERNS.md, RESEARCH.md, and REVIEW.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(12): ship phase 12 — PR #10

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* style: fix prettier formatting in e2e test files

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: bump version to 0.2.0 for hook intercept + redirect e2e

Milestone v1.2 delivers PreToolUse hook interception, redirect
reliability across 8 prompt patterns, and output format
compatibility verification.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v1.1.1

Choose a tag to compare

@onokonem onokonem released this 22 May 12:18
9b237cc
Distribution format changed (#9)

* feat: cc-websearch v1.0 — Claude Code plugin replacing built-in WebSearch and WebFetch

Complete implementation of a Claude Code plugin providing DDG-powered search
and content extraction as a drop-in replacement for Claude Code's built-in
WebSearch and WebFetch tools.

Key components:
- WebSearch: DuckDuckGo Lite HTML scraping with XML output (title/url/snippet)
- WebFetch: Readability + Turndown markdown extraction, redirect handling
- Domain filtering: allowed_domains/blocked_domains with mutual exclusivity
- Retry: exponential backoff with full jitter
- Config: ~/.config/websearch/config.json with env var override
- Logging: configurable levels to stderr
- CI: ESLint, Prettier, coverage, E2E tests, GitHub Actions, Dependabot
- Distribution: bundles shipped in skills/<name>/scripts/ for plugin install
- 142 tests, zero API keys required

* fix: restore actions/checkout@v6 and actions/setup-node@v6

Squash merge overwrote master's @v6 with @v4 from dev branch.
v6 uses Node.js 24+ runner, avoids deprecation warning.

* format fixed