@swarmify/agents-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,120 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { AGENTS, ensureCommandsDir } from './agents.js';
4
+ import { markdownToToml } from './convert.js';
5
+ export function discoverSkills(repoPath) {
6
+ const skills = [];
7
+ const seen = new Set();
8
+ const sharedDir = path.join(repoPath, 'shared', 'commands');
9
+ if (fs.existsSync(sharedDir)) {
10
+ for (const file of fs.readdirSync(sharedDir)) {
11
+ if (file.endsWith('.md')) {
12
+ const name = file.replace('.md', '');
13
+ const sourcePath = path.join(sharedDir, file);
14
+ const content = fs.readFileSync(sourcePath, 'utf-8');
15
+ const description = extractDescription(content);
16
+ skills.push({
17
+ name,
18
+ description,
19
+ sourcePath,
20
+ isShared: true,
21
+ });
22
+ seen.add(name);
23
+ }
24
+ }
25
+ }
26
+ for (const agentId of Object.keys(AGENTS)) {
27
+ const agent = AGENTS[agentId];
28
+ const agentDir = path.join(repoPath, agentId, agent.commandsSubdir);
29
+ if (fs.existsSync(agentDir)) {
30
+ const ext = agent.format === 'toml' ? '.toml' : '.md';
31
+ for (const file of fs.readdirSync(agentDir)) {
32
+ if (file.endsWith(ext)) {
33
+ const name = file.replace(ext, '');
34
+ if (!seen.has(name)) {
35
+ const sourcePath = path.join(agentDir, file);
36
+ const content = fs.readFileSync(sourcePath, 'utf-8');
37
+ const description = extractDescription(content);
38
+ skills.push({
39
+ name,
40
+ description,
41
+ sourcePath,
42
+ isShared: false,
43
+ agentSpecific: agentId,
44
+ });
45
+ seen.add(name);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return skills;
52
+ }
53
+ function extractDescription(content) {
54
+ const match = content.match(/description:\s*(.+)/i);
55
+ if (match)
56
+ return match[1].trim();
57
+ const tomlMatch = content.match(/description\s*=\s*"([^"]+)"/);
58
+ if (tomlMatch)
59
+ return tomlMatch[1];
60
+ const firstLine = content.split('\n').find((l) => l.trim() && !l.startsWith('---'));
61
+ return firstLine?.slice(0, 80) || '';
62
+ }
63
+ export function resolveSkillSource(repoPath, skillName, agentId) {
64
+ const agent = AGENTS[agentId];
65
+ const ext = agent.format === 'toml' ? '.toml' : '.md';
66
+ const agentSpecific = path.join(repoPath, agentId, agent.commandsSubdir, `${skillName}${ext}`);
67
+ if (fs.existsSync(agentSpecific)) {
68
+ return agentSpecific;
69
+ }
70
+ const shared = path.join(repoPath, 'shared', 'commands', `${skillName}.md`);
71
+ if (fs.existsSync(shared)) {
72
+ return shared;
73
+ }
74
+ return null;
75
+ }
76
+ export function installSkill(sourcePath, agentId, skillName, method = 'symlink') {
77
+ const agent = AGENTS[agentId];
78
+ ensureCommandsDir(agentId);
79
+ const ext = agent.format === 'toml' ? '.toml' : '.md';
80
+ const targetPath = path.join(agent.commandsDir, `${skillName}${ext}`);
81
+ if (fs.existsSync(targetPath)) {
82
+ fs.unlinkSync(targetPath);
83
+ }
84
+ const sourceContent = fs.readFileSync(sourcePath, 'utf-8');
85
+ const sourceIsMarkdown = sourcePath.endsWith('.md');
86
+ const needsConversion = agent.format === 'toml' && sourceIsMarkdown;
87
+ if (needsConversion) {
88
+ const tomlContent = markdownToToml(skillName, sourceContent);
89
+ fs.writeFileSync(targetPath, tomlContent, 'utf-8');
90
+ return { path: targetPath, method: 'copy' };
91
+ }
92
+ if (method === 'symlink') {
93
+ fs.symlinkSync(sourcePath, targetPath);
94
+ return { path: targetPath, method: 'symlink' };
95
+ }
96
+ fs.copyFileSync(sourcePath, targetPath);
97
+ return { path: targetPath, method: 'copy' };
98
+ }
99
+ export function uninstallSkill(agentId, skillName) {
100
+ const agent = AGENTS[agentId];
101
+ const ext = agent.format === 'toml' ? '.toml' : '.md';
102
+ const targetPath = path.join(agent.commandsDir, `${skillName}${ext}`);
103
+ if (fs.existsSync(targetPath)) {
104
+ fs.unlinkSync(targetPath);
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ export function listInstalledSkills(agentId) {
110
+ const agent = AGENTS[agentId];
111
+ if (!fs.existsSync(agent.commandsDir)) {
112
+ return [];
113
+ }
114
+ const ext = agent.format === 'toml' ? '.toml' : '.md';
115
+ return fs
116
+ .readdirSync(agent.commandsDir)
117
+ .filter((f) => f.endsWith(ext))
118
+ .map((f) => f.replace(ext, ''));
119
+ }
120
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { State } from './types.js';
2
+ export declare function getAgentsDir(): string;
3
+ export declare function getPackagesDir(): string;
4
+ export declare function getReposDir(): string;
5
+ export declare function ensureAgentsDir(): void;
6
+ export declare function createDefaultState(): State;
7
+ export declare function readState(): State;
8
+ export declare function writeState(state: State): void;
9
+ export declare function updateState(updates: Partial<State>): State;
10
+ export declare function getRepoLocalPath(source: string): string;
11
+ export declare function getPackageLocalPath(source: string): string;
12
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAQxC,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAED,wBAAgB,kBAAkB,IAAI,KAAK,CAU1C;AAED,wBAAgB,SAAS,IAAI,KAAK,CAWjC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAG7C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAK1D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,79 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const HOME = os.homedir();
5
+ const AGENTS_DIR = path.join(HOME, '.agents');
6
+ const STATE_FILE = path.join(AGENTS_DIR, 'state.json');
7
+ const PACKAGES_DIR = path.join(AGENTS_DIR, 'packages');
8
+ const REPOS_DIR = path.join(AGENTS_DIR, 'repos');
9
+ export function getAgentsDir() {
10
+ return AGENTS_DIR;
11
+ }
12
+ export function getPackagesDir() {
13
+ return PACKAGES_DIR;
14
+ }
15
+ export function getReposDir() {
16
+ return REPOS_DIR;
17
+ }
18
+ export function ensureAgentsDir() {
19
+ if (!fs.existsSync(AGENTS_DIR)) {
20
+ fs.mkdirSync(AGENTS_DIR, { recursive: true });
21
+ }
22
+ if (!fs.existsSync(PACKAGES_DIR)) {
23
+ fs.mkdirSync(PACKAGES_DIR, { recursive: true });
24
+ }
25
+ if (!fs.existsSync(REPOS_DIR)) {
26
+ fs.mkdirSync(REPOS_DIR, { recursive: true });
27
+ }
28
+ }
29
+ export function createDefaultState() {
30
+ return {
31
+ version: '1.0',
32
+ lastSync: null,
33
+ source: null,
34
+ clis: {},
35
+ packages: {},
36
+ skills: {},
37
+ mcp: {},
38
+ };
39
+ }
40
+ export function readState() {
41
+ ensureAgentsDir();
42
+ if (!fs.existsSync(STATE_FILE)) {
43
+ return createDefaultState();
44
+ }
45
+ try {
46
+ const content = fs.readFileSync(STATE_FILE, 'utf-8');
47
+ return JSON.parse(content);
48
+ }
49
+ catch {
50
+ return createDefaultState();
51
+ }
52
+ }
53
+ export function writeState(state) {
54
+ ensureAgentsDir();
55
+ fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), 'utf-8');
56
+ }
57
+ export function updateState(updates) {
58
+ const state = readState();
59
+ const newState = { ...state, ...updates };
60
+ writeState(newState);
61
+ return newState;
62
+ }
63
+ export function getRepoLocalPath(source) {
64
+ const sanitized = source
65
+ .replace(/^gh:/, '')
66
+ .replace(/^https?:\/\/github\.com\//, '')
67
+ .replace(/\.git$/, '')
68
+ .replace(/\//g, '-');
69
+ return path.join(REPOS_DIR, sanitized);
70
+ }
71
+ export function getPackageLocalPath(source) {
72
+ const sanitized = source
73
+ .replace(/^gh:/, '')
74
+ .replace(/^https?:\/\/github\.com\//, '')
75
+ .replace(/\.git$/, '')
76
+ .replace(/\//g, '-');
77
+ return path.join(PACKAGES_DIR, sanitized);
78
+ }
79
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ export type AgentId = 'claude' | 'codex' | 'gemini' | 'cursor' | 'opencode' | 'trae';
2
+ export interface AgentConfig {
3
+ id: AgentId;
4
+ name: string;
5
+ cliCommand: string;
6
+ npmPackage: string;
7
+ configDir: string;
8
+ commandsDir: string;
9
+ commandsSubdir: string;
10
+ format: 'markdown' | 'toml';
11
+ variableSyntax: string;
12
+ capabilities: {
13
+ hooks: boolean;
14
+ mcp: boolean;
15
+ allowlist: boolean;
16
+ };
17
+ }
18
+ export interface CliConfig {
19
+ package: string;
20
+ version: string;
21
+ }
22
+ export interface McpServerConfig {
23
+ command: string;
24
+ transport: 'stdio' | 'sse';
25
+ scope: 'user' | 'project';
26
+ agents: AgentId[];
27
+ env?: Record<string, string>;
28
+ }
29
+ export interface Manifest {
30
+ clis?: Partial<Record<AgentId, CliConfig>>;
31
+ dependencies?: Record<string, string>;
32
+ mcp?: Record<string, McpServerConfig>;
33
+ defaults?: {
34
+ method?: 'symlink' | 'copy';
35
+ scope?: 'global' | 'project';
36
+ agents?: AgentId[];
37
+ };
38
+ }
39
+ export interface CliState {
40
+ installed: boolean;
41
+ version: string | null;
42
+ path: string | null;
43
+ }
44
+ export interface SkillInstallation {
45
+ path: string;
46
+ method: 'symlink' | 'copy';
47
+ }
48
+ export interface SkillState {
49
+ source: string;
50
+ installations: Partial<Record<AgentId, SkillInstallation>>;
51
+ }
52
+ export interface McpState {
53
+ registeredWith: AgentId[];
54
+ version?: string;
55
+ }
56
+ export interface PackageState {
57
+ localPath: string;
58
+ commit: string;
59
+ installedAt: string;
60
+ }
61
+ export interface State {
62
+ version: string;
63
+ lastSync: string | null;
64
+ source: string | null;
65
+ clis: Partial<Record<AgentId, CliState>>;
66
+ packages: Record<string, PackageState>;
67
+ skills: Record<string, SkillState>;
68
+ mcp: Record<string, McpState>;
69
+ }
70
+ export interface SyncOptions {
71
+ agents?: AgentId[];
72
+ yes?: boolean;
73
+ force?: boolean;
74
+ dryRun?: boolean;
75
+ skipClis?: boolean;
76
+ skipMcp?: boolean;
77
+ }
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;QAC7B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,QAAQ;IACvB,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@swarmify/agents-cli",
3
+ "version": "1.0.0",
4
+ "description": "Dotfiles manager for AI coding agents - sync skills, MCP servers, hooks, and CLI versions",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "agents": "dist/index.js",
9
+ "ag": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/muqsitnawaz/swarmify.git",
17
+ "directory": "agents-cli"
18
+ },
19
+ "homepage": "https://github.com/muqsitnawaz/swarmify/tree/main/agents-cli",
20
+ "bugs": {
21
+ "url": "https://github.com/muqsitnawaz/swarmify/issues"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "prepublishOnly": "tsc",
26
+ "dev": "tsx src/index.ts",
27
+ "start": "node dist/index.js",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest"
30
+ },
31
+ "keywords": [
32
+ "agents",
33
+ "cli",
34
+ "dotfiles",
35
+ "claude",
36
+ "codex",
37
+ "gemini",
38
+ "cursor",
39
+ "opencode",
40
+ "mcp",
41
+ "skills",
42
+ "ai",
43
+ "sync",
44
+ "multi-agent"
45
+ ],
46
+ "author": "Swarmify <dev@swarmify.co>",
47
+ "license": "MIT",
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ },
51
+ "dependencies": {
52
+ "@inquirer/prompts": "^7.0.0",
53
+ "chalk": "^5.3.0",
54
+ "commander": "^12.1.0",
55
+ "diff": "^7.0.0",
56
+ "ora": "^8.1.0",
57
+ "semver": "^7.6.0",
58
+ "simple-git": "^3.27.0",
59
+ "yaml": "^2.6.0"
60
+ },
61
+ "devDependencies": {
62
+ "@types/diff": "^6.0.0",
63
+ "@types/node": "^22.0.0",
64
+ "@types/semver": "^7.5.0",
65
+ "tsx": "^4.19.0",
66
+ "typescript": "^5.5.0",
67
+ "vitest": "^2.0.0"
68
+ }
69
+ }