webseek 0.1.0 → 0.2.0

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/README.md CHANGED
@@ -23,7 +23,7 @@ express mode** (`vertex-express`).
23
23
 
24
24
  ```bash
25
25
  npm install -g webseek # install the CLI globally
26
- npx webseek search "..." -p google # or run without installing
26
+ npx webseek "..." -p google # or run without installing
27
27
  ```
28
28
 
29
29
  ### Build from source
@@ -39,10 +39,10 @@ the TypeScript source through `tsx`).
39
39
  ## CLI mode
40
40
 
41
41
  ```bash
42
- webseek search <query...> --provider <openai|google|gemini> [options]
42
+ webseek <query...> --provider <openai|google|gemini> [options]
43
43
  ```
44
44
 
45
- Options for `search`:
45
+ Options:
46
46
 
47
47
  | Flag | Description |
48
48
  | ----------------------- | ------------------------------------------- |
@@ -56,9 +56,9 @@ Options for `search`:
56
56
  Examples:
57
57
 
58
58
  ```bash
59
- webseek search "best static site generators 2026" -p google -n 5
60
- webseek search "summarize the latest TypeScript release" -p openai
61
- webseek search "who won euro 2024" -p gemini --gemini-backend vertex-express --json
59
+ webseek "best static site generators 2026" -p google -n 5
60
+ webseek "summarize the latest TypeScript release" -p openai
61
+ webseek "who won euro 2024" -p gemini --gemini-backend vertex-express --json
62
62
  ```
63
63
 
64
64
  ## MCP server mode
@@ -135,7 +135,7 @@ they don't leak into shell history or process listings.
135
135
  ```
136
136
  src/
137
137
  index.ts public library entry (runSearch, types, createWebSearchTool)
138
- cli/ commander program: `search` and `mcp` commands
138
+ cli/ commander program: root search command and `mcp` command
139
139
  mcp/ MCP server + the web_search tool
140
140
  lib/ runSearch — the shared core called by both CLI and MCP
141
141
  providers/ per-provider implementations (openai, google-cse, gemini)
@@ -151,3 +151,19 @@ src/
151
151
  pnpm cicheck # format check, lint, typecheck, unit tests, spelling, secrets
152
152
  pnpm test:e2e # end-to-end tests (CLI subprocess + MCP stdio client)
153
153
  ```
154
+
155
+ ## Releasing
156
+
157
+ Publishing to npm is automated. To cut a new version:
158
+
159
+ 1. Run the `draft-release` skill — it bumps the version on a `release/vX.Y.Z`
160
+ branch, opens a PR, and creates a **draft** GitHub release.
161
+ 2. Review and merge the release PR into `main`.
162
+ 3. Open the draft release on GitHub and click **Publish release**.
163
+
164
+ Publishing the release triggers
165
+ [`.github/workflows/publish.yml`](.github/workflows/publish.yml), which verifies
166
+ the tag matches `package.json` and runs `pnpm publish`. Authentication uses npm
167
+ **trusted publishing** (OIDC) — no token secret is required, and provenance is
168
+ generated automatically. Configure the trusted publisher for the package once on
169
+ npmjs.com, pointing it at this repository's `publish.yml` workflow.
@@ -161,8 +161,12 @@ async function runSearchCommand(params) {
161
161
  json: Boolean(params.options.json)
162
162
  }));
163
163
  }
