Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .agents/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .claude/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .cursor/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .gemini/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .github/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .kiro/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .pi/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .qoder/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .rovodev/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .trae-cn/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion .trae/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
6 changes: 4 additions & 2 deletions bin/commands/skills.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ import { tmpdir } from 'node:os';
const __dirname = dirname(fileURLToPath(import.meta.url));
const API_BASE = 'https://impeccable.style';

// Provider folder names in project roots
const PROVIDER_DIRS = ['.claude', '.cursor', '.gemini', '.agents', '.github', '.kiro', '.opencode', '.pi', '.qoder', '.trae', '.trae-cn'];
// Provider folder names in project roots.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js
// (.codex is intentionally excluded -- Codex CLI consumes .agents/skills/).
const PROVIDER_DIRS = ['.claude', '.cursor', '.gemini', '.agents', '.github', '.kiro', '.opencode', '.pi', '.qoder', '.rovodev', '.trae', '.trae-cn'];

function ask(question) {
const rl = createInterface({ input: process.stdin, output: process.stdout });
Expand Down
4 changes: 3 additions & 1 deletion plugin/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
4 changes: 3 additions & 1 deletion source/skills/impeccable/scripts/cleanup-deprecated.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ const DEPRECATED_NAMES = [
];

// All known harness directories that may contain a skills/ subfolder.
// Must stay in sync with configDir entries in scripts/lib/transformers/providers.js.
const HARNESS_DIRS = [
'.claude', '.cursor', '.gemini', '.codex', '.agents',
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
'.github', '.trae', '.trae-cn', '.pi', '.opencode',
'.kiro', '.qoder', '.rovodev',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pin.mjs HARNESS_DIRS still missing .github and .qoder

Medium Severity

source/skills/impeccable/scripts/pin.mjs (and its mirrored copies in plugin/, .claude/, .cursor/, etc.) contains its own HARNESS_DIRS array that was not updated by this PR. It still lists only 11 entries, missing .github and .qoder. The findHarnessDirs() function in pin.mjs iterates this array to discover harness installs, so pin/unpin commands silently skip GitHub Copilot and Qoder users — the exact same class of drift this PR fixes for cleanup-deprecated.mjs.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 6bc2f26. Configure here.

];

// Per-skill fingerprints for SKILL.md bodies that never mentioned
Expand Down
13 changes: 13 additions & 0 deletions tests/cleanup-deprecated.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,19 @@ describe('cleanup-deprecated', () => {
assert.equal(deleted.length, 3);
});

it('cleans GitHub Copilot and Qoder harness installs', () => {
// Regression: HARNESS_DIRS used to omit .github and .qoder, so users
// who installed via those harnesses kept stale skill directories
// forever. providers.js declares both as build targets, so they need
// to round-trip through cleanup as well.
writeSkill(tmp, '.github', 'arrange', 'Invoke /impeccable first.');
writeSkill(tmp, '.qoder', 'normalize', 'Run impeccable teach.');
const deleted = removeDeprecatedSkills(tmp);
assert.equal(deleted.length, 2);
assert.equal(existsSync(join(tmp, '.github', 'skills', 'arrange')), false);
assert.equal(existsSync(join(tmp, '.qoder', 'skills', 'normalize')), false);
});

it('leaves non-deprecated skills alone', () => {
writeSkill(tmp, '.claude', 'my-custom-skill', 'Invoke /impeccable first.');
writeSkill(tmp, '.claude', 'arrange', 'Invoke /impeccable first.');
Expand Down
Loading