2026-02-21 03:10:39 +00:00
|
|
|
import tseslint from '@typescript-eslint/eslint-plugin';
|
|
|
|
|
import tsparser from '@typescript-eslint/parser';
|
|
|
|
|
|
|
|
|
|
export default [
|
|
|
|
|
{
|
refactor(prime-agent): extract the /mcpctl switcher to typechecked source; pi --dry-run; docs
The prime-agent switcher existed only as a 275-line string literal inside
prime-agent-extension.ts, so nothing typechecked or linted it — the exact gap
that let a wrong ctx.ui.select() option shape ship in the pi extension. It now
lives at src/prime-agent-ext/mcpctl-switch.ts with a generator, a tsconfig
checking it against the real @earendil-works/pi-coding-agent types, eslint
coverage and an embed-freshness test, matching pi and opencode.
The extraction was verified byte-identical before any edit, so the behaviour
shipped today is exactly what was captured. Linting it then found six problems
in code nothing had ever checked: object-truthiness null guards, a nullable
string conditional and a missing return type. All behaviour-preserving to fix,
but exactly the class of thing that ships silently when nothing is looking.
Also:
- `config pi` gains --dry-run, the last agent without it.
- The SessionStart hook installer now drops untagged duplicates of its own
exact command — rows left behind before the marker existed, or by a suite
that used to write into a real ~/.claude. Invisible in the UI; they just run
the sync twice per session. A hook the user wrote is never touched, even one
calling `mcpctl skills sync` with different flags.
- docs/claude-integration.md and docs/prime-agent-extension.md, the two
integrations that had no page.
prime-agent deliberately keeps its per-project MCP entry name rather than the
constant `mcpctl` claude and opencode now use: its switcher already unmounts the
previous project, so it never accumulates entries, and re-keying auth.json from
mcp:<project> to mcp:mcpctl would give up per-project token caching and needs a
migration. Documented as its own change rather than folded in here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVwuCjuMoA13gmzYEfcrNP
2026-08-09 19:20:36 +01:00
|
|
|
files: ['src/*/src/**/*.ts', 'src/pi-ext/*.ts', 'src/opencode-ext/*.ts', 'src/prime-agent-ext/*.ts'],
|
2026-02-21 03:10:39 +00:00
|
|
|
languageOptions: {
|
|
|
|
|
parser: tsparser,
|
|
|
|
|
parserOptions: {
|
|
|
|
|
project: ['./src/*/tsconfig.json'],
|
|
|
|
|
tsconfigRootDir: import.meta.dirname,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
plugins: { '@typescript-eslint': tseslint },
|
|
|
|
|
rules: {
|
|
|
|
|
'@typescript-eslint/explicit-function-return-type': 'error',
|
|
|
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
|
|
|
'@typescript-eslint/no-unused-vars': 'error',
|
|
|
|
|
'@typescript-eslint/strict-boolean-expressions': 'error',
|
|
|
|
|
'no-console': ['warn', { allow: ['warn', 'error'] }],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
ignores: ['**/dist/**', '**/node_modules/**', '**/*.config.*'],
|
|
|
|
|
},
|
|
|
|
|
];
|