# AGENTS.md ## Build & Run - **Compile**: `npm run compile` (or `tsc -p ./`) - **Watch**: `npm run watch` - **Package**: `npm run build` → produces `.vsix` in project root - **Test**: `npm run test` — currently a no-op (`echo "No tests yet"`); press F5 in VS Code to debug the extension - **Verify**: `npx tsc --noEmit` — strict mode, TS 6.0 (uses `ignoreDeprecations: "6.0"`) - No linter or formatter is configured ## Architecture | File | Role | |---|---| | `src/extension.ts` | Entrypoint; registers `aiCommitExt.generate` command; orchestrates flow | | `src/opencodeService.ts` | Spawns `opencode run --format default --variant minimal` with the prompt on stdin; parses stdout for the commit message | | `src/gitService.ts` | Uses VS Code's built-in Git extension API (`vscode.git`) for diffs and repo root | ## Key Behaviors - **Activation**: `onCommand` only — not on startup - **Diff logic**: Prefers staged changes. Falls back to unstaged **only if** `aiCommitExt.includeUnstaged` is `true` (default `false`). - **Prompt**: Hardcoded in `opencodeService.ts` — enforces Conventional Commit format (`(): `, max 72-char subject). Types: feat, fix, refactor, docs, style, test, chore, perf, ci, build, revert. - **Parsing**: Uses `\b(type)(\(scope\))?:\s` regex that matches anywhere in a line (not just line-start), so backtick-wrapped or prose-embedded commit messages are found. ANSI escape sequences are stripped before matching. Falls back to first content line, then `"chore: generated commit message"`. - **Stdout is logged** to the output channel ("ai-commit-ext") for debugging. - **`--pure` flag**: Not used — opencode loads its user config (`~/.config/opencode/opencode.json`) which needs to configure the model. The extension does NOT pass a hardcoded `--model` flag; the user's config determines the model. - **`shell: true`**: Spawn uses a shell so opencode can find `git` and other tools via the shell's PATH (VS Code's GUI-launched process has a minimal PATH). - **Timeout**: 120 seconds for OpenCode response. - **Model**: Default is whatever opencode's user config sets. Override via `aiCommitExt.model` setting or `GenerateOptions.model`. - **OpenCode CLI**: Required on `$PATH`; resolved to an absolute path via `which opencode` and cached — used in `spawn()` to avoid PATH lookup mismatches between the shell and VS Code's process environment. ## Configuration (`aiCommitExt.*`) | Setting | Default | Purpose | |---|---|---| | `model` | `""` | OpenCode model override | | `includeUnstaged` | `false` | Use unstaged changes when nothing staged | | `showNotification` | `true` | Show VS Code notifications on success/error | ## Build Artifacts & Cleanup - Compiled output → `out/` (gitignored) - Packaged extension → `*.vsix` (gitignored) - `node_modules/` (gitignored) - `npm run compile` before packaging (`vscode:prepublish` hook)