From 058249d871c1aeb91a0733c84afff4ff7c6c9e9b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Jul 2026 03:36:15 +0000 Subject: [PATCH 1/3] Initial plan From b284c6dee6c7bb6e551eacc8d16a72097c8b5a3b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Jul 2026 03:45:06 +0000 Subject: [PATCH 2/3] Export addon helpers from rig root API Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- README.md | 8 ++++++-- skills/rig/SKILL.md | 4 ++-- skills/rig/references/composition.md | 9 +++------ skills/rig/rig.ts | 3 +++ src/rig.test.ts | 3 +-- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index e125391..230b620 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,16 @@ gh skills clone githubnext/rig ```ts import { agent, + addons, configureAgent, defineTool, + oncePerAgent, p, + repair, s, + steering, + timeout, } from "rig"; -import { addons, oncePerAgent, repair, steering, timeout } from "rig/addons"; ``` - `agent(spec)` creates a typed agent function. @@ -36,7 +40,7 @@ import { addons, oncePerAgent, repair, steering, timeout } from "rig/addons"; - `defineTool(name, config)` creates an SDK-neutral tool definition and accepts rig `s.*` schemas for `parameters`. - `addons` accepts express-like `(context, next)` turn addons for steering, inline validation, and runtime agent access. - `rig` starts with no default addons. -- `rig/addons` provides optional addon helpers: `oncePerAgent`, `repair`, `steering`, `timeout`, and `addons.{oncePerAgent,repair,steering,timeout}`. +- `rig` exports addon helpers: `oncePerAgent`, `repair`, `steering`, `timeout`, and `addons.{oncePerAgent,repair,steering,timeout}`. - `p\`...\`` returns a prompt builder and renders intent values when coerced to string; prefer `${p.read(...)}` / `${p.bash(...)}` when the context source is already known. ## Embedding in markdown diff --git a/skills/rig/SKILL.md b/skills/rig/SKILL.md index cead1e1..26b3cee 100644 --- a/skills/rig/SKILL.md +++ b/skills/rig/SKILL.md @@ -35,7 +35,7 @@ export default reviewDiff; ## Construction rules -1. Use one `import { ... } from "rig"` statement and `agent({ ... })`; add a `// Agent role: ...` comment above every agent. +1. Use one `import { ... } from "rig"` statement (including addons such as `repair`/`steering`) and `agent({ ... })`; add a `// Agent role: ...` comment above every agent. 2. Set examples to `model: "large"`, `"mini"`, or `"nano"`. 3. Omit `input` and `output` when the default free-form `s.string` schemas are enough; otherwise use explicit `s.*` schemas. 4. Put known workspace context directly in `p\`...\`` with `${p.read(...)}` or `${p.bash(...)}`. Add `input` only for values supplied by the caller. @@ -109,7 +109,7 @@ For `p.readOptional` fallbacks, pass a value the model can parse in context (for - Define tools with `defineTool(name, { description, parameters: s.object(...), handler })`; schema-based handler arguments are inferred and tools default to `skipPermission: true`. `s.unknown` is valid in tool parameters when the tool needs to compare or echo arbitrary JSON-like values, for example `parameters: s.object({ currentValue: s.unknown, recommendedValue: s.unknown })`. Handlers can be sync or async and return a string or any JSON-serializable value; return plain JS values (do not `JSON.stringify`) because Rig serializes non-string results automatically. Async handlers may import Node built-ins with `await import("node:child_process")`. Destructure only handler fields you use. Use `defineTool` for external operations and deterministic transforms that support reasoning — not to replace the core classification or judgment step with in-process TypeScript logic. - `agents` must be a named object — `agents: { extractor }` — never an array (`agents: [extractor]` is a type error). Attach every declared subagent to the exported root's graph. - There is no chain or loop primitive; give the coordinator explicit delegation instructions and require one combined output. -- Automatic parse/schema repair requires `repair()` from `rig/addons`; `repair()` takes no arguments. Put retries on the agent spec: `maxTurns: 3, addons: repair()`. Do not pass retries to `repair()` (`addons: repair({ maxTurns: 3 })` is invalid). +- Automatic parse/schema repair uses `repair()` from `rig`; `repair()` takes no arguments. Put retries on the agent spec: `maxTurns: 3, addons: repair()`. Do not pass retries to `repair()` (`addons: repair({ maxTurns: 3 })` is invalid). - `addons` accepts a single addon or an array. Use `addons: repair()` for one addon, and `addons: [steering(), repair()]` when combining. **`steering()` must come before `repair()` in the array** — write `[steering(), repair()]`, not `[repair(), steering()]`. `steering()` (default warning) or `steering({ message: "..." })` (custom text) should run before `repair()` to append a last-chance instruction on the final retry. `oncePerAgent(callback)` invokes the callback once per runtime agent instance — its internal `WeakSet` already deduplicates, so no external tracking is needed. ## Runnable markdown diff --git a/skills/rig/references/composition.md b/skills/rig/references/composition.md index 7e46392..087f894 100644 --- a/skills/rig/references/composition.md +++ b/skills/rig/references/composition.md @@ -141,8 +141,7 @@ When a task asks for runnable markdown: Rig starts with no addons. `maxTurns` is only the total budget; automatic parse/schema correction requires `repair()`: ```ts -import { agent } from "rig"; -import { repair } from "rig/addons"; +import { agent, repair } from "rig"; // Agent role: return a valid concise summary. const summarize = agent({ @@ -170,8 +169,7 @@ addons: repair(); `steering()` appends a last-chance warning to the final retry prompt produced by `repair`. Put it before `repair` so it can observe the repair prompt as the addon chain unwinds: ```ts -import { agent } from "rig"; -import { repair, steering } from "rig/addons"; +import { agent, repair, steering } from "rig"; // Agent role: return a valid concise summary with final-turn steering. const summarize = agent({ @@ -198,8 +196,7 @@ Use `repair()` alone when the validation error is enough guidance. Pass custom w `oncePerAgent(register)` invokes its callback exactly once per runtime agent instance — not once per turn and not once per retry. The callback receives `(agent: Agent, context: AgentAddonContext)`. Use it for one-time initialization such as registering a tool adapter or constructing a client: ```ts -import { agent, s } from "rig"; -import { oncePerAgent, repair } from "rig/addons"; +import { agent, oncePerAgent, repair, s } from "rig"; // Agent role: answer after one-time runtime initialization. const qa = agent({ diff --git a/skills/rig/rig.ts b/skills/rig/rig.ts index 708bf6f..da9f7bd 100644 --- a/skills/rig/rig.ts +++ b/skills/rig/rig.ts @@ -83,6 +83,9 @@ import { promisify } from "node:util"; import { CopilotClient, RuntimeConnection, approveAll } from "@github/copilot-sdk"; import type { CopilotClientOptions } from "@github/copilot-sdk"; +export { addons, oncePerAgent, repair, steering, timeout } from "./addons.ts"; +export type { AgentRegistration, SteeringOptions, TimeoutOptions } from "./addons.ts"; + export type Json = null | boolean | number | string | Json[] | { [key: string]: Json }; export type ValidationResult = { ok: true } | { ok: false; error: string }; diff --git a/src/rig.test.ts b/src/rig.test.ts index aecf2d3..3ae4dd8 100644 --- a/src/rig.test.ts +++ b/src/rig.test.ts @@ -51,9 +51,8 @@ vi.mock("@github/copilot-sdk", () => ({ RuntimeConnection: { forUri: mocks.forUri, forStdio: mocks.forStdio }, })); -import { AgentError, PromptBuilder, agent, analyzeResponse, configureAgent, copilotEngine, defineTool, p, s, toJsonSchema } from "rig"; +import { AgentError, PromptBuilder, agent, analyzeResponse, configureAgent, copilotEngine, defineTool, oncePerAgent, p, repair, s, steering, timeout, toJsonSchema } from "rig"; import type { Tool } from "rig"; -import { oncePerAgent, repair, steering, timeout } from "rig/addons"; beforeEach(() => { mocks.createSession.mockClear(); From 7b87bbe19d87662becfb2f4e998c724949b4f442 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Jul 2026 03:53:54 +0000 Subject: [PATCH 3/3] Fully merge addon implementation into rig.ts Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- skills/rig/SKILL.md | 2 +- skills/rig/addons.ts | 104 +----------------- skills/rig/references/agent-api.md | 2 +- skills/rig/rig.ts | 73 +++++++++++- .../samples/100-workspace-config-drift-2.md | 3 +- .../samples/101-commit-format-suggester-2.md | 3 +- .../samples/103-hotspot-file-analyzer-2.md | 3 +- .../samples/105-import-cycle-detector-2.md | 3 +- skills/rig/samples/107-git-rename-tracker.md | 3 +- .../samples/110-workspace-config-drift-3.md | 3 +- .../111-conventional-commit-suggester.md | 3 +- .../rig/samples/113-git-hotspot-analyzer.md | 3 +- .../rig/samples/115-import-cycle-detector.md | 3 +- skills/rig/samples/118-pr-review-checklist.md | 3 +- skills/rig/samples/120-git-hotspot-v2.md | 3 +- .../rig/samples/122-import-cycle-detector.md | 3 +- .../rig/samples/125-test-coverage-mapper.md | 3 +- .../samples/126-tsconfig-options-auditor.md | 3 +- .../rig/samples/128-npm-script-dep-mapper.md | 3 +- .../rig/samples/129-markdown-link-checker.md | 3 +- .../rig/samples/130-git-hotspot-analyzer.md | 3 +- .../rig/samples/132-import-cycle-detector.md | 3 +- .../rig/samples/135-test-coverage-mapper.md | 3 +- .../139-markdown-frontmatter-checker.md | 3 +- .../rig/samples/140-git-hotspot-analyzer.md | 3 +- .../rig/samples/142-import-cycle-detector.md | 3 +- .../rig/samples/145-test-coverage-mapper.md | 3 +- skills/rig/samples/149-dotfile-inventory.md | 3 +- .../samples/150-git-hotspot-analyzer-v3.md | 3 +- .../samples/152-import-cycle-detector-v3.md | 3 +- .../samples/155-test-coverage-mapper-v2.md | 3 +- .../rig/samples/156-regex-pattern-tester.md | 3 +- .../samples/157-commit-churn-classifier.md | 3 +- .../rig/samples/49-timeout-signal-helper.md | 3 +- skills/rig/samples/66-ci-workflow-health.md | 3 +- skills/rig/samples/68-changelog-generator.md | 3 +- .../rig/samples/71-package-script-health.md | 3 +- skills/rig/samples/73-git-branch-pruner.md | 3 +- .../rig/samples/74-prettier-eslint-compat.md | 3 +- skills/rig/samples/76-commit-msg-rewriter.md | 3 +- skills/rig/samples/78-build-log-analyzer.md | 3 +- .../rig/samples/82-workspace-config-drift.md | 3 +- .../rig/samples/83-commit-format-suggester.md | 3 +- skills/rig/samples/86-npm-audit-simplifier.md | 3 +- .../rig/samples/90-workspace-config-drift.md | 3 +- .../rig/samples/91-commit-format-suggester.md | 3 +- .../rig/samples/93-hotspot-file-analyzer.md | 3 +- .../94-ts-interface-conflict-checker.md | 3 +- skills/rig/samples/96-test-naming-enforcer.md | 3 +- src/addons.ts | 4 +- src/samples/49-timeout-signal-helper.ts | 3 +- src/samples/57-complex-integration-sonnet.ts | 3 +- 52 files changed, 123 insertions(+), 203 deletions(-) diff --git a/skills/rig/SKILL.md b/skills/rig/SKILL.md index 26b3cee..a439c2c 100644 --- a/skills/rig/SKILL.md +++ b/skills/rig/SKILL.md @@ -134,7 +134,7 @@ Run inline input or a program file with `node skills/rig/rig.ts`; add `--server` - Known context uses `p.*`; true runtime data uses `input`. - Important outputs are explicitly typed and constrained. -- Every helper and import uses the current `rig` or `rig/addons` API. +- Every helper and import uses the current `rig` API. - Generated TypeScript passes `node skills/rig/eslint/lint.js ` and typechecking. - Every subagent is named, reachable, and narrowly scoped. - Snippets have one default export and no `console.log`. diff --git a/skills/rig/addons.ts b/skills/rig/addons.ts index 3dc1949..ed2d4f5 100644 --- a/skills/rig/addons.ts +++ b/skills/rig/addons.ts @@ -1,102 +1,2 @@ -import { analyzeResponse, defaultRepairPrompt } from "./rig.ts"; -import type { Agent, AgentAddon, AgentAddonContext } from "./rig.ts"; - -const DEFAULT_STEERING_WARNING = "You are running out of turns. This is your final attempt before reaching the turn limit. Please correct your output now."; - -export type SteeringOptions = { - /** Warning appended to the final retry prompt. */ - message?: string; -}; - -export type TimeoutOptions = { - timeout: number; -}; - -export type AgentRegistration = ( - agent: Agent, - context: AgentAddonContext, -) => void | Promise; - -/** - * Appends a final-attempt warning to the retry prompt produced by an inner addon. - * - * Place this before `repair()`, for example - * `addons: [steering({ message: "Return valid JSON now." }), repair()]`. - */ -export function steering(options: SteeringOptions = {}): AgentAddon { - const message = options.message ?? DEFAULT_STEERING_WARNING; - return async (context, next) => { - await next(); - if (context.nextPrompt && context.turn + 1 === context.maxTurns) { - context.nextPrompt = `${context.nextPrompt}\n${message}`; - } - }; -} - -/** - * Parses and validates responses, retrying failures within the agent's turn budget. - * - * Configure `maxTurns` on the agent spec. - */ -export function repair(): AgentAddon { - return async (context, next) => { - await next(); - if (context.completed || context.error !== undefined || context.nextPrompt !== undefined) { - return; - } - if (context.response === undefined) { - return; - } - const analysis = analyzeResponse(context.response, context.outputSchema, context.spec.name, context.turn); - if (analysis.ok) { - context.completed = true; - context.output = analysis.output; - return; - } - if (context.turn >= context.maxTurns) { - context.error = analysis.error; - return; - } - context.nextPrompt = defaultRepairPrompt(context.spec, analysis.error); - }; -} - -export function timeout(options: TimeoutOptions): AgentAddon { - return async (context, next) => { - context.signal = timeoutSignal(context.signal, options.timeout); - await next(); - }; -} - -export function oncePerAgent(register: AgentRegistration): AgentAddon { - const seen = new WeakSet(); - return async (context, next) => { - if (!seen.has(context.agent)) { - await register(context.agent, context); - seen.add(context.agent); - } - await next(); - }; -} - -function timeoutSignal(parent?: AbortSignal, timeoutMs?: number): AbortSignal | undefined { - if (!timeoutMs) { - return parent; - } - const controller = new AbortController(); - const onAbort = () => controller.abort(parent?.reason); - parent?.addEventListener("abort", onAbort, { once: true }); - const timer = setTimeout( - () => controller.abort(new Error(`Timed out after ${timeoutMs}ms`)), - timeoutMs, - ); - controller.signal.addEventListener("abort", () => clearTimeout(timer), { once: true }); - return controller.signal; -} - -export const addons = { - oncePerAgent, - timeout, - repair, - steering, -}; +export { addons, oncePerAgent, repair, steering, timeout } from "./rig.ts"; +export type { AgentRegistration, SteeringOptions, TimeoutOptions } from "./rig.ts"; diff --git a/skills/rig/references/agent-api.md b/skills/rig/references/agent-api.md index 78726df..c85d5ed 100644 --- a/skills/rig/references/agent-api.md +++ b/skills/rig/references/agent-api.md @@ -219,6 +219,6 @@ Use only the current API: - `agent({ name, ... })` - `p.*` and ``p`...` `` from `rig` - `s.*` for explicit schemas -- `oncePerAgent`, `repair()`, `steering`, and `timeout` from `rig/addons` +- `oncePerAgent`, `repair()`, `steering`, and `timeout` from `rig` Do not add deprecated hooks, alternate schema syntaxes, or compatibility bridges. diff --git a/skills/rig/rig.ts b/skills/rig/rig.ts index da9f7bd..ff0d9cc 100644 --- a/skills/rig/rig.ts +++ b/skills/rig/rig.ts @@ -83,9 +83,6 @@ import { promisify } from "node:util"; import { CopilotClient, RuntimeConnection, approveAll } from "@github/copilot-sdk"; import type { CopilotClientOptions } from "@github/copilot-sdk"; -export { addons, oncePerAgent, repair, steering, timeout } from "./addons.ts"; -export type { AgentRegistration, SteeringOptions, TimeoutOptions } from "./addons.ts"; - export type Json = null | boolean | number | string | Json[] | { [key: string]: Json }; export type ValidationResult = { ok: true } | { ok: false; error: string }; @@ -644,6 +641,16 @@ export type AgentAddon = ( context: AgentAddonContext, next: () => Promise, ) => void | Promise; +export type SteeringOptions = { + message?: string; +}; +export type TimeoutOptions = { + timeout: number; +}; +export type AgentRegistration = ( + agent: Agent, + context: AgentAddonContext, +) => void | Promise; export type ToolHandler = (args: TArgs) => unknown | Promise; export type ToolParameters = Schema | Record; export type Tool = ToolConfig & { name: string }; @@ -1259,6 +1266,66 @@ export class AgentError extends Error { } } +const DEFAULT_STEERING_WARNING = "You are running out of turns. This is your final attempt before reaching the turn limit. Please correct your output now."; + +export function steering(options: SteeringOptions = {}): AgentAddon { + const message = options.message ?? DEFAULT_STEERING_WARNING; + return async (context, next) => { + await next(); + if (context.nextPrompt && context.turn + 1 === context.maxTurns) { + context.nextPrompt = `${context.nextPrompt}\n${message}`; + } + }; +} + +export function repair(): AgentAddon { + return async (context, next) => { + await next(); + if (context.completed || context.error !== undefined || context.nextPrompt !== undefined) { + return; + } + if (context.response === undefined) { + return; + } + const analysis = analyzeResponse(context.response, context.outputSchema, context.spec.name, context.turn); + if (analysis.ok) { + context.completed = true; + context.output = analysis.output; + return; + } + if (context.turn >= context.maxTurns) { + context.error = analysis.error; + return; + } + context.nextPrompt = defaultRepairPrompt(context.spec, analysis.error); + }; +} + +export function timeout(options: TimeoutOptions): AgentAddon { + return async (context, next) => { + context.signal = timeoutSignal(context.signal, options.timeout); + await next(); + }; +} + +export function oncePerAgent(register: AgentRegistration): AgentAddon { + const seen = new WeakSet(); + return async (context, next) => { + if (!seen.has(context.agent)) { + await register(context.agent, context); + seen.add(context.agent); + } + await next(); + }; +} + +export const addons = { + oncePerAgent, + timeout, + repair, + steering, +}; + let currentAgentFactory: AgentFactory = defaultAgentFactory(); /** diff --git a/skills/rig/samples/100-workspace-config-drift-2.md b/skills/rig/samples/100-workspace-config-drift-2.md index 04d0b89..f3bb763 100644 --- a/skills/rig/samples/100-workspace-config-drift-2.md +++ b/skills/rig/samples/100-workspace-config-drift-2.md @@ -1,8 +1,7 @@ # 100 - Workspace Config Drift 2 ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const parseJson = defineTool("parseJson", { description: "Parse a JSON string and return parsed object or error", diff --git a/skills/rig/samples/101-commit-format-suggester-2.md b/skills/rig/samples/101-commit-format-suggester-2.md index 2348170..2735d8b 100644 --- a/skills/rig/samples/101-commit-format-suggester-2.md +++ b/skills/rig/samples/101-commit-format-suggester-2.md @@ -1,8 +1,7 @@ # 101 - Commit Format Suggester 2 ```rig -import { agent, p, s } from "rig"; -import { repair, steering } from "rig/addons"; +import { agent, p, s, repair, steering } from "rig"; // Agent role: suggest conventional commit format for recent git commit messages. const commitFormatSuggester = agent({ diff --git a/skills/rig/samples/103-hotspot-file-analyzer-2.md b/skills/rig/samples/103-hotspot-file-analyzer-2.md index 53daf6b..6d485b3 100644 --- a/skills/rig/samples/103-hotspot-file-analyzer-2.md +++ b/skills/rig/samples/103-hotspot-file-analyzer-2.md @@ -1,8 +1,7 @@ # 103 - Hotspot File Analyzer 2 ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: identify hot-spot files by measuring commit churn and contributor spread. const hotspotFileAnalyzer = agent({ diff --git a/skills/rig/samples/105-import-cycle-detector-2.md b/skills/rig/samples/105-import-cycle-detector-2.md index 42e4ba6..6998474 100644 --- a/skills/rig/samples/105-import-cycle-detector-2.md +++ b/skills/rig/samples/105-import-cycle-detector-2.md @@ -1,8 +1,7 @@ # 105 - Import Cycle Detector 2 ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: detect circular import cycles in TypeScript source files. const importCycleDetector = agent({ diff --git a/skills/rig/samples/107-git-rename-tracker.md b/skills/rig/samples/107-git-rename-tracker.md index 57ac324..04d3a91 100644 --- a/skills/rig/samples/107-git-rename-tracker.md +++ b/skills/rig/samples/107-git-rename-tracker.md @@ -1,8 +1,7 @@ # 107 - Git Rename Tracker ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: track file renames in git history and produce a structured rename log. const gitRenameTracker = agent({ diff --git a/skills/rig/samples/110-workspace-config-drift-3.md b/skills/rig/samples/110-workspace-config-drift-3.md index 93ae581..a520157 100644 --- a/skills/rig/samples/110-workspace-config-drift-3.md +++ b/skills/rig/samples/110-workspace-config-drift-3.md @@ -1,8 +1,7 @@ # 110 - Workspace Config Drift 3 ```rig -import { agent, defineTool, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, defineTool, p, s, repair } from "rig"; // Agent role: detect drift in workspace config files against a baseline. const workspaceConfigDrift = agent({ diff --git a/skills/rig/samples/111-conventional-commit-suggester.md b/skills/rig/samples/111-conventional-commit-suggester.md index 5713769..1aaf6ff 100644 --- a/skills/rig/samples/111-conventional-commit-suggester.md +++ b/skills/rig/samples/111-conventional-commit-suggester.md @@ -1,8 +1,7 @@ # 111 - Conventional Commit Suggester ```rig -import { agent, p, s } from "rig"; -import { repair, steering } from "rig/addons"; +import { agent, p, s, repair, steering } from "rig"; // Agent role: suggest conventional-format rewrites for recent git commit messages. const conventionalCommitSuggester = agent({ diff --git a/skills/rig/samples/113-git-hotspot-analyzer.md b/skills/rig/samples/113-git-hotspot-analyzer.md index 8545a4d..5f39d33 100644 --- a/skills/rig/samples/113-git-hotspot-analyzer.md +++ b/skills/rig/samples/113-git-hotspot-analyzer.md @@ -1,8 +1,7 @@ # 113 - Git Hotspot Analyzer ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: identify hot-spot files by git churn and top contributors. const gitHotspotAnalyzer = agent({ diff --git a/skills/rig/samples/115-import-cycle-detector.md b/skills/rig/samples/115-import-cycle-detector.md index 9b7b6b5..f955d72 100644 --- a/skills/rig/samples/115-import-cycle-detector.md +++ b/skills/rig/samples/115-import-cycle-detector.md @@ -1,8 +1,7 @@ # 115 - Import Cycle Detector ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: detect circular import cycles in the TypeScript project. const importCycleDetector = agent({ diff --git a/skills/rig/samples/118-pr-review-checklist.md b/skills/rig/samples/118-pr-review-checklist.md index 9b38450..d1dd661 100644 --- a/skills/rig/samples/118-pr-review-checklist.md +++ b/skills/rig/samples/118-pr-review-checklist.md @@ -1,8 +1,7 @@ # 118 - Pr Review Checklist ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: generate a PR review checklist from the recent git diff. const prReviewChecklist = agent({ diff --git a/skills/rig/samples/120-git-hotspot-v2.md b/skills/rig/samples/120-git-hotspot-v2.md index 32bb68c..8dfe02c 100644 --- a/skills/rig/samples/120-git-hotspot-v2.md +++ b/skills/rig/samples/120-git-hotspot-v2.md @@ -1,8 +1,7 @@ # 120 - Git Hotspot V2 ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const getFileCommitCount = defineTool("getFileCommitCount", { description: "Count how many commits touched a specific file", diff --git a/skills/rig/samples/122-import-cycle-detector.md b/skills/rig/samples/122-import-cycle-detector.md index 2b98c6e..d38880a 100644 --- a/skills/rig/samples/122-import-cycle-detector.md +++ b/skills/rig/samples/122-import-cycle-detector.md @@ -1,8 +1,7 @@ # 122 - Import Cycle Detector ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: detect import cycles in a TypeScript project and assess their severity const importCycleDetector = agent({ diff --git a/skills/rig/samples/125-test-coverage-mapper.md b/skills/rig/samples/125-test-coverage-mapper.md index c7b8fb8..bc62255 100644 --- a/skills/rig/samples/125-test-coverage-mapper.md +++ b/skills/rig/samples/125-test-coverage-mapper.md @@ -1,8 +1,7 @@ # 125 - Test Coverage Mapper ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const findTestFile = defineTool("findTestFile", { description: "Find the best matching test file for a given source file using filename heuristics", diff --git a/skills/rig/samples/126-tsconfig-options-auditor.md b/skills/rig/samples/126-tsconfig-options-auditor.md index 7cc0ca4..eca1d8e 100644 --- a/skills/rig/samples/126-tsconfig-options-auditor.md +++ b/skills/rig/samples/126-tsconfig-options-auditor.md @@ -1,8 +1,7 @@ # 126 - Tsconfig Options Auditor ```rig -import { agent, p, s, defineTool } from "rig"; -import { steering, repair } from "rig/addons"; +import { agent, p, s, defineTool, steering, repair } from "rig"; const checkOption = defineTool("checkOption", { description: "Check whether a tsconfig compiler option matches the recommended value", diff --git a/skills/rig/samples/128-npm-script-dep-mapper.md b/skills/rig/samples/128-npm-script-dep-mapper.md index 9b48827..6462b30 100644 --- a/skills/rig/samples/128-npm-script-dep-mapper.md +++ b/skills/rig/samples/128-npm-script-dep-mapper.md @@ -1,8 +1,7 @@ # 128 - Npm Script Dep Mapper ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const parseScriptDeps = defineTool("parseScriptDeps", { description: "Parse pre/post hooks and npm run references for a script", diff --git a/skills/rig/samples/129-markdown-link-checker.md b/skills/rig/samples/129-markdown-link-checker.md index a892f98..91348a1 100644 --- a/skills/rig/samples/129-markdown-link-checker.md +++ b/skills/rig/samples/129-markdown-link-checker.md @@ -1,8 +1,7 @@ # 129 - Markdown Link Checker ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const checkUrl = defineTool("checkUrl", { description: "Check HTTP status of a URL using curl", diff --git a/skills/rig/samples/130-git-hotspot-analyzer.md b/skills/rig/samples/130-git-hotspot-analyzer.md index c0f7ce9..6954881 100644 --- a/skills/rig/samples/130-git-hotspot-analyzer.md +++ b/skills/rig/samples/130-git-hotspot-analyzer.md @@ -1,8 +1,7 @@ # 130 - Git Hotspot Analyzer ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: analyze which files are hot-spots by measuring commit churn and top contributors. const gitHotspotAnalyzer = agent({ diff --git a/skills/rig/samples/132-import-cycle-detector.md b/skills/rig/samples/132-import-cycle-detector.md index 4df6d4d..e1a31a9 100644 --- a/skills/rig/samples/132-import-cycle-detector.md +++ b/skills/rig/samples/132-import-cycle-detector.md @@ -1,8 +1,7 @@ # 132 - Import Cycle Detector ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: detect circular import cycles in the TypeScript project and classify severity. const importCycleDetector = agent({ diff --git a/skills/rig/samples/135-test-coverage-mapper.md b/skills/rig/samples/135-test-coverage-mapper.md index 77c20be..74d0c70 100644 --- a/skills/rig/samples/135-test-coverage-mapper.md +++ b/skills/rig/samples/135-test-coverage-mapper.md @@ -1,8 +1,7 @@ # 135 - Test Coverage Mapper ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const matchTestFile = defineTool("matchTestFile", { description: "Find matching test files for a source file using filename heuristics", diff --git a/skills/rig/samples/139-markdown-frontmatter-checker.md b/skills/rig/samples/139-markdown-frontmatter-checker.md index bffa359..1bbc8b5 100644 --- a/skills/rig/samples/139-markdown-frontmatter-checker.md +++ b/skills/rig/samples/139-markdown-frontmatter-checker.md @@ -1,8 +1,7 @@ # 139 - Markdown Frontmatter Checker ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; import { readFileSync, existsSync } from "node:fs"; const parseFrontmatter = defineTool("parseFrontmatter", { diff --git a/skills/rig/samples/140-git-hotspot-analyzer.md b/skills/rig/samples/140-git-hotspot-analyzer.md index 039f5c6..42d7b14 100644 --- a/skills/rig/samples/140-git-hotspot-analyzer.md +++ b/skills/rig/samples/140-git-hotspot-analyzer.md @@ -1,8 +1,7 @@ # 140 - Git Hotspot Analyzer ```rig -import { agent, p, s, defineTool } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, defineTool, steering } from "rig"; const scoreFile = defineTool("scoreFile", { description: "Compute a churn score from commit count for a file.", diff --git a/skills/rig/samples/142-import-cycle-detector.md b/skills/rig/samples/142-import-cycle-detector.md index b57fa5b..5529fcf 100644 --- a/skills/rig/samples/142-import-cycle-detector.md +++ b/skills/rig/samples/142-import-cycle-detector.md @@ -1,8 +1,7 @@ # 142 - Import Cycle Detector ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: Detect import cycles in TypeScript source using madge and classify severity. const importCycleDetector = agent({ diff --git a/skills/rig/samples/145-test-coverage-mapper.md b/skills/rig/samples/145-test-coverage-mapper.md index 99fcd6f..4237241 100644 --- a/skills/rig/samples/145-test-coverage-mapper.md +++ b/skills/rig/samples/145-test-coverage-mapper.md @@ -1,8 +1,7 @@ # 145 - Test Coverage Mapper ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const matchTestFile = defineTool("matchTestFile", { description: "Heuristically find test files matching a source file by name.", diff --git a/skills/rig/samples/149-dotfile-inventory.md b/skills/rig/samples/149-dotfile-inventory.md index 790324f..d54af8b 100644 --- a/skills/rig/samples/149-dotfile-inventory.md +++ b/skills/rig/samples/149-dotfile-inventory.md @@ -1,8 +1,7 @@ # 149 - Dotfile Inventory ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: Discover and categorize dotfiles in the workspace root and nearby directories. const dotfileInventory = agent({ diff --git a/skills/rig/samples/150-git-hotspot-analyzer-v3.md b/skills/rig/samples/150-git-hotspot-analyzer-v3.md index 903d73b..f89655e 100644 --- a/skills/rig/samples/150-git-hotspot-analyzer-v3.md +++ b/skills/rig/samples/150-git-hotspot-analyzer-v3.md @@ -1,8 +1,7 @@ # 150 - Git Hotspot Analyzer V3 ```rig -import { agent, defineTool, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, defineTool, p, s, steering } from "rig"; // Agent role: identify hot-spot files by git churn and classify risk level. const gitHotspotAnalyzerV3 = agent({ diff --git a/skills/rig/samples/152-import-cycle-detector-v3.md b/skills/rig/samples/152-import-cycle-detector-v3.md index 17145ea..9d0a6c6 100644 --- a/skills/rig/samples/152-import-cycle-detector-v3.md +++ b/skills/rig/samples/152-import-cycle-detector-v3.md @@ -1,8 +1,7 @@ # 152 - Import Cycle Detector V3 ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: detect circular import cycles in TypeScript source and classify severity. const importCycleDetectorV3 = agent({ diff --git a/skills/rig/samples/155-test-coverage-mapper-v2.md b/skills/rig/samples/155-test-coverage-mapper-v2.md index bccf674..1b42a34 100644 --- a/skills/rig/samples/155-test-coverage-mapper-v2.md +++ b/skills/rig/samples/155-test-coverage-mapper-v2.md @@ -1,8 +1,7 @@ # 155 - Test Coverage Mapper V2 ```rig -import { agent, defineTool, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, defineTool, p, s, repair } from "rig"; // Agent role: map source files to their test files using filename heuristics. const testCoverageMapperV2 = agent({ diff --git a/skills/rig/samples/156-regex-pattern-tester.md b/skills/rig/samples/156-regex-pattern-tester.md index 205ab8d..3707746 100644 --- a/skills/rig/samples/156-regex-pattern-tester.md +++ b/skills/rig/samples/156-regex-pattern-tester.md @@ -1,8 +1,7 @@ # 156 - Regex Pattern Tester ```rig -import { agent, defineTool, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, defineTool, p, s, repair } from "rig"; // Agent role: run regex patterns against test cases and report pass/fail results. const regexPatternTester = agent({ diff --git a/skills/rig/samples/157-commit-churn-classifier.md b/skills/rig/samples/157-commit-churn-classifier.md index 5fea348..bbfb5d4 100644 --- a/skills/rig/samples/157-commit-churn-classifier.md +++ b/skills/rig/samples/157-commit-churn-classifier.md @@ -1,8 +1,7 @@ # 157 - Commit Churn Classifier ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: classify files by commit churn frequency and assign a risk level. const commitChurnClassifier = agent({ diff --git a/skills/rig/samples/49-timeout-signal-helper.md b/skills/rig/samples/49-timeout-signal-helper.md index 8c5c553..6eaa2df 100644 --- a/skills/rig/samples/49-timeout-signal-helper.md +++ b/skills/rig/samples/49-timeout-signal-helper.md @@ -1,8 +1,7 @@ # 49 - Timeout Signal Helper ```rig -import { agent, s } from "rig"; -import { timeout } from "rig/addons"; +import { agent, s, timeout } from "rig"; // Agent role: return a short response before the timeout expires. const worker = agent({ model: "mini", diff --git a/skills/rig/samples/66-ci-workflow-health.md b/skills/rig/samples/66-ci-workflow-health.md index 84212ec..e64e056 100644 --- a/skills/rig/samples/66-ci-workflow-health.md +++ b/skills/rig/samples/66-ci-workflow-health.md @@ -1,8 +1,7 @@ # 66 - CI Workflow Health Analyzer ```rig -import { agent, defineTool, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, defineTool, p, s, repair } from "rig"; const parseYamlSteps = defineTool("parse_yaml_steps", { description: "Extract step names and uses from a YAML workflow file.", diff --git a/skills/rig/samples/68-changelog-generator.md b/skills/rig/samples/68-changelog-generator.md index 9e984ae..0142cf3 100644 --- a/skills/rig/samples/68-changelog-generator.md +++ b/skills/rig/samples/68-changelog-generator.md @@ -1,8 +1,7 @@ # 68 - Changelog Generator ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const validateSemver = defineTool("validateSemver", { description: "Validate that a bump type is major, minor, or patch", diff --git a/skills/rig/samples/71-package-script-health.md b/skills/rig/samples/71-package-script-health.md index 800fc59..e098aa4 100644 --- a/skills/rig/samples/71-package-script-health.md +++ b/skills/rig/samples/71-package-script-health.md @@ -1,8 +1,7 @@ # 71 - Package Script Health ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const validateScriptName = defineTool("validateScriptName", { description: "Validate that a package.json script name follows conventional naming (lowercase, hyphens only)", diff --git a/skills/rig/samples/73-git-branch-pruner.md b/skills/rig/samples/73-git-branch-pruner.md index e1015fe..dca604e 100644 --- a/skills/rig/samples/73-git-branch-pruner.md +++ b/skills/rig/samples/73-git-branch-pruner.md @@ -1,8 +1,7 @@ # 73 - Git Branch Pruner ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: identify git branches that are candidates for pruning based on merge status and last commit date. const gitBranchPruner = agent({ diff --git a/skills/rig/samples/74-prettier-eslint-compat.md b/skills/rig/samples/74-prettier-eslint-compat.md index 2ca647e..37a4ece 100644 --- a/skills/rig/samples/74-prettier-eslint-compat.md +++ b/skills/rig/samples/74-prettier-eslint-compat.md @@ -1,8 +1,7 @@ # 74 - Prettier Eslint Compat ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const detectConflicts = defineTool("detectConflicts", { description: "Detect rule conflicts between Prettier and ESLint configs", diff --git a/skills/rig/samples/76-commit-msg-rewriter.md b/skills/rig/samples/76-commit-msg-rewriter.md index 39c9b28..a556660 100644 --- a/skills/rig/samples/76-commit-msg-rewriter.md +++ b/skills/rig/samples/76-commit-msg-rewriter.md @@ -1,8 +1,7 @@ # 76 - Commit Msg Rewriter ```rig -import { agent, p, s } from "rig"; -import { steering, repair } from "rig/addons"; +import { agent, p, s, steering, repair } from "rig"; // Agent role: rewrite recent git commit messages into conventional commit format with imperative mood. const commitMsgRewriter = agent({ diff --git a/skills/rig/samples/78-build-log-analyzer.md b/skills/rig/samples/78-build-log-analyzer.md index 5236d2f..a66fd98 100644 --- a/skills/rig/samples/78-build-log-analyzer.md +++ b/skills/rig/samples/78-build-log-analyzer.md @@ -1,8 +1,7 @@ # 78 - Build Log Analyzer ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: run the build and analyze the output for errors, warnings, and success status. const buildLogAnalyzer = agent({ diff --git a/skills/rig/samples/82-workspace-config-drift.md b/skills/rig/samples/82-workspace-config-drift.md index e6ed700..535787b 100644 --- a/skills/rig/samples/82-workspace-config-drift.md +++ b/skills/rig/samples/82-workspace-config-drift.md @@ -1,8 +1,7 @@ # 82 - Workspace Config Drift ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const parseJson = defineTool("parseJson", { description: "Parse a JSON string and return it, or report a parse error", diff --git a/skills/rig/samples/83-commit-format-suggester.md b/skills/rig/samples/83-commit-format-suggester.md index 7245377..cc69c8d 100644 --- a/skills/rig/samples/83-commit-format-suggester.md +++ b/skills/rig/samples/83-commit-format-suggester.md @@ -1,8 +1,7 @@ # 83 - Commit Format Suggester ```rig -import { agent, p, s } from "rig"; -import { repair, steering } from "rig/addons"; +import { agent, p, s, repair, steering } from "rig"; // Agent role: review recent git commits and suggest conventional-format rewrites for each one. const commitFormatSuggester = agent({ diff --git a/skills/rig/samples/86-npm-audit-simplifier.md b/skills/rig/samples/86-npm-audit-simplifier.md index d5f7992..7c3fc3a 100644 --- a/skills/rig/samples/86-npm-audit-simplifier.md +++ b/skills/rig/samples/86-npm-audit-simplifier.md @@ -1,8 +1,7 @@ # 86 - Npm Audit Simplifier ```rig -import { agent, p, s } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, repair } from "rig"; // Agent role: run npm audit, parse the JSON output, and produce a simplified vulnerability report. const npmAuditSimplifier = agent({ diff --git a/skills/rig/samples/90-workspace-config-drift.md b/skills/rig/samples/90-workspace-config-drift.md index 24baf69..06fb5e2 100644 --- a/skills/rig/samples/90-workspace-config-drift.md +++ b/skills/rig/samples/90-workspace-config-drift.md @@ -1,8 +1,7 @@ # 90 - Workspace Config Drift ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const parseJson = defineTool("parseJson", { description: "Parse a JSON string and return it, or report a parse error", diff --git a/skills/rig/samples/91-commit-format-suggester.md b/skills/rig/samples/91-commit-format-suggester.md index f645bd3..223a57a 100644 --- a/skills/rig/samples/91-commit-format-suggester.md +++ b/skills/rig/samples/91-commit-format-suggester.md @@ -1,8 +1,7 @@ # 91 - Commit Format Suggester ```rig -import { agent, p, s } from "rig"; -import { repair, steering } from "rig/addons"; +import { agent, p, s, repair, steering } from "rig"; // Agent role: review recent git commits and suggest conventional-format rewrites for each one. const commitFormatSuggester = agent({ diff --git a/skills/rig/samples/93-hotspot-file-analyzer.md b/skills/rig/samples/93-hotspot-file-analyzer.md index 96f581c..c9d1daa 100644 --- a/skills/rig/samples/93-hotspot-file-analyzer.md +++ b/skills/rig/samples/93-hotspot-file-analyzer.md @@ -1,8 +1,7 @@ # 93 - Hotspot File Analyzer ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: analyze which source files are hot-spots by measuring churn and top contributors. const hotspotFileAnalyzer = agent({ diff --git a/skills/rig/samples/94-ts-interface-conflict-checker.md b/skills/rig/samples/94-ts-interface-conflict-checker.md index 327b09e..fab4faf 100644 --- a/skills/rig/samples/94-ts-interface-conflict-checker.md +++ b/skills/rig/samples/94-ts-interface-conflict-checker.md @@ -1,8 +1,7 @@ # 94 - Ts Interface Conflict Checker ```rig -import { agent, p, s, defineTool } from "rig"; -import { repair } from "rig/addons"; +import { agent, p, s, defineTool, repair } from "rig"; const scanInterfaces = defineTool("scanInterfaces", { description: "Scan a TypeScript file for exported interface names using grep", diff --git a/skills/rig/samples/96-test-naming-enforcer.md b/skills/rig/samples/96-test-naming-enforcer.md index 9e0a20e..e58a06a 100644 --- a/skills/rig/samples/96-test-naming-enforcer.md +++ b/skills/rig/samples/96-test-naming-enforcer.md @@ -1,8 +1,7 @@ # 96 - Test Naming Enforcer ```rig -import { agent, p, s } from "rig"; -import { steering } from "rig/addons"; +import { agent, p, s, steering } from "rig"; // Agent role: audit test file naming conventions and report files that violate the standard pattern. const testNamingEnforcer = agent({ diff --git a/src/addons.ts b/src/addons.ts index faa8a63..982a005 100644 --- a/src/addons.ts +++ b/src/addons.ts @@ -1,2 +1,2 @@ -export { addons, oncePerAgent, repair, steering, timeout } from "../skills/rig/addons.ts"; -export type { AgentRegistration, SteeringOptions, TimeoutOptions } from "../skills/rig/addons.ts"; +export { addons, oncePerAgent, repair, steering, timeout } from "../skills/rig/rig.ts"; +export type { AgentRegistration, SteeringOptions, TimeoutOptions } from "../skills/rig/rig.ts"; diff --git a/src/samples/49-timeout-signal-helper.ts b/src/samples/49-timeout-signal-helper.ts index 8aa8498..5a1aa19 100644 --- a/src/samples/49-timeout-signal-helper.ts +++ b/src/samples/49-timeout-signal-helper.ts @@ -1,5 +1,4 @@ -import { agent } from "rig"; -import { timeout } from "rig/addons"; +import { agent, timeout } from "rig"; // Agent role: return a short response in output.text. diff --git a/src/samples/57-complex-integration-sonnet.ts b/src/samples/57-complex-integration-sonnet.ts index d558203..223f051 100644 --- a/src/samples/57-complex-integration-sonnet.ts +++ b/src/samples/57-complex-integration-sonnet.ts @@ -1,5 +1,4 @@ -import { agent, defineTool, p, s } from "rig"; -import { oncePerAgent, steering, timeout } from "rig/addons"; +import { agent, defineTool, p, s, oncePerAgent, steering, timeout } from "rig"; const summarizeText = defineTool<{ text: string }>("summarize_text", { description: "Create a concise summary from text.",