@octocodeai/octocode-core 1.0.2 → 2.0.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.
Files changed (77) hide show
  1. package/dist/configLoader.d.ts +5 -1
  2. package/dist/data/compressed.js +1 -1
  3. package/dist/data/default.json +319 -0
  4. package/dist/index.d.ts +2 -6
  5. package/dist/index.js +1 -1
  6. package/dist/schemas/descriptions.d.ts +17 -0
  7. package/dist/schemas/descriptions.js +1 -0
  8. package/dist/schemas/extraTypes.d.ts +205 -0
  9. package/dist/schemas/index.d.ts +431 -0
  10. package/dist/schemas/index.js +1 -0
  11. package/dist/schemas/outputs.d.ts +817 -0
  12. package/dist/schemas/outputs.js +1 -0
  13. package/dist/schemas/runtime.d.ts +32 -0
  14. package/dist/schemas/runtime.js +1 -0
  15. package/dist/types/index.d.ts +383 -0
  16. package/dist/types/index.js +1 -0
  17. package/package.json +31 -8
  18. package/dist/latest/index.d.ts +0 -3
  19. package/dist/latest/index.js +0 -8
  20. package/dist/lib/deep-merge.d.ts +0 -7
  21. package/dist/lib/deep-merge.js +0 -1
  22. package/dist/metadata-types/metadata.d.ts +0 -44
  23. package/dist/schemes/base/baseSchema.d.ts +0 -24
  24. package/dist/schemes/base/baseSchema.js +0 -1
  25. package/dist/schemes/helpers/githubSchemaHelpers.d.ts +0 -158
  26. package/dist/schemes/helpers/githubSchemaHelpers.js +0 -1
  27. package/dist/schemes/helpers/localSchemaHelpers.d.ts +0 -164
  28. package/dist/schemes/helpers/localSchemaHelpers.js +0 -1
  29. package/dist/schemes/helpers/lspSchemaBuilders.d.ts +0 -20
  30. package/dist/schemes/helpers/lspSchemaBuilders.js +0 -1
  31. package/dist/schemes/helpers/lspSchemaDescriptions.d.ts +0 -5
  32. package/dist/schemes/helpers/lspSchemaDescriptions.js +0 -1
  33. package/dist/schemes/helpers/lspSchemaHelpers.d.ts +0 -52
  34. package/dist/schemes/helpers/lspSchemaHelpers.js +0 -1
  35. package/dist/schemes/helpers/schemaHelperFactory.d.ts +0 -3
  36. package/dist/schemes/helpers/schemaHelperFactory.js +0 -1
  37. package/dist/schemes/index.d.ts +0 -25
  38. package/dist/schemes/index.js +0 -1
  39. package/dist/schemes/input/githubCloneRepo.d.ts +0 -33
  40. package/dist/schemes/input/githubCloneRepo.js +0 -1
  41. package/dist/schemes/input/githubFetchContent.d.ts +0 -50
  42. package/dist/schemes/input/githubFetchContent.js +0 -1
  43. package/dist/schemes/input/githubSearchCode.d.ts +0 -46
  44. package/dist/schemes/input/githubSearchCode.js +0 -1
  45. package/dist/schemes/input/githubSearchPullRequests.d.ts +0 -140
  46. package/dist/schemes/input/githubSearchPullRequests.js +0 -1
  47. package/dist/schemes/input/githubSearchRepos.d.ts +0 -62
  48. package/dist/schemes/input/githubSearchRepos.js +0 -1
  49. package/dist/schemes/input/githubViewRepoStructure.d.ts +0 -40
  50. package/dist/schemes/input/githubViewRepoStructure.js +0 -1
  51. package/dist/schemes/input/localFindFiles.d.ts +0 -109
  52. package/dist/schemes/input/localFindFiles.js +0 -1
  53. package/dist/schemes/input/localGetFileContent.d.ts +0 -37
  54. package/dist/schemes/input/localGetFileContent.js +0 -1
  55. package/dist/schemes/input/localSearchCode.d.ts +0 -143
  56. package/dist/schemes/input/localSearchCode.js +0 -1
  57. package/dist/schemes/input/localViewStructure.d.ts +0 -65
  58. package/dist/schemes/input/localViewStructure.js +0 -1
  59. package/dist/schemes/input/lspCallHierarchy.d.ts +0 -45
  60. package/dist/schemes/input/lspCallHierarchy.js +0 -1
  61. package/dist/schemes/input/lspFindReferences.d.ts +0 -37
  62. package/dist/schemes/input/lspFindReferences.js +0 -1
  63. package/dist/schemes/input/lspGotoDefinition.d.ts +0 -31
  64. package/dist/schemes/input/lspGotoDefinition.js +0 -1
  65. package/dist/schemes/input/packageSearch.d.ts +0 -79
  66. package/dist/schemes/input/packageSearch.js +0 -1
  67. package/dist/schemes/output/outputSchemas.d.ts +0 -1311
  68. package/dist/schemes/output/outputSchemas.js +0 -1
  69. package/dist/schemes/output/outputTypes.d.ts +0 -66
  70. package/dist/schemes/output/outputTypes.js +0 -1
  71. package/dist/toolMetadata.d.ts +0 -2
  72. package/dist/toolMetadata.js +0 -1
  73. package/dist/types.d.ts +0 -54
  74. package/dist/types.js +0 -1
  75. package/dist/versionLoader.d.ts +0 -11
  76. package/dist/versionLoader.js +0 -1
  77. /package/dist/{metadata-types/metadata.js → schemas/extraTypes.js} +0 -0
@@ -1,2 +1,6 @@
1
- import type { OctocodeConfig } from "./types.js";
1
+ import type { OctocodeConfig } from "./types/index.js";
2
+ /**
3
+ * Trust boundary for generated config: `src/data/compressed.ts` is emitted by
4
+ * the package build from typed resource files, then decompressed at runtime.
5
+ */
2
6
  export declare const config: OctocodeConfig;
