refactor(opencode): replace availability cache with path cache, enhance parsing, enable shell
This commit is contained in:
@@ -4,19 +4,43 @@
|
||||
|
||||
- **Compile**: `npm run compile` (or `tsc -p ./`)
|
||||
- **Watch**: `npm run watch`
|
||||
- **Package extension**: `npm run build` → produces `.vsix` file
|
||||
- **Test**: Press F5 to launch extension in debug mode
|
||||
- **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
|
||||
|
||||
## Project Structure
|
||||
## Architecture
|
||||
|
||||
- `src/extension.ts` - Extension entry point, registers `aiCommitExt.generate` command
|
||||
- `src/opencodeService.ts` - Spawns `opencode run` CLI, parses output for commit message
|
||||
- `src/gitService.ts` - Uses VS Code Git extension API to get diffs and repo root
|
||||
| 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 Details
|
||||
## Key Behaviors
|
||||
|
||||
- Output compiled to `out/` directory
|
||||
- Extension activates only on command invocation (not on startup)
|
||||
- OpenCode CLI is required on PATH; checked via `which opencode`
|
||||
- Generated message written to SCM input box via `repository.inputBox.value`
|
||||
- Timeout: 120 seconds for OpenCode response
|
||||
- **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 (`<type>(<scope>): <description>`, 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)
|
||||
|
||||
Reference in New Issue
Block a user