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; 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 4bcda9f..d28ceb3 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 './skill-lock.js'; -import * as searchMultiselectModule from './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 './agents.js'; +import * as agentsModule from '../lib/agents/agents.ts'; // Mock dependencies -vi.mock('./skill-lock.js'); -vi.mock('./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-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 736aab4..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 './prompts/search-multiselect.ts'; -import { agents, getUniversalAgents, getNonUniversalAgents } from './agents.ts'; -import { getLastSelectedAgents, saveSelectedAgents } from './skill-lock.ts'; -import type { AgentType } from './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 4e9e1f0..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 './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/add-display.ts similarity index 94% rename from src/add-display.ts rename to src/add/add-display.ts index 0216051..5593bc0 100644 --- a/src/add-display.ts +++ b/src/add/add-display.ts @@ -1,9 +1,9 @@ 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 { AuditResponse, PartnerAudit } from './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 fd3c5f6..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 './types.ts'; +import type { AgentType } from '../lib/types.ts'; // --- Mocks --- @@ -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(), @@ -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(), @@ -49,10 +49,10 @@ 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 './skill-installer.ts'; -import { CommandError } from './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 f1d5295..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 './skill-installer.ts'; -import { detectInstalledAgents, agents } from './agents.ts'; -import type { AgentType } from './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 './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.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 b9640ba..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 './context-add.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 073f486..00a4563 100644 --- a/src/add-options.ts +++ b/src/add/add-options.ts @@ -1,5 +1,5 @@ -import type { ContextType } from './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 90% rename from src/add-prompt.test.ts rename to src/add/add-prompt.test.ts index b74e500..9b382d2 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 './skill-lock.js'; -import * as searchMultiselectModule from './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('./skill-lock.js'); -vi.mock('./prompts/search-multiselect.js'); -vi.mock('./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(), })); -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 53d08b5..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 './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,23 +18,23 @@ 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'), }, })); -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(), }; }); -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), @@ -49,21 +49,21 @@ vi.mock('./add-agents.ts', () => ({ selectAgentsInteractive: vi.fn(), })); -vi.mock('./telemetry.ts', () => ({ +vi.mock('../lib/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'), })); -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), @@ -74,14 +74,14 @@ vi.mock('./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 { 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 { isSourcePrivate } from './source-parser.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 9c21f37..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 './source-parser.ts'; -import { shortenPath, formatList } from './utils.ts'; -import { getCanonicalPath, installWellKnownSkillForAgent } from './skill-installer.ts'; -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 type { AgentType } from './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 './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 e736358..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 './test-utils.ts'; -import { shouldInstallInternalSkills } from './skill-discovery.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 97% rename from src/add.ts rename to src/add/add.ts index 1020870..0d6dbdc 100644 --- a/src/add.ts +++ b/src/add/add.ts @@ -2,31 +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 './source-parser.ts'; -import { shortenPath, formatList, kebabToTitle } from './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 './git.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 { installSkillForAgent, isSkillInstalled, getCanonicalPath } from './skill-installer.ts'; -import { agents } from './agents.ts'; -import { track, setVersion, fetchAuditData } from './telemetry.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'; +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'; import { handleWellKnownSkills } from './add-wellknown.ts'; import { addSkillToLock, fetchSkillFolderHash, isPromptDismissed, dismissPrompt, -} from './skill-lock.ts'; -import { addSkillToLocalLock, computeSkillFolderHash } from './local-lock.ts'; -import type { Skill, AgentType, TargetAgent, ContextType } from './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/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 f6dcc29..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 './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/check.ts similarity index 97% rename from src/check.ts rename to src/check/check.ts index e08fbef..fb4017e 100644 --- a/src/check.ts +++ b/src/check/check.ts @@ -4,10 +4,10 @@ import { getGitHubToken, readSkillLock, type SkillLockEntry, -} from './skill-lock.ts'; -import { checkContextUpdates, updateContext } from './context-check.ts'; -import { track } from './telemetry.ts'; -import { RESET, DIM, TEXT } from './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-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..87e0bcb 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -3,16 +3,16 @@ import { readFileSync } from 'fs'; 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 { 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 { runAdd, parseAddOptions, initTelemetry } from './add/index.ts'; +import { runCheck, runUpdate } from './check/index.ts'; +import { CommandError } from './lib/command-result.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 ff770c8..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.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 { discoverRemoteContext, type RemoteContextSummary } from './find-discovery.ts'; -import { RESET, BOLD, DIM, TEXT, CYAN, MAGENTA, YELLOW } from './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 04e0623..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 './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 4709103..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 './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/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..ae0bd6a 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..70d0644 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/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/context-discovery.ts b/src/lib/discovery/context-discovery.ts similarity index 98% rename from src/context-discovery.ts rename to src/lib/discovery/context-discovery.ts index faa7322..a1092ea 100644 --- a/src/context-discovery.ts +++ b/src/lib/discovery/context-discovery.ts @@ -1,10 +1,12 @@ 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 { targetAgents } from './target-agents.ts'; -import type { ContextFormat, ContextType, DiscoveredItem, TargetAgent } from './types.ts'; +import { + parseAgentContent, + parseInstructionContent, + parsePromptContent, +} from '../parsers/index.ts'; +import { targetAgents } from '../agents/index.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 65a18b6..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 './github-trees.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 894fcb9..4cf76e4 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 './github-trees.ts'; -import { targetAgents } from './target-agents.ts'; +import type { ContextType } from '../types.ts'; +import type { GitHubTreeEntry } from '../git/index.ts'; +import { targetAgents } from '../agents/index.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 98% rename from src/skill-discovery.ts rename to src/lib/discovery/skill-discovery.ts index 457b72b..1e4725f 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/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 95% rename from src/github-trees.ts rename to src/lib/git/github-trees.ts index 4aec111..5a9bc79 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 '../lock/skill-lock.ts'; export interface GitHubTreeEntry { path: string; diff --git a/src/gitignore.test.ts b/src/lib/git/gitignore.test.ts similarity index 99% rename from src/gitignore.test.ts rename to src/lib/git/gitignore.test.ts index 1afe794..56bd378 100644 --- a/src/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/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/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..593c142 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..beceb82 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 7e102e4..3d8bc73 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 './context-discovery.ts'; +import { discover, filterByType } from '../discovery/index.ts'; import { executeInstallPipeline } from './context-installer.ts'; import { readDotaiLock, writeDotaiLock, upsertLockEntry, computeContentHash, -} from './dotai-lock.ts'; -import { loadModelOverrides } from './model-aliases.ts'; -import { TARGET_AGENTS } from './target-agents.ts'; -import { addToGitignore } from './gitignore.ts'; -import type { DiscoveredItem, LockEntry, TargetAgent } from './types.ts'; +} from '../lock/index.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'; // --------------------------------------------------------------------------- // 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 ad05a2a..dfa3b44 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 './git.ts'; -import { parseSource } from './source-parser.ts'; -import { discover, filterByType } from './context-discovery.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 './dotai-lock.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 '../agents/index.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 97% rename from src/context-installer.ts rename to src/lib/install/context-installer.ts index 3a037e9..12606d6 100644 --- a/src/context-installer.ts +++ b/src/lib/install/context-installer.ts @@ -7,11 +7,13 @@ import type { PlannedWrite, LockEntry, 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'; +} from '../types.ts'; +import type { ModelOverrides } from '../model-aliases.ts'; +import { + transpilePromptForAllAgents, + transpileAgentForAllAgents, + transpileInstructionForAllAgents, +} 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 c72587f..29fa455 100644 --- a/src/instruction-check.test.ts +++ b/src/lib/install/instruction-check.test.ts @@ -9,9 +9,9 @@ import { createEmptyLock, upsertLockEntry, computeContentHash, -} from './dotai-lock.ts'; -import type { DotaiLockFile } from './dotai-lock.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..d31b346 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 fd487a9..d46b272 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 './skill-discovery.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 { parseSkillMd } from '../discovery/index.ts'; export type InstallMode = 'symlink' | 'copy'; 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 05369cb..702a63f 100644 --- a/src/instruction-commands.test.ts +++ b/src/lib/instruction-commands.test.ts @@ -3,8 +3,8 @@ import { existsSync, rmSync, mkdirSync, writeFileSync, readFileSync, mkdtempSync 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 { parseListOptions } from '../list/list.ts'; +import { addToGitignore, readManagedPaths } from './git/index.ts'; // --------------------------------------------------------------------------- // Helpers 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..e6ce08f 100644 --- a/src/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/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..fb59f3a 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.ts'; 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 dd93f95..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 './github-trees.ts'; +import { fetchRepoTree } from '../git/index.ts'; const AGENTS_DIR = '.agents'; const LOCK_FILE = '.skill-lock.json'; 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 f2e4d77..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 './target-agents.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/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/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..2ffd40e 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..8bd2ed3 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..5f54cb3 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..83216cb 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 '../agents/index.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..a3b2d55 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 98% rename from src/source-parser.test.ts rename to src/lib/parsers/source-parser.test.ts index 5f8c3bc..22f791a 100644 --- a/src/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/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..1ba21c0 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/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/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 409a3c4..438df4f 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 './override-parser.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..37da9a6 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 '../agents/index.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 8310385..cad3943 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 './agent-parser.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'; +} 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 { 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..0d2ee9d 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 '../agents/index.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 030b56a..f7eba72 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 './instruction-parser.ts'; -import { getTargetAgentConfig } from './target-agents.ts'; -import { mergeOverrides } from './override-parser.ts'; +} from '../types.ts'; +import { parseInstructionContent } from '../parsers/index.ts'; +import { getTargetAgentConfig } from '../agents/index.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 1edc26f..5af0a94 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 './override-parser.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..dec49ff 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 '../agents/index.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 8ea7210..9c2c6f8 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 './prompt-parser.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'; +} 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 { 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 97% rename from src/transpiler.ts rename to src/lib/transpilers/transpiler.ts index 81fdb8a..a7aeba5 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. 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/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 7a57ea8..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 './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/list.ts similarity index 96% rename from src/list.ts rename to src/list/list.ts index 9adcc4f..2dd7236 100644 --- a/src/list.ts +++ b/src/list/list.ts @@ -1,10 +1,19 @@ -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 { RESET, BOLD, DIM, CYAN, YELLOW, shortenPath, formatList, kebabToTitle } from './utils.ts'; -import { consumeMultiValues, parseTypeFlag } from './cli-parse.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 '../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 bf6606c..1aefbab 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 './test-utils.js'; +import { runCli, runCliWithInput } from '../lib/test-utils.ts'; 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/remove.ts similarity index 96% rename from src/remove.ts rename to src/remove/remove.ts index 3b92606..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 './agents.ts'; -import { track } from './telemetry.ts'; -import { removeSkillFromLock, getSkillFromLock } from './skill-lock.ts'; -import type { AgentType, ContextType, LockEntry } from './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 './skill-installer.ts'; -import { readDotaiLock, removeLockEntry, writeDotaiLock } from './dotai-lock.ts'; -import { removeSection } from './append-markers.ts'; -import { removeFromGitignore } from './gitignore.ts'; -import { consumeMultiValues, VALID_CONTEXT_TYPES } from './cli-parse.ts'; -import { CommandError } from './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 e30d592..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 './local-lock.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 { addPrompts, addAgents } from './context-add.ts'; -import { parseSource } from './source-parser.ts'; -import { cloneRepo, cleanupTempDir } from './git.ts'; -import type { LockEntry, TargetAgent } from './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 07ae25e..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 './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 c468486..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 './skill-discovery.ts'; -import { installSkillForAgent, getCanonicalPath } from './skill-installer.ts'; +import { parseSkillMd } from '../lib/discovery/index.ts'; +import { installSkillForAgent, getCanonicalPath } from '../lib/install/index.ts'; import { detectInstalledAgents, agents, getUniversalAgents, getNonUniversalAgents, -} from './agents.ts'; -import { searchMultiselect } from './prompts/search-multiselect.ts'; -import { addSkillToLocalLock, computeSkillFolderHash, readLocalLock } from './local-lock.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 { 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/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 beed58e..7e1fab5 100644 --- a/tests/cross-platform-paths.test.ts +++ b/tests/cross-platform-paths.test.ts @@ -9,14 +9,14 @@ 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, createEmptyLock, upsertLockEntry, -} from '../src/dotai-lock.ts'; -import type { TranspiledOutput, LockEntry, TargetAgent } from '../src/types.ts'; +} from '../src/lib/lock/index.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-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..39ab3f6 100644 --- a/tests/e2e-cli-matrix.test.ts +++ b/tests/e2e-cli-matrix.test.ts @@ -16,10 +16,10 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; -import { removeCommand } from '../src/remove.ts'; -import { checkContextUpdates, updateContext } from '../src/context-check.ts'; -import { runCli } from '../src/test-utils.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.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'; // --------------------------------------------------------------------------- // E2E CLI Matrix Tests 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..74b96c1 100644 --- a/tests/e2e-instruction.test.ts +++ b/tests/e2e-instruction.test.ts @@ -1,8 +1,8 @@ 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 type { TargetAgent } from '../src/types.ts'; +import { addInstructions } from '../src/lib/install/index.ts'; +import type { TargetAgent } from '../src/lib/types.ts'; import { createTempProjectDir, createTestSourceRepo, 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..02b8758 100644 --- a/tests/e2e-remove.test.ts +++ b/tests/e2e-remove.test.ts @@ -16,8 +16,8 @@ import { PROMPT_AGENTS, AGENT_AGENTS, } from './e2e-utils.ts'; -import { addPrompts, addAgents } from '../src/context-add.ts'; -import { removeCommand } from '../src/remove.ts'; +import { addPrompts, addAgents } from '../src/lib/install/index.ts'; +import { removeCommand } from '../src/remove/remove.ts'; // --------------------------------------------------------------------------- // E2E Remove Flow Tests diff --git a/tests/e2e-update-flow.test.ts b/tests/e2e-update-flow.test.ts index a159d8c..bd874ab 100644 --- a/tests/e2e-update-flow.test.ts +++ b/tests/e2e-update-flow.test.ts @@ -14,9 +14,9 @@ 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 { computeContentHash } from '../src/dotai-lock.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'; // --------------------------------------------------------------------------- // E2E Update Flow Tests diff --git a/tests/e2e-utils.ts b/tests/e2e-utils.ts index 78b6730..1f13dc8 100644 --- a/tests/e2e-utils.ts +++ b/tests/e2e-utils.ts @@ -16,10 +16,10 @@ 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 { DotaiLockFile } from '../src/dotai-lock.ts'; -import { readDotaiLock } from '../src/dotai-lock.ts'; -import { targetAgents } from '../src/target-agents.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'; // --------------------------------------------------------------------------- // Temp project directory 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/gitignore-integration.test.ts b/tests/gitignore-integration.test.ts index a111bc9..5bd6862 100644 --- a/tests/gitignore-integration.test.ts +++ b/tests/gitignore-integration.test.ts @@ -3,10 +3,10 @@ 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 { runCli } from '../src/test-utils.ts'; -import { readManagedPaths } from '../src/gitignore.ts'; -import { removeCommand } from '../src/remove.ts'; +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/remove.ts'; import { createTempProjectDir, makeSimplePromptContent, diff --git a/tests/installer-symlink-fallback.test.ts b/tests/installer-symlink-fallback.test.ts index af8b612..5a64475 100644 --- a/tests/installer-symlink-fallback.test.ts +++ b/tests/installer-symlink-fallback.test.ts @@ -20,11 +20,11 @@ import { installSkillForAgent, installRemoteSkillForAgent, installWellKnownSkillForAgent, -} from '../src/skill-installer.ts'; -import { agents } from '../src/agents.ts'; -import type { AgentType } from '../src/types.ts'; -import type { RemoteSkill } from '../src/types.ts'; -import type { WellKnownSkill } from '../src/providers/wellknown.ts'; +} from '../src/lib/install/index.ts'; +import { agents } from '../src/lib/agents/index.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/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..34b13c3 100644 --- a/tests/list-installed.test.ts +++ b/tests/list-installed.test.ts @@ -2,8 +2,8 @@ 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 * as agentsModule from '../src/agents.ts'; +import { listInstalledSkills } from '../src/lib/install/index.ts'; +import * as agentsModule from '../src/lib/agents/agents.ts'; describe('listInstalledSkills', () => { let testDir: string; 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/plugin-grouping.test.ts b/tests/plugin-grouping.test.ts index 6161c4d..0432bd3 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 { 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'; 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/remove-canonical.test.ts b/tests/remove-canonical.test.ts index 3329987..656ba31 100644 --- a/tests/remove-canonical.test.ts +++ b/tests/remove-canonical.test.ts @@ -2,12 +2,12 @@ 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 * as agentsModule from '../src/agents.ts'; +import { removeCommand } from '../src/remove/remove.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/restore.test.ts b/tests/restore.test.ts index 3c30ead..2c4f613 100644 --- a/tests/restore.test.ts +++ b/tests/restore.test.ts @@ -3,9 +3,9 @@ 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 { addPrompts, addAgents } from '../src/context-add.ts'; -import { writeDotaiLock, createEmptyLock, readDotaiLock } from '../src/dotai-lock.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/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', () => { diff --git a/tests/skill-matching.test.ts b/tests/skill-matching.test.ts index 52de1db..3c56232 100644 --- a/tests/skill-matching.test.ts +++ b/tests/skill-matching.test.ts @@ -9,8 +9,8 @@ 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 type { Skill } from '../src/types.ts'; +import { filterSkills, parseSkillMd } from '../src/lib/discovery/index.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/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/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 b13239a..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(); @@ -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'); 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();