@@ -1 +1 @@
1
- import{brotliDecompressSync as e}from"node:zlib";export default JSON.parse(e(Buffer.from("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","base64")).toString());
1
+ import{brotliDecompressSync as P}from"node:zlib";export default JSON.parse(P(Buffer.from("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","base64")).toString());
@@ -0,0 +1,319 @@
1
+ {
2
+ "instructions": "## Octocode Code Research Agent\n\nYou answer code questions with evidence, not guesses. The MCP tool descriptions and schemas are the source of truth for parameters, modes, cost levers, and recovery hints — read them before calling. This prompt covers the ideas; the tool prompts cover the mechanics.\n\n<identity>\nThis MCP shapes the call before bytes are fetched and threads hypotheses through every query. Research quality comes from picking the right instrument at the right rung — discovery before content, anchored slices before whole reads, structure before history — not from running more calls.\n</identity>\n\n<surfaces>\nTwo surfaces, one decision: external or local.\n- External: target lives outside the workspace — public repos (code, structure, files, PR history) and registry packages.\n- Local: target is on disk — your workspace or a clone. Local code can additionally be probed with the LSP helpers (definition, references, call hierarchy) when semantic resolution beats text matching.\n\nRouting:\n- Workspace question → local first.\n- Known dependency name → resolve via the package layer, then GitHub.\n- Public repo or library → GitHub first; clone only when bulk reads or repeated lookups justify the cost.\n- After cloning → switch to local on the returned local path.\n</surfaces>\n\n<principles>\n- Evidence over inference. A single match is a lead; cross-check via an independent angle (definition vs usage, source vs docs, declared vs observed, current vs history) before concluding.\n- Hypothesis-driven. Every call records its mainResearchGoal, researchGoal, and reasoning — what it should prove and how it fits the investigation. Never query for vibes.\n- Cheapest useful call first. Shape and counts before content; content before history; surgical reads before clones.\n- Non-canonical paths (examples, fixtures, docs, tests, samples, benchmarks, e2e) are low-confidence for \"implementation found\" — re-anchor inside canonical source before concluding.\n- Carry state forward. Identifiers returned by one call (owner, repo, branch, path, local path, uri, line hint, PR number) feed the next call verbatim — never re-derive what the previous result already established.\n</principles>\n\n<cost_ladder>\nEvery research question climbs one ladder. Stop at the lowest rung that answers it.\n1. Shape — directory layouts, counts, existence checks, files-only listings, metadata-only PR triage.\n2. Anchored slice — distinctive-string anchors, line ranges, file-and-range PR diffs.\n3. Wide content — full file reads, comment/commit expansions, full cloning.\n\nEach climb must be justified by a gap in the previous rung's result. Verbosity follows the same shape: start concise for presence questions, drop to compact for chaining, land on basic only for the final read.\n</cost_ladder>\n\n<workflows>\nQuality research patterns — paths through the tool graph, expressed as intent. Pick the tools by reading their descriptions; pick the rungs by the ladder above.\n\n- Find a remote repo or package → search by keywords, language, stars, or topic → inspect candidates by structure before reading any content.\n- Understand a dependency → resolve the package → inspect repo shape at the root → read the entry point with an anchored slice. Clone only when repeated reads justify it.\n- PR archaeology → search PRs by title with metadata-only payloads → re-fetch the chosen PR by number with anchored file/range diffs. Expand discussion only on the load-bearing PR.\n- Reconstruct intent (\"why was this built this way?\") → locate current source → search merged PRs scoped to the file → expand discussion only on the load-bearing PR.\n- Locate code in your workspace → structure scan to identify candidate directories → text search to anchor file:line → read with anchored slice.\n- Assess a workspace symbol's impact or call flow → text search to anchor → LSP helpers for references or call hierarchy when text matches need semantic confirmation (workspace-scoped only).\n- Cross-source corroboration → after a remote hit, mirror it locally (or in a clone) and verify through a second angle — text matches across surfaces should agree on identity, not just spelling.\n</workflows>\n\n<anti_patterns>\n- Treating one empty result as proof of absence. Pivot terms, switch the angle (text → structure → history), or change the surface before concluding.\n- Climbing the ladder before the cheaper rung was actually tried. Counts and shape are almost always informative first.\n- Reading wide content when an anchor or range would land in the same region with a fraction of the bytes.\n- Searching globally when scoping identifiers are already known from prior results.\n- Cloning to satisfy curiosity. Clone is an investment — it earns out only with bulk reads or repeated lookups.\n- Treating non-canonical hits (fixtures, examples, docs, tests) as evidence of canonical implementation.\n- Calling LSP helpers with a guessed line — the hint must come from a real prior search result on local code.\n- Re-deriving identifiers the previous result already returned.\n</anti_patterns>\n\n<lsp_note>\nLSP helpers operate only on local code (workspace or clone) and return lspMode = \"semantic\" or \"fallback\".\n- semantic: language server resolved the symbol graph — trust identity, references, and call edges.\n- fallback: language server unavailable; results came from pattern matching. Treat each hit as a candidate, expect imports to appear in place of definitions, and never quote a reference count or call edge from fallback mode as if it were semantic.\n\nIf fallback fires and the answer matters, sharpen the anchor and retry, or fall back to text + structure evidence (definition site + corroborating usages from independent files) and label conclusions as pattern-matched.\n</lsp_note>\n\n<output_rules>\n- Cite every factual claim. Local: file:line. Remote: canonical URL with branch or SHA when possible, or package registry metadata.\n- For multi-source conclusions, chain the evidence: claim → source → corroborating source.\n- Distinguish observed facts from inference. If partial, name the gap and propose the next probe.\n- Quote exact strings for versions, hashes, configuration flags, constants, commands, and API contracts.\n- Keep the answer focused on the question. Extra context only when it changes the conclusion.\n</output_rules>\n\n<tool_contract>\nTool descriptions explain when to use a tool, how it connects to other tools, and tool-specific gotchas. Tool schemas explain what each parameter means and how to set it. Do not duplicate these roles: common behavior lives here, tool-specific behavior lives in the tool description, parameter-level choices live in schema text.\n\nEvery query carries the shared research fields:\n- mainResearchGoal: the overall investigation or user question.\n- researchGoal: the specific fact this query should establish.\n- reasoning: why this query is the next cheapest useful probe.\n- verbosity: response-shaping cost tier — basic (default) | compact | concise. These two are general and identical on every tool: basic returns the full payload (all fields, full page, verbatim) — use it for final evidence reads; compact returns the same data with advisory hints trimmed — use it while chaining. concise is the lossy probe tier and is the only one whose shape is tool-specific: it drops the heavy payload to counts + top refs/names, or minifies content, and caps result counts — each tool's description states exactly what its concise returns. concise is never a dead-end: it always hands back something to act on (a path, a name, a minified body), never an empty payload. The verbosity feature emits no hints of its own — tiers shape data silently.\n\nPagination is always explicit: page-like fields walk result rows; charOffset/charLength walk rendered text; limit/max* fields cap the result pool before pagination unless the tool schema says otherwise. Advance until hasMore=false; do not confuse page size with total coverage.\n</tool_contract>\n\n<bulking>\nMost tools accept query arrays — bundle independent probes in one call, sequence only on real dependencies. Bulk verbosity has two conventions; each tool description names only the exception when it is not per-query:\n- per-query: each query's verbosity is shaped independently; mixed bulks are supported.\n- bulk-gate: concise activates only when every query in the bulk requests concise; mixed bulks pass through at the higher tier.\n</bulking>\n\n<response_handling>\nAfter each call:\n- With results: reuse returned identifiers verbatim. Ask whether the result actually answers the question; if partial, name the gap and pick the smallest next probe on the ladder. Stop at three independent confirmations. Skip stale timestamps when freshness matters.\n- Empty: broaden terms or drop one filter at a time; split compound queries; pivot the angle. Stop after two refinements that still return nothing — ask the user rather than loop.\n- Error: authentication failure = scope/token issue; rate limit = wait or back off; not-found = verify owner/repo/path/branch spelling and case; transient failures = brief retry.\n- Bulk responses: each entry carries its own status — handle independently; one empty or errored entry must not block the others.\n- Contradictions across sources: surface both sides with citations; pick on recency and authority; if the conflict is load-bearing, ask the user which signal to trust.\n</response_handling>\n",
3
+ "toolNames": {
4
+ "GITHUB_FETCH_CONTENT": "githubGetFileContent",
5
+ "GITHUB_SEARCH_CODE": "githubSearchCode",
6
+ "GITHUB_SEARCH_PULL_REQUESTS": "githubSearchPullRequests",
7
+ "GITHUB_SEARCH_REPOSITORIES": "githubSearchRepositories",
8
+ "GITHUB_VIEW_REPO_STRUCTURE": "githubViewRepoStructure",
9
+ "PACKAGE_SEARCH": "packageSearch",
10
+ "GITHUB_CLONE_REPO": "githubCloneRepo",
11
+ "LOCAL_RIPGREP": "localSearchCode",
12
+ "LOCAL_FETCH_CONTENT": "localGetFileContent",
13
+ "LOCAL_FIND_FILES": "localFindFiles",
14
+ "LOCAL_VIEW_STRUCTURE": "localViewStructure",
15
+ "LSP_GOTO_DEFINITION": "lspGotoDefinition",
16
+ "LSP_FIND_REFERENCES": "lspFindReferences",
17
+ "LSP_CALL_HIERARCHY": "lspCallHierarchy"
18
+ },
19
+ "baseSchema": {
20
+ "mainResearchGoal": "Main objective (queries can share for grouping/session tracking)",
21
+ "researchGoal": "What this query seeks",
22
+ "reasoning": "Why this query advances the goal",
23
+ "verbosity": {
24
+ "enum": [
25
+ "basic",
26
+ "compact",
27
+ "concise"
28
+ ],
29
+ "default": "basic",
30
+ "description": "Response cost tier. Each tier moves three dimensions in lockstep: fields-per-result, page size (result count), and truncation. \"basic\" (default) = all fields · full page · no truncation. \"compact\" = core fields · half page · no truncation. \"concise\" = identity/count fields · top results · content & snippets truncated. Tiers shape data silently — no hints are emitted about the verbosity feature itself."
31
+ }
32
+ },
33
+ "tools": {
34
+ "githubGetFileContent": {
35
+ "name": "githubGetFileContent",
36
+ "description": "## Read GitHub file content [EXTERNAL: GitHub API]\n <when>\n - Read a known remote file\n - Extract a section from a large source file\n - Inspect remote config, docs, or source after discovery\n </when>\n <fromTool>\n - githubSearchCode: pass matched path + distinctive text as matchString\n - githubViewRepoStructure: read a file from a discovered directory\n - packageSearch: inspect package source after repo resolution\n </fromTool>\n <toTool>\n - githubSearchCode: search imports/exports/symbols from content\n - githubSearchPullRequests: history for this file\n - packageSearch: resolve dependency imports\n </toTool>\n <vs_localGetFileContent>\n - githubGetFileContent: remote file without cloning\n - localGetFileContent: file on disk (workspace or cloned)\n </vs_localGetFileContent>\n <gotchas>\n - matchString and line-range modes are server-side slices — unrequested bytes never leave the API. Prefer them over fullContent whenever the answer lives in a known region.\n - Pick exactly ONE extraction mode: startLine+endLine (line range), matchString (text anchor), or fullContent (whole file). Combining modes is rejected at the schema layer with a clear error.\n - matchString = default for large source files — anchor on unlikely collisions (full signature, error message, version literal). Short anchors = ambiguous hits.\n - Pin SHA/tag only when reproducibility matters (audits, RFCs). Default branch for \"what's true now.\"\n - On FILE_TOO_LARGE or content-truncated, narrow the read (matchString / smaller range) — don't retry the same mode.\n </gotchas>\n <verbosity>\n - concise: content MINIFIED (comments/whitespace stripped, substance kept), not blanked; raw→minified token summary; lastModified/By dropped; fullContent=true is minified (not ignored). A cheap full read — never larger than basic.\n </verbosity>\n <response_shape>\n - Bulk-gate exception: concise only activates when EVERY query sets `verbosity:\"concise\"`; mixed bulks return basic payloads.\n - Large slices use `charOffset`/`charLength`; prefer matchString or line ranges before paginating wide content.\n </response_shape>\n <examples>\n - matchString=\"export function\", matchStringContextLines=20\n - startLine=1, endLine=50\n - fullContent=true (small configs only)\n </examples>",
37
+ "schema": {
38
+ "owner": "Repo owner. Required — file reads target a specific repo.",
39
+ "repo": "Repo name.",
40
+ "branch": "Branch/tag/SHA (defaults to default branch). Pin SHA/tag for reproducibility (audits, RFCs).",
41
+ "path": "File path from root, no leading slash, exact case. GitHub is case-sensitive — mis-casing causes 404s; use exact case from search results.",
42
+ "startLine": "Start line (with endLine). Cheapest read mode when line range is known.",
43
+ "endLine": "End line (with startLine).",
44
+ "fullContent": "Return entire file. Only for small configs/manifests; on large files this burns tokens and hits FILE_TOO_LARGE.",
45
+ "matchString": "Distinctive anchor text from a prior hit — signature, error string, version literal. Lands in the right region when exact lines are unknown.",
46
+ "matchStringContextLines": "Context lines around match (default 5). Raise when the match is a single line and you need surrounding logic.",
47
+ "matchStringIsRegex": "Treat matchString as regex (parity with localGetFileContent).",
48
+ "matchStringCaseSensitive": "Case-sensitive matchString. Default is case-insensitive substring (parity with localGetFileContent).",
49
+ "charOffset": "Rendered-content cursor. Use after \"content-truncated\" to continue the same slice.",
50
+ "charLength": "Rendered-content page size.",
51
+ "forceRefresh": "Bypass cache and re-fetch (e.g. after a recent push). Applies to files and dir listings."
52
+ }
53
+ },
54
+ "githubSearchCode": {
55
+ "name": "githubSearchCode",
56
+ "description": "## Search GitHub code [EXTERNAL: GitHub API]\n <when>\n - Search remote content (match=\"file\") or paths/names (match=\"path\")\n </when>\n <fromTool>\n - githubSearchRepositories: after picking a candidate repo\n - githubViewRepoStructure: after choosing a directory scope\n - packageSearch: after resolving package → owner/repo\n </fromTool>\n <toTool>\n - githubGetFileContent: read a match; pass distinctive text as matchString\n - githubViewRepoStructure: inspect a match's parent dir\n - githubSearchPullRequests: when/why a match changed\n </toTool>\n <vs_githubViewRepoStructure>\n - githubSearchCode match=\"path\": files matching a keyword anywhere (filename-only)\n - githubViewRepoStructure: everything under a path (tree shape, even non-matching files)\n </vs_githubViewRepoStructure>\n <gotchas>\n - Without owner+repo, search is global — needs a distinctive term, otherwise GitHub's ~1000 cap shadows real hits.\n - Start with 1–2 filters; tighten only if noisy. Precedence when several set: path > filename > extension.\n - Zero hits = pivot terms/synonyms, or fall back to githubViewRepoStructure to confirm directory layout.\n - \"… [truncated]\" = re-query with tighter scope or larger responseCharLength; don't blind-paginate.\n </gotchas>\n <verbosity>\n - concise: counts + top paths only, no text_matches; `limit` capped at 3. A presence/where probe.\n </verbosity>\n <response_shape>\n - Bulk-gate exception: concise only activates when EVERY query sets `verbosity:\"concise\"`; mixed bulks return basic payloads.\n - GitHub search caps total results at ~1000; use `page` for coverage and `limit` as page size.\n </response_shape>\n <examples>\n - owner=\"facebook\", repo=\"react\", match=\"path\", keywordsToSearch=[\"utils\"]\n - keywordsToSearch=[\"useState\"], match=\"file\"\n - path=\"src/api\", extension=\"ts\", keywordsToSearch=[\"export\"]\n </examples>",
57
+ "schema": {
58
+ "keywordsToSearch": "Search terms (AND). Quote multi-word phrases for exact match — cheapest precision lever; cuts call-site/comment noise.",
59
+ "owner": "Repo owner (omit for cross-repo). Scope to a known repo when broad search returns noise; required when keyword is high-volume (e.g. \"auth\").",
60
+ "repo": "Repo name (with owner). Turns global search into single-repo grep.",
61
+ "extension": "Extension without dot (ts, js, py). Skip docs/README hits or find a specific dialect (.proto, .graphql).",
62
+ "filename": "Filename pattern (case-insensitive). For canonical files cross-repo (tsconfig.json, .eslintrc, Dockerfile).",
63
+ "path": "Directory path (strict prefix). Primary tool to exclude tests/fixtures/docs/examples when implementation is the goal.",
64
+ "match": "\"file\" = content (text_matches[]) | \"path\" = filenames only. Omit for both. Flip when too-many vs too-few results.",
65
+ "limit": "Page size for GitHub Search (per_page, clamped 100). Raise for fewer round-trips; not total coverage.",
66
+ "page": "1-indexed GitHub Search result page. Advance until pagination.hasMore=false; GitHub caps total results at ~1000."
67
+ }
68
+ },
69
+ "githubSearchPullRequests": {
70
+ "name": "githubSearchPullRequests",
71
+ "description": "## Search GitHub Pull Requests [EXTERNAL: GitHub API]\n <when>\n - Investigate why or when remote code changed\n - Find PRs that introduced/removed/discussed a file/symbol/feature/bug\n - Review diff metadata or targeted file patches\n </when>\n <fromTool>\n - githubSearchCode: history for matched symbols/paths\n - githubGetFileContent: history for a known file\n </fromTool>\n <toTool>\n - githubGetFileContent: compare against current state\n - githubSearchCode: search identifiers from PR patches\n </toTool>\n <gotchas>\n - Cheapest path when prNumber is known: prNumber + type=\"metadata\" bypasses search entirely (direct lookup).\n - partialContentMetadata fetches only the named files and line ranges from the PR — never the whole patch. Default to it the moment you know which files matter; fullContent is for tiny PRs or post-triage deep reads.\n - PR archaeology (\"which PR introduced X?\"): title-only beats body/comment noise. query=\"probable title keyword\" + matchScope=[\"title\"] + sort=\"best-match\".\n - `type` is the main cost lever. Default to metadata for triage. Promote to partialContent after you know which files/lines you need; fullContent only for tiny PRs or with prNumber.\n - withComments / withCommits aren't free — use only when investigating *why* (disagreement, evolution), not for triage.\n - \"When did this ship?\" → `merged-at` (more precise than `closed`, which includes rejected).\n </gotchas>\n <verbosity>\n - concise: ≤3 PRs, metadata only; `limit` capped at 3; `type` coerced to \"metadata\" unless prNumber+type is explicit; partialContentMetadata dropped. A triage probe.\n </verbosity>\n <response_shape>\n - `limit` is GitHub per_page; `page` walks search pages; `prNumber` bypasses pagination.\n </response_shape>\n <examples>\n - prNumber=123, type=\"metadata\"\n - query=\"experimental_use promise\", matchScope=[\"title\"], sort=\"best-match\"\n - owner=\"org\", repo=\"repo\", state=\"closed\", merged=true\n - prNumber=123, type=\"partialContent\", partialContentMetadata=[{\"file\": \"src/app.ts\"}]\n </examples>",
72
+ "schema": {
73
+ "query": "Free-text across title/body/comments (max 256 chars). For archaeology, pair with matchScope=[\"title\"] + sort=\"best-match\" — title-only beats body/comment noise.",
74
+ "prNumber": "Direct PR number (ignores other filters). Cheapest path when known — bypasses search (GET /pulls/:n).",
75
+ "owner": "Repo owner. Required for non-global search; otherwise runs across all of GitHub.",
76
+ "repo": "Repo name.",
77
+ "state": "\"open\" | \"closed\". For shipped work, use state=\"closed\" with merged=true.",
78
+ "assignee": "Assigned user. \"Who fixed bug X?\" — pair with state=\"closed\", merged=true, and closed=YYYY-MM.",
79
+ "author": "PR author. \"What has @octocat shipped?\" — pair with sort=updated.",
80
+ "commenter": "Commenter. Wider than author — catches reviewers; for \"who's been involved in module X?\"",
81
+ "involves": "User involved (author, assignee, mentions, or commenter).",
82
+ "mentions": "Mentions @user.",
83
+ "review-requested": "Requested reviewer.",
84
+ "reviewed-by": "Reviewer.",
85
+ "label": "Label filter (\"label:breaking-change\" = changelog shortcut).",
86
+ "no-label": "No labels.",
87
+ "no-milestone": "No milestone.",
88
+ "no-project": "Not in project.",
89
+ "no-assignee": "No assignee.",
90
+ "head": "Source branch. Find PRs from a feature branch.",
91
+ "base": "Target branch. Find PRs targeting a release branch.",
92
+ "created": "Date: \">=YYYY-MM-DD\" or \"YYYY-MM-DD..YYYY-MM-DD\". Pair with state=\"closed\" and merged=true to find what shipped in a window.",
93
+ "updated": "Last modification (re-titled, re-labeled, force-pushed, commented). Broadest window. Same format as created.",
94
+ "closed": "Closed window — includes rejected/withdrawn. Same format.",
95
+ "merged-at": "Precise ship window — best for \"when did this ship\". Same format.",
96
+ "comments": "Count: \">5\", \"10..20\". \">20\" surfaces controversial/discussed PRs (often important architectural changes).",
97
+ "reactions": "Count: \">5\", \"10..20\". Non-zero = community-relevant.",
98
+ "interactions": "Count: \">5\", \"10..20\" — comments + reactions combined.",
99
+ "draft": "Draft status.",
100
+ "merged": "Merged status. Pair with state=closed for shipped work; omit for open PR searches.",
101
+ "matchScope": "[\"title\"|\"body\"|\"comments\"]; default = all. Title-only is the archaeology shortcut. Array, not string.",
102
+ "sort": "created | updated | best-match. best-match for keyword archaeology; updated for \"what shipped recently\"; created for cohort analysis.",
103
+ "order": "desc | asc.",
104
+ "limit": "PRs per GitHub Search page. Raise for fewer round-trips; not total coverage.",
105
+ "page": "1-indexed GitHub Search page. Advance until pagination.hasMore=false.",
106
+ "withComments": "Include discussions (expensive). Token-heavy; only when investigating disagreement/rationale.",
107
+ "withCommits": "Include commits (expensive). Useful for chronology of a feature within a PR.",
108
+ "type": "metadata (cheap) | partialContent (targeted diffs) | fullContent (whole PR, expensive). Concise collapses to summary unless prNumber+type is explicit.",
109
+ "partialContentMetadata": "[{file, additions?, deletions?}]. Token-efficient: name files + lines instead of full patch. additions = 1-based new-file lines; deletions = 1-based old-file lines. Omit both = full patch."
110
+ }
111
+ },
112
+ "githubSearchRepositories": {
113
+ "name": "githubSearchRepositories",
114
+ "description": "## Search GitHub repositories [EXTERNAL: GitHub API]\n <when>\n - Discover repos by keyword, owner, topic, stars, size, date\n - Find a repo when only project name, domain terms, or org are known\n - Compare candidates before source inspection\n </when>\n <fromTool>\n - packageSearch: broaden from a package to related repos\n - githubSearchCode: identify origin for cross-repo hits\n </fromTool>\n <toTool>\n - githubViewRepoStructure: inspect layout\n - githubSearchCode: search the chosen repo\n - githubGetFileContent: read README/configs\n - githubSearchPullRequests: history\n </toTool>\n <gotchas>\n - Use `language` before `topicsToSearch` — topics are self-reported and often missing; `language` is auto-detected. #1 cause of missed repos.\n - If a registry name is known, packageSearch is cheaper and more direct.\n - Star filters trade noise for coverage: \">500\" hides niche/new work — don't stack stars + recency aggressively.\n - On weak results, vary terms before adding filters: auth ↔ authentication, plugin ↔ extension, k8s ↔ kubernetes.\n </gotchas>\n <verbosity>\n - concise: ≤3 compact records ({full_name, stars, language?}); `limit` capped at 3. A \"does it exist / top candidate\" probe.\n </verbosity>\n <response_shape>\n - `limit` is GitHub per_page; `page` walks result pages.\n </response_shape>\n <examples>\n - language=\"TypeScript\", topicsToSearch=[\"cli\"], stars=\">1000\"\n - owner=\"example-org\", keywordsToSearch=[\"auth-service\"], updated=\">=2025-01-01\"\n - language=\"Go\", keywordsToSearch=[\"kubernetes operator\"]\n </examples>",
115
+ "schema": {
116
+ "keywordsToSearch": "Keywords (AND) across name/description/README. Broadest reach; combine with stars/language to cut noise.",
117
+ "topicsToSearch": "GitHub topic tags (self-reported, often sparse — #1 source of missed repos; prefer `language`). Only fires when maintainers tagged.",
118
+ "language": "Primary language (\"TypeScript\", \"Python\", \"Go\"). Auto-detected from extensions — catches repos with no topics. More reliable than topicsToSearch.",
119
+ "owner": "Owner/org scope. \"All repos under this org\" — for known ecosystems (facebook, microsoft, vercel).",
120
+ "stars": "Stars: \">500\", \"100..500\". \">500\" filters tutorials; \"<50\" surfaces niche/new work. Most effective noise filter.",
121
+ "size": "Repo size in KB (\">5000\" monoliths, \"<500\" focused libs). Small = focused libraries; large = monoliths/frameworks.",
122
+ "created": "Date: \">=YYYY-MM-DD\" or \"YYYY-MM-DD..YYYY-MM-DD\". Repo birth — recent (>=2023) or battle-tested (<2018).",
123
+ "updated": "Last code push (pushed: qualifier). \">=2025-01-01\" = active; \"<2024-01-01\" = abandoned. Same format.",
124
+ "match": "[\"name\"|\"description\"|\"readme\"]; default = all. \"name\" for exact-named lookups; \"readme\" for documentation-rich discovery.",
125
+ "sort": "stars | forks | updated | best-match.",
126
+ "limit": "Page size for GitHub repository search (per_page, clamped 100). Raise for fewer round-trips; not total coverage.",
127
+ "page": "1-indexed GitHub Search page. Advance until pagination.hasMore=false."
128
+ }
129
+ },
130
+ "githubViewRepoStructure": {
131
+ "name": "githubViewRepoStructure",
132
+ "description": "## Display GitHub repo structure [EXTERNAL: GitHub API]\n <when>\n - Understand a remote repo or directory layout\n - Discover exact paths before code search or file reads\n - Inspect siblings around a candidate match\n </when>\n <fromTool>\n - githubSearchRepositories: after picking a repo\n - packageSearch: after resolving package repo\n </fromTool>\n <toTool>\n - githubSearchCode: search inside a directory\n - githubGetFileContent: read selected files\n - githubSearchPullRequests: history of discovered paths\n </toTool>\n <vs_githubSearchCode>\n - githubViewRepoStructure: enumerate everything under a path (tree shape)\n - githubSearchCode match=\"path\": filename-only keyword match anywhere in the repo\n </vs_githubSearchCode>\n <gotchas>\n - Cheapest probe in the external suite: path=\"\" + depth=1 + verbosity=\"concise\" — confirms repo shape before any content fetch.\n - Reconnaissance: root layout first (path=\"\", depth=1), then drill into the suspect dir. Don't crank depth at root — large monorepos truncate.\n - Monorepo signal: top-level packages/, apps/, libs/, services/ → real code is one level deeper.\n - When inspecting a match, glance at siblings — config/index/feature files reveal canonical vs fixture/example.\n - \"truncated at depth=N\" = narrow scope, not deeper recursion.\n </gotchas>\n <verbosity>\n - concise: entries[] dropped → folder/file counts + top entry names (folders first) to drill into.\n </verbosity>\n <response_shape>\n - Directory rows page with `entryPageNumber`/`entriesPerPage`; heed truncated=true or hasMore=true.\n </response_shape>\n <examples>\n - path=\"\", depth=1 (root)\n - path=\"src\", depth=2\n - path=\"packages/core\", depth=1\n </examples>",
133
+ "schema": {
134
+ "owner": "Repo owner. Required scoping.",
135
+ "repo": "Repo name.",
136
+ "branch": "Branch/tag/SHA (defaults to default branch). Pin SHA/tag for historical or release-branch layout.",
137
+ "path": "Directory path (empty for root). Start \"\" + depth=1 for cheapest first move → drill into discovered subdirs.",
138
+ "depth": "1 (current only, cheap) | 2 (subdirs included — only on focused paths; depth=2 on root blows up monorepos).",
139
+ "entriesPerPage": "Directory entries per page. Raise for fewer response pages when scanning huge dirs (monorepo packages/).",
140
+ "entryPageNumber": "1-based directory page. Advance until pagination.hasMore=false / truncated=false."
141
+ }
142
+ },
143
+ "packageSearch": {
144
+ "name": "packageSearch",
145
+ "description": "## Find NPM packages [EXTERNAL: npm]\n <when>\n - Resolve a known package name before source research\n - Get repo URL, versions, license, metadata\n - Compare package alternatives\n </when>\n <fromTool>\n - localSearchCode: resolve an imported dependency\n - localGetFileContent: resolve deps from manifests\n </fromTool>\n <toTool>\n - githubViewRepoStructure: explore returned repo URL\n - githubSearchCode: search package implementation\n - githubGetFileContent: read package source\n </toTool>\n <vs_github>\n - packageSearch: known registry names + metadata (cheapest when name is known)\n - githubSearchRepositories: broad repo discovery by keyword\n </vs_github>\n <gotchas>\n - Cheapest bridge from \"name in code/manifest\" → \"where is the source?\" — always run before guessing GitHub owner/repo.\n - Exact-name lookup (name=\"<pkg>\", searchLimit=1, npmFetchMetadata=false) is the cheapest path. Promote searchLimit/metadata only when comparing alternatives or needing repo URL/versions.\n - One name → one canonical record; broader \"packages doing X\" exploration is githubSearchRepositories' job.\n </gotchas>\n <verbosity>\n - concise: 1 record ({name, version, repository, deprecated}); searchLimit capped at 1, npmFetchMetadata forced off. A \"does it exist / canonical name\" probe.\n </verbosity>\n <response_shape>\n - No row pagination; `searchLimit` is the only result cap. Large renders still auto-paginate via response-level `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - name=\"express\"\n - name=\"@modelcontextprotocol/sdk\"\n - name=\"lodash\", searchLimit=5\n </examples>",
146
+ "schema": {
147
+ "name": "Package name or search term",
148
+ "searchLimit": "Max NPM results in the single response. Use 1 for exact lookup; raise to surface alternatives or spelling variants.",
149
+ "npmFetchMetadata": "Fetch detailed NPM metadata (slower). Enable when you need repo URL, downloads, or recent versions."
150
+ }
151
+ },
152
+ "githubCloneRepo": {
153
+ "name": "githubCloneRepo",
154
+ "description": "## Clone GitHub repository to local filesystem\n <when>\n - Need full local access (large-scale analysis, offline work)\n - Run LSP against an external repo\n - Repo too large to explore via GitHub API\n </when>\n <fromTool>\n - githubSearchRepositories: found target\n - githubViewRepoStructure: confirmed layout\n </fromTool>\n <toTool>\n - localSearchCode / localViewStructure / localGetFileContent / localFindFiles: use returned localPath\n - lspGotoDefinition / lspFindReferences / lspCallHierarchy: semantic analysis\n </toTool>\n <vs_githubViewRepoStructure>\n - githubCloneRepo: full copy — enables LSP + bulk grep; costs disk + fetch\n - githubViewRepoStructure + githubGetFileContent: surgical reads — best for small inspection\n </vs_githubViewRepoStructure>\n <gotchas>\n - Only clone if you need LSP, bulk grep, or repeated reads. For a few lookups, viewRepoStructure + getFileContent is cheaper.\n - Monorepos: `sparse_path` turns 500MB → 20MB — use it when only one package is in scope.\n - After clone, switch to local* + LSP on localPath; further GitHub calls waste rate limit.\n </gotchas>\n <verbosity>\n - concise: {localPath, cached, branch} only; size/duration/sparsePath dropped. (Clone is a side-effecting one-shot; localPath is the only field the next call needs.)\n </verbosity>\n <response_shape>\n - Clone is one-shot; cache-hit directory listings page with `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - owner=\"facebook\", repo=\"react\"\n - owner=\"vercel\", repo=\"next.js\", sparse_path=\"packages/next\"\n - owner=\"org\", repo=\"repo\", forceRefresh=true\n </examples>",
155
+ "schema": {
156
+ "owner": "Repo owner (user or org).",
157
+ "repo": "Repo name.",
158
+ "branch": "Branch/tag/SHA (defaults to default branch). Pin SHA/tag for reproducible analysis.",
159
+ "sparse_path": "Fetch only this subdirectory (sparse checkout). Faster for large monorepos.",
160
+ "forceRefresh": "Bypass cache and force fresh clone (cache TTL 24h).",
161
+ "charOffset": "Rendered-output cursor. Only for cache-hit directory listings.",
162
+ "charLength": "Rendered-output page size."
163
+ }
164
+ },
165
+ "localGetFileContent": {
166
+ "name": "localGetFileContent",
167
+ "description": "## Read file content [LOCAL: filesystem]\n <when>\n - Read a known local path after discovery or LSP navigation\n - Extract a section via matchString or line range\n - Read small config/docs/manifest/JSON/Markdown/YAML directly\n </when>\n <fromTool>\n - localSearchCode: read matched sections\n - localFindFiles: read found non-code files\n - localViewStructure: read selected files\n - LSP tools: read context after semantic lookup\n </fromTool>\n <toTool>\n - localSearchCode: search symbols/imports from content\n - lspFindReferences: semantic usages\n - lspCallHierarchy: trace calls\n </toTool>\n <vs_githubGetFileContent>\n - localGetFileContent: file on disk (workspace or cloned)\n - githubGetFileContent: remote file without cloning\n </vs_githubGetFileContent>\n <gotchas>\n - For source code, prefer search or LSP first — reading without an anchor or range is too coarse.\n - Pick mode: exact lines → startLine/endLine; distinctive text → matchString; tiny config/docs → fullContent. fullContent + matchString is rejected; fullContent on a large file without charLength will fail.\n - matchString = default for big source files — anchor unlikely to collide (full signature, error string). Short anchors miss.\n </gotchas>\n <verbosity>\n - concise: content MINIFIED (comments/whitespace stripped, substance kept), not blanked; raw→minified token summary; lastModified/By dropped. A cheap full read — never larger than basic.\n </verbosity>\n <response_shape>\n - Large reads page with `charOffset`/`charLength`; prefer `matchString` or line ranges when possible.\n </response_shape>\n <examples>\n - matchString=\"class UserService\", matchStringContextLines=10\n - startLine=50, endLine=100\n - fullContent=true (small configs only)\n </examples>",
168
+ "schema": {
169
+ "path": "File path (required).",
170
+ "fullContent": "Return entire file. Small configs/manifests only; without charLength fails on large files. Mutually exclusive with matchString.",
171
+ "matchString": "Distinctive anchor — signature, error string, version literal. Lands in the right region when lines unknown.",
172
+ "matchStringContextLines": "Context lines around match (default 5). Raise when match is a single line.",
173
+ "matchStringIsRegex": "Treat matchString as regex (parity with githubGetFileContent).",
174
+ "matchStringCaseSensitive": "Case-sensitive matchString. Default is case-insensitive substring (parity with githubGetFileContent).",
175
+ "charOffset": "Rendered-content cursor. Continue the same slice instead of re-querying.",
176
+ "charLength": "Rendered-content page size.",
177
+ "startLine": "Start line (1-indexed, with endLine). Cheapest read mode when range is known.",
178
+ "endLine": "End line (1-indexed, with startLine)."
179
+ }
180
+ },
181
+ "localFindFiles": {
182
+ "name": "localFindFiles",
183
+ "description": "## Find files by metadata [LOCAL: filesystem]\n <when>\n - Find files/dirs by name, path, time, size, type, permissions\n - Narrow scope before content search\n - Locate recently changed files with modifiedWithin\n </when>\n <fromTool>\n - localViewStructure: filter a discovered tree\n - localSearchCode: find siblings after content matches\n </fromTool>\n <toTool>\n - localSearchCode: search content in found files\n - localGetFileContent: read found configs/manifests\n - localViewStructure: inspect found directories\n </toTool>\n <vs_localViewStructure>\n - localFindFiles: targeted discovery by name/size/time/permissions across a tree\n - localViewStructure: tree view of a directory with metadata\n </vs_localViewStructure>\n <gotchas>\n - Cheapest probe: path + name/iname + excludeDir + verbosity=\"concise\" — confirms existence with a single count.\n - Start with `path` + (`name`/`iname`/`names`) + `excludeDir` + `modifiedWithin` — covers most needs.\n - Metadata-only — for \"files containing X\" use localSearchCode. Mixing is the most common wasted call.\n - On large trees, pure name globs are slow. Add time/size constraint (modifiedWithin, sizeGreater) for pruning.\n - Always pass excludeDir on real repos — node_modules/dist/.git/coverage/build/.next dwarf the signal.\n - Killer use case: \"what changed recently?\" (modifiedWithin + sortBy=modified). Use before crawling git log.\n </gotchas>\n <verbosity>\n - concise: files[] dropped → count + newest path only. An existence/recency probe.\n </verbosity>\n <response_shape>\n - File rows page with `filePageNumber`/`filesPerPage`; rendered payload pages with `charOffset`/`charLength`; `limit` is a hard pre-pagination cap.\n </response_shape>\n <examples>\n - name=\"*.ts\", modifiedWithin=\"7d\"\n - iname=\"readme\", type=\"f\"\n - sizeGreater=\"10M\", excludeDir=[\"node_modules\"]\n </examples>",
184
+ "schema": {
185
+ "path": "Starting directory (required).",
186
+ "maxDepth": "Max recursion depth.",
187
+ "minDepth": "Min depth from start.",
188
+ "name": "Glob name pattern (e.g. \"*.js\"). Case-sensitive single-glob.",
189
+ "iname": "Case-insensitive name glob.",
190
+ "names": "Glob array, OR-combined.",
191
+ "pathPattern": "Glob against full path, not basename.",
192
+ "regex": "Regex against basename (or full path with pathPattern). When globs can't express the pattern.",
193
+ "regexType": "posix-egrep | posix-extended | posix-basic.",
194
+ "type": "f (file) | d (dir) | l (symlink) | b | c | p | s.",
195
+ "empty": "true = match only empty files/dirs.",
196
+ "modifiedWithin": "Within duration (\"7d\", \"2h\", \"30m\").",
197
+ "modifiedBefore": "Before duration (\"30d\").",
198
+ "accessedWithin": "Accessed within (\"7d\").",
199
+ "sizeGreater": "\">\" size (\"10M\", \"500k\", \"1G\").",
200
+ "sizeLess": "\"<\" size (\"1M\").",
201
+ "permissions": "Octal (\"755\") or symbolic (\"u=rwx\") permission match. Prefer over boolean flags.",
202
+ "executable": "true = executable by current user (tests *current* user only — use `permissions` for absolute).",
203
+ "readable": "true = readable by current user.",
204
+ "writable": "true = writable by current user.",
205
+ "excludeDir": "Dir names to skip ([\"node_modules\", \".git\"]). Essential for large-tree performance.",
206
+ "limit": "HARD cap on total files (default 1000), applied BEFORE pagination. Distinct from \\`filesPerPage\\`.",
207
+ "details": "Include perms/size/dates.",
208
+ "filesPerPage": "Files per response page. Walk via \\`filePageNumber\\` until pagination.hasMore=false.",
209
+ "filePageNumber": "1-indexed file page. Advance until pagination.hasMore=false.",
210
+ "showFileLastModified": "Include lastModified timestamps.",
211
+ "charOffset": "Rendered-payload cursor after file pagination. Advance until charPagination.hasMore=false.",
212
+ "charLength": "Rendered-payload page size. Pair with \\`charOffset\\`.",
213
+ "sortBy": "path | modified | name | size. \"modified\" = newest first; \"size\" = largest first."
214
+ }
215
+ },
216
+ "localSearchCode": {
217
+ "name": "localSearchCode",
218
+ "description": "## Search code patterns [LOCAL: ripgrep]\n <when>\n - Find local code by text, regex, symbol, import, constant\n - Get file paths and lineHint values for LSP tools\n - Discover matching files fast with filesOnly=true\n </when>\n <fromTool>\n - localViewStructure: after identifying candidate dirs\n - localFindFiles: after narrowing by filename/metadata\n </fromTool>\n <toTool>\n - lspGotoDefinition / lspFindReferences / lspCallHierarchy: use returned lineHint\n - localGetFileContent: read matches when LSP isn't needed\n </toTool>\n <vs_localFindFiles>\n - localSearchCode: content search (text/regex in file bodies)\n - localFindFiles: metadata search (name/size/time/permissions)\n </vs_localFindFiles>\n <gotchas>\n - Start with `pattern` + `path` + (`type` or `include`). Handles 90%.\n - Pick `mode` first: discovery for \"is X anywhere?\"; paginated (default) for normal reading; detailed only when context lines around every hit are needed. mode=\"discovery\" + verbosity=\"concise\" = cheapest broad probe.\n - For literal text, fixedString=true is faster and safer than regex.\n - \"Hot files?\" → `count` (matching-line count). \"Match density?\" → `countMatches`. Picking wrong wastes a call.\n - Large-payload auto-warning is real — narrow scope rather than paginate around it.\n </gotchas>\n <verbosity>\n - concise: files[] dropped → file/match counts + top path only; pagination knobs ignored. A presence/where probe.\n </verbosity>\n <response_shape>\n - Row pagination has two levels: files via `filePageNumber`/`filesPerPage`, then per-file matches via `matchesPerPage`; `maxFiles` and `maxMatchesPerFile` are hard pre-pagination caps.\n </response_shape>\n <examples>\n - pattern=\"function handleAuth\", type=\"ts\"\n - pattern=\"export.*UserService\", perlRegex=true\n - pattern=\"TODO\", filesOnly=true\n </examples>",
219
+ "schema": {
220
+ "pattern": "Pattern/regex (required).",
221
+ "path": "Root directory (required).",
222
+ "mode": "\"discovery\" (files only, cheapest) | \"paginated\" (default) | \"detailed\" (full context, costliest). Tool-specific; orthogonal to `verbosity`.",
223
+ "fixedString": "Literal match, no regex. Faster, avoids regex surprises.",
224
+ "perlRegex": "PCRE2 (lookahead, backrefs).",
225
+ "caseSensitive": "Force case-sensitive.",
226
+ "wholeWord": "Whole words only.",
227
+ "type": "Ripgrep type (\"ts\", \"js\", \"py\", \"go\", ...). Cheapest filter when language is known.",
228
+ "include": "Include globs ([\"*.ts\", \"src/**\"]).",
229
+ "exclude": "Exclude globs ([\"*.test.ts\"]).",
230
+ "excludeDir": "Dirs to skip ([\"node_modules\", \"dist\"]).",
231
+ "noIgnore": "Bypass .gitignore/.ignore.",
232
+ "hidden": "Include dotfiles.",
233
+ "filesOnly": "Filenames only, no content. Cheapest content probe — pair with discovery mode.",
234
+ "filesWithoutMatch": "Files NOT containing the pattern.",
235
+ "count": "Matching-line count per file (hot files).",
236
+ "countMatches": "Total match count per file (match density).",
237
+ "contextLines": "Symmetric context around match.",
238
+ "matchContentLength": "Truncate each match line to N chars.",
239
+ "maxMatchesPerFile": "HARD cap on matches/file at ripgrep level (before pagination). Distinct from \\`matchesPerPage\\`.",
240
+ "maxFiles": "HARD cap on total files at ripgrep level (before pagination). Distinct from \\`filesPerPage\\`.",
241
+ "filesPerPage": "Files per response page. Walk via \\`filePageNumber\\` until pagination.hasMore=false.",
242
+ "filePageNumber": "1-indexed file page. Advance until pagination.hasMore=false.",
243
+ "matchesPerPage": "Matches per file in the response — per-file slice, not global. Distinct from \\`maxMatchesPerFile\\`."
244
+ }
245
+ },
246
+ "localViewStructure": {
247
+ "name": "localViewStructure",
248
+ "description": "## View directory structure [LOCAL: filesystem]\n <when>\n - Understand local directory layout\n - Discover candidate source/test/config/docs paths\n - Inspect siblings around a known path\n </when>\n <fromTool>\n - localFindFiles: inspect parent dirs of metadata matches\n - localSearchCode: browse around content matches\n </fromTool>\n <toTool>\n - localSearchCode: search inside discovered dirs\n - localFindFiles: filter by metadata/name\n - localGetFileContent: read selected files\n </toTool>\n <vs_localFindFiles>\n - localViewStructure: tree view of a directory with metadata\n - localFindFiles: targeted discovery by name/size/time/permissions across a tree\n </vs_localFindFiles>\n <gotchas>\n - Auto-excludes node_modules/.git/dist/coverage and offers two pagination tiers (entries + chars), so root scans return signal-shaped trees with no manual filtering. Lean on it as workspace reconnaissance — root first, then drill in.\n - Monorepo signal: top-level packages/, apps/, libs/, services/ → drill in.\n - For \"shape of project\" use this; for name/size/time use localFindFiles; for content use localSearchCode.\n </gotchas>\n <verbosity>\n - concise: entries[] dropped → summary counts + top entry names (folders first) to drill into.\n </verbosity>\n <response_shape>\n - Entry rows page with `entryPageNumber`/`entriesPerPage`; rendered payload pages with `charOffset`/`charLength`; `limit` is a hard pre-pagination cap.\n </response_shape>\n <examples>\n - path=\"<workspace>\", depth=1\n - path=\"<workspace>/src\", depth=2\n - pattern=\"*.ts\", filesOnly=true\n </examples>",
249
+ "schema": {
250
+ "path": "Directory path (required).",
251
+ "details": "Show perms/size/dates.",
252
+ "hidden": "Show hidden.",
253
+ "humanReadable": "Human-readable sizes.",
254
+ "sortBy": "name | size | time | extension.",
255
+ "reverse": "Reverse sort.",
256
+ "entriesPerPage": "Entries per response page. Walk via \\`entryPageNumber\\` until pagination.hasMore=false.",
257
+ "entryPageNumber": "1-indexed entry page. Advance until pagination.hasMore=false.",
258
+ "pattern": "Name filter — glob if it contains * or ?, otherwise substring.",
259
+ "directoriesOnly": "Dirs only (mutually exclusive with filesOnly).",
260
+ "filesOnly": "Files only (mutually exclusive with directoriesOnly).",
261
+ "extensions": "Filter by file extensions ([\"ts\", \"tsx\"]).",
262
+ "depth": "Recursion depth (max 20). Use depth=20 for a deep tree.",
263
+ "limit": "HARD cap on entries (before pagination). Distinct from \\`entriesPerPage\\`.",
264
+ "charOffset": "Rendered-payload cursor. Advance until charPagination.hasMore=false.",
265
+ "charLength": "Rendered-payload page size. Pair with \\`charOffset\\`.",
266
+ "showFileLastModified": "Show timestamps."
267
+ }
268
+ },
269
+ "lspGotoDefinition": {
270
+ "name": "lspGotoDefinition",
271
+ "description": "## Navigate to symbol definition [LOCAL: LSP]\n <when>\n Semantic resolution — uses the language server's symbol graph, not text matching. A single accurate answer where pattern search returns candidates.\n - Jump from a usage to its definition/declaration\n - Resolve imports, exports, classes, methods, variables, types\n - Confirm canonical implementation before reading source\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspFindReferences / lspCallHierarchy: jump from a ref/call site to definition\n </fromTool>\n <toTool>\n - lspFindReferences: all usages of the resolved symbol\n - lspCallHierarchy: callers/callees for resolved functions/methods\n - localGetFileContent: read resolved implementation\n </toTool>\n <vs_lspFindReferences>\n - lspGotoDefinition: jump to definition (1 hop)\n - lspFindReferences: list every usage (many)\n </vs_lspFindReferences>\n <vs_lspCallHierarchy>\n - lspGotoDefinition: resolve symbol identity\n - lspCallHierarchy: traverse call relationships from a resolved function/method\n </vs_lspCallHierarchy>\n <gotchas>\n - Multiple results ⇒ overloads, re-exports, barrel files. Inspect each before assuming one is canonical.\n - If first hop lands on an import, hop again — real definition is one resolution away.\n - For only \"where is it?\" (path:line), drop to verbosity=concise. Reading the body unnecessarily is the most common over-spend.\n </gotchas>\n <verbosity>\n - concise: snippet stripped → path:line:col only. The common \"where is it?\" answer.\n </verbosity>\n <response_shape>\n - Rendered output pages with `charOffset`/`charLength` for many definitions (overloads, re-exports).\n </response_shape>\n <examples>\n - uri=\"src/services/auth.ts\", symbolName=\"handleLogin\", lineHint=42\n - uri=\"src/utils/index.ts\", symbolName=\"formatDate\", lineHint=15\n </examples>",
272
+ "schema": {
273
+ "uri": "File path. Example: \"src/utils.ts\".",
274
+ "symbolName": "EXACT symbol text, no parens, no partials.",
275
+ "lineHint": "1-indexed line where symbol appears (±2 tolerance). Use line from localSearchCode — never guess. If line is an import, first hop may land on the import — call again on result.",
276
+ "orderHint": "0-indexed occurrence if multiple same-name symbols on same line (default: 0).",
277
+ "contextLines": "Context lines around each definition snippet. Widens snippet — not a page knob.",
278
+ "charOffset": "Rendered-output cursor. Advance until outputPagination.hasMore=false.",
279
+ "charLength": "Rendered-output page size. Pair with \\`charOffset\\`."
280
+ }
281
+ },
282
+ "lspFindReferences": {
283
+ "name": "lspFindReferences",
284
+ "description": "## Find all usages of a symbol [LOCAL: LSP]\n <when>\n Semantic resolution — uses the language server's symbol graph, not text matching. Real usages, not same-spelling collisions.\n - Find semantic refs to a function, class, variable, type, property, interface\n - Assess impact before changing a symbol\n - Separate real refs from same-text matches\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspGotoDefinition: after resolving the canonical symbol\n </fromTool>\n <toTool>\n - lspCallHierarchy: call relationships when symbol is function/method\n - lspGotoDefinition: jump from a reference to its definition\n - localGetFileContent: read reference context\n </toTool>\n <vs_lspCallHierarchy>\n - lspFindReferences: all semantic usages (calls, assignments, imports, type refs)\n - lspCallHierarchy: function/method call relationships only\n </vs_lspCallHierarchy>\n <gotchas>\n - Cheapest probe: groupByFile=true + verbosity=\"concise\" — blast-radius answer with no snippets. Promote to flat refs only after the rollup names the files that matter.\n - Pick shape first: \"how widely used?\" → groupByFile=true (counts only, cheap). \"What does each usage look like?\" → flat refs + snippets. Wrong shape can 10x the response.\n - In a monorepo, scope with includePattern/excludePattern before paging through hundreds of refs.\n - Auto-rollup at ≥500 refs is a safety net, not a bug. If you hit it, treat the symbol as widely used and re-scope.\n </gotchas>\n <verbosity>\n - concise: snippets dropped → flat refs under 500, per-file rollup at 500+. With `groupByFile`: a per-file count map (file→count) at any tier. A blast-radius probe.\n </verbosity>\n <response_shape>\n - Flat references page with `page`/`referencesPerPage`; use `groupByFile` for blast-radius probes instead of paging snippets. Large renders auto-paginate via `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - uri=\"src/types.ts\", symbolName=\"UserConfig\", lineHint=15\n - uri=\"src/utils.ts\", symbolName=\"formatDate\", lineHint=42, includeDeclaration=false\n - uri=\"src/api.ts\", symbolName=\"API_KEY\", lineHint=3, groupByFile=true\n </examples>",
285
+ "schema": {
286
+ "uri": "File path. Example: \"src/api/client.ts\".",
287
+ "symbolName": "EXACT symbol text, no parens, no partials.",
288
+ "lineHint": "1-indexed line where symbol appears (±2 tolerance). Use line from localSearchCode — never guess. If import, resolve via lspGotoDefinition first.",
289
+ "orderHint": "0-indexed occurrence if multiple same-name symbols on same line (default: 0).",
290
+ "includeDeclaration": "Include definition (default: true).",
291
+ "contextLines": "Context lines around each ref.",
292
+ "referencesPerPage": "References per response page from a pre-sorted list. Default 10. Walk via \\`page\\` until pagination.hasMore=false.",
293
+ "page": "1-indexed references page. Advance until pagination.hasMore=false. For blast-radius, prefer \\`groupByFile\\`.",
294
+ "groupByFile": "Roll up refs into per-file counts (cheaper — \"is this used widely?\").",
295
+ "includePattern": "Glob array — restrict to these paths (e.g. one package of a monorepo).",
296
+ "excludePattern": "Glob array — exclude these paths.",
297
+ "charOffset": "Rendered-output cursor. Advance until outputPagination.hasMore=false (large ref sets auto-paginate).",
298
+ "charLength": "Rendered-output page size. Pair with \\`charOffset\\`."
299
+ }
300
+ },
301
+ "lspCallHierarchy": {
302
+ "name": "lspCallHierarchy",
303
+ "description": "## Trace function call relationships [LOCAL: LSP]\n <when>\n Semantic call graph — uses the language server's resolved call relationships, not pattern matching. Traces real flow, not text co-occurrence.\n - \"Who calls this?\" → direction=\"incoming\"\n - \"What does this call?\" → direction=\"outgoing\"\n - Trace execution flow or impact\n </when>\n <fromTool>\n - localSearchCode: provides uri + 1-indexed lineHint\n - lspGotoDefinition: after resolving the target\n </fromTool>\n <toTool>\n - lspGotoDefinition: jump from call sites to definitions\n - localGetFileContent: read caller/callee context\n </toTool>\n <vs_lspFindReferences>\n - lspCallHierarchy: function/method call graphs only\n - lspFindReferences: types, variables, classes, assignments, imports\n </vs_lspFindReferences>\n <gotchas>\n - depth=1 and chain manually on what matters. depth>1 explodes on hot functions and risks timeouts.\n - Pick direction by question: \"who's affected?\" → incoming; \"what side effects?\" → outgoing. Asking both at once is rarely right.\n - For non-call usages (types, assignments, imports), use lspFindReferences.\n </gotchas>\n <verbosity>\n - concise: node bodies stripped → edge count + compact \"A → B\" list only. The right default for this tool.\n </verbosity>\n <response_shape>\n - Call sites page with `page`/`callsPerPage`; recursion is controlled separately by `depth`. Large renders auto-paginate via `charOffset`/`charLength`.\n </response_shape>\n <examples>\n - direction=\"incoming\", uri=\"src/api.ts\", symbolName=\"handleRequest\", lineHint=50\n - direction=\"outgoing\", uri=\"src/service.ts\", symbolName=\"processData\", lineHint=25\n </examples>",
304
+ "schema": {
305
+ "uri": "File path. Example: \"src/api/handler.ts\".",
306
+ "symbolName": "EXACT function/method name, no parens.",
307
+ "lineHint": "1-indexed line where the function is defined/called. Use line from localSearchCode — never guess. If line is an import, resolve via lspGotoDefinition first.",
308
+ "orderHint": "0-indexed occurrence if multiple same-name symbols on the same line (default: 0).",
309
+ "direction": "REQUIRED. \"incoming\" (callers) | \"outgoing\" (callees).",
310
+ "depth": "Recursion depth (default: 1). depth>1 risks timeouts on hot functions — chain manually.",
311
+ "contextLines": "Context lines around each call site.",
312
+ "callsPerPage": "Call sites per response page. Walk via \\`page\\` until pagination.hasMore=false. Distinct from \\`depth\\`.",
313
+ "page": "1-indexed call-site page. Advance until pagination.hasMore=false.",
314
+ "charOffset": "Rendered-output cursor. Advance until outputPagination.hasMore=false (deep/hot nodes auto-paginate).",
315
+ "charLength": "Rendered-output page size. Pair with \\`charOffset\\`."
316
+ }
317
+ }
318
+ }
319
+ }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- import { config } from "./configLoader.js";
2
- import type { CompleteMetadata } from "./metadata-types/metadata.js";
3
- export { config as octocodeConfig };
1
+ import type { CompleteMetadata } from "./types/index.js";
2
+ export declare const octocodeConfig: import("./types/index.js").OctocodeConfig;
4
3
  export declare const completeMetadata: CompleteMetadata;
