From 8e900d430154a5f6a87d9e430a0c8de04b98cc9d Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 17:48:57 +0200 Subject: [PATCH 01/12] refactor: move git module to lib/git/ --- src/add.ts | 2 +- src/context-add.ts | 2 +- src/context-check.ts | 2 +- src/find-discovery.test.ts | 2 +- src/find-discovery.ts | 2 +- src/find.ts | 2 +- src/instruction-commands.test.ts | 2 +- src/{ => lib/git}/git.test.ts | 0 src/{ => lib/git}/git.ts | 0 src/{ => lib/git}/github-trees.test.ts | 2 +- src/{ => lib/git}/github-trees.ts | 2 +- src/{ => lib/git}/gitignore.test.ts | 0 src/{ => lib/git}/gitignore.ts | 0 src/lib/git/index.ts | 3 +++ src/remove.ts | 2 +- src/restore.ts | 2 +- src/skill-lock.ts | 2 +- tests/gitignore-integration.test.ts | 2 +- 18 files changed, 16 insertions(+), 13 deletions(-) rename src/{ => lib/git}/git.test.ts (100%) rename src/{ => lib/git}/git.ts (100%) rename src/{ => lib/git}/github-trees.test.ts (98%) rename src/{ => lib/git}/github-trees.ts (96%) rename src/{ => lib/git}/gitignore.test.ts (100%) rename src/{ => lib/git}/gitignore.ts (100%) create mode 100644 src/lib/git/index.ts diff --git a/src/add.ts b/src/add.ts index 1020870..38bf3ea 100644 --- a/src/add.ts +++ b/src/add.ts @@ -6,7 +6,7 @@ import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from './sour import { shortenPath, formatList, kebabToTitle } from './utils.ts'; import { multiselect } from './add-agents.ts'; export { promptForAgents } from './add-agents.ts'; -import { cloneRepo, cleanupTempDir, GitCloneError } from './git.ts'; +import { cloneRepo, cleanupTempDir, GitCloneError } from './lib/git/index.ts'; import { CommandError } from './command-result.ts'; import { addPrompts, addAgents, addInstructions, resolveTargetAgents } from './context-add.ts'; import { TARGET_AGENTS } from './target-agents.ts'; diff --git a/src/context-add.ts b/src/context-add.ts index 7e102e4..c3e1d70 100644 --- a/src/context-add.ts +++ b/src/context-add.ts @@ -9,7 +9,7 @@ import { } from './dotai-lock.ts'; import { loadModelOverrides } from './model-aliases.ts'; import { TARGET_AGENTS } from './target-agents.ts'; -import { addToGitignore } from './gitignore.ts'; +import { addToGitignore } from './lib/git/index.ts'; import type { DiscoveredItem, LockEntry, TargetAgent } from './types.ts'; // --------------------------------------------------------------------------- diff --git a/src/context-check.ts b/src/context-check.ts index ad05a2a..9f73cc0 100644 --- a/src/context-check.ts +++ b/src/context-check.ts @@ -1,6 +1,6 @@ import pc from 'picocolors'; import { resolve } from 'path'; -import { cloneRepo, cleanupTempDir } from './git.ts'; +import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; import { parseSource } from './source-parser.ts'; import { discover, filterByType } from './context-discovery.ts'; import { executeInstallPipeline } from './context-installer.ts'; diff --git a/src/find-discovery.test.ts b/src/find-discovery.test.ts index 65a18b6..6afb36f 100644 --- a/src/find-discovery.test.ts +++ b/src/find-discovery.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { discoverRemoteContext } from './find-discovery.ts'; -import type { GitHubTreeEntry } from './github-trees.ts'; +import type { GitHubTreeEntry } from './lib/git/index.ts'; function blob(path: string): GitHubTreeEntry { return { path, type: 'blob', sha: 'abc123' }; diff --git a/src/find-discovery.ts b/src/find-discovery.ts index 894fcb9..cd9ca07 100644 --- a/src/find-discovery.ts +++ b/src/find-discovery.ts @@ -1,5 +1,5 @@ import type { ContextType } from './types.ts'; -import type { GitHubTreeEntry } from './github-trees.ts'; +import type { GitHubTreeEntry } from './lib/git/index.ts'; import { targetAgents } from './target-agents.ts'; export interface RemoteContextItem { diff --git a/src/find.ts b/src/find.ts index ff770c8..51405dd 100644 --- a/src/find.ts +++ b/src/find.ts @@ -4,7 +4,7 @@ import { runAdd } from './add.ts'; import { parseAddOptions } from './add-options.ts'; import { track } from './telemetry.ts'; import { isRepoPrivate, parseOwnerRepo } from './source-parser.ts'; -import { fetchRepoTree } from './github-trees.ts'; +import { fetchRepoTree } from './lib/git/index.ts'; import { discoverRemoteContext, type RemoteContextSummary } from './find-discovery.ts'; import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './utils.ts'; diff --git a/src/instruction-commands.test.ts b/src/instruction-commands.test.ts index 05369cb..a8bceda 100644 --- a/src/instruction-commands.test.ts +++ b/src/instruction-commands.test.ts @@ -4,7 +4,7 @@ import { join } from 'path'; import { tmpdir } from 'os'; import { runCli } from './test-utils.ts'; import { parseListOptions } from './list.ts'; -import { addToGitignore, readManagedPaths } from './gitignore.ts'; +import { addToGitignore, readManagedPaths } from './lib/git/index.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/git.test.ts b/src/lib/git/git.test.ts similarity index 100% rename from src/git.test.ts rename to src/lib/git/git.test.ts diff --git a/src/git.ts b/src/lib/git/git.ts similarity index 100% rename from src/git.ts rename to src/lib/git/git.ts diff --git a/src/github-trees.test.ts b/src/lib/git/github-trees.test.ts similarity index 98% rename from src/github-trees.test.ts rename to src/lib/git/github-trees.test.ts index 45564b3..4dfc145 100644 --- a/src/github-trees.test.ts +++ b/src/lib/git/github-trees.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, afterEach } from 'vitest'; -vi.mock('./skill-lock.ts', () => ({ +vi.mock('../../skill-lock.ts', () => ({ getGitHubToken: () => null, })); diff --git a/src/github-trees.ts b/src/lib/git/github-trees.ts similarity index 96% rename from src/github-trees.ts rename to src/lib/git/github-trees.ts index 4aec111..bebb1ef 100644 --- a/src/github-trees.ts +++ b/src/lib/git/github-trees.ts @@ -1,4 +1,4 @@ -import { getGitHubToken } from './skill-lock.ts'; +import { getGitHubToken } from '../../skill-lock.ts'; export interface GitHubTreeEntry { path: string; diff --git a/src/gitignore.test.ts b/src/lib/git/gitignore.test.ts similarity index 100% rename from src/gitignore.test.ts rename to src/lib/git/gitignore.test.ts diff --git a/src/gitignore.ts b/src/lib/git/gitignore.ts similarity index 100% rename from src/gitignore.ts rename to src/lib/git/gitignore.ts diff --git a/src/lib/git/index.ts b/src/lib/git/index.ts new file mode 100644 index 0000000..77b693f --- /dev/null +++ b/src/lib/git/index.ts @@ -0,0 +1,3 @@ +export { cloneRepo, cleanupTempDir, GitCloneError } from './git.ts'; +export { addToGitignore, removeFromGitignore, readManagedPaths } from './gitignore.ts'; +export { fetchRepoTree, type GitHubTreeEntry } from './github-trees.ts'; diff --git a/src/remove.ts b/src/remove.ts index 3b92606..a6af4c2 100644 --- a/src/remove.ts +++ b/src/remove.ts @@ -14,7 +14,7 @@ import { } from './skill-installer.ts'; import { readDotaiLock, removeLockEntry, writeDotaiLock } from './dotai-lock.ts'; import { removeSection } from './append-markers.ts'; -import { removeFromGitignore } from './gitignore.ts'; +import { removeFromGitignore } from './lib/git/index.ts'; import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; import { CommandError } from './command-result.ts'; diff --git a/src/restore.ts b/src/restore.ts index e30d592..02a4845 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -7,7 +7,7 @@ import { getUniversalAgents } from './agents.ts'; import { readDotaiLock, getLockEntriesByType } from './dotai-lock.ts'; import { addPrompts, addAgents } from './context-add.ts'; import { parseSource } from './source-parser.ts'; -import { cloneRepo, cleanupTempDir } from './git.ts'; +import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; import type { LockEntry, TargetAgent } from './types.ts'; /** diff --git a/src/skill-lock.ts b/src/skill-lock.ts index dd93f95..fbff3f1 100644 --- a/src/skill-lock.ts +++ b/src/skill-lock.ts @@ -4,7 +4,7 @@ import { homedir } from 'os'; import { execSync } from 'child_process'; import { LockVersionError } from './lock-version-error.ts'; -import { fetchRepoTree } from './github-trees.ts'; +import { fetchRepoTree } from './lib/git/index.ts'; const AGENTS_DIR = '.agents'; const LOCK_FILE = '.skill-lock.json'; diff --git a/tests/gitignore-integration.test.ts b/tests/gitignore-integration.test.ts index a111bc9..c85c4da 100644 --- a/tests/gitignore-integration.test.ts +++ b/tests/gitignore-integration.test.ts @@ -5,7 +5,7 @@ import { existsSync } from 'fs'; import { relative } from 'path'; import { addPrompts } from '../src/context-add.ts'; import { runCli } from '../src/test-utils.ts'; -import { readManagedPaths } from '../src/gitignore.ts'; +import { readManagedPaths } from '../src/lib/git/index.ts'; import { removeCommand } from '../src/remove.ts'; import { createTempProjectDir, From 8573e09f328be2d983e4806c9c19e1855f3f053c Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 17:55:10 +0200 Subject: [PATCH 02/12] refactor: move lock module to lib/lock/ --- src/add-agents.test.ts | 4 +-- src/add-agents.ts | 2 +- src/add-prompt.test.ts | 4 +-- src/add-wellknown.test.ts | 8 ++--- src/add-wellknown.ts | 4 +-- src/add.ts | 4 +-- src/check.test.ts | 8 ++--- src/check.ts | 2 +- src/context-add.ts | 2 +- src/context-check.ts | 2 +- src/instruction-check.test.ts | 4 +-- src/lib/git/github-trees.ts | 2 +- src/{ => lib/lock}/dotai-lock.test.ts | 2 +- src/{ => lib/lock}/dotai-lock.ts | 2 +- src/lib/lock/index.ts | 46 ++++++++++++++++++++++++ src/{ => lib/lock}/local-lock.ts | 0 src/{ => lib/lock}/lock-version-error.ts | 0 src/{ => lib/lock}/skill-lock.test.ts | 0 src/{ => lib/lock}/skill-lock.ts | 2 +- src/list.ts | 4 +-- src/remove.ts | 4 +-- src/restore.ts | 4 +-- src/sync.ts | 2 +- tests/cross-platform-paths.test.ts | 2 +- tests/e2e-update-flow.test.ts | 2 +- tests/e2e-utils.ts | 4 +-- tests/local-lock.test.ts | 4 +-- tests/restore.test.ts | 2 +- 28 files changed, 86 insertions(+), 40 deletions(-) rename src/{ => lib/lock}/dotai-lock.test.ts (99%) rename src/{ => lib/lock}/dotai-lock.ts (99%) create mode 100644 src/lib/lock/index.ts rename src/{ => lib/lock}/local-lock.ts (100%) rename src/{ => lib/lock}/lock-version-error.ts (100%) rename src/{ => lib/lock}/skill-lock.test.ts (100%) rename src/{ => lib/lock}/skill-lock.ts (99%) diff --git a/src/add-agents.test.ts b/src/add-agents.test.ts index 4bcda9f..deca53f 100644 --- a/src/add-agents.test.ts +++ b/src/add-agents.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { multiselect, promptForAgents, selectAgentsInteractive } from './add-agents.js'; -import * as skillLock from './skill-lock.js'; +import * as skillLock from './lib/lock/skill-lock.js'; import * as searchMultiselectModule from './prompts/search-multiselect.js'; import * as clack from '@clack/prompts'; import * as agentsModule from './agents.js'; // Mock dependencies -vi.mock('./skill-lock.js'); +vi.mock('./lib/lock/skill-lock.js'); vi.mock('./prompts/search-multiselect.js'); vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); diff --git a/src/add-agents.ts b/src/add-agents.ts index 736aab4..95abbaa 100644 --- a/src/add-agents.ts +++ b/src/add-agents.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { searchMultiselect } from './prompts/search-multiselect.ts'; import { agents, getUniversalAgents, getNonUniversalAgents } from './agents.ts'; -import { getLastSelectedAgents, saveSelectedAgents } from './skill-lock.ts'; +import { getLastSelectedAgents, saveSelectedAgents } from './lib/lock/index.ts'; import type { AgentType } from './types.ts'; // Helper to check if a value is a cancel symbol (works with both clack and our custom prompts) diff --git a/src/add-prompt.test.ts b/src/add-prompt.test.ts index b74e500..637ba52 100644 --- a/src/add-prompt.test.ts +++ b/src/add-prompt.test.ts @@ -1,10 +1,10 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { promptForAgents } from './add.js'; -import * as skillLock from './skill-lock.js'; +import * as skillLock from './lib/lock/skill-lock.js'; import * as searchMultiselectModule from './prompts/search-multiselect.js'; // Mock dependencies -vi.mock('./skill-lock.js'); +vi.mock('./lib/lock/skill-lock.js'); vi.mock('./prompts/search-multiselect.js'); vi.mock('./telemetry.js', () => ({ setVersion: vi.fn(), diff --git a/src/add-wellknown.test.ts b/src/add-wellknown.test.ts index 53d08b5..60a345d 100644 --- a/src/add-wellknown.test.ts +++ b/src/add-wellknown.test.ts @@ -53,11 +53,11 @@ vi.mock('./telemetry.ts', () => ({ track: vi.fn(), })); -vi.mock('./skill-lock.ts', () => ({ +vi.mock('./lib/lock/skill-lock.ts', () => ({ addSkillToLock: vi.fn(), })); -vi.mock('./local-lock.ts', () => ({ +vi.mock('./lib/lock/local-lock.ts', () => ({ addSkillToLocalLock: vi.fn(), computeSkillFolderHash: vi.fn().mockResolvedValue('abc123'), })); @@ -79,8 +79,8 @@ import { detectInstalledAgents } from './agents.ts'; import { isSkillInstalled, installWellKnownSkillForAgent } from './skill-installer.ts'; import { track } from './telemetry.ts'; import { CommandError } from './command-result.ts'; -import { addSkillToLock } from './skill-lock.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './local-lock.ts'; +import { addSkillToLock } from './lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; import { isSourcePrivate } from './source-parser.ts'; import { multiselect } from './add-agents.ts'; diff --git a/src/add-wellknown.ts b/src/add-wellknown.ts index 9c21f37..c36819b 100644 --- a/src/add-wellknown.ts +++ b/src/add-wellknown.ts @@ -6,8 +6,8 @@ import { getCanonicalPath, installWellKnownSkillForAgent } from './skill-install import { agents } from './agents.ts'; import { track } from './telemetry.ts'; import { wellKnownProvider, type WellKnownSkill } from './providers/index.ts'; -import { addSkillToLock } from './skill-lock.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './local-lock.ts'; +import { addSkillToLock } from './lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; import type { AgentType } from './types.ts'; import { buildAgentSummaryLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; diff --git a/src/add.ts b/src/add.ts index 38bf3ea..16dc978 100644 --- a/src/add.ts +++ b/src/add.ts @@ -21,8 +21,8 @@ import { fetchSkillFolderHash, isPromptDismissed, dismissPrompt, -} from './skill-lock.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './local-lock.ts'; +} from './lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; import type { Skill, AgentType, TargetAgent, ContextType } from './types.ts'; import { parseAddOptions, type AddOptions } from './add-options.ts'; export { parseAddOptions, type AddOptions } from './add-options.ts'; diff --git a/src/check.test.ts b/src/check.test.ts index f6dcc29..e121084 100644 --- a/src/check.test.ts +++ b/src/check.test.ts @@ -1,17 +1,17 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { findSkillUpdates } from './check.ts'; -import type { SkillLockEntry } from './skill-lock.ts'; +import type { SkillLockEntry } from './lib/lock/index.ts'; // Mock fetchSkillFolderHash from skill-lock.ts -vi.mock('./skill-lock.ts', async (importOriginal) => { - const original = await importOriginal(); +vi.mock('./lib/lock/skill-lock.ts', async (importOriginal) => { + const original = await importOriginal(); return { ...original, fetchSkillFolderHash: vi.fn(), }; }); -import { fetchSkillFolderHash } from './skill-lock.ts'; +import { fetchSkillFolderHash } from './lib/lock/index.ts'; const mockFetch = vi.mocked(fetchSkillFolderHash); function makeEntry(overrides: Partial = {}): SkillLockEntry { diff --git a/src/check.ts b/src/check.ts index e08fbef..3ce97a1 100644 --- a/src/check.ts +++ b/src/check.ts @@ -4,7 +4,7 @@ import { getGitHubToken, readSkillLock, type SkillLockEntry, -} from './skill-lock.ts'; +} from './lib/lock/index.ts'; import { checkContextUpdates, updateContext } from './context-check.ts'; import { track } from './telemetry.ts'; import { RESET, DIM, TEXT } from './utils.ts'; diff --git a/src/context-add.ts b/src/context-add.ts index c3e1d70..8006d4b 100644 --- a/src/context-add.ts +++ b/src/context-add.ts @@ -6,7 +6,7 @@ import { writeDotaiLock, upsertLockEntry, computeContentHash, -} from './dotai-lock.ts'; +} from './lib/lock/index.ts'; import { loadModelOverrides } from './model-aliases.ts'; import { TARGET_AGENTS } from './target-agents.ts'; import { addToGitignore } from './lib/git/index.ts'; diff --git a/src/context-check.ts b/src/context-check.ts index 9f73cc0..887970b 100644 --- a/src/context-check.ts +++ b/src/context-check.ts @@ -10,7 +10,7 @@ import { computeContentHash, upsertLockEntry, getLockEntriesByType, -} from './dotai-lock.ts'; +} from './lib/lock/index.ts'; import { loadModelOverrides } from './model-aliases.ts'; import { TARGET_AGENTS } from './target-agents.ts'; import type { ContextType, LockEntry, TargetAgent } from './types.ts'; diff --git a/src/instruction-check.test.ts b/src/instruction-check.test.ts index c72587f..ffabe04 100644 --- a/src/instruction-check.test.ts +++ b/src/instruction-check.test.ts @@ -9,8 +9,8 @@ import { createEmptyLock, upsertLockEntry, computeContentHash, -} from './dotai-lock.ts'; -import type { DotaiLockFile } from './dotai-lock.ts'; +} from './lib/lock/index.ts'; +import type { DotaiLockFile } from './lib/lock/index.ts'; import type { LockEntry, TargetAgent } from './types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/git/github-trees.ts b/src/lib/git/github-trees.ts index bebb1ef..5a9bc79 100644 --- a/src/lib/git/github-trees.ts +++ b/src/lib/git/github-trees.ts @@ -1,4 +1,4 @@ -import { getGitHubToken } from '../../skill-lock.ts'; +import { getGitHubToken } from '../lock/skill-lock.ts'; export interface GitHubTreeEntry { path: string; diff --git a/src/dotai-lock.test.ts b/src/lib/lock/dotai-lock.test.ts similarity index 99% rename from src/dotai-lock.test.ts rename to src/lib/lock/dotai-lock.test.ts index c831519..2783dfa 100644 --- a/src/dotai-lock.test.ts +++ b/src/lib/lock/dotai-lock.test.ts @@ -18,7 +18,7 @@ import { LockVersionError, } from './dotai-lock.js'; import type { DotaiLockFile } from './dotai-lock.js'; -import type { LockEntry } from './types.js'; +import type { LockEntry } from '../../types.js'; // --------------------------------------------------------------------------- // Test helpers diff --git a/src/dotai-lock.ts b/src/lib/lock/dotai-lock.ts similarity index 99% rename from src/dotai-lock.ts rename to src/lib/lock/dotai-lock.ts index 10bf2ea..43069f4 100644 --- a/src/dotai-lock.ts +++ b/src/lib/lock/dotai-lock.ts @@ -2,7 +2,7 @@ import { readFile, writeFile, rename } from 'fs/promises'; import { join } from 'path'; import { createHash } from 'crypto'; -import type { LockEntry, ContextType, ContextFormat, TargetAgent } from './types.js'; +import type { LockEntry, ContextType, ContextFormat, TargetAgent } from '../../types.js'; import { LockVersionError } from './lock-version-error.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/lock/index.ts b/src/lib/lock/index.ts new file mode 100644 index 0000000..765133f --- /dev/null +++ b/src/lib/lock/index.ts @@ -0,0 +1,46 @@ +export { + type DotaiLockFile, + type ReadLockResult, + getDotaiLockPath, + readDotaiLock, + writeDotaiLock, + findLockEntry, + upsertLockEntry, + removeLockEntry, + getLockEntriesByType, + getLockEntriesBySource, + computeContentHash, + createEmptyLock, + getCurrentVersion, + LockVersionError, +} from './dotai-lock.ts'; + +export { + type SkillLockEntry, + type DismissedPrompts, + type SkillLockFile, + getSkillLockPath, + readSkillLock, + writeSkillLock, + getGitHubToken, + fetchSkillFolderHash, + addSkillToLock, + removeSkillFromLock, + getSkillFromLock, + getAllLockedSkills, + isPromptDismissed, + dismissPrompt, + getLastSelectedAgents, + saveSelectedAgents, +} from './skill-lock.ts'; + +export { + type LocalSkillLockEntry, + type LocalSkillLockFile, + getLocalLockPath, + readLocalLock, + writeLocalLock, + computeSkillFolderHash, + addSkillToLocalLock, + removeSkillFromLocalLock, +} from './local-lock.ts'; diff --git a/src/local-lock.ts b/src/lib/lock/local-lock.ts similarity index 100% rename from src/local-lock.ts rename to src/lib/lock/local-lock.ts diff --git a/src/lock-version-error.ts b/src/lib/lock/lock-version-error.ts similarity index 100% rename from src/lock-version-error.ts rename to src/lib/lock/lock-version-error.ts diff --git a/src/skill-lock.test.ts b/src/lib/lock/skill-lock.test.ts similarity index 100% rename from src/skill-lock.test.ts rename to src/lib/lock/skill-lock.test.ts diff --git a/src/skill-lock.ts b/src/lib/lock/skill-lock.ts similarity index 99% rename from src/skill-lock.ts rename to src/lib/lock/skill-lock.ts index fbff3f1..785baae 100644 --- a/src/skill-lock.ts +++ b/src/lib/lock/skill-lock.ts @@ -4,7 +4,7 @@ import { homedir } from 'os'; import { execSync } from 'child_process'; import { LockVersionError } from './lock-version-error.ts'; -import { fetchRepoTree } from './lib/git/index.ts'; +import { fetchRepoTree } from '../git/index.ts'; const AGENTS_DIR = '.agents'; const LOCK_FILE = '.skill-lock.json'; diff --git a/src/list.ts b/src/list.ts index 9adcc4f..668de57 100644 --- a/src/list.ts +++ b/src/list.ts @@ -1,8 +1,8 @@ import type { AgentType, ContextType, LockEntry, TargetAgent } from './types.ts'; import { agents } from './agents.ts'; import { listInstalledSkills, type InstalledSkill } from './skill-installer.ts'; -import { getAllLockedSkills } from './skill-lock.ts'; -import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './dotai-lock.ts'; +import { getAllLockedSkills } from './lib/lock/index.ts'; +import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './lib/lock/index.ts'; import { RESET, BOLD, DIM, CYAN, YELLOW, shortenPath, formatList, kebabToTitle } from './utils.ts'; import { consumeMultiValues, parseTypeFlag } from './cli-parse.ts'; diff --git a/src/remove.ts b/src/remove.ts index a6af4c2..37c26fa 100644 --- a/src/remove.ts +++ b/src/remove.ts @@ -4,7 +4,7 @@ import { readdir, rm, lstat, unlink, readFile, writeFile } from 'fs/promises'; import { join } from 'path'; import { agents, detectInstalledAgents } from './agents.ts'; import { track } from './telemetry.ts'; -import { removeSkillFromLock, getSkillFromLock } from './skill-lock.ts'; +import { removeSkillFromLock, getSkillFromLock } from './lib/lock/index.ts'; import type { AgentType, ContextType, LockEntry } from './types.ts'; import { getInstallPath, @@ -12,7 +12,7 @@ import { getCanonicalSkillsDir, sanitizeName, } from './skill-installer.ts'; -import { readDotaiLock, removeLockEntry, writeDotaiLock } from './dotai-lock.ts'; +import { readDotaiLock, removeLockEntry, writeDotaiLock } from './lib/lock/index.ts'; import { removeSection } from './append-markers.ts'; import { removeFromGitignore } from './lib/git/index.ts'; import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; diff --git a/src/restore.ts b/src/restore.ts index 02a4845..658cf31 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -1,10 +1,10 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { readLocalLock } from './local-lock.ts'; +import { readLocalLock } from './lib/lock/index.ts'; import { runAdd } from './add.ts'; import { runSync, parseSyncOptions } from './sync.ts'; import { getUniversalAgents } from './agents.ts'; -import { readDotaiLock, getLockEntriesByType } from './dotai-lock.ts'; +import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; import { addPrompts, addAgents } from './context-add.ts'; import { parseSource } from './source-parser.ts'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; diff --git a/src/sync.ts b/src/sync.ts index c468486..b08a5f8 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -11,7 +11,7 @@ import { getNonUniversalAgents, } from './agents.ts'; import { searchMultiselect } from './prompts/search-multiselect.ts'; -import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './local-lock.ts'; +import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './lib/lock/index.ts'; import type { Skill, AgentType } from './types.ts'; import { CommandError } from './command-result.ts'; import { track } from './telemetry.ts'; diff --git a/tests/cross-platform-paths.test.ts b/tests/cross-platform-paths.test.ts index beed58e..43c6051 100644 --- a/tests/cross-platform-paths.test.ts +++ b/tests/cross-platform-paths.test.ts @@ -15,7 +15,7 @@ import { readDotaiLock, createEmptyLock, upsertLockEntry, -} from '../src/dotai-lock.ts'; +} from '../src/lib/lock/index.ts'; import type { TranspiledOutput, LockEntry, TargetAgent } from '../src/types.ts'; import { mkdtempSync, rmSync } from 'fs'; import { tmpdir } from 'os'; diff --git a/tests/e2e-update-flow.test.ts b/tests/e2e-update-flow.test.ts index a159d8c..03665e2 100644 --- a/tests/e2e-update-flow.test.ts +++ b/tests/e2e-update-flow.test.ts @@ -16,7 +16,7 @@ import { } from './e2e-utils.ts'; import { addPrompts, addAgents } from '../src/context-add.ts'; import { checkContextUpdates, updateContext } from '../src/context-check.ts'; -import { computeContentHash } from '../src/dotai-lock.ts'; +import { computeContentHash } from '../src/lib/lock/index.ts'; // --------------------------------------------------------------------------- // E2E Update Flow Tests diff --git a/tests/e2e-utils.ts b/tests/e2e-utils.ts index 78b6730..aa43f65 100644 --- a/tests/e2e-utils.ts +++ b/tests/e2e-utils.ts @@ -17,8 +17,8 @@ import { join } from 'path'; import { tmpdir } from 'os'; import { execSync } from 'child_process'; import type { ContextType, LockEntry, TargetAgent } from '../src/types.ts'; -import type { DotaiLockFile } from '../src/dotai-lock.ts'; -import { readDotaiLock } from '../src/dotai-lock.ts'; +import type { DotaiLockFile } from '../src/lib/lock/index.ts'; +import { readDotaiLock } from '../src/lib/lock/index.ts'; import { targetAgents } from '../src/target-agents.ts'; // --------------------------------------------------------------------------- diff --git a/tests/local-lock.test.ts b/tests/local-lock.test.ts index 4ff3a88..de87165 100644 --- a/tests/local-lock.test.ts +++ b/tests/local-lock.test.ts @@ -9,8 +9,8 @@ import { removeSkillFromLocalLock, computeSkillFolderHash, getLocalLockPath, -} from '../src/local-lock.ts'; -import { LockVersionError } from '../src/lock-version-error.ts'; +} from '../src/lib/lock/index.ts'; +import { LockVersionError } from '../src/lib/lock/index.ts'; describe('local-lock', () => { describe('getLocalLockPath', () => { diff --git a/tests/restore.test.ts b/tests/restore.test.ts index 3c30ead..2f8e423 100644 --- a/tests/restore.test.ts +++ b/tests/restore.test.ts @@ -5,7 +5,7 @@ import { tmpdir } from 'os'; import { existsSync } from 'fs'; import { runCli } from '../src/test-utils.ts'; import { addPrompts, addAgents } from '../src/context-add.ts'; -import { writeDotaiLock, createEmptyLock, readDotaiLock } from '../src/dotai-lock.ts'; +import { writeDotaiLock, createEmptyLock, readDotaiLock } from '../src/lib/lock/index.ts'; import { createTestSourceRepo } from './e2e-utils.ts'; // --------------------------------------------------------------------------- From 8787388e253f2baba6f83f2e5ee500531ecf0d3e Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:01:33 +0200 Subject: [PATCH 03/12] refactor: move parsers to lib/parsers/ --- src/add-wellknown.test.ts | 6 +++--- src/add-wellknown.ts | 2 +- src/add.ts | 2 +- src/agent-transpiler-overrides.test.ts | 2 +- src/agent-transpilers.ts | 4 ++-- src/context-check.ts | 2 +- src/context-discovery.ts | 8 +++++--- src/find.ts | 2 +- src/instruction-transpilers.ts | 4 ++-- .../parsers}/agent-override-parser.test.ts | 0 src/{ => lib/parsers}/agent-parser.test.ts | 0 src/{ => lib/parsers}/agent-parser.ts | 4 ++-- src/lib/parsers/index.ts | 19 +++++++++++++++++++ .../instruction-override-parser.test.ts | 0 .../parsers}/instruction-parser.test.ts | 0 src/{ => lib/parsers}/instruction-parser.ts | 4 ++-- src/{ => lib/parsers}/override-parser.test.ts | 2 +- src/{ => lib/parsers}/override-parser.ts | 4 ++-- .../parsers}/prompt-override-parser.test.ts | 0 src/{ => lib/parsers}/prompt-parser.test.ts | 0 src/{ => lib/parsers}/prompt-parser.ts | 4 ++-- src/{ => lib/parsers}/source-parser.test.ts | 0 src/{ => lib/parsers}/source-parser.ts | 2 +- src/prompt-transpiler-overrides.test.ts | 2 +- src/prompt-transpilers.ts | 4 ++-- src/restore.ts | 2 +- tests/source-parser.test.ts | 2 +- tests/wellknown-provider.test.ts | 2 +- 28 files changed, 52 insertions(+), 31 deletions(-) rename src/{ => lib/parsers}/agent-override-parser.test.ts (100%) rename src/{ => lib/parsers}/agent-parser.test.ts (100%) rename src/{ => lib/parsers}/agent-parser.ts (99%) create mode 100644 src/lib/parsers/index.ts rename src/{ => lib/parsers}/instruction-override-parser.test.ts (100%) rename src/{ => lib/parsers}/instruction-parser.test.ts (100%) rename src/{ => lib/parsers}/instruction-parser.ts (98%) rename src/{ => lib/parsers}/override-parser.test.ts (98%) rename src/{ => lib/parsers}/override-parser.ts (97%) rename src/{ => lib/parsers}/prompt-override-parser.test.ts (100%) rename src/{ => lib/parsers}/prompt-parser.test.ts (100%) rename src/{ => lib/parsers}/prompt-parser.ts (99%) rename src/{ => lib/parsers}/source-parser.test.ts (100%) rename src/{ => lib/parsers}/source-parser.ts (99%) diff --git a/src/add-wellknown.test.ts b/src/add-wellknown.test.ts index 60a345d..c3968dd 100644 --- a/src/add-wellknown.test.ts +++ b/src/add-wellknown.test.ts @@ -62,8 +62,8 @@ vi.mock('./lib/lock/local-lock.ts', () => ({ computeSkillFolderHash: vi.fn().mockResolvedValue('abc123'), })); -vi.mock('./source-parser.ts', async () => { - const actual = await vi.importActual('./source-parser.ts'); +vi.mock('./lib/parsers/source-parser.ts', async () => { + const actual = await vi.importActual('./lib/parsers/source-parser.ts'); return { ...actual, isSourcePrivate: vi.fn().mockResolvedValue(false), @@ -81,7 +81,7 @@ import { track } from './telemetry.ts'; import { CommandError } from './command-result.ts'; import { addSkillToLock } from './lib/lock/index.ts'; import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import { isSourcePrivate } from './source-parser.ts'; +import { isSourcePrivate } from './lib/parsers/index.ts'; import { multiselect } from './add-agents.ts'; // --- Helpers --- diff --git a/src/add-wellknown.ts b/src/add-wellknown.ts index c36819b..efd4819 100644 --- a/src/add-wellknown.ts +++ b/src/add-wellknown.ts @@ -1,6 +1,6 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { isSourcePrivate } from './source-parser.ts'; +import { isSourcePrivate } from './lib/parsers/index.ts'; import { shortenPath, formatList } from './utils.ts'; import { getCanonicalPath, installWellKnownSkillForAgent } from './skill-installer.ts'; import { agents } from './agents.ts'; diff --git a/src/add.ts b/src/add.ts index 16dc978..768b54d 100644 --- a/src/add.ts +++ b/src/add.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { existsSync } from 'fs'; import { sep } from 'path'; -import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from './source-parser.ts'; +import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from './lib/parsers/index.ts'; import { shortenPath, formatList, kebabToTitle } from './utils.ts'; import { multiselect } from './add-agents.ts'; export { promptForAgents } from './add-agents.ts'; diff --git a/src/agent-transpiler-overrides.test.ts b/src/agent-transpiler-overrides.test.ts index 409a3c4..4697652 100644 --- a/src/agent-transpiler-overrides.test.ts +++ b/src/agent-transpiler-overrides.test.ts @@ -4,7 +4,7 @@ import { copilotAgentTranspiler, claudeCodeAgentTranspiler, } from './agent-transpilers.ts'; -import { mergeOverrides } from './override-parser.ts'; +import { mergeOverrides } from './lib/parsers/index.ts'; import type { CanonicalAgent, DiscoveredItem } from './types.ts'; // --------------------------------------------------------------------------- diff --git a/src/agent-transpilers.ts b/src/agent-transpilers.ts index 8310385..621551e 100644 --- a/src/agent-transpilers.ts +++ b/src/agent-transpilers.ts @@ -6,11 +6,11 @@ import type { TargetAgent, TranspiledOutput, } from './types.ts'; -import { parseAgentContent } from './agent-parser.ts'; +import { parseAgentContent } from './lib/parsers/index.ts'; import { getTargetAgentConfig } from './target-agents.ts'; import { resolveModel, type ModelOverrides } from './model-aliases.ts'; import { quoteYaml } from './utils.ts'; -import { mergeOverrides } from './override-parser.ts'; +import { mergeOverrides } from './lib/parsers/index.ts'; // --------------------------------------------------------------------------- // Agent transpilers — canonical AGENT.md → per-agent output diff --git a/src/context-check.ts b/src/context-check.ts index 887970b..97011e9 100644 --- a/src/context-check.ts +++ b/src/context-check.ts @@ -1,7 +1,7 @@ import pc from 'picocolors'; import { resolve } from 'path'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; -import { parseSource } from './source-parser.ts'; +import { parseSource } from './lib/parsers/index.ts'; import { discover, filterByType } from './context-discovery.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { diff --git a/src/context-discovery.ts b/src/context-discovery.ts index faa7322..0bc4513 100644 --- a/src/context-discovery.ts +++ b/src/context-discovery.ts @@ -1,8 +1,10 @@ import { readdir, readFile, stat } from 'fs/promises'; import { join, resolve, sep } from 'path'; -import { parseAgentContent } from './agent-parser.ts'; -import { parseInstructionContent } from './instruction-parser.ts'; -import { parsePromptContent } from './prompt-parser.ts'; +import { + parseAgentContent, + parseInstructionContent, + parsePromptContent, +} from './lib/parsers/index.ts'; import { targetAgents } from './target-agents.ts'; import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from './types.ts'; diff --git a/src/find.ts b/src/find.ts index 51405dd..9468129 100644 --- a/src/find.ts +++ b/src/find.ts @@ -3,7 +3,7 @@ import * as p from '@clack/prompts'; import { runAdd } from './add.ts'; import { parseAddOptions } from './add-options.ts'; import { track } from './telemetry.ts'; -import { isRepoPrivate, parseOwnerRepo } from './source-parser.ts'; +import { isRepoPrivate, parseOwnerRepo } from './lib/parsers/index.ts'; import { fetchRepoTree } from './lib/git/index.ts'; import { discoverRemoteContext, type RemoteContextSummary } from './find-discovery.ts'; import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './utils.ts'; diff --git a/src/instruction-transpilers.ts b/src/instruction-transpilers.ts index 030b56a..b7720e9 100644 --- a/src/instruction-transpilers.ts +++ b/src/instruction-transpilers.ts @@ -5,9 +5,9 @@ import type { TargetAgent, TranspiledOutput, } from './types.ts'; -import { parseInstructionContent } from './instruction-parser.ts'; +import { parseInstructionContent } from './lib/parsers/index.ts'; import { getTargetAgentConfig } from './target-agents.ts'; -import { mergeOverrides } from './override-parser.ts'; +import { mergeOverrides } from './lib/parsers/index.ts'; // --------------------------------------------------------------------------- // Instruction transpilers — canonical INSTRUCTIONS.md → per-agent output diff --git a/src/agent-override-parser.test.ts b/src/lib/parsers/agent-override-parser.test.ts similarity index 100% rename from src/agent-override-parser.test.ts rename to src/lib/parsers/agent-override-parser.test.ts diff --git a/src/agent-parser.test.ts b/src/lib/parsers/agent-parser.test.ts similarity index 100% rename from src/agent-parser.test.ts rename to src/lib/parsers/agent-parser.test.ts diff --git a/src/agent-parser.ts b/src/lib/parsers/agent-parser.ts similarity index 99% rename from src/agent-parser.ts rename to src/lib/parsers/agent-parser.ts index 1c8c0e4..1acb54b 100644 --- a/src/agent-parser.ts +++ b/src/lib/parsers/agent-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalAgent, AgentOverrideFields, TargetAgent } from './types.ts'; +import type { CanonicalAgent, AgentOverrideFields, TargetAgent } from '../../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from './validation.ts'; +} from '../../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/index.ts b/src/lib/parsers/index.ts new file mode 100644 index 0000000..a8c794a --- /dev/null +++ b/src/lib/parsers/index.ts @@ -0,0 +1,19 @@ +export { + getOwnerRepo, + isRepoPrivate, + isSourcePrivate, + parseOwnerRepo, + parseSource, +} from './source-parser.ts'; + +export { parsePromptContent } from './prompt-parser.ts'; +export type { ParsePromptResult } from './prompt-parser.ts'; + +export { parseAgentContent } from './agent-parser.ts'; +export type { ParseAgentResult } from './agent-parser.ts'; + +export { parseInstructionContent } from './instruction-parser.ts'; +export type { ParseInstructionResult } from './instruction-parser.ts'; + +export { extractOverrides, mergeOverrides } from './override-parser.ts'; +export type { ExtractOverridesResult } from './override-parser.ts'; diff --git a/src/instruction-override-parser.test.ts b/src/lib/parsers/instruction-override-parser.test.ts similarity index 100% rename from src/instruction-override-parser.test.ts rename to src/lib/parsers/instruction-override-parser.test.ts diff --git a/src/instruction-parser.test.ts b/src/lib/parsers/instruction-parser.test.ts similarity index 100% rename from src/instruction-parser.test.ts rename to src/lib/parsers/instruction-parser.test.ts diff --git a/src/instruction-parser.ts b/src/lib/parsers/instruction-parser.ts similarity index 98% rename from src/instruction-parser.ts rename to src/lib/parsers/instruction-parser.ts index 6090826..9085c6a 100644 --- a/src/instruction-parser.ts +++ b/src/lib/parsers/instruction-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalInstruction, InstructionOverrideFields, TargetAgent } from './types.ts'; +import type { CanonicalInstruction, InstructionOverrideFields, TargetAgent } from '../../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from './validation.ts'; +} from '../../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/override-parser.test.ts b/src/lib/parsers/override-parser.test.ts similarity index 98% rename from src/override-parser.test.ts rename to src/lib/parsers/override-parser.test.ts index 3f5b2dc..92c63b4 100644 --- a/src/override-parser.test.ts +++ b/src/lib/parsers/override-parser.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { extractOverrides, mergeOverrides } from './override-parser.ts'; -import type { CanonicalPrompt, TargetAgent } from './types.ts'; +import type { CanonicalPrompt, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // extractOverrides diff --git a/src/override-parser.ts b/src/lib/parsers/override-parser.ts similarity index 97% rename from src/override-parser.ts rename to src/lib/parsers/override-parser.ts index b3ea672..cc649cd 100644 --- a/src/override-parser.ts +++ b/src/lib/parsers/override-parser.ts @@ -1,5 +1,5 @@ -import type { TargetAgent } from './types.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; +import type { TargetAgent } from '../../types.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; // --------------------------------------------------------------------------- // Shared override extraction for per-agent frontmatter overrides diff --git a/src/prompt-override-parser.test.ts b/src/lib/parsers/prompt-override-parser.test.ts similarity index 100% rename from src/prompt-override-parser.test.ts rename to src/lib/parsers/prompt-override-parser.test.ts diff --git a/src/prompt-parser.test.ts b/src/lib/parsers/prompt-parser.test.ts similarity index 100% rename from src/prompt-parser.test.ts rename to src/lib/parsers/prompt-parser.test.ts diff --git a/src/prompt-parser.ts b/src/lib/parsers/prompt-parser.ts similarity index 99% rename from src/prompt-parser.ts rename to src/lib/parsers/prompt-parser.ts index 2909b88..38a6d29 100644 --- a/src/prompt-parser.ts +++ b/src/lib/parsers/prompt-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalPrompt, PromptOverrideFields, TargetAgent } from './types.ts'; +import type { CanonicalPrompt, PromptOverrideFields, TargetAgent } from '../../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from './validation.ts'; +} from '../../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/source-parser.test.ts b/src/lib/parsers/source-parser.test.ts similarity index 100% rename from src/source-parser.test.ts rename to src/lib/parsers/source-parser.test.ts diff --git a/src/source-parser.ts b/src/lib/parsers/source-parser.ts similarity index 99% rename from src/source-parser.ts rename to src/lib/parsers/source-parser.ts index ec2d799..2e68787 100644 --- a/src/source-parser.ts +++ b/src/lib/parsers/source-parser.ts @@ -1,5 +1,5 @@ import { isAbsolute, resolve } from 'path'; -import type { ParsedSource } from './types.ts'; +import type { ParsedSource } from '../../types.ts'; /** * Extract owner/repo (or group/subgroup/repo for GitLab) from a parsed source diff --git a/src/prompt-transpiler-overrides.test.ts b/src/prompt-transpiler-overrides.test.ts index 1edc26f..6942ad4 100644 --- a/src/prompt-transpiler-overrides.test.ts +++ b/src/prompt-transpiler-overrides.test.ts @@ -4,7 +4,7 @@ import { copilotPromptTranspiler, claudeCodePromptTranspiler, } from './prompt-transpilers.ts'; -import { mergeOverrides } from './override-parser.ts'; +import { mergeOverrides } from './lib/parsers/index.ts'; import type { CanonicalPrompt, DiscoveredItem } from './types.ts'; // --------------------------------------------------------------------------- diff --git a/src/prompt-transpilers.ts b/src/prompt-transpilers.ts index 8ea7210..41c6a4f 100644 --- a/src/prompt-transpilers.ts +++ b/src/prompt-transpilers.ts @@ -6,11 +6,11 @@ import type { TargetAgent, TranspiledOutput, } from './types.ts'; -import { parsePromptContent } from './prompt-parser.ts'; +import { parsePromptContent } from './lib/parsers/index.ts'; import { getTargetAgentConfig } from './target-agents.ts'; import { resolveModel, type ModelOverrides } from './model-aliases.ts'; import { quoteYaml } from './utils.ts'; -import { mergeOverrides } from './override-parser.ts'; +import { mergeOverrides } from './lib/parsers/index.ts'; // --------------------------------------------------------------------------- // Prompt transpilers — canonical PROMPT.md → per-agent output diff --git a/src/restore.ts b/src/restore.ts index 658cf31..86df1fe 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -6,7 +6,7 @@ import { runSync, parseSyncOptions } from './sync.ts'; import { getUniversalAgents } from './agents.ts'; import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; import { addPrompts, addAgents } from './context-add.ts'; -import { parseSource } from './source-parser.ts'; +import { parseSource } from './lib/parsers/index.ts'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; import type { LockEntry, TargetAgent } from './types.ts'; diff --git a/tests/source-parser.test.ts b/tests/source-parser.test.ts index 1aa6889..7036f97 100644 --- a/tests/source-parser.test.ts +++ b/tests/source-parser.test.ts @@ -8,7 +8,7 @@ import { describe, it, expect } from 'vitest'; import { platform } from 'os'; -import { parseSource, getOwnerRepo } from '../src/source-parser.ts'; +import { parseSource, getOwnerRepo } from '../src/lib/parsers/index.ts'; const isWindows = platform() === 'win32'; diff --git a/tests/wellknown-provider.test.ts b/tests/wellknown-provider.test.ts index b13239a..c754531 100644 --- a/tests/wellknown-provider.test.ts +++ b/tests/wellknown-provider.test.ts @@ -183,7 +183,7 @@ describe('WellKnownProvider', () => { describe('parseSource with well-known URLs', async () => { // Import parseSource after provider is defined - const { parseSource } = await import('../src/source-parser.ts'); + const { parseSource } = await import('../src/lib/parsers/source-parser.ts'); it('should parse arbitrary URL as well-known type', () => { const result = parseSource('https://example.com'); From b6946515dc329b59367e35e723c1442d66a38a47 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:07:11 +0200 Subject: [PATCH 04/12] refactor: move transpilers to lib/transpilers/ --- src/context-installer.ts | 8 +++-- .../agent-transpiler-overrides.test.ts | 4 +-- .../transpilers}/agent-transpilers.test.ts | 4 +-- .../transpilers}/agent-transpilers.ts | 12 +++---- src/lib/transpilers/index.ts | 31 +++++++++++++++++++ .../instruction-transpilers.test.ts | 4 +-- .../transpilers}/instruction-transpilers.ts | 8 ++--- .../prompt-transpiler-overrides.test.ts | 4 +-- .../transpilers}/prompt-transpilers.test.ts | 4 +-- .../transpilers}/prompt-transpilers.ts | 12 +++---- src/{ => lib/transpilers}/transpiler.ts | 2 +- 11 files changed, 63 insertions(+), 30 deletions(-) rename src/{ => lib/transpilers}/agent-transpiler-overrides.test.ts (98%) rename src/{ => lib/transpilers}/agent-transpilers.test.ts (99%) rename src/{ => lib/transpilers}/agent-transpilers.ts (97%) create mode 100644 src/lib/transpilers/index.ts rename src/{ => lib/transpilers}/instruction-transpilers.test.ts (99%) rename src/{ => lib/transpilers}/instruction-transpilers.ts (97%) rename src/{ => lib/transpilers}/prompt-transpiler-overrides.test.ts (98%) rename src/{ => lib/transpilers}/prompt-transpilers.test.ts (99%) rename src/{ => lib/transpilers}/prompt-transpilers.ts (96%) rename src/{ => lib/transpilers}/transpiler.ts (96%) diff --git a/src/context-installer.ts b/src/context-installer.ts index 3a037e9..e1efd20 100644 --- a/src/context-installer.ts +++ b/src/context-installer.ts @@ -9,9 +9,11 @@ import type { Collision, } from './types.ts'; import type { ModelOverrides } from './model-aliases.ts'; -import { transpilePromptForAllAgents } from './prompt-transpilers.ts'; -import { transpileAgentForAllAgents } from './agent-transpilers.ts'; -import { transpileInstructionForAllAgents } from './instruction-transpilers.ts'; +import { + transpilePromptForAllAgents, + transpileAgentForAllAgents, + transpileInstructionForAllAgents, +} from './lib/transpilers/index.ts'; import { checkCollisions, createPlannedWrite, filterBlockingCollisions } from './collisions.ts'; import { upsertSection } from './append-markers.ts'; diff --git a/src/agent-transpiler-overrides.test.ts b/src/lib/transpilers/agent-transpiler-overrides.test.ts similarity index 98% rename from src/agent-transpiler-overrides.test.ts rename to src/lib/transpilers/agent-transpiler-overrides.test.ts index 4697652..c83a5ea 100644 --- a/src/agent-transpiler-overrides.test.ts +++ b/src/lib/transpilers/agent-transpiler-overrides.test.ts @@ -4,8 +4,8 @@ import { copilotAgentTranspiler, claudeCodeAgentTranspiler, } from './agent-transpilers.ts'; -import { mergeOverrides } from './lib/parsers/index.ts'; -import type { CanonicalAgent, DiscoveredItem } from './types.ts'; +import { mergeOverrides } from '../parsers/index.ts'; +import type { CanonicalAgent, DiscoveredItem } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/agent-transpilers.test.ts b/src/lib/transpilers/agent-transpilers.test.ts similarity index 99% rename from src/agent-transpilers.test.ts rename to src/lib/transpilers/agent-transpilers.test.ts index 033362e..5c51287 100644 --- a/src/agent-transpilers.test.ts +++ b/src/lib/transpilers/agent-transpilers.test.ts @@ -8,8 +8,8 @@ import { transpileAgent, transpileAgentForAllAgents, } from './agent-transpilers.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import type { CanonicalAgent, DiscoveredItem, TargetAgent } from './types.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; +import type { CanonicalAgent, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/agent-transpilers.ts b/src/lib/transpilers/agent-transpilers.ts similarity index 97% rename from src/agent-transpilers.ts rename to src/lib/transpilers/agent-transpilers.ts index 621551e..8752ef1 100644 --- a/src/agent-transpilers.ts +++ b/src/lib/transpilers/agent-transpilers.ts @@ -5,12 +5,12 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from './types.ts'; -import { parseAgentContent } from './lib/parsers/index.ts'; -import { getTargetAgentConfig } from './target-agents.ts'; -import { resolveModel, type ModelOverrides } from './model-aliases.ts'; -import { quoteYaml } from './utils.ts'; -import { mergeOverrides } from './lib/parsers/index.ts'; +} from '../../types.ts'; +import { parseAgentContent } from '../parsers/index.ts'; +import { getTargetAgentConfig } from '../../target-agents.ts'; +import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; +import { quoteYaml } from '../../utils.ts'; +import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- // Agent transpilers — canonical AGENT.md → per-agent output diff --git a/src/lib/transpilers/index.ts b/src/lib/transpilers/index.ts new file mode 100644 index 0000000..30c5541 --- /dev/null +++ b/src/lib/transpilers/index.ts @@ -0,0 +1,31 @@ +export type { Transpiler } from './transpiler.ts'; + +export { + copilotPromptTranspiler, + claudeCodePromptTranspiler, + opencodeCommandTranspiler, + nativePromptPassthrough, + promptTranspilers, + transpilePrompt, + transpilePromptForAllAgents, +} from './prompt-transpilers.ts'; + +export { + copilotAgentTranspiler, + claudeCodeAgentTranspiler, + opencodeAgentTranspiler, + nativeAgentPassthrough, + agentTranspilers, + transpileAgent, + transpileAgentForAllAgents, +} from './agent-transpilers.ts'; + +export { + copilotInstructionTranspiler, + claudeCodeInstructionTranspiler, + cursorInstructionTranspiler, + opencodeInstructionTranspiler, + instructionTranspilers, + transpileInstruction, + transpileInstructionForAllAgents, +} from './instruction-transpilers.ts'; diff --git a/src/instruction-transpilers.test.ts b/src/lib/transpilers/instruction-transpilers.test.ts similarity index 99% rename from src/instruction-transpilers.test.ts rename to src/lib/transpilers/instruction-transpilers.test.ts index 6920e7c..81aa015 100644 --- a/src/instruction-transpilers.test.ts +++ b/src/lib/transpilers/instruction-transpilers.test.ts @@ -8,8 +8,8 @@ import { transpileInstruction, transpileInstructionForAllAgents, } from './instruction-transpilers.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import type { CanonicalInstruction, DiscoveredItem, TargetAgent } from './types.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; +import type { CanonicalInstruction, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/instruction-transpilers.ts b/src/lib/transpilers/instruction-transpilers.ts similarity index 97% rename from src/instruction-transpilers.ts rename to src/lib/transpilers/instruction-transpilers.ts index b7720e9..ac2fe6f 100644 --- a/src/instruction-transpilers.ts +++ b/src/lib/transpilers/instruction-transpilers.ts @@ -4,10 +4,10 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from './types.ts'; -import { parseInstructionContent } from './lib/parsers/index.ts'; -import { getTargetAgentConfig } from './target-agents.ts'; -import { mergeOverrides } from './lib/parsers/index.ts'; +} from '../../types.ts'; +import { parseInstructionContent } from '../parsers/index.ts'; +import { getTargetAgentConfig } from '../../target-agents.ts'; +import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- // Instruction transpilers — canonical INSTRUCTIONS.md → per-agent output diff --git a/src/prompt-transpiler-overrides.test.ts b/src/lib/transpilers/prompt-transpiler-overrides.test.ts similarity index 98% rename from src/prompt-transpiler-overrides.test.ts rename to src/lib/transpilers/prompt-transpiler-overrides.test.ts index 6942ad4..068b147 100644 --- a/src/prompt-transpiler-overrides.test.ts +++ b/src/lib/transpilers/prompt-transpiler-overrides.test.ts @@ -4,8 +4,8 @@ import { copilotPromptTranspiler, claudeCodePromptTranspiler, } from './prompt-transpilers.ts'; -import { mergeOverrides } from './lib/parsers/index.ts'; -import type { CanonicalPrompt, DiscoveredItem } from './types.ts'; +import { mergeOverrides } from '../parsers/index.ts'; +import type { CanonicalPrompt, DiscoveredItem } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/prompt-transpilers.test.ts b/src/lib/transpilers/prompt-transpilers.test.ts similarity index 99% rename from src/prompt-transpilers.test.ts rename to src/lib/transpilers/prompt-transpilers.test.ts index b501d6f..8ad33a9 100644 --- a/src/prompt-transpilers.test.ts +++ b/src/lib/transpilers/prompt-transpilers.test.ts @@ -7,8 +7,8 @@ import { transpilePrompt, transpilePromptForAllAgents, } from './prompt-transpilers.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import type { CanonicalPrompt, DiscoveredItem, TargetAgent } from './types.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; +import type { CanonicalPrompt, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/prompt-transpilers.ts b/src/lib/transpilers/prompt-transpilers.ts similarity index 96% rename from src/prompt-transpilers.ts rename to src/lib/transpilers/prompt-transpilers.ts index 41c6a4f..4b4ae28 100644 --- a/src/prompt-transpilers.ts +++ b/src/lib/transpilers/prompt-transpilers.ts @@ -5,12 +5,12 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from './types.ts'; -import { parsePromptContent } from './lib/parsers/index.ts'; -import { getTargetAgentConfig } from './target-agents.ts'; -import { resolveModel, type ModelOverrides } from './model-aliases.ts'; -import { quoteYaml } from './utils.ts'; -import { mergeOverrides } from './lib/parsers/index.ts'; +} from '../../types.ts'; +import { parsePromptContent } from '../parsers/index.ts'; +import { getTargetAgentConfig } from '../../target-agents.ts'; +import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; +import { quoteYaml } from '../../utils.ts'; +import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- // Prompt transpilers — canonical PROMPT.md → per-agent output diff --git a/src/transpiler.ts b/src/lib/transpilers/transpiler.ts similarity index 96% rename from src/transpiler.ts rename to src/lib/transpilers/transpiler.ts index 81fdb8a..3cc0ffc 100644 --- a/src/transpiler.ts +++ b/src/lib/transpilers/transpiler.ts @@ -1,4 +1,4 @@ -import type { DiscoveredItem, TargetAgent, TranspiledOutput } from './types.ts'; +import type { DiscoveredItem, TargetAgent, TranspiledOutput } from '../../types.ts'; /** * A transpiler converts a canonical context item into agent-specific output. From 61d584c8c7cf18a16819126b01e74d035237f80c Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:14:04 +0200 Subject: [PATCH 05/12] refactor: move discovery to lib/discovery/ --- src/add.test.ts | 2 +- src/add.ts | 8 +++++-- src/context-add.ts | 2 +- src/context-check.ts | 2 +- src/find.ts | 2 +- src/{ => lib/discovery}/context-discovery.ts | 6 ++--- .../discovery}/find-discovery.test.ts | 2 +- src/{ => lib/discovery}/find-discovery.ts | 6 ++--- src/lib/discovery/index.ts | 23 +++++++++++++++++++ .../discovery}/instruction-discovery.test.ts | 0 src/{ => lib/discovery}/skill-discovery.ts | 4 ++-- src/skill-installer.ts | 2 +- src/sync.ts | 2 +- tests/full-depth-discovery.test.ts | 2 +- tests/plugin-grouping.test.ts | 2 +- tests/plugin-manifest-discovery.test.ts | 2 +- tests/skill-matching.test.ts | 2 +- 17 files changed, 48 insertions(+), 21 deletions(-) rename src/{ => lib/discovery}/context-discovery.ts (99%) rename src/{ => lib/discovery}/find-discovery.test.ts (99%) rename src/{ => lib/discovery}/find-discovery.ts (96%) create mode 100644 src/lib/discovery/index.ts rename src/{ => lib/discovery}/instruction-discovery.test.ts (100%) rename src/{ => lib/discovery}/skill-discovery.ts (97%) diff --git a/src/add.test.ts b/src/add.test.ts index e736358..45e2726 100644 --- a/src/add.test.ts +++ b/src/add.test.ts @@ -3,7 +3,7 @@ import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; import { runCli } from './test-utils.ts'; -import { shouldInstallInternalSkills } from './skill-discovery.ts'; +import { shouldInstallInternalSkills } from './lib/discovery/index.ts'; import { parseAddOptions } from './add.ts'; describe('add command', () => { diff --git a/src/add.ts b/src/add.ts index 768b54d..78bd17f 100644 --- a/src/add.ts +++ b/src/add.ts @@ -10,8 +10,12 @@ import { cloneRepo, cleanupTempDir, GitCloneError } from './lib/git/index.ts'; import { CommandError } from './command-result.ts'; import { addPrompts, addAgents, addInstructions, resolveTargetAgents } from './context-add.ts'; import { TARGET_AGENTS } from './target-agents.ts'; -import { discoverSkills, getSkillDisplayName, filterSkills } from './skill-discovery.ts'; -import { discover } from './context-discovery.ts'; +import { + discoverSkills, + getSkillDisplayName, + filterSkills, + discover, +} from './lib/discovery/index.ts'; import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './skill-installer.ts'; import { agents } from './agents.ts'; import { track, setVersion, fetchAuditData } from './telemetry.ts'; diff --git a/src/context-add.ts b/src/context-add.ts index 8006d4b..2b0262c 100644 --- a/src/context-add.ts +++ b/src/context-add.ts @@ -1,5 +1,5 @@ import pc from 'picocolors'; -import { discover, filterByType } from './context-discovery.ts'; +import { discover, filterByType } from './lib/discovery/index.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { readDotaiLock, diff --git a/src/context-check.ts b/src/context-check.ts index 97011e9..62f335e 100644 --- a/src/context-check.ts +++ b/src/context-check.ts @@ -2,7 +2,7 @@ import pc from 'picocolors'; import { resolve } from 'path'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; import { parseSource } from './lib/parsers/index.ts'; -import { discover, filterByType } from './context-discovery.ts'; +import { discover, filterByType } from './lib/discovery/index.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { readDotaiLock, diff --git a/src/find.ts b/src/find.ts index 9468129..d321017 100644 --- a/src/find.ts +++ b/src/find.ts @@ -5,7 +5,7 @@ import { parseAddOptions } from './add-options.ts'; import { track } from './telemetry.ts'; import { isRepoPrivate, parseOwnerRepo } from './lib/parsers/index.ts'; import { fetchRepoTree } from './lib/git/index.ts'; -import { discoverRemoteContext, type RemoteContextSummary } from './find-discovery.ts'; +import { discoverRemoteContext, type RemoteContextSummary } from './lib/discovery/index.ts'; import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './utils.ts'; // API endpoint for skills search diff --git a/src/context-discovery.ts b/src/lib/discovery/context-discovery.ts similarity index 99% rename from src/context-discovery.ts rename to src/lib/discovery/context-discovery.ts index 0bc4513..ab012c0 100644 --- a/src/context-discovery.ts +++ b/src/lib/discovery/context-discovery.ts @@ -4,9 +4,9 @@ import { parseAgentContent, parseInstructionContent, parsePromptContent, -} from './lib/parsers/index.ts'; -import { targetAgents } from './target-agents.ts'; -import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from './types.ts'; +} from '../parsers/index.ts'; +import { targetAgents } from '../../target-agents.ts'; +import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Discovery constants diff --git a/src/find-discovery.test.ts b/src/lib/discovery/find-discovery.test.ts similarity index 99% rename from src/find-discovery.test.ts rename to src/lib/discovery/find-discovery.test.ts index 6afb36f..0e4960a 100644 --- a/src/find-discovery.test.ts +++ b/src/lib/discovery/find-discovery.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { discoverRemoteContext } from './find-discovery.ts'; -import type { GitHubTreeEntry } from './lib/git/index.ts'; +import type { GitHubTreeEntry } from '../git/index.ts'; function blob(path: string): GitHubTreeEntry { return { path, type: 'blob', sha: 'abc123' }; diff --git a/src/find-discovery.ts b/src/lib/discovery/find-discovery.ts similarity index 96% rename from src/find-discovery.ts rename to src/lib/discovery/find-discovery.ts index cd9ca07..fb25c78 100644 --- a/src/find-discovery.ts +++ b/src/lib/discovery/find-discovery.ts @@ -1,6 +1,6 @@ -import type { ContextType } from './types.ts'; -import type { GitHubTreeEntry } from './lib/git/index.ts'; -import { targetAgents } from './target-agents.ts'; +import type { ContextType } from '../../types.ts'; +import type { GitHubTreeEntry } from '../git/index.ts'; +import { targetAgents } from '../../target-agents.ts'; export interface RemoteContextItem { name: string; diff --git a/src/lib/discovery/index.ts b/src/lib/discovery/index.ts new file mode 100644 index 0000000..e95eff1 --- /dev/null +++ b/src/lib/discovery/index.ts @@ -0,0 +1,23 @@ +export { + discover, + filterByType, + filterByFormat, + type DiscoverOptions, + type DiscoveryWarning, + type DiscoveryResult, +} from './context-discovery.ts'; + +export { + shouldInstallInternalSkills, + parseSkillMd, + discoverSkills, + getSkillDisplayName, + filterSkills, + type DiscoverSkillsOptions, +} from './skill-discovery.ts'; + +export { + discoverRemoteContext, + type RemoteContextItem, + type RemoteContextSummary, +} from './find-discovery.ts'; diff --git a/src/instruction-discovery.test.ts b/src/lib/discovery/instruction-discovery.test.ts similarity index 100% rename from src/instruction-discovery.test.ts rename to src/lib/discovery/instruction-discovery.test.ts diff --git a/src/skill-discovery.ts b/src/lib/discovery/skill-discovery.ts similarity index 97% rename from src/skill-discovery.ts rename to src/lib/discovery/skill-discovery.ts index 457b72b..4af7d5f 100644 --- a/src/skill-discovery.ts +++ b/src/lib/discovery/skill-discovery.ts @@ -1,8 +1,8 @@ import { readdir, readFile, stat } from 'fs/promises'; import { join, basename, dirname, resolve } from 'path'; import matter from 'gray-matter'; -import type { Skill } from './types.ts'; -import { getPluginSkillPaths, getPluginGroupings } from './plugin-manifest.ts'; +import type { Skill } from '../../types.ts'; +import { getPluginSkillPaths, getPluginGroupings } from '../../plugin-manifest.ts'; const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', '__pycache__']; diff --git a/src/skill-installer.ts b/src/skill-installer.ts index fd487a9..7384a95 100644 --- a/src/skill-installer.ts +++ b/src/skill-installer.ts @@ -17,7 +17,7 @@ import type { Skill, AgentType, RemoteSkill } from './types.ts'; import type { WellKnownSkill } from './providers/wellknown.ts'; import { agents, detectInstalledAgents, isUniversalAgent } from './agents.ts'; import { AGENTS_DIR, SKILLS_SUBDIR } from './constants.ts'; -import { parseSkillMd } from './skill-discovery.ts'; +import { parseSkillMd } from './lib/discovery/index.ts'; export type InstallMode = 'symlink' | 'copy'; diff --git a/src/sync.ts b/src/sync.ts index b08a5f8..2f732e3 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { readdir, stat } from 'fs/promises'; import { join } from 'path'; -import { parseSkillMd } from './skill-discovery.ts'; +import { parseSkillMd } from './lib/discovery/index.ts'; import { installSkillForAgent, getCanonicalPath } from './skill-installer.ts'; import { detectInstalledAgents, diff --git a/tests/full-depth-discovery.test.ts b/tests/full-depth-discovery.test.ts index 19ec034..3c0a762 100644 --- a/tests/full-depth-discovery.test.ts +++ b/tests/full-depth-discovery.test.ts @@ -9,7 +9,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { discoverSkills } from '../src/skill-discovery.ts'; +import { discoverSkills } from '../src/lib/discovery/index.ts'; describe('discoverSkills with fullDepth option', () => { let testDir: string; diff --git a/tests/plugin-grouping.test.ts b/tests/plugin-grouping.test.ts index 6161c4d..10749ff 100644 --- a/tests/plugin-grouping.test.ts +++ b/tests/plugin-grouping.test.ts @@ -1,6 +1,6 @@ import { join, resolve } from 'path'; import { getPluginGroupings } from '../src/plugin-manifest.ts'; -import { discoverSkills } from '../src/skill-discovery.ts'; +import { discoverSkills } from '../src/lib/discovery/index.ts'; import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest'; import { mkdir, writeFile, rm } from 'fs/promises'; import { mkdirSync, writeFileSync, rmSync } from 'fs'; diff --git a/tests/plugin-manifest-discovery.test.ts b/tests/plugin-manifest-discovery.test.ts index 3862760..d753457 100644 --- a/tests/plugin-manifest-discovery.test.ts +++ b/tests/plugin-manifest-discovery.test.ts @@ -5,7 +5,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { discoverSkills } from '../src/skill-discovery.ts'; +import { discoverSkills } from '../src/lib/discovery/index.ts'; describe('discoverSkills with plugin manifests', () => { let testDir: string; diff --git a/tests/skill-matching.test.ts b/tests/skill-matching.test.ts index 52de1db..8071521 100644 --- a/tests/skill-matching.test.ts +++ b/tests/skill-matching.test.ts @@ -9,7 +9,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { filterSkills, parseSkillMd } from '../src/skill-discovery.ts'; +import { filterSkills, parseSkillMd } from '../src/lib/discovery/index.ts'; import type { Skill } from '../src/types.ts'; // Mock skill factory From e644beb93a6f5df457b91185b284f2646c3c9fe7 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:25:57 +0200 Subject: [PATCH 06/12] refactor: move install pipeline to lib/install/ --- src/add-display.ts | 2 +- src/add-install.test.ts | 6 +-- src/add-install.ts | 2 +- src/add-options.test.ts | 2 +- src/add-wellknown.test.ts | 6 +-- src/add-wellknown.ts | 2 +- src/add.ts | 9 +++- src/check.ts | 2 +- src/{ => lib/install}/append-markers.test.ts | 0 src/{ => lib/install}/append-markers.ts | 0 src/{ => lib/install}/collisions.test.ts | 2 +- src/{ => lib/install}/collisions.ts | 2 +- src/{ => lib/install}/context-add.ts | 12 ++--- src/{ => lib/install}/context-check.ts | 14 ++--- src/{ => lib/install}/context-installer.ts | 6 +-- src/lib/install/index.ts | 53 +++++++++++++++++++ .../install}/instruction-check.test.ts | 6 +-- .../install}/instruction-pipeline.test.ts | 2 +- src/{ => lib/install}/skill-installer.ts | 10 ++-- src/list.ts | 2 +- src/remove.ts | 4 +- src/restore.ts | 2 +- src/sync.ts | 2 +- tests/cross-platform-paths.test.ts | 2 +- tests/e2e-canonical-install.test.ts | 2 +- tests/e2e-cli-matrix.test.ts | 4 +- tests/e2e-collision.test.ts | 2 +- tests/e2e-instruction.test.ts | 2 +- tests/e2e-native-passthrough.test.ts | 2 +- tests/e2e-remove.test.ts | 2 +- tests/e2e-update-flow.test.ts | 4 +- tests/gitignore-integration.test.ts | 2 +- tests/installer-symlink-fallback.test.ts | 2 +- tests/installer-symlink.test.ts | 2 +- tests/list-installed.test.ts | 2 +- tests/restore.test.ts | 2 +- tests/sanitize-name.test.ts | 2 +- 37 files changed, 119 insertions(+), 61 deletions(-) rename src/{ => lib/install}/append-markers.test.ts (100%) rename src/{ => lib/install}/append-markers.ts (100%) rename src/{ => lib/install}/collisions.test.ts (99%) rename src/{ => lib/install}/collisions.ts (99%) rename src/{ => lib/install}/context-add.ts (98%) rename src/{ => lib/install}/context-check.ts (96%) rename src/{ => lib/install}/context-installer.ts (99%) create mode 100644 src/lib/install/index.ts rename src/{ => lib/install}/instruction-check.test.ts (98%) rename src/{ => lib/install}/instruction-pipeline.test.ts (99%) rename src/{ => lib/install}/skill-installer.ts (99%) diff --git a/src/add-display.ts b/src/add-display.ts index 0216051..e346fc8 100644 --- a/src/add-display.ts +++ b/src/add-display.ts @@ -2,7 +2,7 @@ import pc from 'picocolors'; import { formatList } from './utils.ts'; import { agents, getUniversalAgents, isUniversalAgent } from './agents.ts'; import type { AgentType } from './types.ts'; -import type { InstallMode } from './skill-installer.ts'; +import type { InstallMode } from './lib/install/index.ts'; import type { AuditResponse, PartnerAudit } from './telemetry.ts'; // ─── Security Advisory ─── diff --git a/src/add-install.test.ts b/src/add-install.test.ts index fd3c5f6..61f8bfe 100644 --- a/src/add-install.test.ts +++ b/src/add-install.test.ts @@ -32,8 +32,8 @@ vi.mock('./add-agents.ts', () => ({ selectAgentsInteractive: vi.fn(), })); -vi.mock('./skill-installer.ts', async () => { - const actual = await vi.importActual('./skill-installer.ts'); +vi.mock('./lib/install/skill-installer.ts', async () => { + const actual = await vi.importActual('./lib/install/skill-installer.ts'); return { ...actual, isSkillInstalled: vi.fn(), @@ -51,7 +51,7 @@ import { } from './add-install.ts'; import { detectInstalledAgents, agents } from './agents.ts'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; -import { isSkillInstalled } from './skill-installer.ts'; +import { isSkillInstalled } from './lib/install/index.ts'; import { CommandError } from './command-result.ts'; // --- Helpers --- diff --git a/src/add-install.ts b/src/add-install.ts index f1d5295..7626e91 100644 --- a/src/add-install.ts +++ b/src/add-install.ts @@ -1,7 +1,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; -import { isSkillInstalled, type InstallMode } from './skill-installer.ts'; +import { isSkillInstalled, type InstallMode } from './lib/install/index.ts'; import { detectInstalledAgents, agents } from './agents.ts'; import type { AgentType } from './types.ts'; import { ensureUniversalAgents, buildResultLines } from './add-display.ts'; diff --git a/src/add-options.test.ts b/src/add-options.test.ts index b9640ba..19b3db8 100644 --- a/src/add-options.test.ts +++ b/src/add-options.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { parseAddOptions } from './add-options.ts'; -import { resolveTargetAgents } from './context-add.ts'; +import { resolveTargetAgents } from './lib/install/index.ts'; // --------------------------------------------------------------------------- // parseAddOptions — basic flags diff --git a/src/add-wellknown.test.ts b/src/add-wellknown.test.ts index c3968dd..134441b 100644 --- a/src/add-wellknown.test.ts +++ b/src/add-wellknown.test.ts @@ -33,8 +33,8 @@ vi.mock('./agents.ts', async () => { }; }); -vi.mock('./skill-installer.ts', async () => { - const actual = await vi.importActual('./skill-installer.ts'); +vi.mock('./lib/install/skill-installer.ts', async () => { + const actual = await vi.importActual('./lib/install/skill-installer.ts'); return { ...actual, isSkillInstalled: vi.fn().mockResolvedValue(false), @@ -76,7 +76,7 @@ import * as p from '@clack/prompts'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { wellKnownProvider } from './providers/index.ts'; import { detectInstalledAgents } from './agents.ts'; -import { isSkillInstalled, installWellKnownSkillForAgent } from './skill-installer.ts'; +import { isSkillInstalled, installWellKnownSkillForAgent } from './lib/install/index.ts'; import { track } from './telemetry.ts'; import { CommandError } from './command-result.ts'; import { addSkillToLock } from './lib/lock/index.ts'; diff --git a/src/add-wellknown.ts b/src/add-wellknown.ts index efd4819..c4803c3 100644 --- a/src/add-wellknown.ts +++ b/src/add-wellknown.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { isSourcePrivate } from './lib/parsers/index.ts'; import { shortenPath, formatList } from './utils.ts'; -import { getCanonicalPath, installWellKnownSkillForAgent } from './skill-installer.ts'; +import { getCanonicalPath, installWellKnownSkillForAgent } from './lib/install/index.ts'; import { agents } from './agents.ts'; import { track } from './telemetry.ts'; import { wellKnownProvider, type WellKnownSkill } from './providers/index.ts'; diff --git a/src/add.ts b/src/add.ts index 78bd17f..14bfc97 100644 --- a/src/add.ts +++ b/src/add.ts @@ -8,7 +8,12 @@ import { multiselect } from './add-agents.ts'; export { promptForAgents } from './add-agents.ts'; import { cloneRepo, cleanupTempDir, GitCloneError } from './lib/git/index.ts'; import { CommandError } from './command-result.ts'; -import { addPrompts, addAgents, addInstructions, resolveTargetAgents } from './context-add.ts'; +import { + addPrompts, + addAgents, + addInstructions, + resolveTargetAgents, +} from './lib/install/index.ts'; import { TARGET_AGENTS } from './target-agents.ts'; import { discoverSkills, @@ -16,7 +21,7 @@ import { filterSkills, discover, } from './lib/discovery/index.ts'; -import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './skill-installer.ts'; +import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './lib/install/index.ts'; import { agents } from './agents.ts'; import { track, setVersion, fetchAuditData } from './telemetry.ts'; import { handleWellKnownSkills } from './add-wellknown.ts'; diff --git a/src/check.ts b/src/check.ts index 3ce97a1..9c5fd6d 100644 --- a/src/check.ts +++ b/src/check.ts @@ -5,7 +5,7 @@ import { readSkillLock, type SkillLockEntry, } from './lib/lock/index.ts'; -import { checkContextUpdates, updateContext } from './context-check.ts'; +import { checkContextUpdates, updateContext } from './lib/install/index.ts'; import { track } from './telemetry.ts'; import { RESET, DIM, TEXT } from './utils.ts'; diff --git a/src/append-markers.test.ts b/src/lib/install/append-markers.test.ts similarity index 100% rename from src/append-markers.test.ts rename to src/lib/install/append-markers.test.ts diff --git a/src/append-markers.ts b/src/lib/install/append-markers.ts similarity index 100% rename from src/append-markers.ts rename to src/lib/install/append-markers.ts diff --git a/src/collisions.test.ts b/src/lib/install/collisions.test.ts similarity index 99% rename from src/collisions.test.ts rename to src/lib/install/collisions.test.ts index 94d73a7..7af5d54 100644 --- a/src/collisions.test.ts +++ b/src/lib/install/collisions.test.ts @@ -16,7 +16,7 @@ import type { ContextType, ContextFormat, TargetAgent, -} from './types.ts'; +} from '../../types.ts'; /** Assert exactly one collision and return it (avoids TS "possibly undefined" on collisions[0]). */ function expectSingleCollision(collisions: Collision[]): Collision { diff --git a/src/collisions.ts b/src/lib/install/collisions.ts similarity index 99% rename from src/collisions.ts rename to src/lib/install/collisions.ts index fa28260..35f829b 100644 --- a/src/collisions.ts +++ b/src/lib/install/collisions.ts @@ -10,7 +10,7 @@ import type { ContextType, ContextFormat, TargetAgent, -} from './types.ts'; +} from '../../types.ts'; // --------------------------------------------------------------------------- // Collision detection — Phase 5: Installer + Collision Safety diff --git a/src/context-add.ts b/src/lib/install/context-add.ts similarity index 98% rename from src/context-add.ts rename to src/lib/install/context-add.ts index 2b0262c..9dc5947 100644 --- a/src/context-add.ts +++ b/src/lib/install/context-add.ts @@ -1,16 +1,16 @@ import pc from 'picocolors'; -import { discover, filterByType } from './lib/discovery/index.ts'; +import { discover, filterByType } from '../discovery/index.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { readDotaiLock, writeDotaiLock, upsertLockEntry, computeContentHash, -} from './lib/lock/index.ts'; -import { loadModelOverrides } from './model-aliases.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import { addToGitignore } from './lib/git/index.ts'; -import type { DiscoveredItem, LockEntry, TargetAgent } from './types.ts'; +} from '../lock/index.ts'; +import { loadModelOverrides } from '../../model-aliases.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; +import { addToGitignore } from '../git/index.ts'; +import type { DiscoveredItem, LockEntry, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Context install — wires discovery → transpile → install pipeline diff --git a/src/context-check.ts b/src/lib/install/context-check.ts similarity index 96% rename from src/context-check.ts rename to src/lib/install/context-check.ts index 62f335e..465984e 100644 --- a/src/context-check.ts +++ b/src/lib/install/context-check.ts @@ -1,8 +1,8 @@ import pc from 'picocolors'; import { resolve } from 'path'; -import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; -import { parseSource } from './lib/parsers/index.ts'; -import { discover, filterByType } from './lib/discovery/index.ts'; +import { cloneRepo, cleanupTempDir } from '../git/index.ts'; +import { parseSource } from '../parsers/index.ts'; +import { discover, filterByType } from '../discovery/index.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { readDotaiLock, @@ -10,10 +10,10 @@ import { computeContentHash, upsertLockEntry, getLockEntriesByType, -} from './lib/lock/index.ts'; -import { loadModelOverrides } from './model-aliases.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import type { ContextType, LockEntry, TargetAgent } from './types.ts'; +} from '../lock/index.ts'; +import { loadModelOverrides } from '../../model-aliases.ts'; +import { TARGET_AGENTS } from '../../target-agents.ts'; +import type { ContextType, LockEntry, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Context check/update — reads .dotai-lock.json and compares content hashes diff --git a/src/context-installer.ts b/src/lib/install/context-installer.ts similarity index 99% rename from src/context-installer.ts rename to src/lib/install/context-installer.ts index e1efd20..e569356 100644 --- a/src/context-installer.ts +++ b/src/lib/install/context-installer.ts @@ -7,13 +7,13 @@ import type { PlannedWrite, LockEntry, Collision, -} from './types.ts'; -import type { ModelOverrides } from './model-aliases.ts'; +} from '../../types.ts'; +import type { ModelOverrides } from '../../model-aliases.ts'; import { transpilePromptForAllAgents, transpileAgentForAllAgents, transpileInstructionForAllAgents, -} from './lib/transpilers/index.ts'; +} from '../transpilers/index.ts'; import { checkCollisions, createPlannedWrite, filterBlockingCollisions } from './collisions.ts'; import { upsertSection } from './append-markers.ts'; diff --git a/src/lib/install/index.ts b/src/lib/install/index.ts new file mode 100644 index 0000000..9b9e8db --- /dev/null +++ b/src/lib/install/index.ts @@ -0,0 +1,53 @@ +export { + type InstallPipelineOptions, + type PipelineWrite, + type InstallPipelineResult, + planContextWrites, + executeInstallPipeline, +} from './context-installer.ts'; + +export { + resolveTargetAgents, + type PromptAddOptions, + type PromptAddResult, + addPrompts, + type AgentAddOptions, + type AgentAddResult, + addAgents, + type InstructionAddOptions, + type InstructionAddResult, + addInstructions, +} from './context-add.ts'; + +export { + type RuleUpdate, + type RuleCheckError, + type ContextCheckResult, + type ContextUpdateResult, + checkContextUpdates, + updateContext, +} from './context-check.ts'; + +export { + type InstallMode, + sanitizeName, + getCanonicalSkillsDir, + installSkillForAgent, + isSkillInstalled, + getInstallPath, + getCanonicalPath, + installRemoteSkillForAgent, + installWellKnownSkillForAgent, + type InstalledSkill, + listInstalledSkills, +} from './skill-installer.ts'; + +export { + type CheckCollisionOptions, + createPlannedWrite, + checkCollisions, + filterBlockingCollisions, + formatCollision, +} from './collisions.ts'; + +export { upsertSection, removeSection, hasSection, extractSection } from './append-markers.ts'; diff --git a/src/instruction-check.test.ts b/src/lib/install/instruction-check.test.ts similarity index 98% rename from src/instruction-check.test.ts rename to src/lib/install/instruction-check.test.ts index ffabe04..415be3c 100644 --- a/src/instruction-check.test.ts +++ b/src/lib/install/instruction-check.test.ts @@ -9,9 +9,9 @@ import { createEmptyLock, upsertLockEntry, computeContentHash, -} from './lib/lock/index.ts'; -import type { DotaiLockFile } from './lib/lock/index.ts'; -import type { LockEntry, TargetAgent } from './types.ts'; +} from '../lock/index.ts'; +import type { DotaiLockFile } from '../lock/index.ts'; +import type { LockEntry, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/instruction-pipeline.test.ts b/src/lib/install/instruction-pipeline.test.ts similarity index 99% rename from src/instruction-pipeline.test.ts rename to src/lib/install/instruction-pipeline.test.ts index 64c4049..f293d8e 100644 --- a/src/instruction-pipeline.test.ts +++ b/src/lib/install/instruction-pipeline.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdtempSync, writeFileSync, existsSync, readFileSync, rmSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import type { DiscoveredItem } from './types.ts'; +import type { DiscoveredItem } from '../../types.ts'; import { planContextWrites, executeInstallPipeline, diff --git a/src/skill-installer.ts b/src/lib/install/skill-installer.ts similarity index 99% rename from src/skill-installer.ts rename to src/lib/install/skill-installer.ts index 7384a95..4dd1241 100644 --- a/src/skill-installer.ts +++ b/src/lib/install/skill-installer.ts @@ -13,11 +13,11 @@ import { } from 'fs/promises'; import { join, basename, normalize, resolve, sep, relative, dirname } from 'path'; import { homedir, platform } from 'os'; -import type { Skill, AgentType, RemoteSkill } from './types.ts'; -import type { WellKnownSkill } from './providers/wellknown.ts'; -import { agents, detectInstalledAgents, isUniversalAgent } from './agents.ts'; -import { AGENTS_DIR, SKILLS_SUBDIR } from './constants.ts'; -import { parseSkillMd } from './lib/discovery/index.ts'; +import type { Skill, AgentType, RemoteSkill } from '../../types.ts'; +import type { WellKnownSkill } from '../../providers/wellknown.ts'; +import { agents, detectInstalledAgents, isUniversalAgent } from '../../agents.ts'; +import { AGENTS_DIR, SKILLS_SUBDIR } from '../../constants.ts'; +import { parseSkillMd } from '../discovery/index.ts'; export type InstallMode = 'symlink' | 'copy'; diff --git a/src/list.ts b/src/list.ts index 668de57..5018ffc 100644 --- a/src/list.ts +++ b/src/list.ts @@ -1,6 +1,6 @@ import type { AgentType, ContextType, LockEntry, TargetAgent } from './types.ts'; import { agents } from './agents.ts'; -import { listInstalledSkills, type InstalledSkill } from './skill-installer.ts'; +import { listInstalledSkills, type InstalledSkill } from './lib/install/index.ts'; import { getAllLockedSkills } from './lib/lock/index.ts'; import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './lib/lock/index.ts'; import { RESET, BOLD, DIM, CYAN, YELLOW, shortenPath, formatList, kebabToTitle } from './utils.ts'; diff --git a/src/remove.ts b/src/remove.ts index 37c26fa..597ad69 100644 --- a/src/remove.ts +++ b/src/remove.ts @@ -11,9 +11,9 @@ import { getCanonicalPath, getCanonicalSkillsDir, sanitizeName, -} from './skill-installer.ts'; +} from './lib/install/index.ts'; import { readDotaiLock, removeLockEntry, writeDotaiLock } from './lib/lock/index.ts'; -import { removeSection } from './append-markers.ts'; +import { removeSection } from './lib/install/index.ts'; import { removeFromGitignore } from './lib/git/index.ts'; import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; import { CommandError } from './command-result.ts'; diff --git a/src/restore.ts b/src/restore.ts index 86df1fe..9935e50 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -5,7 +5,7 @@ import { runAdd } from './add.ts'; import { runSync, parseSyncOptions } from './sync.ts'; import { getUniversalAgents } from './agents.ts'; import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; -import { addPrompts, addAgents } from './context-add.ts'; +import { addPrompts, addAgents } from './lib/install/index.ts'; import { parseSource } from './lib/parsers/index.ts'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; import type { LockEntry, TargetAgent } from './types.ts'; diff --git a/src/sync.ts b/src/sync.ts index 2f732e3..bb19e13 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -3,7 +3,7 @@ import pc from 'picocolors'; import { readdir, stat } from 'fs/promises'; import { join } from 'path'; import { parseSkillMd } from './lib/discovery/index.ts'; -import { installSkillForAgent, getCanonicalPath } from './skill-installer.ts'; +import { installSkillForAgent, getCanonicalPath } from './lib/install/index.ts'; import { detectInstalledAgents, agents, diff --git a/tests/cross-platform-paths.test.ts b/tests/cross-platform-paths.test.ts index 43c6051..64afeea 100644 --- a/tests/cross-platform-paths.test.ts +++ b/tests/cross-platform-paths.test.ts @@ -9,7 +9,7 @@ import { describe, it, expect } from 'vitest'; import { join, resolve, sep } from 'path'; -import { createPlannedWrite } from '../src/collisions.ts'; +import { createPlannedWrite } from '../src/lib/install/index.ts'; import { writeDotaiLock, readDotaiLock, diff --git a/tests/e2e-canonical-install.test.ts b/tests/e2e-canonical-install.test.ts index 327f2be..e9321b8 100644 --- a/tests/e2e-canonical-install.test.ts +++ b/tests/e2e-canonical-install.test.ts @@ -15,7 +15,7 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; // --------------------------------------------------------------------------- // E2E Canonical Install Tests diff --git a/tests/e2e-cli-matrix.test.ts b/tests/e2e-cli-matrix.test.ts index fdd0b99..bcdbac1 100644 --- a/tests/e2e-cli-matrix.test.ts +++ b/tests/e2e-cli-matrix.test.ts @@ -16,9 +16,9 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; import { removeCommand } from '../src/remove.ts'; -import { checkContextUpdates, updateContext } from '../src/context-check.ts'; +import { checkContextUpdates, updateContext } from '../src/lib/install/index.ts'; import { runCli } from '../src/test-utils.ts'; // --------------------------------------------------------------------------- diff --git a/tests/e2e-collision.test.ts b/tests/e2e-collision.test.ts index 494c08c..a4e7776 100644 --- a/tests/e2e-collision.test.ts +++ b/tests/e2e-collision.test.ts @@ -15,7 +15,7 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; // --------------------------------------------------------------------------- // E2E Collision and Force Tests diff --git a/tests/e2e-instruction.test.ts b/tests/e2e-instruction.test.ts index b29e8a4..731d25c 100644 --- a/tests/e2e-instruction.test.ts +++ b/tests/e2e-instruction.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'; import { join } from 'path'; -import { addInstructions } from '../src/context-add.ts'; +import { addInstructions } from '../src/lib/install/index.ts'; import type { TargetAgent } from '../src/types.ts'; import { createTempProjectDir, diff --git a/tests/e2e-native-passthrough.test.ts b/tests/e2e-native-passthrough.test.ts index 66a7cb7..04864fa 100644 --- a/tests/e2e-native-passthrough.test.ts +++ b/tests/e2e-native-passthrough.test.ts @@ -15,7 +15,7 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; // --------------------------------------------------------------------------- // E2E Native Passthrough Tests diff --git a/tests/e2e-remove.test.ts b/tests/e2e-remove.test.ts index 7cf2419..30d45bf 100644 --- a/tests/e2e-remove.test.ts +++ b/tests/e2e-remove.test.ts @@ -16,7 +16,7 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; import { removeCommand } from '../src/remove.ts'; // --------------------------------------------------------------------------- diff --git a/tests/e2e-update-flow.test.ts b/tests/e2e-update-flow.test.ts index 03665e2..bd874ab 100644 --- a/tests/e2e-update-flow.test.ts +++ b/tests/e2e-update-flow.test.ts @@ -14,8 +14,8 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; -import { checkContextUpdates, updateContext } from '../src/context-check.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; +import { checkContextUpdates, updateContext } from '../src/lib/install/index.ts'; import { computeContentHash } from '../src/lib/lock/index.ts'; // --------------------------------------------------------------------------- diff --git a/tests/gitignore-integration.test.ts b/tests/gitignore-integration.test.ts index c85c4da..a4736a2 100644 --- a/tests/gitignore-integration.test.ts +++ b/tests/gitignore-integration.test.ts @@ -3,7 +3,7 @@ import { readFile, writeFile } from 'fs/promises'; import { join } from 'path'; import { existsSync } from 'fs'; import { relative } from 'path'; -import { addPrompts } from '../src/context-add.ts'; +import { addPrompts } from '../src/lib/install/index.ts'; import { runCli } from '../src/test-utils.ts'; import { readManagedPaths } from '../src/lib/git/index.ts'; import { removeCommand } from '../src/remove.ts'; diff --git a/tests/installer-symlink-fallback.test.ts b/tests/installer-symlink-fallback.test.ts index af8b612..3b390f1 100644 --- a/tests/installer-symlink-fallback.test.ts +++ b/tests/installer-symlink-fallback.test.ts @@ -20,7 +20,7 @@ import { installSkillForAgent, installRemoteSkillForAgent, installWellKnownSkillForAgent, -} from '../src/skill-installer.ts'; +} from '../src/lib/install/index.ts'; import { agents } from '../src/agents.ts'; import type { AgentType } from '../src/types.ts'; import type { RemoteSkill } from '../src/types.ts'; diff --git a/tests/installer-symlink.test.ts b/tests/installer-symlink.test.ts index e4d86b0..7be1749 100644 --- a/tests/installer-symlink.test.ts +++ b/tests/installer-symlink.test.ts @@ -16,7 +16,7 @@ import { } from 'node:fs/promises'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; -import { installSkillForAgent } from '../src/skill-installer.ts'; +import { installSkillForAgent } from '../src/lib/install/index.ts'; /** * Check whether the OS allows creating symlinks without elevated privileges. diff --git a/tests/list-installed.test.ts b/tests/list-installed.test.ts index 79e87e8..c3b7dd7 100644 --- a/tests/list-installed.test.ts +++ b/tests/list-installed.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { mkdir, writeFile, rm } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; -import { listInstalledSkills } from '../src/skill-installer.ts'; +import { listInstalledSkills } from '../src/lib/install/index.ts'; import * as agentsModule from '../src/agents.ts'; describe('listInstalledSkills', () => { diff --git a/tests/restore.test.ts b/tests/restore.test.ts index 2f8e423..919880b 100644 --- a/tests/restore.test.ts +++ b/tests/restore.test.ts @@ -4,7 +4,7 @@ import { join } from 'path'; import { tmpdir } from 'os'; import { existsSync } from 'fs'; import { runCli } from '../src/test-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; import { writeDotaiLock, createEmptyLock, readDotaiLock } from '../src/lib/lock/index.ts'; import { createTestSourceRepo } from './e2e-utils.ts'; diff --git a/tests/sanitize-name.test.ts b/tests/sanitize-name.test.ts index c452fdd..79c6240 100644 --- a/tests/sanitize-name.test.ts +++ b/tests/sanitize-name.test.ts @@ -8,7 +8,7 @@ */ import { describe, it, expect } from 'vitest'; -import { sanitizeName } from '../src/skill-installer.ts'; +import { sanitizeName } from '../src/lib/install/index.ts'; describe('sanitizeName', () => { describe('basic transformations', () => { From 8ad10234319e3019e2ce17ac34bcd99735a8a7f6 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:36:00 +0200 Subject: [PATCH 07/12] refactor: move agent config to lib/agents/ --- src/add-agents.test.ts | 2 +- src/add-agents.ts | 2 +- src/add-display.ts | 2 +- src/add-install.test.ts | 6 ++--- src/add-install.ts | 2 +- src/add-wellknown.test.ts | 6 ++--- src/add-wellknown.ts | 2 +- src/add.ts | 4 ++-- src/{ => lib/agents}/agents.ts | 2 +- src/lib/agents/index.ts | 24 +++++++++++++++++++ src/{ => lib/agents}/target-agents.ts | 2 +- src/lib/discovery/context-discovery.ts | 2 +- src/lib/discovery/find-discovery.ts | 2 +- src/lib/install/context-add.ts | 2 +- src/lib/install/context-check.ts | 2 +- src/lib/install/skill-installer.ts | 2 +- src/lib/parsers/override-parser.ts | 2 +- src/lib/transpilers/agent-transpilers.test.ts | 2 +- src/lib/transpilers/agent-transpilers.ts | 2 +- .../instruction-transpilers.test.ts | 2 +- .../transpilers/instruction-transpilers.ts | 2 +- .../transpilers/prompt-transpilers.test.ts | 2 +- src/lib/transpilers/prompt-transpilers.ts | 2 +- src/list.ts | 2 +- src/model-aliases.test.ts | 2 +- src/remove.ts | 2 +- src/restore.ts | 2 +- src/sync.ts | 2 +- tests/e2e-utils.ts | 2 +- tests/installer-symlink-fallback.test.ts | 2 +- tests/list-installed.test.ts | 2 +- tests/remove-canonical.test.ts | 6 ++--- tests/xdg-config-paths.test.ts | 2 +- 33 files changed, 63 insertions(+), 39 deletions(-) rename src/{ => lib/agents}/agents.ts (98%) create mode 100644 src/lib/agents/index.ts rename src/{ => lib/agents}/target-agents.ts (99%) diff --git a/src/add-agents.test.ts b/src/add-agents.test.ts index deca53f..c449b95 100644 --- a/src/add-agents.test.ts +++ b/src/add-agents.test.ts @@ -3,7 +3,7 @@ import { multiselect, promptForAgents, selectAgentsInteractive } from './add-age import * as skillLock from './lib/lock/skill-lock.js'; import * as searchMultiselectModule from './prompts/search-multiselect.js'; import * as clack from '@clack/prompts'; -import * as agentsModule from './agents.js'; +import * as agentsModule from './lib/agents/agents.js'; // Mock dependencies vi.mock('./lib/lock/skill-lock.js'); diff --git a/src/add-agents.ts b/src/add-agents.ts index 95abbaa..2c2c421 100644 --- a/src/add-agents.ts +++ b/src/add-agents.ts @@ -1,7 +1,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { searchMultiselect } from './prompts/search-multiselect.ts'; -import { agents, getUniversalAgents, getNonUniversalAgents } from './agents.ts'; +import { agents, getUniversalAgents, getNonUniversalAgents } from './lib/agents/index.ts'; import { getLastSelectedAgents, saveSelectedAgents } from './lib/lock/index.ts'; import type { AgentType } from './types.ts'; diff --git a/src/add-display.ts b/src/add-display.ts index e346fc8..7db268f 100644 --- a/src/add-display.ts +++ b/src/add-display.ts @@ -1,6 +1,6 @@ import pc from 'picocolors'; import { formatList } from './utils.ts'; -import { agents, getUniversalAgents, isUniversalAgent } from './agents.ts'; +import { agents, getUniversalAgents, isUniversalAgent } from './lib/agents/index.ts'; import type { AgentType } from './types.ts'; import type { InstallMode } from './lib/install/index.ts'; import type { AuditResponse, PartnerAudit } from './telemetry.ts'; diff --git a/src/add-install.test.ts b/src/add-install.test.ts index 61f8bfe..2d95544 100644 --- a/src/add-install.test.ts +++ b/src/add-install.test.ts @@ -18,8 +18,8 @@ vi.mock('@clack/prompts', async () => { }; }); -vi.mock('./agents.ts', async () => { - const actual = await vi.importActual('./agents.ts'); +vi.mock('./lib/agents/agents.ts', async () => { + const actual = await vi.importActual('./lib/agents/agents.ts'); return { ...actual, detectInstalledAgents: vi.fn(), @@ -49,7 +49,7 @@ import { displayInstallResults, type InstallResult, } from './add-install.ts'; -import { detectInstalledAgents, agents } from './agents.ts'; +import { detectInstalledAgents, agents } from './lib/agents/index.ts'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; import { isSkillInstalled } from './lib/install/index.ts'; import { CommandError } from './command-result.ts'; diff --git a/src/add-install.ts b/src/add-install.ts index 7626e91..2444ad0 100644 --- a/src/add-install.ts +++ b/src/add-install.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; import { isSkillInstalled, type InstallMode } from './lib/install/index.ts'; -import { detectInstalledAgents, agents } from './agents.ts'; +import { detectInstalledAgents, agents } from './lib/agents/index.ts'; import type { AgentType } from './types.ts'; import { ensureUniversalAgents, buildResultLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; diff --git a/src/add-wellknown.test.ts b/src/add-wellknown.test.ts index 134441b..8c805bc 100644 --- a/src/add-wellknown.test.ts +++ b/src/add-wellknown.test.ts @@ -25,8 +25,8 @@ vi.mock('./providers/index.ts', () => ({ }, })); -vi.mock('./agents.ts', async () => { - const actual = await vi.importActual('./agents.ts'); +vi.mock('./lib/agents/agents.ts', async () => { + const actual = await vi.importActual('./lib/agents/agents.ts'); return { ...actual, detectInstalledAgents: vi.fn(), @@ -75,7 +75,7 @@ vi.mock('./lib/parsers/source-parser.ts', async () => { import * as p from '@clack/prompts'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { wellKnownProvider } from './providers/index.ts'; -import { detectInstalledAgents } from './agents.ts'; +import { detectInstalledAgents } from './lib/agents/index.ts'; import { isSkillInstalled, installWellKnownSkillForAgent } from './lib/install/index.ts'; import { track } from './telemetry.ts'; import { CommandError } from './command-result.ts'; diff --git a/src/add-wellknown.ts b/src/add-wellknown.ts index c4803c3..977d02a 100644 --- a/src/add-wellknown.ts +++ b/src/add-wellknown.ts @@ -3,7 +3,7 @@ import pc from 'picocolors'; import { isSourcePrivate } from './lib/parsers/index.ts'; import { shortenPath, formatList } from './utils.ts'; import { getCanonicalPath, installWellKnownSkillForAgent } from './lib/install/index.ts'; -import { agents } from './agents.ts'; +import { agents } from './lib/agents/index.ts'; import { track } from './telemetry.ts'; import { wellKnownProvider, type WellKnownSkill } from './providers/index.ts'; import { addSkillToLock } from './lib/lock/index.ts'; diff --git a/src/add.ts b/src/add.ts index 14bfc97..a4542a3 100644 --- a/src/add.ts +++ b/src/add.ts @@ -14,7 +14,7 @@ import { addInstructions, resolveTargetAgents, } from './lib/install/index.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; +import { TARGET_AGENTS } from './lib/agents/index.ts'; import { discoverSkills, getSkillDisplayName, @@ -22,7 +22,7 @@ import { discover, } from './lib/discovery/index.ts'; import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './lib/install/index.ts'; -import { agents } from './agents.ts'; +import { agents } from './lib/agents/index.ts'; import { track, setVersion, fetchAuditData } from './telemetry.ts'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { diff --git a/src/agents.ts b/src/lib/agents/agents.ts similarity index 98% rename from src/agents.ts rename to src/lib/agents/agents.ts index aa9b727..7deaa9a 100644 --- a/src/agents.ts +++ b/src/lib/agents/agents.ts @@ -2,7 +2,7 @@ import { homedir } from 'os'; import { join } from 'path'; import { existsSync } from 'fs'; import { xdgConfig } from 'xdg-basedir'; -import type { AgentConfig, AgentType } from './types.ts'; +import type { AgentConfig, AgentType } from '../../types.ts'; const home = homedir(); // Use xdg-basedir (not env-paths) to match OpenCode behavior on all platforms. diff --git a/src/lib/agents/index.ts b/src/lib/agents/index.ts new file mode 100644 index 0000000..614eed4 --- /dev/null +++ b/src/lib/agents/index.ts @@ -0,0 +1,24 @@ +export { + agents, + detectInstalledAgents, + getUniversalAgents, + getNonUniversalAgents, + isUniversalAgent, +} from './agents.ts'; + +export type { + ContextTypeConfig, + InstructionsConfig, + NativePromptDiscovery, + NativeAgentDiscovery, + TargetAgentConfig, +} from './target-agents.ts'; + +export { + targetAgents, + TARGET_AGENTS, + getTargetAgentConfig, + getOutputDir, + getPromptExtension, + getAgentExtension, +} from './target-agents.ts'; diff --git a/src/target-agents.ts b/src/lib/agents/target-agents.ts similarity index 99% rename from src/target-agents.ts rename to src/lib/agents/target-agents.ts index 8fa9c0a..be622bc 100644 --- a/src/target-agents.ts +++ b/src/lib/agents/target-agents.ts @@ -1,4 +1,4 @@ -import type { TargetAgent, ContextType } from './types.ts'; +import type { TargetAgent, ContextType } from '../../types.ts'; // --------------------------------------------------------------------------- // Target agent registry for dotai transpilation (skills, prompts, agents, instructions) diff --git a/src/lib/discovery/context-discovery.ts b/src/lib/discovery/context-discovery.ts index ab012c0..7c53c83 100644 --- a/src/lib/discovery/context-discovery.ts +++ b/src/lib/discovery/context-discovery.ts @@ -5,7 +5,7 @@ import { parseInstructionContent, parsePromptContent, } from '../parsers/index.ts'; -import { targetAgents } from '../../target-agents.ts'; +import { targetAgents } from '../agents/index.ts'; import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/discovery/find-discovery.ts b/src/lib/discovery/find-discovery.ts index fb25c78..18deb1b 100644 --- a/src/lib/discovery/find-discovery.ts +++ b/src/lib/discovery/find-discovery.ts @@ -1,6 +1,6 @@ import type { ContextType } from '../../types.ts'; import type { GitHubTreeEntry } from '../git/index.ts'; -import { targetAgents } from '../../target-agents.ts'; +import { targetAgents } from '../agents/index.ts'; export interface RemoteContextItem { name: string; diff --git a/src/lib/install/context-add.ts b/src/lib/install/context-add.ts index 9dc5947..3a2599c 100644 --- a/src/lib/install/context-add.ts +++ b/src/lib/install/context-add.ts @@ -8,7 +8,7 @@ import { computeContentHash, } from '../lock/index.ts'; import { loadModelOverrides } from '../../model-aliases.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; import { addToGitignore } from '../git/index.ts'; import type { DiscoveredItem, LockEntry, TargetAgent } from '../../types.ts'; diff --git a/src/lib/install/context-check.ts b/src/lib/install/context-check.ts index 465984e..debf90b 100644 --- a/src/lib/install/context-check.ts +++ b/src/lib/install/context-check.ts @@ -12,7 +12,7 @@ import { getLockEntriesByType, } from '../lock/index.ts'; import { loadModelOverrides } from '../../model-aliases.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; import type { ContextType, LockEntry, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/install/skill-installer.ts b/src/lib/install/skill-installer.ts index 4dd1241..133119e 100644 --- a/src/lib/install/skill-installer.ts +++ b/src/lib/install/skill-installer.ts @@ -15,7 +15,7 @@ import { join, basename, normalize, resolve, sep, relative, dirname } from 'path import { homedir, platform } from 'os'; import type { Skill, AgentType, RemoteSkill } from '../../types.ts'; import type { WellKnownSkill } from '../../providers/wellknown.ts'; -import { agents, detectInstalledAgents, isUniversalAgent } from '../../agents.ts'; +import { agents, detectInstalledAgents, isUniversalAgent } from '../agents/index.ts'; import { AGENTS_DIR, SKILLS_SUBDIR } from '../../constants.ts'; import { parseSkillMd } from '../discovery/index.ts'; diff --git a/src/lib/parsers/override-parser.ts b/src/lib/parsers/override-parser.ts index cc649cd..462791b 100644 --- a/src/lib/parsers/override-parser.ts +++ b/src/lib/parsers/override-parser.ts @@ -1,5 +1,5 @@ import type { TargetAgent } from '../../types.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; // --------------------------------------------------------------------------- // Shared override extraction for per-agent frontmatter overrides diff --git a/src/lib/transpilers/agent-transpilers.test.ts b/src/lib/transpilers/agent-transpilers.test.ts index 5c51287..0ddc7b1 100644 --- a/src/lib/transpilers/agent-transpilers.test.ts +++ b/src/lib/transpilers/agent-transpilers.test.ts @@ -8,7 +8,7 @@ import { transpileAgent, transpileAgentForAllAgents, } from './agent-transpilers.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; import type { CanonicalAgent, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/agent-transpilers.ts b/src/lib/transpilers/agent-transpilers.ts index 8752ef1..efdb35b 100644 --- a/src/lib/transpilers/agent-transpilers.ts +++ b/src/lib/transpilers/agent-transpilers.ts @@ -7,7 +7,7 @@ import type { TranspiledOutput, } from '../../types.ts'; import { parseAgentContent } from '../parsers/index.ts'; -import { getTargetAgentConfig } from '../../target-agents.ts'; +import { getTargetAgentConfig } from '../agents/index.ts'; import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; import { quoteYaml } from '../../utils.ts'; import { mergeOverrides } from '../parsers/index.ts'; diff --git a/src/lib/transpilers/instruction-transpilers.test.ts b/src/lib/transpilers/instruction-transpilers.test.ts index 81aa015..bed1d2a 100644 --- a/src/lib/transpilers/instruction-transpilers.test.ts +++ b/src/lib/transpilers/instruction-transpilers.test.ts @@ -8,7 +8,7 @@ import { transpileInstruction, transpileInstructionForAllAgents, } from './instruction-transpilers.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; import type { CanonicalInstruction, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/instruction-transpilers.ts b/src/lib/transpilers/instruction-transpilers.ts index ac2fe6f..ee3c02b 100644 --- a/src/lib/transpilers/instruction-transpilers.ts +++ b/src/lib/transpilers/instruction-transpilers.ts @@ -6,7 +6,7 @@ import type { TranspiledOutput, } from '../../types.ts'; import { parseInstructionContent } from '../parsers/index.ts'; -import { getTargetAgentConfig } from '../../target-agents.ts'; +import { getTargetAgentConfig } from '../agents/index.ts'; import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/prompt-transpilers.test.ts b/src/lib/transpilers/prompt-transpilers.test.ts index 8ad33a9..d861cad 100644 --- a/src/lib/transpilers/prompt-transpilers.test.ts +++ b/src/lib/transpilers/prompt-transpilers.test.ts @@ -7,7 +7,7 @@ import { transpilePrompt, transpilePromptForAllAgents, } from './prompt-transpilers.ts'; -import { TARGET_AGENTS } from '../../target-agents.ts'; +import { TARGET_AGENTS } from '../agents/index.ts'; import type { CanonicalPrompt, DiscoveredItem, TargetAgent } from '../../types.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/prompt-transpilers.ts b/src/lib/transpilers/prompt-transpilers.ts index 4b4ae28..fc3fe8f 100644 --- a/src/lib/transpilers/prompt-transpilers.ts +++ b/src/lib/transpilers/prompt-transpilers.ts @@ -7,7 +7,7 @@ import type { TranspiledOutput, } from '../../types.ts'; import { parsePromptContent } from '../parsers/index.ts'; -import { getTargetAgentConfig } from '../../target-agents.ts'; +import { getTargetAgentConfig } from '../agents/index.ts'; import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; import { quoteYaml } from '../../utils.ts'; import { mergeOverrides } from '../parsers/index.ts'; diff --git a/src/list.ts b/src/list.ts index 5018ffc..bac769a 100644 --- a/src/list.ts +++ b/src/list.ts @@ -1,5 +1,5 @@ import type { AgentType, ContextType, LockEntry, TargetAgent } from './types.ts'; -import { agents } from './agents.ts'; +import { agents } from './lib/agents/index.ts'; import { listInstalledSkills, type InstalledSkill } from './lib/install/index.ts'; import { getAllLockedSkills } from './lib/lock/index.ts'; import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './lib/lock/index.ts'; diff --git a/src/model-aliases.test.ts b/src/model-aliases.test.ts index f2e4d77..e1c26fc 100644 --- a/src/model-aliases.test.ts +++ b/src/model-aliases.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { resolveModel, getKnownModels, loadModelOverrides } from './model-aliases.ts'; import type { TargetAgent } from './types.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; +import { TARGET_AGENTS } from './lib/agents/index.ts'; import { mkdtemp, writeFile, rm } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; diff --git a/src/remove.ts b/src/remove.ts index 597ad69..2aac44b 100644 --- a/src/remove.ts +++ b/src/remove.ts @@ -2,7 +2,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { readdir, rm, lstat, unlink, readFile, writeFile } from 'fs/promises'; import { join } from 'path'; -import { agents, detectInstalledAgents } from './agents.ts'; +import { agents, detectInstalledAgents } from './lib/agents/index.ts'; import { track } from './telemetry.ts'; import { removeSkillFromLock, getSkillFromLock } from './lib/lock/index.ts'; import type { AgentType, ContextType, LockEntry } from './types.ts'; diff --git a/src/restore.ts b/src/restore.ts index 9935e50..2ad3df5 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -3,7 +3,7 @@ import pc from 'picocolors'; import { readLocalLock } from './lib/lock/index.ts'; import { runAdd } from './add.ts'; import { runSync, parseSyncOptions } from './sync.ts'; -import { getUniversalAgents } from './agents.ts'; +import { getUniversalAgents } from './lib/agents/index.ts'; import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; import { addPrompts, addAgents } from './lib/install/index.ts'; import { parseSource } from './lib/parsers/index.ts'; diff --git a/src/sync.ts b/src/sync.ts index bb19e13..8e359b2 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -9,7 +9,7 @@ import { agents, getUniversalAgents, getNonUniversalAgents, -} from './agents.ts'; +} from './lib/agents/index.ts'; import { searchMultiselect } from './prompts/search-multiselect.ts'; import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './lib/lock/index.ts'; import type { Skill, AgentType } from './types.ts'; diff --git a/tests/e2e-utils.ts b/tests/e2e-utils.ts index aa43f65..02d52af 100644 --- a/tests/e2e-utils.ts +++ b/tests/e2e-utils.ts @@ -19,7 +19,7 @@ import { execSync } from 'child_process'; import type { ContextType, LockEntry, TargetAgent } from '../src/types.ts'; import type { DotaiLockFile } from '../src/lib/lock/index.ts'; import { readDotaiLock } from '../src/lib/lock/index.ts'; -import { targetAgents } from '../src/target-agents.ts'; +import { targetAgents } from '../src/lib/agents/index.ts'; // --------------------------------------------------------------------------- // Temp project directory diff --git a/tests/installer-symlink-fallback.test.ts b/tests/installer-symlink-fallback.test.ts index 3b390f1..48d194e 100644 --- a/tests/installer-symlink-fallback.test.ts +++ b/tests/installer-symlink-fallback.test.ts @@ -21,7 +21,7 @@ import { installRemoteSkillForAgent, installWellKnownSkillForAgent, } from '../src/lib/install/index.ts'; -import { agents } from '../src/agents.ts'; +import { agents } from '../src/lib/agents/index.ts'; import type { AgentType } from '../src/types.ts'; import type { RemoteSkill } from '../src/types.ts'; import type { WellKnownSkill } from '../src/providers/wellknown.ts'; diff --git a/tests/list-installed.test.ts b/tests/list-installed.test.ts index c3b7dd7..34b13c3 100644 --- a/tests/list-installed.test.ts +++ b/tests/list-installed.test.ts @@ -3,7 +3,7 @@ import { mkdir, writeFile, rm } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; import { listInstalledSkills } from '../src/lib/install/index.ts'; -import * as agentsModule from '../src/agents.ts'; +import * as agentsModule from '../src/lib/agents/agents.ts'; describe('listInstalledSkills', () => { let testDir: string; diff --git a/tests/remove-canonical.test.ts b/tests/remove-canonical.test.ts index 3329987..7bfc173 100644 --- a/tests/remove-canonical.test.ts +++ b/tests/remove-canonical.test.ts @@ -3,11 +3,11 @@ import { mkdir, rm, writeFile, lstat, symlink } from 'node:fs/promises'; import { join, resolve } from 'node:path'; import { tmpdir } from 'node:os'; import { removeCommand } from '../src/remove.ts'; -import * as agentsModule from '../src/agents.ts'; +import * as agentsModule from '../src/lib/agents/agents.ts'; // Mock detectInstalledAgents -vi.mock('../src/agents.ts', async () => { - const actual = await vi.importActual('../src/agents.ts'); +vi.mock('../src/lib/agents/agents.ts', async () => { + const actual = await vi.importActual('../src/lib/agents/agents.ts'); return { ...actual, detectInstalledAgents: vi.fn(), diff --git a/tests/xdg-config-paths.test.ts b/tests/xdg-config-paths.test.ts index 85da3bd..aff54f7 100644 --- a/tests/xdg-config-paths.test.ts +++ b/tests/xdg-config-paths.test.ts @@ -16,7 +16,7 @@ import { describe, it, expect } from 'vitest'; import { homedir } from 'os'; import { join } from 'path'; -import { agents } from '../src/agents.ts'; +import { agents } from '../src/lib/agents/index.ts'; describe('XDG config paths', () => { const home = homedir(); From 5197bccd4e90a54b5eaf3e159c050d4686a5cfa7 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:47:44 +0200 Subject: [PATCH 08/12] refactor: move shared modules to lib/ --- src/add-agents.test.ts | 4 ++-- src/add-agents.ts | 4 ++-- src/add-display.test.ts | 4 ++-- src/add-display.ts | 6 +++--- src/add-install.test.ts | 4 ++-- src/add-install.ts | 6 +++--- src/add-options.ts | 2 +- src/add-prompt.test.ts | 6 +++--- src/add-wellknown.test.ts | 14 +++++++------- src/add-wellknown.ts | 10 +++++----- src/add.test.ts | 2 +- src/add.ts | 8 ++++---- src/check.ts | 4 ++-- src/cli-parse.ts | 2 +- src/cli.test.ts | 2 +- src/cli.ts | 4 ++-- src/find.ts | 4 ++-- src/init.test.ts | 2 +- src/init.ts | 4 ++-- src/instruction-commands.test.ts | 2 +- src/lib/agents/agents.ts | 2 +- src/lib/agents/target-agents.ts | 2 +- src/{ => lib}/command-result.test.ts | 0 src/{ => lib}/command-result.ts | 0 src/{ => lib}/constants.ts | 0 src/lib/discovery/context-discovery.ts | 2 +- src/lib/discovery/find-discovery.ts | 2 +- src/lib/discovery/skill-discovery.ts | 4 ++-- src/lib/install/collisions.test.ts | 2 +- src/lib/install/collisions.ts | 2 +- src/lib/install/context-add.ts | 4 ++-- src/lib/install/context-check.ts | 4 ++-- src/lib/install/context-installer.ts | 4 ++-- src/lib/install/instruction-check.test.ts | 2 +- src/lib/install/instruction-pipeline.test.ts | 2 +- src/lib/install/skill-installer.ts | 6 +++--- src/lib/lock/dotai-lock.test.ts | 2 +- src/lib/lock/dotai-lock.ts | 2 +- src/{ => lib}/model-aliases.test.ts | 2 +- src/{ => lib}/model-aliases.ts | 0 src/lib/parsers/agent-parser.ts | 4 ++-- src/lib/parsers/instruction-parser.ts | 4 ++-- src/lib/parsers/override-parser.test.ts | 2 +- src/lib/parsers/override-parser.ts | 2 +- src/lib/parsers/prompt-parser.ts | 4 ++-- src/lib/parsers/source-parser.ts | 2 +- src/{ => lib}/plugin-manifest.ts | 0 src/{ => lib}/prompts/search-multiselect.ts | 0 src/{ => lib}/providers/index.ts | 0 src/{ => lib}/providers/types.ts | 0 src/{ => lib}/providers/wellknown.ts | 0 src/{ => lib}/telemetry.test.ts | 0 src/{ => lib}/telemetry.ts | 0 src/{ => lib}/test-utils.ts | 2 +- .../transpilers/agent-transpiler-overrides.test.ts | 2 +- src/lib/transpilers/agent-transpilers.test.ts | 2 +- src/lib/transpilers/agent-transpilers.ts | 6 +++--- .../transpilers/instruction-transpilers.test.ts | 2 +- src/lib/transpilers/instruction-transpilers.ts | 2 +- .../prompt-transpiler-overrides.test.ts | 2 +- src/lib/transpilers/prompt-transpilers.test.ts | 2 +- src/lib/transpilers/prompt-transpilers.ts | 6 +++--- src/lib/transpilers/transpiler.ts | 2 +- src/{ => lib}/types.ts | 0 src/{ => lib}/utils.ts | 0 src/{ => lib}/validation.ts | 0 src/list.test.ts | 4 ++-- src/list.ts | 13 +++++++++++-- src/remove.test.ts | 4 ++-- src/remove.ts | 6 +++--- src/restore.ts | 2 +- src/sync.test.ts | 2 +- src/sync.ts | 10 +++++----- tests/cli-subprocess.test.ts | 2 +- tests/cross-platform-paths.test.ts | 2 +- tests/e2e-cli-matrix.test.ts | 2 +- tests/e2e-instruction.test.ts | 2 +- tests/e2e-utils.ts | 2 +- tests/gitignore-integration.test.ts | 2 +- tests/installer-symlink-fallback.test.ts | 6 +++--- tests/plugin-grouping.test.ts | 2 +- tests/restore.test.ts | 2 +- tests/skill-matching.test.ts | 2 +- tests/sync.test.ts | 2 +- tests/wellknown-provider.test.ts | 2 +- 85 files changed, 131 insertions(+), 122 deletions(-) rename src/{ => lib}/command-result.test.ts (100%) rename src/{ => lib}/command-result.ts (100%) rename src/{ => lib}/constants.ts (100%) rename src/{ => lib}/model-aliases.test.ts (99%) rename src/{ => lib}/model-aliases.ts (100%) rename src/{ => lib}/plugin-manifest.ts (100%) rename src/{ => lib}/prompts/search-multiselect.ts (100%) rename src/{ => lib}/providers/index.ts (100%) rename src/{ => lib}/providers/types.ts (100%) rename src/{ => lib}/providers/wellknown.ts (100%) rename src/{ => lib}/telemetry.test.ts (100%) rename src/{ => lib}/telemetry.ts (100%) rename src/{ => lib}/test-utils.ts (97%) rename src/{ => lib}/types.ts (100%) rename src/{ => lib}/utils.ts (100%) rename src/{ => lib}/validation.ts (100%) diff --git a/src/add-agents.test.ts b/src/add-agents.test.ts index c449b95..4e4dc53 100644 --- a/src/add-agents.test.ts +++ b/src/add-agents.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { multiselect, promptForAgents, selectAgentsInteractive } from './add-agents.js'; import * as skillLock from './lib/lock/skill-lock.js'; -import * as searchMultiselectModule from './prompts/search-multiselect.js'; +import * as searchMultiselectModule from './lib/prompts/search-multiselect.js'; import * as clack from '@clack/prompts'; import * as agentsModule from './lib/agents/agents.js'; // Mock dependencies vi.mock('./lib/lock/skill-lock.js'); -vi.mock('./prompts/search-multiselect.js'); +vi.mock('./lib/prompts/search-multiselect.js'); vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); return { diff --git a/src/add-agents.ts b/src/add-agents.ts index 2c2c421..4b9fe22 100644 --- a/src/add-agents.ts +++ b/src/add-agents.ts @@ -1,9 +1,9 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { searchMultiselect } from './prompts/search-multiselect.ts'; +import { searchMultiselect } from './lib/prompts/search-multiselect.ts'; import { agents, getUniversalAgents, getNonUniversalAgents } from './lib/agents/index.ts'; import { getLastSelectedAgents, saveSelectedAgents } from './lib/lock/index.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; // Helper to check if a value is a cancel symbol (works with both clack and our custom prompts) const isCancelled = (value: unknown): value is symbol => typeof value === 'symbol'; diff --git a/src/add-display.test.ts b/src/add-display.test.ts index 4e9e1f0..274a52b 100644 --- a/src/add-display.test.ts +++ b/src/add-display.test.ts @@ -9,8 +9,8 @@ import { ensureUniversalAgents, buildResultLines, } from './add-display.ts'; -import type { AgentType } from './types.ts'; -import type { AuditResponse, PartnerAudit } from './telemetry.ts'; +import type { AgentType } from './lib/types.ts'; +import type { AuditResponse, PartnerAudit } from './lib/telemetry.ts'; // Helper to strip ANSI escape codes for easier assertion const stripAnsi = (s: string) => s.replace(/\x1b\[[0-9;]*m/g, ''); diff --git a/src/add-display.ts b/src/add-display.ts index 7db268f..240baa8 100644 --- a/src/add-display.ts +++ b/src/add-display.ts @@ -1,9 +1,9 @@ import pc from 'picocolors'; -import { formatList } from './utils.ts'; +import { formatList } from './lib/utils.ts'; import { agents, getUniversalAgents, isUniversalAgent } from './lib/agents/index.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; import type { InstallMode } from './lib/install/index.ts'; -import type { AuditResponse, PartnerAudit } from './telemetry.ts'; +import type { AuditResponse, PartnerAudit } from './lib/telemetry.ts'; // ─── Security Advisory ─── diff --git a/src/add-install.test.ts b/src/add-install.test.ts index 2d95544..e175853 100644 --- a/src/add-install.test.ts +++ b/src/add-install.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import type { AddOptions } from './add-options.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; // --- Mocks --- @@ -52,7 +52,7 @@ import { import { detectInstalledAgents, agents } from './lib/agents/index.ts'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; import { isSkillInstalled } from './lib/install/index.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; // --- Helpers --- diff --git a/src/add-install.ts b/src/add-install.ts index 2444ad0..3fe9f5f 100644 --- a/src/add-install.ts +++ b/src/add-install.ts @@ -3,11 +3,11 @@ import pc from 'picocolors'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; import { isSkillInstalled, type InstallMode } from './lib/install/index.ts'; import { detectInstalledAgents, agents } from './lib/agents/index.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; import { ensureUniversalAgents, buildResultLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; -import { shortenPath, formatList, kebabToTitle } from './utils.ts'; -import { CommandError } from './command-result.ts'; +import { shortenPath, formatList, kebabToTitle } from './lib/utils.ts'; +import { CommandError } from './lib/command-result.ts'; export interface InstallResult { skill: string; diff --git a/src/add-options.ts b/src/add-options.ts index 073f486..5b054a4 100644 --- a/src/add-options.ts +++ b/src/add-options.ts @@ -1,4 +1,4 @@ -import type { ContextType } from './types.ts'; +import type { ContextType } from './lib/types.ts'; import { consumeMultiValues } from './cli-parse.ts'; export interface AddOptions { diff --git a/src/add-prompt.test.ts b/src/add-prompt.test.ts index 637ba52..c0a8b31 100644 --- a/src/add-prompt.test.ts +++ b/src/add-prompt.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { promptForAgents } from './add.js'; import * as skillLock from './lib/lock/skill-lock.js'; -import * as searchMultiselectModule from './prompts/search-multiselect.js'; +import * as searchMultiselectModule from './lib/prompts/search-multiselect.js'; // Mock dependencies vi.mock('./lib/lock/skill-lock.js'); -vi.mock('./prompts/search-multiselect.js'); -vi.mock('./telemetry.js', () => ({ +vi.mock('./lib/prompts/search-multiselect.js'); +vi.mock('./lib/telemetry.js', () => ({ setVersion: vi.fn(), track: vi.fn(), })); diff --git a/src/add-wellknown.test.ts b/src/add-wellknown.test.ts index 8c805bc..a7afde7 100644 --- a/src/add-wellknown.test.ts +++ b/src/add-wellknown.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import type { WellKnownSkill } from './providers/index.ts'; +import type { WellKnownSkill } from './lib/providers/index.ts'; import type { AddOptions } from './add-options.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; // --- Mocks --- @@ -18,7 +18,7 @@ vi.mock('@clack/prompts', async () => { }; }); -vi.mock('./providers/index.ts', () => ({ +vi.mock('./lib/providers/index.ts', () => ({ wellKnownProvider: { fetchAllSkills: vi.fn(), getSourceIdentifier: vi.fn().mockReturnValue('wellknown/example.com'), @@ -49,7 +49,7 @@ vi.mock('./add-agents.ts', () => ({ selectAgentsInteractive: vi.fn(), })); -vi.mock('./telemetry.ts', () => ({ +vi.mock('./lib/telemetry.ts', () => ({ track: vi.fn(), })); @@ -74,11 +74,11 @@ vi.mock('./lib/parsers/source-parser.ts', async () => { import * as p from '@clack/prompts'; import { handleWellKnownSkills } from './add-wellknown.ts'; -import { wellKnownProvider } from './providers/index.ts'; +import { wellKnownProvider } from './lib/providers/index.ts'; import { detectInstalledAgents } from './lib/agents/index.ts'; import { isSkillInstalled, installWellKnownSkillForAgent } from './lib/install/index.ts'; -import { track } from './telemetry.ts'; -import { CommandError } from './command-result.ts'; +import { track } from './lib/telemetry.ts'; +import { CommandError } from './lib/command-result.ts'; import { addSkillToLock } from './lib/lock/index.ts'; import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; import { isSourcePrivate } from './lib/parsers/index.ts'; diff --git a/src/add-wellknown.ts b/src/add-wellknown.ts index 977d02a..4d21cbb 100644 --- a/src/add-wellknown.ts +++ b/src/add-wellknown.ts @@ -1,18 +1,18 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { isSourcePrivate } from './lib/parsers/index.ts'; -import { shortenPath, formatList } from './utils.ts'; +import { shortenPath, formatList } from './lib/utils.ts'; import { getCanonicalPath, installWellKnownSkillForAgent } from './lib/install/index.ts'; import { agents } from './lib/agents/index.ts'; -import { track } from './telemetry.ts'; -import { wellKnownProvider, type WellKnownSkill } from './providers/index.ts'; +import { track } from './lib/telemetry.ts'; +import { wellKnownProvider, type WellKnownSkill } from './lib/providers/index.ts'; import { addSkillToLock } from './lib/lock/index.ts'; import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import type { AgentType } from './types.ts'; +import type { AgentType } from './lib/types.ts'; import { buildAgentSummaryLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; import { multiselect } from './add-agents.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; import { resolveInstallTargets, checkOverwrites, diff --git a/src/add.test.ts b/src/add.test.ts index 45e2726..695c965 100644 --- a/src/add.test.ts +++ b/src/add.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli } from './test-utils.ts'; +import { runCli } from './lib/test-utils.ts'; import { shouldInstallInternalSkills } from './lib/discovery/index.ts'; import { parseAddOptions } from './add.ts'; diff --git a/src/add.ts b/src/add.ts index a4542a3..ccf62a4 100644 --- a/src/add.ts +++ b/src/add.ts @@ -3,11 +3,11 @@ import pc from 'picocolors'; import { existsSync } from 'fs'; import { sep } from 'path'; import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from './lib/parsers/index.ts'; -import { shortenPath, formatList, kebabToTitle } from './utils.ts'; +import { shortenPath, formatList, kebabToTitle } from './lib/utils.ts'; import { multiselect } from './add-agents.ts'; export { promptForAgents } from './add-agents.ts'; import { cloneRepo, cleanupTempDir, GitCloneError } from './lib/git/index.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; import { addPrompts, addAgents, @@ -23,7 +23,7 @@ import { } from './lib/discovery/index.ts'; import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './lib/install/index.ts'; import { agents } from './lib/agents/index.ts'; -import { track, setVersion, fetchAuditData } from './telemetry.ts'; +import { track, setVersion, fetchAuditData } from './lib/telemetry.ts'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { addSkillToLock, @@ -32,7 +32,7 @@ import { dismissPrompt, } from './lib/lock/index.ts'; import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import type { Skill, AgentType, TargetAgent, ContextType } from './types.ts'; +import type { Skill, AgentType, TargetAgent, ContextType } from './lib/types.ts'; import { parseAddOptions, type AddOptions } from './add-options.ts'; export { parseAddOptions, type AddOptions } from './add-options.ts'; import packageJson from '../package.json' with { type: 'json' }; diff --git a/src/check.ts b/src/check.ts index 9c5fd6d..71752a7 100644 --- a/src/check.ts +++ b/src/check.ts @@ -6,8 +6,8 @@ import { type SkillLockEntry, } from './lib/lock/index.ts'; import { checkContextUpdates, updateContext } from './lib/install/index.ts'; -import { track } from './telemetry.ts'; -import { RESET, DIM, TEXT } from './utils.ts'; +import { track } from './lib/telemetry.ts'; +import { RESET, DIM, TEXT } from './lib/utils.ts'; // ============================================ // Shared skill update detection diff --git a/src/cli-parse.ts b/src/cli-parse.ts index 8f330ef..ebae37f 100644 --- a/src/cli-parse.ts +++ b/src/cli-parse.ts @@ -1,4 +1,4 @@ -import type { ContextType } from './types.ts'; +import type { ContextType } from './lib/types.ts'; /** Valid context types accepted by --type flags. */ export const VALID_CONTEXT_TYPES: readonly ContextType[] = [ diff --git a/src/cli.test.ts b/src/cli.test.ts index 1f12391..658b07a 100644 --- a/src/cli.test.ts +++ b/src/cli.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; import { readFileSync } from 'fs'; import { join } from 'path'; -import { runCli, runCliOutput, stripLogo, hasLogo } from './test-utils.ts'; +import { runCli, runCliOutput, stripLogo, hasLogo } from './lib/test-utils.ts'; describe('dotai CLI', () => { describe('--help', () => { diff --git a/src/cli.ts b/src/cli.ts index 43c34c8..c62932a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -5,14 +5,14 @@ import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import { runAdd, parseAddOptions, initTelemetry } from './add.ts'; import { runCheck, runUpdate } from './check.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; import { runFind } from './find.ts'; import { runInit } from './init.ts'; import { runInstallFromLock } from './restore.ts'; import { runList } from './list.ts'; import { removeCommand, parseRemoveOptions } from './remove.ts'; import { runSync, parseSyncOptions } from './sync.ts'; -import { RESET, BOLD, DIM, TEXT, YELLOW } from './utils.ts'; +import { RESET, BOLD, DIM, TEXT, YELLOW } from './lib/utils.ts'; const __dirname = dirname(fileURLToPath(import.meta.url)); diff --git a/src/find.ts b/src/find.ts index d321017..ad0c08f 100644 --- a/src/find.ts +++ b/src/find.ts @@ -2,11 +2,11 @@ import * as readline from 'readline'; import * as p from '@clack/prompts'; import { runAdd } from './add.ts'; import { parseAddOptions } from './add-options.ts'; -import { track } from './telemetry.ts'; +import { track } from './lib/telemetry.ts'; import { isRepoPrivate, parseOwnerRepo } from './lib/parsers/index.ts'; import { fetchRepoTree } from './lib/git/index.ts'; import { discoverRemoteContext, type RemoteContextSummary } from './lib/discovery/index.ts'; -import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './utils.ts'; +import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './lib/utils.ts'; // API endpoint for skills search const SEARCH_API_BASE = process.env.SKILLS_API_URL || 'https://skills.sh'; diff --git a/src/init.test.ts b/src/init.test.ts index 04e0623..39c6fde 100644 --- a/src/init.test.ts +++ b/src/init.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, rmSync, readFileSync, mkdirSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli, runCliOutput, stripLogo } from './test-utils.ts'; +import { runCli, runCliOutput, stripLogo } from './lib/test-utils.ts'; describe('init command', () => { let testDir: string; diff --git a/src/init.ts b/src/init.ts index 4709103..c909b5c 100644 --- a/src/init.ts +++ b/src/init.ts @@ -1,7 +1,7 @@ import { writeFileSync, existsSync, mkdirSync } from 'fs'; import { basename, join } from 'path'; -import { RESET, DIM, TEXT, BOLD, YELLOW } from './utils.ts'; -import { KEBAB_CASE_PATTERN } from './validation.ts'; +import { RESET, DIM, TEXT, BOLD, YELLOW } from './lib/utils.ts'; +import { KEBAB_CASE_PATTERN } from './lib/validation.ts'; // --------------------------------------------------------------------------- // Template configuration diff --git a/src/instruction-commands.test.ts b/src/instruction-commands.test.ts index a8bceda..ae2d062 100644 --- a/src/instruction-commands.test.ts +++ b/src/instruction-commands.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync, readFileSync, mkdtempSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli } from './test-utils.ts'; +import { runCli } from './lib/test-utils.ts'; import { parseListOptions } from './list.ts'; import { addToGitignore, readManagedPaths } from './lib/git/index.ts'; diff --git a/src/lib/agents/agents.ts b/src/lib/agents/agents.ts index 7deaa9a..ae0bd6a 100644 --- a/src/lib/agents/agents.ts +++ b/src/lib/agents/agents.ts @@ -2,7 +2,7 @@ import { homedir } from 'os'; import { join } from 'path'; import { existsSync } from 'fs'; import { xdgConfig } from 'xdg-basedir'; -import type { AgentConfig, AgentType } from '../../types.ts'; +import type { AgentConfig, AgentType } from '../types.ts'; const home = homedir(); // Use xdg-basedir (not env-paths) to match OpenCode behavior on all platforms. diff --git a/src/lib/agents/target-agents.ts b/src/lib/agents/target-agents.ts index be622bc..70d0644 100644 --- a/src/lib/agents/target-agents.ts +++ b/src/lib/agents/target-agents.ts @@ -1,4 +1,4 @@ -import type { TargetAgent, ContextType } from '../../types.ts'; +import type { TargetAgent, ContextType } from '../types.ts'; // --------------------------------------------------------------------------- // Target agent registry for dotai transpilation (skills, prompts, agents, instructions) diff --git a/src/command-result.test.ts b/src/lib/command-result.test.ts similarity index 100% rename from src/command-result.test.ts rename to src/lib/command-result.test.ts diff --git a/src/command-result.ts b/src/lib/command-result.ts similarity index 100% rename from src/command-result.ts rename to src/lib/command-result.ts diff --git a/src/constants.ts b/src/lib/constants.ts similarity index 100% rename from src/constants.ts rename to src/lib/constants.ts diff --git a/src/lib/discovery/context-discovery.ts b/src/lib/discovery/context-discovery.ts index 7c53c83..a1092ea 100644 --- a/src/lib/discovery/context-discovery.ts +++ b/src/lib/discovery/context-discovery.ts @@ -6,7 +6,7 @@ import { parsePromptContent, } from '../parsers/index.ts'; import { targetAgents } from '../agents/index.ts'; -import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from '../../types.ts'; +import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Discovery constants diff --git a/src/lib/discovery/find-discovery.ts b/src/lib/discovery/find-discovery.ts index 18deb1b..4cf76e4 100644 --- a/src/lib/discovery/find-discovery.ts +++ b/src/lib/discovery/find-discovery.ts @@ -1,4 +1,4 @@ -import type { ContextType } from '../../types.ts'; +import type { ContextType } from '../types.ts'; import type { GitHubTreeEntry } from '../git/index.ts'; import { targetAgents } from '../agents/index.ts'; diff --git a/src/lib/discovery/skill-discovery.ts b/src/lib/discovery/skill-discovery.ts index 4af7d5f..1e4725f 100644 --- a/src/lib/discovery/skill-discovery.ts +++ b/src/lib/discovery/skill-discovery.ts @@ -1,8 +1,8 @@ import { readdir, readFile, stat } from 'fs/promises'; import { join, basename, dirname, resolve } from 'path'; import matter from 'gray-matter'; -import type { Skill } from '../../types.ts'; -import { getPluginSkillPaths, getPluginGroupings } from '../../plugin-manifest.ts'; +import type { Skill } from '../types.ts'; +import { getPluginSkillPaths, getPluginGroupings } from '../plugin-manifest.ts'; const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', '__pycache__']; diff --git a/src/lib/install/collisions.test.ts b/src/lib/install/collisions.test.ts index 7af5d54..593c142 100644 --- a/src/lib/install/collisions.test.ts +++ b/src/lib/install/collisions.test.ts @@ -16,7 +16,7 @@ import type { ContextType, ContextFormat, TargetAgent, -} from '../../types.ts'; +} from '../types.ts'; /** Assert exactly one collision and return it (avoids TS "possibly undefined" on collisions[0]). */ function expectSingleCollision(collisions: Collision[]): Collision { diff --git a/src/lib/install/collisions.ts b/src/lib/install/collisions.ts index 35f829b..beceb82 100644 --- a/src/lib/install/collisions.ts +++ b/src/lib/install/collisions.ts @@ -10,7 +10,7 @@ import type { ContextType, ContextFormat, TargetAgent, -} from '../../types.ts'; +} from '../types.ts'; // --------------------------------------------------------------------------- // Collision detection — Phase 5: Installer + Collision Safety diff --git a/src/lib/install/context-add.ts b/src/lib/install/context-add.ts index 3a2599c..3d8bc73 100644 --- a/src/lib/install/context-add.ts +++ b/src/lib/install/context-add.ts @@ -7,10 +7,10 @@ import { upsertLockEntry, computeContentHash, } from '../lock/index.ts'; -import { loadModelOverrides } from '../../model-aliases.ts'; +import { loadModelOverrides } from '../model-aliases.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; import { addToGitignore } from '../git/index.ts'; -import type { DiscoveredItem, LockEntry, TargetAgent } from '../../types.ts'; +import type { DiscoveredItem, LockEntry, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Context install — wires discovery → transpile → install pipeline diff --git a/src/lib/install/context-check.ts b/src/lib/install/context-check.ts index debf90b..dfa3b44 100644 --- a/src/lib/install/context-check.ts +++ b/src/lib/install/context-check.ts @@ -11,9 +11,9 @@ import { upsertLockEntry, getLockEntriesByType, } from '../lock/index.ts'; -import { loadModelOverrides } from '../../model-aliases.ts'; +import { loadModelOverrides } from '../model-aliases.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; -import type { ContextType, LockEntry, TargetAgent } from '../../types.ts'; +import type { ContextType, LockEntry, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Context check/update — reads .dotai-lock.json and compares content hashes diff --git a/src/lib/install/context-installer.ts b/src/lib/install/context-installer.ts index e569356..12606d6 100644 --- a/src/lib/install/context-installer.ts +++ b/src/lib/install/context-installer.ts @@ -7,8 +7,8 @@ import type { PlannedWrite, LockEntry, Collision, -} from '../../types.ts'; -import type { ModelOverrides } from '../../model-aliases.ts'; +} from '../types.ts'; +import type { ModelOverrides } from '../model-aliases.ts'; import { transpilePromptForAllAgents, transpileAgentForAllAgents, diff --git a/src/lib/install/instruction-check.test.ts b/src/lib/install/instruction-check.test.ts index 415be3c..29fa455 100644 --- a/src/lib/install/instruction-check.test.ts +++ b/src/lib/install/instruction-check.test.ts @@ -11,7 +11,7 @@ import { computeContentHash, } from '../lock/index.ts'; import type { DotaiLockFile } from '../lock/index.ts'; -import type { LockEntry, TargetAgent } from '../../types.ts'; +import type { LockEntry, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/install/instruction-pipeline.test.ts b/src/lib/install/instruction-pipeline.test.ts index f293d8e..d31b346 100644 --- a/src/lib/install/instruction-pipeline.test.ts +++ b/src/lib/install/instruction-pipeline.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdtempSync, writeFileSync, existsSync, readFileSync, rmSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import type { DiscoveredItem } from '../../types.ts'; +import type { DiscoveredItem } from '../types.ts'; import { planContextWrites, executeInstallPipeline, diff --git a/src/lib/install/skill-installer.ts b/src/lib/install/skill-installer.ts index 133119e..d46b272 100644 --- a/src/lib/install/skill-installer.ts +++ b/src/lib/install/skill-installer.ts @@ -13,10 +13,10 @@ import { } from 'fs/promises'; import { join, basename, normalize, resolve, sep, relative, dirname } from 'path'; import { homedir, platform } from 'os'; -import type { Skill, AgentType, RemoteSkill } from '../../types.ts'; -import type { WellKnownSkill } from '../../providers/wellknown.ts'; +import type { Skill, AgentType, RemoteSkill } from '../types.ts'; +import type { WellKnownSkill } from '../providers/wellknown.ts'; import { agents, detectInstalledAgents, isUniversalAgent } from '../agents/index.ts'; -import { AGENTS_DIR, SKILLS_SUBDIR } from '../../constants.ts'; +import { AGENTS_DIR, SKILLS_SUBDIR } from '../constants.ts'; import { parseSkillMd } from '../discovery/index.ts'; export type InstallMode = 'symlink' | 'copy'; diff --git a/src/lib/lock/dotai-lock.test.ts b/src/lib/lock/dotai-lock.test.ts index 2783dfa..facda38 100644 --- a/src/lib/lock/dotai-lock.test.ts +++ b/src/lib/lock/dotai-lock.test.ts @@ -18,7 +18,7 @@ import { LockVersionError, } from './dotai-lock.js'; import type { DotaiLockFile } from './dotai-lock.js'; -import type { LockEntry } from '../../types.js'; +import type { LockEntry } from '../types.js'; // --------------------------------------------------------------------------- // Test helpers diff --git a/src/lib/lock/dotai-lock.ts b/src/lib/lock/dotai-lock.ts index 43069f4..2d712be 100644 --- a/src/lib/lock/dotai-lock.ts +++ b/src/lib/lock/dotai-lock.ts @@ -2,7 +2,7 @@ import { readFile, writeFile, rename } from 'fs/promises'; import { join } from 'path'; import { createHash } from 'crypto'; -import type { LockEntry, ContextType, ContextFormat, TargetAgent } from '../../types.js'; +import type { LockEntry, ContextType, ContextFormat, TargetAgent } from '../types.js'; import { LockVersionError } from './lock-version-error.ts'; // --------------------------------------------------------------------------- diff --git a/src/model-aliases.test.ts b/src/lib/model-aliases.test.ts similarity index 99% rename from src/model-aliases.test.ts rename to src/lib/model-aliases.test.ts index e1c26fc..73fea2d 100644 --- a/src/model-aliases.test.ts +++ b/src/lib/model-aliases.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { resolveModel, getKnownModels, loadModelOverrides } from './model-aliases.ts'; import type { TargetAgent } from './types.ts'; -import { TARGET_AGENTS } from './lib/agents/index.ts'; +import { TARGET_AGENTS } from './agents/index.ts'; import { mkdtemp, writeFile, rm } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; diff --git a/src/model-aliases.ts b/src/lib/model-aliases.ts similarity index 100% rename from src/model-aliases.ts rename to src/lib/model-aliases.ts diff --git a/src/lib/parsers/agent-parser.ts b/src/lib/parsers/agent-parser.ts index 1acb54b..2ffd40e 100644 --- a/src/lib/parsers/agent-parser.ts +++ b/src/lib/parsers/agent-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalAgent, AgentOverrideFields, TargetAgent } from '../../types.ts'; +import type { CanonicalAgent, AgentOverrideFields, TargetAgent } from '../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from '../../validation.ts'; +} from '../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/instruction-parser.ts b/src/lib/parsers/instruction-parser.ts index 9085c6a..8bd2ed3 100644 --- a/src/lib/parsers/instruction-parser.ts +++ b/src/lib/parsers/instruction-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalInstruction, InstructionOverrideFields, TargetAgent } from '../../types.ts'; +import type { CanonicalInstruction, InstructionOverrideFields, TargetAgent } from '../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from '../../validation.ts'; +} from '../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/override-parser.test.ts b/src/lib/parsers/override-parser.test.ts index 92c63b4..5f54cb3 100644 --- a/src/lib/parsers/override-parser.test.ts +++ b/src/lib/parsers/override-parser.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { extractOverrides, mergeOverrides } from './override-parser.ts'; -import type { CanonicalPrompt, TargetAgent } from '../../types.ts'; +import type { CanonicalPrompt, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // extractOverrides diff --git a/src/lib/parsers/override-parser.ts b/src/lib/parsers/override-parser.ts index 462791b..83216cb 100644 --- a/src/lib/parsers/override-parser.ts +++ b/src/lib/parsers/override-parser.ts @@ -1,4 +1,4 @@ -import type { TargetAgent } from '../../types.ts'; +import type { TargetAgent } from '../types.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/prompt-parser.ts b/src/lib/parsers/prompt-parser.ts index 38a6d29..a3b2d55 100644 --- a/src/lib/parsers/prompt-parser.ts +++ b/src/lib/parsers/prompt-parser.ts @@ -1,11 +1,11 @@ import matter from 'gray-matter'; -import type { CanonicalPrompt, PromptOverrideFields, TargetAgent } from '../../types.ts'; +import type { CanonicalPrompt, PromptOverrideFields, TargetAgent } from '../types.ts'; import { SUPPORTED_SCHEMA_VERSION, validateName, validateDescription, validateSchemaVersion, -} from '../../validation.ts'; +} from '../validation.ts'; import { extractOverrides } from './override-parser.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/source-parser.ts b/src/lib/parsers/source-parser.ts index 2e68787..1ba21c0 100644 --- a/src/lib/parsers/source-parser.ts +++ b/src/lib/parsers/source-parser.ts @@ -1,5 +1,5 @@ import { isAbsolute, resolve } from 'path'; -import type { ParsedSource } from '../../types.ts'; +import type { ParsedSource } from '../types.ts'; /** * Extract owner/repo (or group/subgroup/repo for GitLab) from a parsed source diff --git a/src/plugin-manifest.ts b/src/lib/plugin-manifest.ts similarity index 100% rename from src/plugin-manifest.ts rename to src/lib/plugin-manifest.ts diff --git a/src/prompts/search-multiselect.ts b/src/lib/prompts/search-multiselect.ts similarity index 100% rename from src/prompts/search-multiselect.ts rename to src/lib/prompts/search-multiselect.ts diff --git a/src/providers/index.ts b/src/lib/providers/index.ts similarity index 100% rename from src/providers/index.ts rename to src/lib/providers/index.ts diff --git a/src/providers/types.ts b/src/lib/providers/types.ts similarity index 100% rename from src/providers/types.ts rename to src/lib/providers/types.ts diff --git a/src/providers/wellknown.ts b/src/lib/providers/wellknown.ts similarity index 100% rename from src/providers/wellknown.ts rename to src/lib/providers/wellknown.ts diff --git a/src/telemetry.test.ts b/src/lib/telemetry.test.ts similarity index 100% rename from src/telemetry.test.ts rename to src/lib/telemetry.test.ts diff --git a/src/telemetry.ts b/src/lib/telemetry.ts similarity index 100% rename from src/telemetry.ts rename to src/lib/telemetry.ts diff --git a/src/test-utils.ts b/src/lib/test-utils.ts similarity index 97% rename from src/test-utils.ts rename to src/lib/test-utils.ts index 5692d20..9251d35 100644 --- a/src/test-utils.ts +++ b/src/lib/test-utils.ts @@ -8,7 +8,7 @@ function quoteArg(arg: string): string { } // const PROJECT_ROOT = join(import.meta.dirname, '..'); -const CLI_PATH = join(import.meta.dirname, 'cli.ts'); +const CLI_PATH = join(import.meta.dirname, '..', 'cli.ts'); function stripAnsi(str: string): string { return str.replace(/\x1b\[[0-9;]*m/g, ''); diff --git a/src/lib/transpilers/agent-transpiler-overrides.test.ts b/src/lib/transpilers/agent-transpiler-overrides.test.ts index c83a5ea..438df4f 100644 --- a/src/lib/transpilers/agent-transpiler-overrides.test.ts +++ b/src/lib/transpilers/agent-transpiler-overrides.test.ts @@ -5,7 +5,7 @@ import { claudeCodeAgentTranspiler, } from './agent-transpilers.ts'; import { mergeOverrides } from '../parsers/index.ts'; -import type { CanonicalAgent, DiscoveredItem } from '../../types.ts'; +import type { CanonicalAgent, DiscoveredItem } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/transpilers/agent-transpilers.test.ts b/src/lib/transpilers/agent-transpilers.test.ts index 0ddc7b1..37da9a6 100644 --- a/src/lib/transpilers/agent-transpilers.test.ts +++ b/src/lib/transpilers/agent-transpilers.test.ts @@ -9,7 +9,7 @@ import { transpileAgentForAllAgents, } from './agent-transpilers.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; -import type { CanonicalAgent, DiscoveredItem, TargetAgent } from '../../types.ts'; +import type { CanonicalAgent, DiscoveredItem, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/transpilers/agent-transpilers.ts b/src/lib/transpilers/agent-transpilers.ts index efdb35b..cad3943 100644 --- a/src/lib/transpilers/agent-transpilers.ts +++ b/src/lib/transpilers/agent-transpilers.ts @@ -5,11 +5,11 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from '../../types.ts'; +} from '../types.ts'; import { parseAgentContent } from '../parsers/index.ts'; import { getTargetAgentConfig } from '../agents/index.ts'; -import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; -import { quoteYaml } from '../../utils.ts'; +import { resolveModel, type ModelOverrides } from '../model-aliases.ts'; +import { quoteYaml } from '../utils.ts'; import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/instruction-transpilers.test.ts b/src/lib/transpilers/instruction-transpilers.test.ts index bed1d2a..0d2ee9d 100644 --- a/src/lib/transpilers/instruction-transpilers.test.ts +++ b/src/lib/transpilers/instruction-transpilers.test.ts @@ -9,7 +9,7 @@ import { transpileInstructionForAllAgents, } from './instruction-transpilers.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; -import type { CanonicalInstruction, DiscoveredItem, TargetAgent } from '../../types.ts'; +import type { CanonicalInstruction, DiscoveredItem, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/transpilers/instruction-transpilers.ts b/src/lib/transpilers/instruction-transpilers.ts index ee3c02b..f7eba72 100644 --- a/src/lib/transpilers/instruction-transpilers.ts +++ b/src/lib/transpilers/instruction-transpilers.ts @@ -4,7 +4,7 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from '../../types.ts'; +} from '../types.ts'; import { parseInstructionContent } from '../parsers/index.ts'; import { getTargetAgentConfig } from '../agents/index.ts'; import { mergeOverrides } from '../parsers/index.ts'; diff --git a/src/lib/transpilers/prompt-transpiler-overrides.test.ts b/src/lib/transpilers/prompt-transpiler-overrides.test.ts index 068b147..5af0a94 100644 --- a/src/lib/transpilers/prompt-transpiler-overrides.test.ts +++ b/src/lib/transpilers/prompt-transpiler-overrides.test.ts @@ -5,7 +5,7 @@ import { claudeCodePromptTranspiler, } from './prompt-transpilers.ts'; import { mergeOverrides } from '../parsers/index.ts'; -import type { CanonicalPrompt, DiscoveredItem } from '../../types.ts'; +import type { CanonicalPrompt, DiscoveredItem } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/transpilers/prompt-transpilers.test.ts b/src/lib/transpilers/prompt-transpilers.test.ts index d861cad..dec49ff 100644 --- a/src/lib/transpilers/prompt-transpilers.test.ts +++ b/src/lib/transpilers/prompt-transpilers.test.ts @@ -8,7 +8,7 @@ import { transpilePromptForAllAgents, } from './prompt-transpilers.ts'; import { TARGET_AGENTS } from '../agents/index.ts'; -import type { CanonicalPrompt, DiscoveredItem, TargetAgent } from '../../types.ts'; +import type { CanonicalPrompt, DiscoveredItem, TargetAgent } from '../types.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/lib/transpilers/prompt-transpilers.ts b/src/lib/transpilers/prompt-transpilers.ts index fc3fe8f..9c2c6f8 100644 --- a/src/lib/transpilers/prompt-transpilers.ts +++ b/src/lib/transpilers/prompt-transpilers.ts @@ -5,11 +5,11 @@ import type { DiscoveredItem, TargetAgent, TranspiledOutput, -} from '../../types.ts'; +} from '../types.ts'; import { parsePromptContent } from '../parsers/index.ts'; import { getTargetAgentConfig } from '../agents/index.ts'; -import { resolveModel, type ModelOverrides } from '../../model-aliases.ts'; -import { quoteYaml } from '../../utils.ts'; +import { resolveModel, type ModelOverrides } from '../model-aliases.ts'; +import { quoteYaml } from '../utils.ts'; import { mergeOverrides } from '../parsers/index.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/transpilers/transpiler.ts b/src/lib/transpilers/transpiler.ts index 3cc0ffc..a7aeba5 100644 --- a/src/lib/transpilers/transpiler.ts +++ b/src/lib/transpilers/transpiler.ts @@ -1,4 +1,4 @@ -import type { DiscoveredItem, TargetAgent, TranspiledOutput } from '../../types.ts'; +import type { DiscoveredItem, TargetAgent, TranspiledOutput } from '../types.ts'; /** * A transpiler converts a canonical context item into agent-specific output. diff --git a/src/types.ts b/src/lib/types.ts similarity index 100% rename from src/types.ts rename to src/lib/types.ts diff --git a/src/utils.ts b/src/lib/utils.ts similarity index 100% rename from src/utils.ts rename to src/lib/utils.ts diff --git a/src/validation.ts b/src/lib/validation.ts similarity index 100% rename from src/validation.ts rename to src/lib/validation.ts diff --git a/src/list.test.ts b/src/list.test.ts index 7a57ea8..8c25a72 100644 --- a/src/list.test.ts +++ b/src/list.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir, homedir } from 'os'; -import { runCli } from './test-utils.ts'; +import { runCli } from './lib/test-utils.ts'; import { parseListOptions } from './list.ts'; -import { shortenPath } from './utils.ts'; +import { shortenPath } from './lib/utils.ts'; describe('list command', () => { let testDir: string; diff --git a/src/list.ts b/src/list.ts index bac769a..7e885d5 100644 --- a/src/list.ts +++ b/src/list.ts @@ -1,9 +1,18 @@ -import type { AgentType, ContextType, LockEntry, TargetAgent } from './types.ts'; +import type { AgentType, ContextType, LockEntry, TargetAgent } from './lib/types.ts'; import { agents } from './lib/agents/index.ts'; import { listInstalledSkills, type InstalledSkill } from './lib/install/index.ts'; import { getAllLockedSkills } from './lib/lock/index.ts'; import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './lib/lock/index.ts'; -import { RESET, BOLD, DIM, CYAN, YELLOW, shortenPath, formatList, kebabToTitle } from './utils.ts'; +import { + RESET, + BOLD, + DIM, + CYAN, + YELLOW, + shortenPath, + formatList, + kebabToTitle, +} from './lib/utils.ts'; import { consumeMultiValues, parseTypeFlag } from './cli-parse.ts'; interface ListOptions { diff --git a/src/remove.test.ts b/src/remove.test.ts index bf6606c..27a9f99 100644 --- a/src/remove.test.ts +++ b/src/remove.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync, readdirSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli, runCliWithInput } from './test-utils.js'; +import { runCli, runCliWithInput } from './lib/test-utils.js'; import { parseRemoveOptions, removeCommand } from './remove.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); diff --git a/src/remove.ts b/src/remove.ts index 2aac44b..160d672 100644 --- a/src/remove.ts +++ b/src/remove.ts @@ -3,9 +3,9 @@ import pc from 'picocolors'; import { readdir, rm, lstat, unlink, readFile, writeFile } from 'fs/promises'; import { join } from 'path'; import { agents, detectInstalledAgents } from './lib/agents/index.ts'; -import { track } from './telemetry.ts'; +import { track } from './lib/telemetry.ts'; import { removeSkillFromLock, getSkillFromLock } from './lib/lock/index.ts'; -import type { AgentType, ContextType, LockEntry } from './types.ts'; +import type { AgentType, ContextType, LockEntry } from './lib/types.ts'; import { getInstallPath, getCanonicalPath, @@ -16,7 +16,7 @@ import { readDotaiLock, removeLockEntry, writeDotaiLock } from './lib/lock/index import { removeSection } from './lib/install/index.ts'; import { removeFromGitignore } from './lib/git/index.ts'; import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; export interface RemoveOptions { global?: boolean; diff --git a/src/restore.ts b/src/restore.ts index 2ad3df5..0641fee 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -8,7 +8,7 @@ import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; import { addPrompts, addAgents } from './lib/install/index.ts'; import { parseSource } from './lib/parsers/index.ts'; import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; -import type { LockEntry, TargetAgent } from './types.ts'; +import type { LockEntry, TargetAgent } from './lib/types.ts'; /** * Install all context from lock files: diff --git a/src/sync.test.ts b/src/sync.test.ts index 07ae25e..bc8d8ed 100644 --- a/src/sync.test.ts +++ b/src/sync.test.ts @@ -3,7 +3,7 @@ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; import { runSync, parseSyncOptions } from './sync.ts'; -import { CommandError } from './command-result.ts'; +import { CommandError } from './lib/command-result.ts'; vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); diff --git a/src/sync.ts b/src/sync.ts index 8e359b2..8aba4c6 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -10,12 +10,12 @@ import { getUniversalAgents, getNonUniversalAgents, } from './lib/agents/index.ts'; -import { searchMultiselect } from './prompts/search-multiselect.ts'; +import { searchMultiselect } from './lib/prompts/search-multiselect.ts'; import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './lib/lock/index.ts'; -import type { Skill, AgentType } from './types.ts'; -import { CommandError } from './command-result.ts'; -import { track } from './telemetry.ts'; -import { shortenPath } from './utils.ts'; +import type { Skill, AgentType } from './lib/types.ts'; +import { CommandError } from './lib/command-result.ts'; +import { track } from './lib/telemetry.ts'; +import { shortenPath } from './lib/utils.ts'; import { consumeMultiValues } from './cli-parse.ts'; const isCancelled = (value: unknown): value is symbol => typeof value === 'symbol'; diff --git a/tests/cli-subprocess.test.ts b/tests/cli-subprocess.test.ts index 3de436f..273e64c 100644 --- a/tests/cli-subprocess.test.ts +++ b/tests/cli-subprocess.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { mkdir, writeFile } from 'fs/promises'; import { join } from 'path'; import { existsSync } from 'fs'; -import { runCli } from '../src/test-utils.ts'; +import { runCli } from '../src/lib/test-utils.ts'; import { createTempProjectDir } from './e2e-utils.ts'; // --------------------------------------------------------------------------- diff --git a/tests/cross-platform-paths.test.ts b/tests/cross-platform-paths.test.ts index 64afeea..7e1fab5 100644 --- a/tests/cross-platform-paths.test.ts +++ b/tests/cross-platform-paths.test.ts @@ -16,7 +16,7 @@ import { createEmptyLock, upsertLockEntry, } from '../src/lib/lock/index.ts'; -import type { TranspiledOutput, LockEntry, TargetAgent } from '../src/types.ts'; +import type { TranspiledOutput, LockEntry, TargetAgent } from '../src/lib/types.ts'; import { mkdtempSync, rmSync } from 'fs'; import { tmpdir } from 'os'; import { execSync } from 'child_process'; diff --git a/tests/e2e-cli-matrix.test.ts b/tests/e2e-cli-matrix.test.ts index bcdbac1..26b967d 100644 --- a/tests/e2e-cli-matrix.test.ts +++ b/tests/e2e-cli-matrix.test.ts @@ -19,7 +19,7 @@ import { import { addPrompts, addAgents } from '../src/lib/install/index.ts'; import { removeCommand } from '../src/remove.ts'; import { checkContextUpdates, updateContext } from '../src/lib/install/index.ts'; -import { runCli } from '../src/test-utils.ts'; +import { runCli } from '../src/lib/test-utils.ts'; // --------------------------------------------------------------------------- // E2E CLI Matrix Tests diff --git a/tests/e2e-instruction.test.ts b/tests/e2e-instruction.test.ts index 731d25c..74b96c1 100644 --- a/tests/e2e-instruction.test.ts +++ b/tests/e2e-instruction.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'; import { join } from 'path'; import { addInstructions } from '../src/lib/install/index.ts'; -import type { TargetAgent } from '../src/types.ts'; +import type { TargetAgent } from '../src/lib/types.ts'; import { createTempProjectDir, createTestSourceRepo, diff --git a/tests/e2e-utils.ts b/tests/e2e-utils.ts index 02d52af..1f13dc8 100644 --- a/tests/e2e-utils.ts +++ b/tests/e2e-utils.ts @@ -16,7 +16,7 @@ import { mkdtemp, rm, mkdir, writeFile, readFile } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; import { execSync } from 'child_process'; -import type { ContextType, LockEntry, TargetAgent } from '../src/types.ts'; +import type { ContextType, LockEntry, TargetAgent } from '../src/lib/types.ts'; import type { DotaiLockFile } from '../src/lib/lock/index.ts'; import { readDotaiLock } from '../src/lib/lock/index.ts'; import { targetAgents } from '../src/lib/agents/index.ts'; diff --git a/tests/gitignore-integration.test.ts b/tests/gitignore-integration.test.ts index a4736a2..d9b5574 100644 --- a/tests/gitignore-integration.test.ts +++ b/tests/gitignore-integration.test.ts @@ -4,7 +4,7 @@ import { join } from 'path'; import { existsSync } from 'fs'; import { relative } from 'path'; import { addPrompts } from '../src/lib/install/index.ts'; -import { runCli } from '../src/test-utils.ts'; +import { runCli } from '../src/lib/test-utils.ts'; import { readManagedPaths } from '../src/lib/git/index.ts'; import { removeCommand } from '../src/remove.ts'; import { diff --git a/tests/installer-symlink-fallback.test.ts b/tests/installer-symlink-fallback.test.ts index 48d194e..5a64475 100644 --- a/tests/installer-symlink-fallback.test.ts +++ b/tests/installer-symlink-fallback.test.ts @@ -22,9 +22,9 @@ import { installWellKnownSkillForAgent, } from '../src/lib/install/index.ts'; import { agents } from '../src/lib/agents/index.ts'; -import type { AgentType } from '../src/types.ts'; -import type { RemoteSkill } from '../src/types.ts'; -import type { WellKnownSkill } from '../src/providers/wellknown.ts'; +import type { AgentType } from '../src/lib/types.ts'; +import type { RemoteSkill } from '../src/lib/types.ts'; +import type { WellKnownSkill } from '../src/lib/providers/wellknown.ts'; async function makeSkillSource(root: string, name: string): Promise { const dir = join(root, 'source-skill'); diff --git a/tests/plugin-grouping.test.ts b/tests/plugin-grouping.test.ts index 10749ff..0432bd3 100644 --- a/tests/plugin-grouping.test.ts +++ b/tests/plugin-grouping.test.ts @@ -1,5 +1,5 @@ import { join, resolve } from 'path'; -import { getPluginGroupings } from '../src/plugin-manifest.ts'; +import { getPluginGroupings } from '../src/lib/plugin-manifest.ts'; import { discoverSkills } from '../src/lib/discovery/index.ts'; import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest'; import { mkdir, writeFile, rm } from 'fs/promises'; diff --git a/tests/restore.test.ts b/tests/restore.test.ts index 919880b..2c4f613 100644 --- a/tests/restore.test.ts +++ b/tests/restore.test.ts @@ -3,7 +3,7 @@ import { mkdtemp, rm, mkdir, writeFile, readFile } from 'fs/promises'; import { join } from 'path'; import { tmpdir } from 'os'; import { existsSync } from 'fs'; -import { runCli } from '../src/test-utils.ts'; +import { runCli } from '../src/lib/test-utils.ts'; import { addPrompts, addAgents } from '../src/lib/install/index.ts'; import { writeDotaiLock, createEmptyLock, readDotaiLock } from '../src/lib/lock/index.ts'; import { createTestSourceRepo } from './e2e-utils.ts'; diff --git a/tests/skill-matching.test.ts b/tests/skill-matching.test.ts index 8071521..3c56232 100644 --- a/tests/skill-matching.test.ts +++ b/tests/skill-matching.test.ts @@ -10,7 +10,7 @@ import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; import { filterSkills, parseSkillMd } from '../src/lib/discovery/index.ts'; -import type { Skill } from '../src/types.ts'; +import type { Skill } from '../src/lib/types.ts'; // Mock skill factory function makeSkill(name: string, path: string = '/tmp/skill'): Skill { diff --git a/tests/sync.test.ts b/tests/sync.test.ts index a33534f..5d81f3b 100644 --- a/tests/sync.test.ts +++ b/tests/sync.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli } from '../src/test-utils.ts'; +import { runCli } from '../src/lib/test-utils.ts'; describe('experimental_sync command', () => { let testDir: string; diff --git a/tests/wellknown-provider.test.ts b/tests/wellknown-provider.test.ts index c754531..dc47ece 100644 --- a/tests/wellknown-provider.test.ts +++ b/tests/wellknown-provider.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { WellKnownProvider, isValidSkillEntry } from '../src/providers/wellknown.ts'; +import { WellKnownProvider, isValidSkillEntry } from '../src/lib/providers/wellknown.ts'; describe('WellKnownProvider', () => { const provider = new WellKnownProvider(); From 0e3ca9b58f285bcf623592fdb5137d422072603c Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 18:57:03 +0200 Subject: [PATCH 09/12] refactor: move add command to add/ --- src/{ => add}/add-agents.test.ts | 10 ++++---- src/{ => add}/add-agents.ts | 8 +++--- src/{ => add}/add-display.test.ts | 4 +-- src/{ => add}/add-display.ts | 10 ++++---- src/{ => add}/add-install.test.ts | 16 ++++++------ src/{ => add}/add-install.ts | 10 ++++---- src/{ => add}/add-options.test.ts | 2 +- src/{ => add}/add-options.ts | 4 +-- src/{ => add}/add-prompt.test.ts | 12 ++++----- src/{ => add}/add-wellknown.test.ts | 40 ++++++++++++++--------------- src/{ => add}/add-wellknown.ts | 20 +++++++-------- src/{ => add}/add.test.ts | 4 +-- src/{ => add}/add.ts | 28 ++++++++++---------- src/add/index.ts | 3 +++ src/cli.ts | 2 +- src/find.ts | 4 +-- src/restore.ts | 2 +- 17 files changed, 91 insertions(+), 88 deletions(-) rename src/{ => add}/add-agents.test.ts (97%) rename src/{ => add}/add-agents.ts (94%) rename src/{ => add}/add-display.test.ts (98%) rename src/{ => add}/add-display.ts (94%) rename src/{ => add}/add-install.test.ts (97%) rename src/{ => add}/add-install.ts (96%) rename src/{ => add}/add-options.test.ts (98%) rename src/{ => add}/add-options.ts (96%) rename src/{ => add}/add-prompt.test.ts (91%) rename src/{ => add}/add-wellknown.test.ts (93%) rename src/{ => add}/add-wellknown.ts (93%) rename src/{ => add}/add.test.ts (99%) rename src/{ => add}/add.ts (98%) create mode 100644 src/add/index.ts diff --git a/src/add-agents.test.ts b/src/add/add-agents.test.ts similarity index 97% rename from src/add-agents.test.ts rename to src/add/add-agents.test.ts index 4e4dc53..53dd50f 100644 --- a/src/add-agents.test.ts +++ b/src/add/add-agents.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { multiselect, promptForAgents, selectAgentsInteractive } from './add-agents.js'; -import * as skillLock from './lib/lock/skill-lock.js'; -import * as searchMultiselectModule from './lib/prompts/search-multiselect.js'; +import * as skillLock from '../lib/lock/skill-lock.js'; +import * as searchMultiselectModule from '../lib/prompts/search-multiselect.js'; import * as clack from '@clack/prompts'; -import * as agentsModule from './lib/agents/agents.js'; +import * as agentsModule from '../lib/agents/agents.js'; // Mock dependencies -vi.mock('./lib/lock/skill-lock.js'); -vi.mock('./lib/prompts/search-multiselect.js'); +vi.mock('../lib/lock/skill-lock.js'); +vi.mock('../lib/prompts/search-multiselect.js'); vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); return { diff --git a/src/add-agents.ts b/src/add/add-agents.ts similarity index 94% rename from src/add-agents.ts rename to src/add/add-agents.ts index 4b9fe22..6bf2c44 100644 --- a/src/add-agents.ts +++ b/src/add/add-agents.ts @@ -1,9 +1,9 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { searchMultiselect } from './lib/prompts/search-multiselect.ts'; -import { agents, getUniversalAgents, getNonUniversalAgents } from './lib/agents/index.ts'; -import { getLastSelectedAgents, saveSelectedAgents } from './lib/lock/index.ts'; -import type { AgentType } from './lib/types.ts'; +import { searchMultiselect } from '../lib/prompts/search-multiselect.ts'; +import { agents, getUniversalAgents, getNonUniversalAgents } from '../lib/agents/index.ts'; +import { getLastSelectedAgents, saveSelectedAgents } from '../lib/lock/index.ts'; +import type { AgentType } from '../lib/types.ts'; // Helper to check if a value is a cancel symbol (works with both clack and our custom prompts) const isCancelled = (value: unknown): value is symbol => typeof value === 'symbol'; diff --git a/src/add-display.test.ts b/src/add/add-display.test.ts similarity index 98% rename from src/add-display.test.ts rename to src/add/add-display.test.ts index 274a52b..9debcaa 100644 --- a/src/add-display.test.ts +++ b/src/add/add-display.test.ts @@ -9,8 +9,8 @@ import { ensureUniversalAgents, buildResultLines, } from './add-display.ts'; -import type { AgentType } from './lib/types.ts'; -import type { AuditResponse, PartnerAudit } from './lib/telemetry.ts'; +import type { AgentType } from '../lib/types.ts'; +import type { AuditResponse, PartnerAudit } from '../lib/telemetry.ts'; // Helper to strip ANSI escape codes for easier assertion const stripAnsi = (s: string) => s.replace(/\x1b\[[0-9;]*m/g, ''); diff --git a/src/add-display.ts b/src/add/add-display.ts similarity index 94% rename from src/add-display.ts rename to src/add/add-display.ts index 240baa8..5593bc0 100644 --- a/src/add-display.ts +++ b/src/add/add-display.ts @@ -1,9 +1,9 @@ import pc from 'picocolors'; -import { formatList } from './lib/utils.ts'; -import { agents, getUniversalAgents, isUniversalAgent } from './lib/agents/index.ts'; -import type { AgentType } from './lib/types.ts'; -import type { InstallMode } from './lib/install/index.ts'; -import type { AuditResponse, PartnerAudit } from './lib/telemetry.ts'; +import { formatList } from '../lib/utils.ts'; +import { agents, getUniversalAgents, isUniversalAgent } from '../lib/agents/index.ts'; +import type { AgentType } from '../lib/types.ts'; +import type { InstallMode } from '../lib/install/index.ts'; +import type { AuditResponse, PartnerAudit } from '../lib/telemetry.ts'; // ─── Security Advisory ─── diff --git a/src/add-install.test.ts b/src/add/add-install.test.ts similarity index 97% rename from src/add-install.test.ts rename to src/add/add-install.test.ts index e175853..db21fde 100644 --- a/src/add-install.test.ts +++ b/src/add/add-install.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import type { AddOptions } from './add-options.ts'; -import type { AgentType } from './lib/types.ts'; +import type { AgentType } from '../lib/types.ts'; // --- Mocks --- @@ -18,8 +18,8 @@ vi.mock('@clack/prompts', async () => { }; }); -vi.mock('./lib/agents/agents.ts', async () => { - const actual = await vi.importActual('./lib/agents/agents.ts'); +vi.mock('../lib/agents/agents.ts', async () => { + const actual = await vi.importActual('../lib/agents/agents.ts'); return { ...actual, detectInstalledAgents: vi.fn(), @@ -32,8 +32,8 @@ vi.mock('./add-agents.ts', () => ({ selectAgentsInteractive: vi.fn(), })); -vi.mock('./lib/install/skill-installer.ts', async () => { - const actual = await vi.importActual('./lib/install/skill-installer.ts'); +vi.mock('../lib/install/skill-installer.ts', async () => { + const actual = await vi.importActual('../lib/install/skill-installer.ts'); return { ...actual, isSkillInstalled: vi.fn(), @@ -49,10 +49,10 @@ import { displayInstallResults, type InstallResult, } from './add-install.ts'; -import { detectInstalledAgents, agents } from './lib/agents/index.ts'; +import { detectInstalledAgents, agents } from '../lib/agents/index.ts'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; -import { isSkillInstalled } from './lib/install/index.ts'; -import { CommandError } from './lib/command-result.ts'; +import { isSkillInstalled } from '../lib/install/index.ts'; +import { CommandError } from '../lib/command-result.ts'; // --- Helpers --- diff --git a/src/add-install.ts b/src/add/add-install.ts similarity index 96% rename from src/add-install.ts rename to src/add/add-install.ts index 3fe9f5f..00a19b9 100644 --- a/src/add-install.ts +++ b/src/add/add-install.ts @@ -1,13 +1,13 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { promptForAgents, selectAgentsInteractive } from './add-agents.ts'; -import { isSkillInstalled, type InstallMode } from './lib/install/index.ts'; -import { detectInstalledAgents, agents } from './lib/agents/index.ts'; -import type { AgentType } from './lib/types.ts'; +import { isSkillInstalled, type InstallMode } from '../lib/install/index.ts'; +import { detectInstalledAgents, agents } from '../lib/agents/index.ts'; +import type { AgentType } from '../lib/types.ts'; import { ensureUniversalAgents, buildResultLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; -import { shortenPath, formatList, kebabToTitle } from './lib/utils.ts'; -import { CommandError } from './lib/command-result.ts'; +import { shortenPath, formatList, kebabToTitle } from '../lib/utils.ts'; +import { CommandError } from '../lib/command-result.ts'; export interface InstallResult { skill: string; diff --git a/src/add-options.test.ts b/src/add/add-options.test.ts similarity index 98% rename from src/add-options.test.ts rename to src/add/add-options.test.ts index 19b3db8..c0a1915 100644 --- a/src/add-options.test.ts +++ b/src/add/add-options.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { parseAddOptions } from './add-options.ts'; -import { resolveTargetAgents } from './lib/install/index.ts'; +import { resolveTargetAgents } from '../lib/install/index.ts'; // --------------------------------------------------------------------------- // parseAddOptions — basic flags diff --git a/src/add-options.ts b/src/add/add-options.ts similarity index 96% rename from src/add-options.ts rename to src/add/add-options.ts index 5b054a4..00a4563 100644 --- a/src/add-options.ts +++ b/src/add/add-options.ts @@ -1,5 +1,5 @@ -import type { ContextType } from './lib/types.ts'; -import { consumeMultiValues } from './cli-parse.ts'; +import type { ContextType } from '../lib/types.ts'; +import { consumeMultiValues } from '../cli-parse.ts'; export interface AddOptions { global?: boolean; diff --git a/src/add-prompt.test.ts b/src/add/add-prompt.test.ts similarity index 91% rename from src/add-prompt.test.ts rename to src/add/add-prompt.test.ts index c0a8b31..731518e 100644 --- a/src/add-prompt.test.ts +++ b/src/add/add-prompt.test.ts @@ -1,16 +1,16 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { promptForAgents } from './add.js'; -import * as skillLock from './lib/lock/skill-lock.js'; -import * as searchMultiselectModule from './lib/prompts/search-multiselect.js'; +import * as skillLock from '../lib/lock/skill-lock.js'; +import * as searchMultiselectModule from '../lib/prompts/search-multiselect.js'; // Mock dependencies -vi.mock('./lib/lock/skill-lock.js'); -vi.mock('./lib/prompts/search-multiselect.js'); -vi.mock('./lib/telemetry.js', () => ({ +vi.mock('../lib/lock/skill-lock.js'); +vi.mock('../lib/prompts/search-multiselect.js'); +vi.mock('../lib/telemetry.js', () => ({ setVersion: vi.fn(), track: vi.fn(), })); -vi.mock('../package.json', () => ({ +vi.mock('../../package.json', () => ({ default: { version: '1.0.0' }, })); diff --git a/src/add-wellknown.test.ts b/src/add/add-wellknown.test.ts similarity index 93% rename from src/add-wellknown.test.ts rename to src/add/add-wellknown.test.ts index a7afde7..e90e7cb 100644 --- a/src/add-wellknown.test.ts +++ b/src/add/add-wellknown.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import type { WellKnownSkill } from './lib/providers/index.ts'; +import type { WellKnownSkill } from '../lib/providers/index.ts'; import type { AddOptions } from './add-options.ts'; -import type { AgentType } from './lib/types.ts'; +import type { AgentType } from '../lib/types.ts'; // --- Mocks --- @@ -18,23 +18,23 @@ vi.mock('@clack/prompts', async () => { }; }); -vi.mock('./lib/providers/index.ts', () => ({ +vi.mock('../lib/providers/index.ts', () => ({ wellKnownProvider: { fetchAllSkills: vi.fn(), getSourceIdentifier: vi.fn().mockReturnValue('wellknown/example.com'), }, })); -vi.mock('./lib/agents/agents.ts', async () => { - const actual = await vi.importActual('./lib/agents/agents.ts'); +vi.mock('../lib/agents/agents.ts', async () => { + const actual = await vi.importActual('../lib/agents/agents.ts'); return { ...actual, detectInstalledAgents: vi.fn(), }; }); -vi.mock('./lib/install/skill-installer.ts', async () => { - const actual = await vi.importActual('./lib/install/skill-installer.ts'); +vi.mock('../lib/install/skill-installer.ts', async () => { + const actual = await vi.importActual('../lib/install/skill-installer.ts'); return { ...actual, isSkillInstalled: vi.fn().mockResolvedValue(false), @@ -49,21 +49,21 @@ vi.mock('./add-agents.ts', () => ({ selectAgentsInteractive: vi.fn(), })); -vi.mock('./lib/telemetry.ts', () => ({ +vi.mock('../lib/telemetry.ts', () => ({ track: vi.fn(), })); -vi.mock('./lib/lock/skill-lock.ts', () => ({ +vi.mock('../lib/lock/skill-lock.ts', () => ({ addSkillToLock: vi.fn(), })); -vi.mock('./lib/lock/local-lock.ts', () => ({ +vi.mock('../lib/lock/local-lock.ts', () => ({ addSkillToLocalLock: vi.fn(), computeSkillFolderHash: vi.fn().mockResolvedValue('abc123'), })); -vi.mock('./lib/parsers/source-parser.ts', async () => { - const actual = await vi.importActual('./lib/parsers/source-parser.ts'); +vi.mock('../lib/parsers/source-parser.ts', async () => { + const actual = await vi.importActual('../lib/parsers/source-parser.ts'); return { ...actual, isSourcePrivate: vi.fn().mockResolvedValue(false), @@ -74,14 +74,14 @@ vi.mock('./lib/parsers/source-parser.ts', async () => { import * as p from '@clack/prompts'; import { handleWellKnownSkills } from './add-wellknown.ts'; -import { wellKnownProvider } from './lib/providers/index.ts'; -import { detectInstalledAgents } from './lib/agents/index.ts'; -import { isSkillInstalled, installWellKnownSkillForAgent } from './lib/install/index.ts'; -import { track } from './lib/telemetry.ts'; -import { CommandError } from './lib/command-result.ts'; -import { addSkillToLock } from './lib/lock/index.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import { isSourcePrivate } from './lib/parsers/index.ts'; +import { wellKnownProvider } from '../lib/providers/index.ts'; +import { detectInstalledAgents } from '../lib/agents/index.ts'; +import { isSkillInstalled, installWellKnownSkillForAgent } from '../lib/install/index.ts'; +import { track } from '../lib/telemetry.ts'; +import { CommandError } from '../lib/command-result.ts'; +import { addSkillToLock } from '../lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from '../lib/lock/index.ts'; +import { isSourcePrivate } from '../lib/parsers/index.ts'; import { multiselect } from './add-agents.ts'; // --- Helpers --- diff --git a/src/add-wellknown.ts b/src/add/add-wellknown.ts similarity index 93% rename from src/add-wellknown.ts rename to src/add/add-wellknown.ts index 4d21cbb..97a789e 100644 --- a/src/add-wellknown.ts +++ b/src/add/add-wellknown.ts @@ -1,18 +1,18 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { isSourcePrivate } from './lib/parsers/index.ts'; -import { shortenPath, formatList } from './lib/utils.ts'; -import { getCanonicalPath, installWellKnownSkillForAgent } from './lib/install/index.ts'; -import { agents } from './lib/agents/index.ts'; -import { track } from './lib/telemetry.ts'; -import { wellKnownProvider, type WellKnownSkill } from './lib/providers/index.ts'; -import { addSkillToLock } from './lib/lock/index.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import type { AgentType } from './lib/types.ts'; +import { isSourcePrivate } from '../lib/parsers/index.ts'; +import { shortenPath, formatList } from '../lib/utils.ts'; +import { getCanonicalPath, installWellKnownSkillForAgent } from '../lib/install/index.ts'; +import { agents } from '../lib/agents/index.ts'; +import { track } from '../lib/telemetry.ts'; +import { wellKnownProvider, type WellKnownSkill } from '../lib/providers/index.ts'; +import { addSkillToLock } from '../lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from '../lib/lock/index.ts'; +import type { AgentType } from '../lib/types.ts'; import { buildAgentSummaryLines } from './add-display.ts'; import type { AddOptions } from './add-options.ts'; import { multiselect } from './add-agents.ts'; -import { CommandError } from './lib/command-result.ts'; +import { CommandError } from '../lib/command-result.ts'; import { resolveInstallTargets, checkOverwrites, diff --git a/src/add.test.ts b/src/add/add.test.ts similarity index 99% rename from src/add.test.ts rename to src/add/add.test.ts index 695c965..c4d4c33 100644 --- a/src/add.test.ts +++ b/src/add/add.test.ts @@ -2,8 +2,8 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli } from './lib/test-utils.ts'; -import { shouldInstallInternalSkills } from './lib/discovery/index.ts'; +import { runCli } from '../lib/test-utils.ts'; +import { shouldInstallInternalSkills } from '../lib/discovery/index.ts'; import { parseAddOptions } from './add.ts'; describe('add command', () => { diff --git a/src/add.ts b/src/add/add.ts similarity index 98% rename from src/add.ts rename to src/add/add.ts index ccf62a4..0d6dbdc 100644 --- a/src/add.ts +++ b/src/add/add.ts @@ -2,40 +2,40 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { existsSync } from 'fs'; import { sep } from 'path'; -import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from './lib/parsers/index.ts'; -import { shortenPath, formatList, kebabToTitle } from './lib/utils.ts'; +import { parseSource, getOwnerRepo, parseOwnerRepo, isRepoPrivate } from '../lib/parsers/index.ts'; +import { shortenPath, formatList, kebabToTitle } from '../lib/utils.ts'; import { multiselect } from './add-agents.ts'; export { promptForAgents } from './add-agents.ts'; -import { cloneRepo, cleanupTempDir, GitCloneError } from './lib/git/index.ts'; -import { CommandError } from './lib/command-result.ts'; +import { cloneRepo, cleanupTempDir, GitCloneError } from '../lib/git/index.ts'; +import { CommandError } from '../lib/command-result.ts'; import { addPrompts, addAgents, addInstructions, resolveTargetAgents, -} from './lib/install/index.ts'; -import { TARGET_AGENTS } from './lib/agents/index.ts'; +} from '../lib/install/index.ts'; +import { TARGET_AGENTS } from '../lib/agents/index.ts'; import { discoverSkills, getSkillDisplayName, filterSkills, discover, -} from './lib/discovery/index.ts'; -import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './lib/install/index.ts'; -import { agents } from './lib/agents/index.ts'; -import { track, setVersion, fetchAuditData } from './lib/telemetry.ts'; +} from '../lib/discovery/index.ts'; +import { installSkillForAgent, isSkillInstalled, getCanonicalPath } from '../lib/install/index.ts'; +import { agents } from '../lib/agents/index.ts'; +import { track, setVersion, fetchAuditData } from '../lib/telemetry.ts'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { addSkillToLock, fetchSkillFolderHash, isPromptDismissed, dismissPrompt, -} from './lib/lock/index.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './lib/lock/index.ts'; -import type { Skill, AgentType, TargetAgent, ContextType } from './lib/types.ts'; +} from '../lib/lock/index.ts'; +import { addSkillToLocalLock, computeSkillFolderHash } from '../lib/lock/index.ts'; +import type { Skill, AgentType, TargetAgent, ContextType } from '../lib/types.ts'; import { parseAddOptions, type AddOptions } from './add-options.ts'; export { parseAddOptions, type AddOptions } from './add-options.ts'; -import packageJson from '../package.json' with { type: 'json' }; +import packageJson from '../../package.json' with { type: 'json' }; import { buildSecurityLines, buildAgentSummaryLines } from './add-display.ts'; import { resolveInstallTargets, diff --git a/src/add/index.ts b/src/add/index.ts new file mode 100644 index 0000000..be0fcb5 --- /dev/null +++ b/src/add/index.ts @@ -0,0 +1,3 @@ +export { runAdd, initTelemetry } from './add.ts'; +export { parseAddOptions, type AddOptions } from './add-options.ts'; +export { promptForAgents } from './add-agents.ts'; diff --git a/src/cli.ts b/src/cli.ts index c62932a..4d26c19 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -3,7 +3,7 @@ import { readFileSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; -import { runAdd, parseAddOptions, initTelemetry } from './add.ts'; +import { runAdd, parseAddOptions, initTelemetry } from './add/index.ts'; import { runCheck, runUpdate } from './check.ts'; import { CommandError } from './lib/command-result.ts'; import { runFind } from './find.ts'; diff --git a/src/find.ts b/src/find.ts index ad0c08f..3c41a3d 100644 --- a/src/find.ts +++ b/src/find.ts @@ -1,7 +1,7 @@ import * as readline from 'readline'; import * as p from '@clack/prompts'; -import { runAdd } from './add.ts'; -import { parseAddOptions } from './add-options.ts'; +import { runAdd } from './add/add.ts'; +import { parseAddOptions } from './add/add-options.ts'; import { track } from './lib/telemetry.ts'; import { isRepoPrivate, parseOwnerRepo } from './lib/parsers/index.ts'; import { fetchRepoTree } from './lib/git/index.ts'; diff --git a/src/restore.ts b/src/restore.ts index 0641fee..66add3e 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -1,7 +1,7 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { readLocalLock } from './lib/lock/index.ts'; -import { runAdd } from './add.ts'; +import { runAdd } from './add/add.ts'; import { runSync, parseSyncOptions } from './sync.ts'; import { getUniversalAgents } from './lib/agents/index.ts'; import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; From e80b1bb53471a7e7338228b57d4f5f276074e940 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 19:02:28 +0200 Subject: [PATCH 10/12] refactor: move remaining commands to own directories --- src/{ => check}/check.test.ts | 8 ++++---- src/{ => check}/check.ts | 8 ++++---- src/check/index.ts | 8 ++++++++ src/cli.ts | 14 +++++++------- src/{ => find}/find.test.ts | 0 src/{ => find}/find.ts | 14 +++++++------- src/find/index.ts | 1 + src/init/index.ts | 1 + src/{ => init}/init.test.ts | 2 +- src/{ => init}/init.ts | 4 ++-- src/{ => lib}/instruction-commands.test.ts | 6 +++--- src/{ => lib}/parser-parity.test.ts | 6 +++--- src/list/index.ts | 1 + src/{ => list}/list.test.ts | 4 ++-- src/{ => list}/list.ts | 14 +++++++------- src/remove/index.ts | 1 + src/{ => remove}/remove.test.ts | 4 ++-- src/{ => remove}/remove.ts | 20 ++++++++++---------- src/restore/index.ts | 1 + src/{ => restore}/restore.ts | 18 +++++++++--------- src/sync/index.ts | 1 + src/{ => sync}/sync.test.ts | 2 +- src/{ => sync}/sync.ts | 20 ++++++++++---------- tests/e2e-cli-matrix.test.ts | 2 +- tests/e2e-remove.test.ts | 2 +- tests/gitignore-integration.test.ts | 2 +- tests/remove-canonical.test.ts | 2 +- 27 files changed, 90 insertions(+), 76 deletions(-) rename src/{ => check}/check.test.ts (95%) rename src/{ => check}/check.ts (97%) create mode 100644 src/check/index.ts rename src/{ => find}/find.test.ts (100%) rename src/{ => find}/find.ts (98%) create mode 100644 src/find/index.ts create mode 100644 src/init/index.ts rename src/{ => init}/init.test.ts (99%) rename src/{ => init}/init.ts (98%) rename src/{ => lib}/instruction-commands.test.ts (98%) rename src/{ => lib}/parser-parity.test.ts (98%) create mode 100644 src/list/index.ts rename src/{ => list}/list.test.ts (99%) rename src/{ => list}/list.ts (96%) create mode 100644 src/remove/index.ts rename src/{ => remove}/remove.test.ts (99%) rename src/{ => remove}/remove.ts (96%) create mode 100644 src/restore/index.ts rename src/{ => restore}/restore.ts (95%) create mode 100644 src/sync/index.ts rename src/{ => sync}/sync.test.ts (98%) rename src/{ => sync}/sync.ts (95%) diff --git a/src/check.test.ts b/src/check/check.test.ts similarity index 95% rename from src/check.test.ts rename to src/check/check.test.ts index e121084..12c4dec 100644 --- a/src/check.test.ts +++ b/src/check/check.test.ts @@ -1,17 +1,17 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { findSkillUpdates } from './check.ts'; -import type { SkillLockEntry } from './lib/lock/index.ts'; +import type { SkillLockEntry } from '../lib/lock/index.ts'; // Mock fetchSkillFolderHash from skill-lock.ts -vi.mock('./lib/lock/skill-lock.ts', async (importOriginal) => { - const original = await importOriginal(); +vi.mock('../lib/lock/skill-lock.ts', async (importOriginal) => { + const original = await importOriginal(); return { ...original, fetchSkillFolderHash: vi.fn(), }; }); -import { fetchSkillFolderHash } from './lib/lock/index.ts'; +import { fetchSkillFolderHash } from '../lib/lock/index.ts'; const mockFetch = vi.mocked(fetchSkillFolderHash); function makeEntry(overrides: Partial = {}): SkillLockEntry { diff --git a/src/check.ts b/src/check/check.ts similarity index 97% rename from src/check.ts rename to src/check/check.ts index 71752a7..fb4017e 100644 --- a/src/check.ts +++ b/src/check/check.ts @@ -4,10 +4,10 @@ import { getGitHubToken, readSkillLock, type SkillLockEntry, -} from './lib/lock/index.ts'; -import { checkContextUpdates, updateContext } from './lib/install/index.ts'; -import { track } from './lib/telemetry.ts'; -import { RESET, DIM, TEXT } from './lib/utils.ts'; +} from '../lib/lock/index.ts'; +import { checkContextUpdates, updateContext } from '../lib/install/index.ts'; +import { track } from '../lib/telemetry.ts'; +import { RESET, DIM, TEXT } from '../lib/utils.ts'; // ============================================ // Shared skill update detection diff --git a/src/check/index.ts b/src/check/index.ts new file mode 100644 index 0000000..5fb2a83 --- /dev/null +++ b/src/check/index.ts @@ -0,0 +1,8 @@ +export { + runCheck, + runUpdate, + findSkillUpdates, + type SkillUpdate, + type SkillCheckError, + type SkillCheckResult, +} from './check.ts'; diff --git a/src/cli.ts b/src/cli.ts index 4d26c19..87e0bcb 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,14 +4,14 @@ import { readFileSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import { runAdd, parseAddOptions, initTelemetry } from './add/index.ts'; -import { runCheck, runUpdate } from './check.ts'; +import { runCheck, runUpdate } from './check/index.ts'; import { CommandError } from './lib/command-result.ts'; -import { runFind } from './find.ts'; -import { runInit } from './init.ts'; -import { runInstallFromLock } from './restore.ts'; -import { runList } from './list.ts'; -import { removeCommand, parseRemoveOptions } from './remove.ts'; -import { runSync, parseSyncOptions } from './sync.ts'; +import { runFind } from './find/index.ts'; +import { runInit } from './init/index.ts'; +import { runInstallFromLock } from './restore/index.ts'; +import { runList } from './list/index.ts'; +import { removeCommand, parseRemoveOptions } from './remove/index.ts'; +import { runSync, parseSyncOptions } from './sync/index.ts'; import { RESET, BOLD, DIM, TEXT, YELLOW } from './lib/utils.ts'; const __dirname = dirname(fileURLToPath(import.meta.url)); diff --git a/src/find.test.ts b/src/find/find.test.ts similarity index 100% rename from src/find.test.ts rename to src/find/find.test.ts diff --git a/src/find.ts b/src/find/find.ts similarity index 98% rename from src/find.ts rename to src/find/find.ts index 3c41a3d..21246be 100644 --- a/src/find.ts +++ b/src/find/find.ts @@ -1,12 +1,12 @@ import * as readline from 'readline'; import * as p from '@clack/prompts'; -import { runAdd } from './add/add.ts'; -import { parseAddOptions } from './add/add-options.ts'; -import { track } from './lib/telemetry.ts'; -import { isRepoPrivate, parseOwnerRepo } from './lib/parsers/index.ts'; -import { fetchRepoTree } from './lib/git/index.ts'; -import { discoverRemoteContext, type RemoteContextSummary } from './lib/discovery/index.ts'; -import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './lib/utils.ts'; +import { runAdd } from '../add/add.ts'; +import { parseAddOptions } from '../add/add-options.ts'; +import { track } from '../lib/telemetry.ts'; +import { isRepoPrivate, parseOwnerRepo } from '../lib/parsers/index.ts'; +import { fetchRepoTree } from '../lib/git/index.ts'; +import { discoverRemoteContext, type RemoteContextSummary } from '../lib/discovery/index.ts'; +import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from '../lib/utils.ts'; // API endpoint for skills search const SEARCH_API_BASE = process.env.SKILLS_API_URL || 'https://skills.sh'; diff --git a/src/find/index.ts b/src/find/index.ts new file mode 100644 index 0000000..58a8603 --- /dev/null +++ b/src/find/index.ts @@ -0,0 +1 @@ +export { runFind, formatInstalls, searchSkillsAPI, type SearchSkill } from './find.ts'; diff --git a/src/init/index.ts b/src/init/index.ts new file mode 100644 index 0000000..27bfeee --- /dev/null +++ b/src/init/index.ts @@ -0,0 +1 @@ +export { runInit } from './init.ts'; diff --git a/src/init.test.ts b/src/init/init.test.ts similarity index 99% rename from src/init.test.ts rename to src/init/init.test.ts index 39c6fde..ba3bbd3 100644 --- a/src/init.test.ts +++ b/src/init/init.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, rmSync, readFileSync, mkdirSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli, runCliOutput, stripLogo } from './lib/test-utils.ts'; +import { runCli, runCliOutput, stripLogo } from '../lib/test-utils.ts'; describe('init command', () => { let testDir: string; diff --git a/src/init.ts b/src/init/init.ts similarity index 98% rename from src/init.ts rename to src/init/init.ts index c909b5c..299cbb9 100644 --- a/src/init.ts +++ b/src/init/init.ts @@ -1,7 +1,7 @@ import { writeFileSync, existsSync, mkdirSync } from 'fs'; import { basename, join } from 'path'; -import { RESET, DIM, TEXT, BOLD, YELLOW } from './lib/utils.ts'; -import { KEBAB_CASE_PATTERN } from './lib/validation.ts'; +import { RESET, DIM, TEXT, BOLD, YELLOW } from '../lib/utils.ts'; +import { KEBAB_CASE_PATTERN } from '../lib/validation.ts'; // --------------------------------------------------------------------------- // Template configuration diff --git a/src/instruction-commands.test.ts b/src/lib/instruction-commands.test.ts similarity index 98% rename from src/instruction-commands.test.ts rename to src/lib/instruction-commands.test.ts index ae2d062..702a63f 100644 --- a/src/instruction-commands.test.ts +++ b/src/lib/instruction-commands.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync, readFileSync, mkdtempSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli } from './lib/test-utils.ts'; -import { parseListOptions } from './list.ts'; -import { addToGitignore, readManagedPaths } from './lib/git/index.ts'; +import { runCli } from './test-utils.ts'; +import { parseListOptions } from '../list/list.ts'; +import { addToGitignore, readManagedPaths } from './git/index.ts'; // --------------------------------------------------------------------------- // Helpers diff --git a/src/parser-parity.test.ts b/src/lib/parser-parity.test.ts similarity index 98% rename from src/parser-parity.test.ts rename to src/lib/parser-parity.test.ts index aefa80e..27ff4bf 100644 --- a/src/parser-parity.test.ts +++ b/src/lib/parser-parity.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; -import { parseListOptions } from './list.ts'; -import { parseRemoveOptions } from './remove.ts'; -import { parseSyncOptions } from './sync.ts'; +import { parseListOptions } from '../list/list.ts'; +import { parseRemoveOptions } from '../remove/remove.ts'; +import { parseSyncOptions } from '../sync/sync.ts'; /** * Parser parity tests: verify that shared flags (`--targets`, `--type`) produce diff --git a/src/list/index.ts b/src/list/index.ts new file mode 100644 index 0000000..76b63fd --- /dev/null +++ b/src/list/index.ts @@ -0,0 +1 @@ +export { runList, parseListOptions } from './list.ts'; diff --git a/src/list.test.ts b/src/list/list.test.ts similarity index 99% rename from src/list.test.ts rename to src/list/list.test.ts index 8c25a72..b0fc781 100644 --- a/src/list.test.ts +++ b/src/list/list.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { tmpdir, homedir } from 'os'; -import { runCli } from './lib/test-utils.ts'; +import { runCli } from '../lib/test-utils.ts'; import { parseListOptions } from './list.ts'; -import { shortenPath } from './lib/utils.ts'; +import { shortenPath } from '../lib/utils.ts'; describe('list command', () => { let testDir: string; diff --git a/src/list.ts b/src/list/list.ts similarity index 96% rename from src/list.ts rename to src/list/list.ts index 7e885d5..2dd7236 100644 --- a/src/list.ts +++ b/src/list/list.ts @@ -1,8 +1,8 @@ -import type { AgentType, ContextType, LockEntry, TargetAgent } from './lib/types.ts'; -import { agents } from './lib/agents/index.ts'; -import { listInstalledSkills, type InstalledSkill } from './lib/install/index.ts'; -import { getAllLockedSkills } from './lib/lock/index.ts'; -import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from './lib/lock/index.ts'; +import type { AgentType, ContextType, LockEntry, TargetAgent } from '../lib/types.ts'; +import { agents } from '../lib/agents/index.ts'; +import { listInstalledSkills, type InstalledSkill } from '../lib/install/index.ts'; +import { getAllLockedSkills } from '../lib/lock/index.ts'; +import { readDotaiLock, getLockEntriesByType, type DotaiLockFile } from '../lib/lock/index.ts'; import { RESET, BOLD, @@ -12,8 +12,8 @@ import { shortenPath, formatList, kebabToTitle, -} from './lib/utils.ts'; -import { consumeMultiValues, parseTypeFlag } from './cli-parse.ts'; +} from '../lib/utils.ts'; +import { consumeMultiValues, parseTypeFlag } from '../cli-parse.ts'; interface ListOptions { global?: boolean; diff --git a/src/remove/index.ts b/src/remove/index.ts new file mode 100644 index 0000000..30132a0 --- /dev/null +++ b/src/remove/index.ts @@ -0,0 +1 @@ +export { removeCommand, parseRemoveOptions, type RemoveOptions } from './remove.ts'; diff --git a/src/remove.test.ts b/src/remove/remove.test.ts similarity index 99% rename from src/remove.test.ts rename to src/remove/remove.test.ts index 27a9f99..4b84921 100644 --- a/src/remove.test.ts +++ b/src/remove/remove.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync, readdirSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli, runCliWithInput } from './lib/test-utils.js'; +import { runCli, runCliWithInput } from '../lib/test-utils.js'; import { parseRemoveOptions, removeCommand } from './remove.ts'; -import { CommandError } from './lib/command-result.ts'; +import { CommandError } from '../lib/command-result.ts'; vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); diff --git a/src/remove.ts b/src/remove/remove.ts similarity index 96% rename from src/remove.ts rename to src/remove/remove.ts index 160d672..71dfe87 100644 --- a/src/remove.ts +++ b/src/remove/remove.ts @@ -2,21 +2,21 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { readdir, rm, lstat, unlink, readFile, writeFile } from 'fs/promises'; import { join } from 'path'; -import { agents, detectInstalledAgents } from './lib/agents/index.ts'; -import { track } from './lib/telemetry.ts'; -import { removeSkillFromLock, getSkillFromLock } from './lib/lock/index.ts'; -import type { AgentType, ContextType, LockEntry } from './lib/types.ts'; +import { agents, detectInstalledAgents } from '../lib/agents/index.ts'; +import { track } from '../lib/telemetry.ts'; +import { removeSkillFromLock, getSkillFromLock } from '../lib/lock/index.ts'; +import type { AgentType, ContextType, LockEntry } from '../lib/types.ts'; import { getInstallPath, getCanonicalPath, getCanonicalSkillsDir, sanitizeName, -} from './lib/install/index.ts'; -import { readDotaiLock, removeLockEntry, writeDotaiLock } from './lib/lock/index.ts'; -import { removeSection } from './lib/install/index.ts'; -import { removeFromGitignore } from './lib/git/index.ts'; -import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; -import { CommandError } from './lib/command-result.ts'; +} from '../lib/install/index.ts'; +import { readDotaiLock, removeLockEntry, writeDotaiLock } from '../lib/lock/index.ts'; +import { removeSection } from '../lib/install/index.ts'; +import { removeFromGitignore } from '../lib/git/index.ts'; +import { consumeMultiValues, VALID_CONTEXT_TYPES } from '../cli-parse.ts'; +import { CommandError } from '../lib/command-result.ts'; export interface RemoveOptions { global?: boolean; diff --git a/src/restore/index.ts b/src/restore/index.ts new file mode 100644 index 0000000..1b8123a --- /dev/null +++ b/src/restore/index.ts @@ -0,0 +1 @@ +export { runInstallFromLock } from './restore.ts'; diff --git a/src/restore.ts b/src/restore/restore.ts similarity index 95% rename from src/restore.ts rename to src/restore/restore.ts index 66add3e..5c8c702 100644 --- a/src/restore.ts +++ b/src/restore/restore.ts @@ -1,14 +1,14 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; -import { readLocalLock } from './lib/lock/index.ts'; -import { runAdd } from './add/add.ts'; -import { runSync, parseSyncOptions } from './sync.ts'; -import { getUniversalAgents } from './lib/agents/index.ts'; -import { readDotaiLock, getLockEntriesByType } from './lib/lock/index.ts'; -import { addPrompts, addAgents } from './lib/install/index.ts'; -import { parseSource } from './lib/parsers/index.ts'; -import { cloneRepo, cleanupTempDir } from './lib/git/index.ts'; -import type { LockEntry, TargetAgent } from './lib/types.ts'; +import { readLocalLock } from '../lib/lock/index.ts'; +import { runAdd } from '../add/add.ts'; +import { runSync, parseSyncOptions } from '../sync/sync.ts'; +import { getUniversalAgents } from '../lib/agents/index.ts'; +import { readDotaiLock, getLockEntriesByType } from '../lib/lock/index.ts'; +import { addPrompts, addAgents } from '../lib/install/index.ts'; +import { parseSource } from '../lib/parsers/index.ts'; +import { cloneRepo, cleanupTempDir } from '../lib/git/index.ts'; +import type { LockEntry, TargetAgent } from '../lib/types.ts'; /** * Install all context from lock files: diff --git a/src/sync/index.ts b/src/sync/index.ts new file mode 100644 index 0000000..e689cd4 --- /dev/null +++ b/src/sync/index.ts @@ -0,0 +1 @@ +export { runSync, parseSyncOptions, type SyncOptions } from './sync.ts'; diff --git a/src/sync.test.ts b/src/sync/sync.test.ts similarity index 98% rename from src/sync.test.ts rename to src/sync/sync.test.ts index bc8d8ed..adb9f72 100644 --- a/src/sync.test.ts +++ b/src/sync/sync.test.ts @@ -3,7 +3,7 @@ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; import { runSync, parseSyncOptions } from './sync.ts'; -import { CommandError } from './lib/command-result.ts'; +import { CommandError } from '../lib/command-result.ts'; vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); diff --git a/src/sync.ts b/src/sync/sync.ts similarity index 95% rename from src/sync.ts rename to src/sync/sync.ts index 8aba4c6..f49bbf8 100644 --- a/src/sync.ts +++ b/src/sync/sync.ts @@ -2,21 +2,21 @@ import * as p from '@clack/prompts'; import pc from 'picocolors'; import { readdir, stat } from 'fs/promises'; import { join } from 'path'; -import { parseSkillMd } from './lib/discovery/index.ts'; -import { installSkillForAgent, getCanonicalPath } from './lib/install/index.ts'; +import { parseSkillMd } from '../lib/discovery/index.ts'; +import { installSkillForAgent, getCanonicalPath } from '../lib/install/index.ts'; import { detectInstalledAgents, agents, getUniversalAgents, getNonUniversalAgents, -} from './lib/agents/index.ts'; -import { searchMultiselect } from './lib/prompts/search-multiselect.ts'; -import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './lib/lock/index.ts'; -import type { Skill, AgentType } from './lib/types.ts'; -import { CommandError } from './lib/command-result.ts'; -import { track } from './lib/telemetry.ts'; -import { shortenPath } from './lib/utils.ts'; -import { consumeMultiValues } from './cli-parse.ts'; +} from '../lib/agents/index.ts'; +import { searchMultiselect } from '../lib/prompts/search-multiselect.ts'; +import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from '../lib/lock/index.ts'; +import type { Skill, AgentType } from '../lib/types.ts'; +import { CommandError } from '../lib/command-result.ts'; +import { track } from '../lib/telemetry.ts'; +import { shortenPath } from '../lib/utils.ts'; +import { consumeMultiValues } from '../cli-parse.ts'; const isCancelled = (value: unknown): value is symbol => typeof value === 'symbol'; diff --git a/tests/e2e-cli-matrix.test.ts b/tests/e2e-cli-matrix.test.ts index 26b967d..39ab3f6 100644 --- a/tests/e2e-cli-matrix.test.ts +++ b/tests/e2e-cli-matrix.test.ts @@ -17,7 +17,7 @@ import { AGENT_AGENTS, } from './e2e-utils.ts'; import { addPrompts, addAgents } from '../src/lib/install/index.ts'; -import { removeCommand } from '../src/remove.ts'; +import { removeCommand } from '../src/remove/remove.ts'; import { checkContextUpdates, updateContext } from '../src/lib/install/index.ts'; import { runCli } from '../src/lib/test-utils.ts'; diff --git a/tests/e2e-remove.test.ts b/tests/e2e-remove.test.ts index 30d45bf..02b8758 100644 --- a/tests/e2e-remove.test.ts +++ b/tests/e2e-remove.test.ts @@ -17,7 +17,7 @@ import { AGENT_AGENTS, } from './e2e-utils.ts'; import { addPrompts, addAgents } from '../src/lib/install/index.ts'; -import { removeCommand } from '../src/remove.ts'; +import { removeCommand } from '../src/remove/remove.ts'; // --------------------------------------------------------------------------- // E2E Remove Flow Tests diff --git a/tests/gitignore-integration.test.ts b/tests/gitignore-integration.test.ts index d9b5574..5bd6862 100644 --- a/tests/gitignore-integration.test.ts +++ b/tests/gitignore-integration.test.ts @@ -6,7 +6,7 @@ import { relative } from 'path'; import { addPrompts } from '../src/lib/install/index.ts'; import { runCli } from '../src/lib/test-utils.ts'; import { readManagedPaths } from '../src/lib/git/index.ts'; -import { removeCommand } from '../src/remove.ts'; +import { removeCommand } from '../src/remove/remove.ts'; import { createTempProjectDir, makeSimplePromptContent, diff --git a/tests/remove-canonical.test.ts b/tests/remove-canonical.test.ts index 7bfc173..656ba31 100644 --- a/tests/remove-canonical.test.ts +++ b/tests/remove-canonical.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { mkdir, rm, writeFile, lstat, symlink } from 'node:fs/promises'; import { join, resolve } from 'node:path'; import { tmpdir } from 'node:os'; -import { removeCommand } from '../src/remove.ts'; +import { removeCommand } from '../src/remove/remove.ts'; import * as agentsModule from '../src/lib/agents/agents.ts'; // Mock detectInstalledAgents From 083d5961ff01800aa2ce9fa4b6c770bd489490e3 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 19:08:03 +0200 Subject: [PATCH 11/12] chore: normalize import extensions to .ts --- src/add/add-agents.test.ts | 12 ++++++------ src/add/add-prompt.test.ts | 12 ++++++------ src/lib/git/gitignore.test.ts | 2 +- src/lib/lock/dotai-lock.test.ts | 6 +++--- src/lib/lock/dotai-lock.ts | 2 +- src/lib/parsers/source-parser.test.ts | 2 +- src/remove/remove.test.ts | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/add/add-agents.test.ts b/src/add/add-agents.test.ts index 53dd50f..d28ceb3 100644 --- a/src/add/add-agents.test.ts +++ b/src/add/add-agents.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { multiselect, promptForAgents, selectAgentsInteractive } from './add-agents.js'; -import * as skillLock from '../lib/lock/skill-lock.js'; -import * as searchMultiselectModule from '../lib/prompts/search-multiselect.js'; +import { multiselect, promptForAgents, selectAgentsInteractive } from './add-agents.ts'; +import * as skillLock from '../lib/lock/skill-lock.ts'; +import * as searchMultiselectModule from '../lib/prompts/search-multiselect.ts'; import * as clack from '@clack/prompts'; -import * as agentsModule from '../lib/agents/agents.js'; +import * as agentsModule from '../lib/agents/agents.ts'; // Mock dependencies -vi.mock('../lib/lock/skill-lock.js'); -vi.mock('../lib/prompts/search-multiselect.js'); +vi.mock('../lib/lock/skill-lock.ts'); +vi.mock('../lib/prompts/search-multiselect.ts'); vi.mock('@clack/prompts', async () => { const actual = await vi.importActual('@clack/prompts'); return { diff --git a/src/add/add-prompt.test.ts b/src/add/add-prompt.test.ts index 731518e..9b382d2 100644 --- a/src/add/add-prompt.test.ts +++ b/src/add/add-prompt.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { promptForAgents } from './add.js'; -import * as skillLock from '../lib/lock/skill-lock.js'; -import * as searchMultiselectModule from '../lib/prompts/search-multiselect.js'; +import { promptForAgents } from './add.ts'; +import * as skillLock from '../lib/lock/skill-lock.ts'; +import * as searchMultiselectModule from '../lib/prompts/search-multiselect.ts'; // Mock dependencies -vi.mock('../lib/lock/skill-lock.js'); -vi.mock('../lib/prompts/search-multiselect.js'); -vi.mock('../lib/telemetry.js', () => ({ +vi.mock('../lib/lock/skill-lock.ts'); +vi.mock('../lib/prompts/search-multiselect.ts'); +vi.mock('../lib/telemetry.ts', () => ({ setVersion: vi.fn(), track: vi.fn(), })); diff --git a/src/lib/git/gitignore.test.ts b/src/lib/git/gitignore.test.ts index 1afe794..56bd378 100644 --- a/src/lib/git/gitignore.test.ts +++ b/src/lib/git/gitignore.test.ts @@ -4,7 +4,7 @@ import { join } from 'path'; import { tmpdir } from 'os'; import { existsSync } from 'fs'; -import { addToGitignore, removeFromGitignore, readManagedPaths } from './gitignore.js'; +import { addToGitignore, removeFromGitignore, readManagedPaths } from './gitignore.ts'; // --------------------------------------------------------------------------- // Test helpers diff --git a/src/lib/lock/dotai-lock.test.ts b/src/lib/lock/dotai-lock.test.ts index facda38..e6ce08f 100644 --- a/src/lib/lock/dotai-lock.test.ts +++ b/src/lib/lock/dotai-lock.test.ts @@ -16,9 +16,9 @@ import { createEmptyLock, getCurrentVersion, LockVersionError, -} from './dotai-lock.js'; -import type { DotaiLockFile } from './dotai-lock.js'; -import type { LockEntry } from '../types.js'; +} from './dotai-lock.ts'; +import type { DotaiLockFile } from './dotai-lock.ts'; +import type { LockEntry } from '../types.ts'; // --------------------------------------------------------------------------- // Test helpers diff --git a/src/lib/lock/dotai-lock.ts b/src/lib/lock/dotai-lock.ts index 2d712be..fb59f3a 100644 --- a/src/lib/lock/dotai-lock.ts +++ b/src/lib/lock/dotai-lock.ts @@ -2,7 +2,7 @@ import { readFile, writeFile, rename } from 'fs/promises'; import { join } from 'path'; import { createHash } from 'crypto'; -import type { LockEntry, ContextType, ContextFormat, TargetAgent } from '../types.js'; +import type { LockEntry, ContextType, ContextFormat, TargetAgent } from '../types.ts'; import { LockVersionError } from './lock-version-error.ts'; // --------------------------------------------------------------------------- diff --git a/src/lib/parsers/source-parser.test.ts b/src/lib/parsers/source-parser.test.ts index 5f8c3bc..22f791a 100644 --- a/src/lib/parsers/source-parser.test.ts +++ b/src/lib/parsers/source-parser.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { parseSource } from './source-parser.js'; +import { parseSource } from './source-parser.ts'; describe('source-parser', () => { describe('GitLab Custom Domains & Subgroups', () => { diff --git a/src/remove/remove.test.ts b/src/remove/remove.test.ts index 4b84921..1aefbab 100644 --- a/src/remove/remove.test.ts +++ b/src/remove/remove.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { existsSync, rmSync, mkdirSync, writeFileSync, readdirSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { runCli, runCliWithInput } from '../lib/test-utils.js'; +import { runCli, runCliWithInput } from '../lib/test-utils.ts'; import { parseRemoveOptions, removeCommand } from './remove.ts'; import { CommandError } from '../lib/command-result.ts'; From 21719ac3a0dde17d7cf940e1b902fca3542d1e18 Mon Sep 17 00:00:00 2001 From: mfaux Date: Sat, 4 Apr 2026 19:18:49 +0200 Subject: [PATCH 12/12] fix: update script imports for new src/lib/agents/ path --- scripts/sync-agents.ts | 2 +- scripts/validate-agents.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/sync-agents.ts b/scripts/sync-agents.ts index 55b46d8..340c960 100644 --- a/scripts/sync-agents.ts +++ b/scripts/sync-agents.ts @@ -3,7 +3,7 @@ import { readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; import { homedir } from 'os'; -import { agents } from '../src/agents.ts'; +import { agents } from '../src/lib/agents/agents.ts'; const ROOT = join(import.meta.dirname, '..'); const README_PATH = join(ROOT, 'README.md'); diff --git a/scripts/validate-agents.ts b/scripts/validate-agents.ts index 21fb466..76687ec 100644 --- a/scripts/validate-agents.ts +++ b/scripts/validate-agents.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { agents } from '../src/agents.ts'; +import { agents } from '../src/lib/agents/agents.ts'; let hasErrors = false;