Repository navigation
Releases: Djarvur/cc-websearch
Releases · Djarvur/cc-websearch
Release list
v1.2.4
What's Changed
- Bundle jsdom into webfetch.cjs — no more
npm installneeded at runtime. Zero external dependencies. Plugin works directly from git clone with no build step. - Inline CSS and worker source — jsdom's
default-stylesheet.cssandxhr-sync-worker.jsare now embedded in the CJS bundle via esbuild plugin - Fix strict-mode compatibility —
@acemir/cssomCSSStyleRule setsparentRulevia plain assignment (sloppy mode); bundled strict mode threw because cssstyle defines it as getter-only. Patched to use_parentRulebacking field - Keep built artifacts in repo — CJS files tracked in git for seamless install
Details
webfetch.cjsis fully self-contained (9.9MB with jsdom bundled)websearch.cjsunchanged (2.7MB)- No runtime deps, no SessionStart hooks, no
node_modulesneeded
v1.2.3
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
v1.2.1
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
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