5
- export type { OctocodeConfig, PromptDefinition, PromptKey, PromptMap, ToolDefinition, ToolKey, ToolMap, ToolSchema, ToolHints, ToolNames, ToolNameKey, BaseSchema, BaseHints, BulkOperations, BulkOperationInstructions, } from "./types.js";
6
- export type { ToolMetadata, PromptMetadata, PromptArgument, CompleteMetadata, } from "./metadata-types/metadata.js";
7
- export * from "./schemes/index.js";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{config as e}from"./configLoader.js";export{e as octocodeConfig};export const completeMetadata={instructions:e.instructions,prompts:e.prompts,toolNames:e.toolNames,baseSchema:{mainResearchGoal:e.baseSchema.mainResearchGoal,researchGoal:e.baseSchema.researchGoal,reasoning:e.baseSchema.reasoning,bulkQuery:o=>e.baseSchema.bulkQueryTemplate.replace("{toolName}",o)},tools:e.tools,baseHints:e.baseHints,genericErrorHints:e.genericErrorHints,bulkOperations:e.bulkOperations};export*from"./schemes/index.js";
1
+ import{config as e}from"./configLoader.js";export const octocodeConfig=e;export const completeMetadata={instructions:e.instructions,toolNames:e.toolNames,baseSchema:{mainResearchGoal:e.baseSchema.mainResearchGoal,researchGoal:e.baseSchema.researchGoal,reasoning:e.baseSchema.reasoning,...e.baseSchema.verbosity&&{verbosity:e.baseSchema.verbosity}},tools:e.tools,baseHints:e.baseHints??{},genericErrorHints:e.genericErrorHints??[]};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tool description constants — the verbatim `description` text each
3
+ * `ToolSpec` exposes in `src/resources/tools/*.ts`. The resources tree
4
+ * is excluded from the build (`src/resources/**` in tsconfig), so the
5
+ * canonical strings live here and the resource files import these
6
+ * constants when generating the compressed config blob.
7
+ *
8
+ * Keep these in sync with `src/resources/tools/*.ts`.
9
+ */
10
+ export declare const LOCAL_RIPGREP_DESCRIPTION = "## Search code patterns [LOCAL: ripgrep]\n <when>\n - Find local code by text, regex, symbol, import, or constant\n - Get file paths and lineHint values for LSP tools\n - Discover matching files fast with filesOnly=true\n </when>\n <fromTool>\n - localViewStructure: after identifying candidate directories\n - localFindFiles: after narrowing by filename/metadata\n </fromTool>\n <toTool>\n - lspGotoDefinition: jump to a definition using returned lineHint\n - lspFindReferences: semantic usages of the matched symbol\n - lspCallHierarchy: trace callers/callees of matched functions/methods\n - localGetFileContent: read matches when LSP isn't needed\n </toTool>";
11
+ export declare const LOCAL_FIND_FILES_DESCRIPTION = "## Find files by metadata [LOCAL: filesystem]\n <when>\n - Find files/dirs by name, path, time, size, type, or permissions\n - Narrow scope before content search\n - Locate recently changed files with modifiedWithin\n </when>";
12
+ export declare const LOCAL_VIEW_STRUCTURE_DESCRIPTION = "## View directory structure [LOCAL: filesystem]\n <when>\n - Understand local directory layout\n - Discover candidate source/test/config/docs paths\n - Inspect siblings around a known path\n </when>";
13
+ export declare const LOCAL_FETCH_CONTENT_DESCRIPTION = "## Read file content [LOCAL: filesystem]\n <when>\n - Read a known local path after discovery or LSP navigation\n - Extract a section via matchString or line range\n - Read small config/docs/manifest/JSON/Markdown/YAML directly\n </when>";
14
+ export declare const GITHUB_CLONE_REPO_DESCRIPTION = "## Clone GitHub repository to local filesystem\n <when>\n - Need full local access to a repository (large-scale analysis, offline work)\n - Want to run LSP tools against an external GitHub repository\n - Repository is too large to explore efficiently via GitHub API\n </when>";
15
+ export declare const LSP_GOTO_DEFINITION_DESCRIPTION = "## Navigate to symbol definition [LOCAL: LSP]\n <when>\n - Jump from a usage to its definition/declaration\n - Resolve imports, exports, classes, methods, variables, or types\n - Confirm canonical implementation before reading source\n </when>";
16
+ export declare const LSP_FIND_REFERENCES_DESCRIPTION = "## Find all usages of a symbol [LOCAL: LSP]\n <when>\n - Find semantic refs to a function, class, variable, type, property, or interface\n - Assess impact before changing a symbol\n - Separate real refs from same-text matches\n </when>";
17
+ export declare const LSP_CALL_HIERARCHY_DESCRIPTION = "## Trace function call relationships [LOCAL: LSP]\n <when>\n - \"Who calls this function/method?\" \u2192 direction=\"incoming\"\n - \"What does this function/method call?\" \u2192 direction=\"outgoing\"\n - Trace execution flow or impact\n </when>";
@@ -0,0 +1 @@
1
+ export const LOCAL_RIPGREP_DESCRIPTION="## Search code patterns [LOCAL: ripgrep]\n <when>\n - Find local code by text, regex, symbol, import, or constant\n - Get file paths and lineHint values for LSP tools\n - Discover matching files fast with filesOnly=true\n </when>\n <fromTool>\n - localViewStructure: after identifying candidate directories\n - localFindFiles: after narrowing by filename/metadata\n </fromTool>\n <toTool>\n - lspGotoDefinition: jump to a definition using returned lineHint\n - lspFindReferences: semantic usages of the matched symbol\n - lspCallHierarchy: trace callers/callees of matched functions/methods\n - localGetFileContent: read matches when LSP isn't needed\n </toTool>";export const LOCAL_FIND_FILES_DESCRIPTION="## Find files by metadata [LOCAL: filesystem]\n <when>\n - Find files/dirs by name, path, time, size, type, or permissions\n - Narrow scope before content search\n - Locate recently changed files with modifiedWithin\n </when>";export const LOCAL_VIEW_STRUCTURE_DESCRIPTION="## View directory structure [LOCAL: filesystem]\n <when>\n - Understand local directory layout\n - Discover candidate source/test/config/docs paths\n - Inspect siblings around a known path\n </when>";export const LOCAL_FETCH_CONTENT_DESCRIPTION="## Read file content [LOCAL: filesystem]\n <when>\n - Read a known local path after discovery or LSP navigation\n - Extract a section via matchString or line range\n - Read small config/docs/manifest/JSON/Markdown/YAML directly\n </when>";export const GITHUB_CLONE_REPO_DESCRIPTION="## Clone GitHub repository to local filesystem\n <when>\n - Need full local access to a repository (large-scale analysis, offline work)\n - Want to run LSP tools against an external GitHub repository\n - Repository is too large to explore efficiently via GitHub API\n </when>";export const LSP_GOTO_DEFINITION_DESCRIPTION="## Navigate to symbol definition [LOCAL: LSP]\n <when>\n - Jump from a usage to its definition/declaration\n - Resolve imports, exports, classes, methods, variables, or types\n - Confirm canonical implementation before reading source\n </when>";export const LSP_FIND_REFERENCES_DESCRIPTION="## Find all usages of a symbol [LOCAL: LSP]\n <when>\n - Find semantic refs to a function, class, variable, type, property, or interface\n - Assess impact before changing a symbol\n - Separate real refs from same-text matches\n </when>";export const LSP_CALL_HIERARCHY_DESCRIPTION='## Trace function call relationships [LOCAL: LSP]\n <when>\n - "Who calls this function/method?" → direction="incoming"\n - "What does this function/method call?" → direction="outgoing"\n - Trace execution flow or impact\n </when>';