164
+ /**
165
+ * Configure the root program to run a web search. Search has no dedicated
166
+ * subcommand — `webseek "<query>" -p <provider>` is the primary invocation.
167
+ */
164
168
  function registerSearchCommand(program) {
165
- program.command("search").description("Search the web via a provider").argument("<query...>", "the search query").requiredOption("-p, --provider <name>", "provider: openai | google | gemini").option("-n, --max-results <number>", "desired number of results (SERP providers)").option("-m, --model <name>", "model override (openai, gemini)").option("--gemini-backend <backend>", "gemini backend: gemini-api | vertex-express").option("--json", "emit normalized JSON instead of text").option("--raw", "include the provider's raw response").action(wrapCommand(async ({ logger }, queryParts, options) => {
169
+ program.argument("[query...]", "the search query").option("-p, --provider <name>", "provider: openai | google | gemini").option("-n, --max-results <number>", "desired number of results (SERP providers)").option("-m, --model <name>", "model override (openai, gemini)").option("--gemini-backend <backend>", "gemini backend: gemini-api | vertex-express").option("--json", "emit normalized JSON instead of text").option("--raw", "include the provider's raw response").action(wrapCommand(async ({ logger }, queryParts, options) => {
166
170
  await runSearchCommand({
167
171
  logger,
168
172
  queryParts,
@@ -176,8 +180,8 @@ function registerSearchCommand(program) {
176
180
  * webseek CLI entry point.
177
181
  *
178
182
  * Two modes:
179
- * webseek search <query> --provider <name> run a one-off web search
180
- * webseek mcp start the MCP server (stdio)
183
+ * webseek <query> --provider <name> run a one-off web search (root command)
184
+ * webseek mcp start the MCP server (stdio)
181
185
  */
182
186
  function readPackageVersion(dir) {
183
187
  try {
@@ -161,8 +161,12 @@ async function runSearchCommand(params) {
161
161
  json: Boolean(params.options.json)
162
162
  }));
163
163
  }
164
+ /**
165
+ * Configure the root program to run a web search. Search has no dedicated
166
+ * subcommand — `webseek "<query>" -p <provider>` is the primary invocation.
167
+ */
164
168
  function registerSearchCommand(program) {
165
- program.command("search").description("Search the web via a provider").argument("<query...>", "the search query").requiredOption("-p, --provider <name>", "provider: openai | google | gemini").option("-n, --max-results <number>", "desired number of results (SERP providers)").option("-m, --model <name>", "model override (openai, gemini)").option("--gemini-backend <backend>", "gemini backend: gemini-api | vertex-express").option("--json", "emit normalized JSON instead of text").option("--raw", "include the provider's raw response").action(wrapCommand(async ({ logger }, queryParts, options) => {
169
+ program.argument("[query...]", "the search query").option("-p, --provider <name>", "provider: openai | google | gemini").option("-n, --max-results <number>", "desired number of results (SERP providers)").option("-m, --model <name>", "model override (openai, gemini)").option("--gemini-backend <backend>", "gemini backend: gemini-api | vertex-express").option("--json", "emit normalized JSON instead of text").option("--raw", "include the provider's raw response").action(wrapCommand(async ({ logger }, queryParts, options) => {
166
170
  await runSearchCommand({
167
171
  logger,
168
172
  queryParts,
@@ -176,8 +180,8 @@ function registerSearchCommand(program) {
176
180
  * webseek CLI entry point.
177
181
  *
178
182
  * Two modes:
179
- * webseek search <query> --provider <name> run a one-off web search
180
- * webseek mcp start the MCP server (stdio)
183
+ * webseek <query> --provider <name> run a one-off web search (root command)
184
+ * webseek mcp start the MCP server (stdio)
181
185
  */
182
186
  function readPackageVersion(dir) {
183
187
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webseek",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Unified multi-provider web search as a CLI, MCP server, and library (OpenAI, Google Custom Search, Gemini)",
5
5
  "keywords": [
6
6
  "web-search",
@@ -12,13 +12,13 @@
12
12
  "gemini",
13
13
  "serp"
14
14
  ],
15
- "homepage": "https://github.com/dyoshikawa/websearch#readme",
15
+ "homepage": "https://github.com/dyoshikawa/webseek#readme",
16
16
  "bugs": {
17
- "url": "https://github.com/dyoshikawa/websearch/issues"
17
+ "url": "https://github.com/dyoshikawa/webseek/issues"
18
18
  },
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "https://github.com/dyoshikawa/websearch.git"
21
+ "url": "https://github.com/dyoshikawa/webseek.git"
22
22
  },
23
23
  "license": "MIT",
24
24
  "author": "dyoshikawa",
@@ -54,6 +54,7 @@
54
54
  "access": "public"
55
55
  },
56
56
  "devDependencies": {
57
+ "@openrouter/sdk": "0.13.7",
57
58
  "@secretlint/secretlint-rule-preset-recommend": "13.0.2",
58
59
  "@tsconfig/node24": "^24.0.4",
59
60
  "@types/node": "^26.0.0",
@@ -61,6 +62,8 @@
61
62
  "lint-staged": "17.0.7",
62
63
  "oxfmt": "0.55.0",
63
64
  "oxlint": "1.70.0",
65
+ "repomix": "1.14.1",
66
+ "resend": "6.14.0",
64
67
  "rulesync": "^8.31.0",
65
68
  "secretlint": "13.0.2",
66
69
  "simple-git-hooks": "2.13.1",
@@ -89,8 +92,10 @@
89
92
  "fix": "pnpm run fmt && pnpm run oxlint:fix",
90
93
  "test": "vitest run --config vitest.config.ts --silent=true",
91
94
  "test:e2e": "vitest run --config vitest.e2e.config.ts --silent=false",
95
+ "sync:skill-docs": "tsx scripts/sync-skill-docs.ts",
96
+ "check:sync-skill-docs": "tsx scripts/check-skill-docs-sync.ts",
92
97
  "cicheck:code": "pnpm run check && pnpm run test",
93
- "cicheck:content": "pnpm run cspell && pnpm run secretlint",
98
+ "cicheck:content": "pnpm run check:sync-skill-docs && pnpm run cspell && pnpm run secretlint",
94
99
  "cicheck": "pnpm run cicheck:code && pnpm run cicheck:content",
95
100
  "generate": "rulesync generate",
96
101
  "gitignore": "rulesync gitignore"