synarcx 0.3.3 → 0.3.4

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.
@@ -4,32 +4,32 @@ export const SYNSPEC_MARKERS = {
4
4
  end: '<!-- SYNSPEC:END -->'
5
5
  };
6
6
  export const AI_TOOLS = [
7
- { name: 'Amazon Q Developer', value: 'amazon-q', available: true, successLabel: 'Amazon Q Developer', skillsDir: '.amazonq' },
8
- { name: 'Antigravity', value: 'antigravity', available: true, successLabel: 'Antigravity', skillsDir: '.agent' },
9
- { name: 'Auggie (Augment CLI)', value: 'auggie', available: true, successLabel: 'Auggie', skillsDir: '.augment' },
10
- { name: 'Bob Shell', value: 'bob', available: true, successLabel: 'Bob Shell', skillsDir: '.bob' },
7
+ { name: 'Amazon Q Developer', value: 'amazon-q', available: true, successLabel: 'Amazon Q Developer', skillsDir: '.amazonq', hasCommands: true },
8
+ { name: 'Antigravity', value: 'antigravity', available: true, successLabel: 'Antigravity', skillsDir: '.agent', hasCommands: true },
9
+ { name: 'Auggie (Augment CLI)', value: 'auggie', available: true, successLabel: 'Auggie', skillsDir: '.augment', hasCommands: true },
10
+ { name: 'Bob Shell', value: 'bob', available: true, successLabel: 'Bob Shell', skillsDir: '.bob', hasCommands: true },
11
11
  { name: 'Claude Code', value: 'claude', available: true, successLabel: 'Claude Code', skillsDir: '.claude', hasCommands: true },
12
- { name: 'Cline', value: 'cline', available: true, successLabel: 'Cline', skillsDir: '.cline' },
13
- { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex' },
14
- { name: 'CodeBuddy Code (CLI)', value: 'codebuddy', available: true, successLabel: 'CodeBuddy Code', skillsDir: '.codebuddy' },
15
- { name: 'Continue', value: 'continue', available: true, successLabel: 'Continue (VS Code / JetBrains / Cli)', skillsDir: '.continue' },
16
- { name: 'CoStrict', value: 'costrict', available: true, successLabel: 'CoStrict', skillsDir: '.cospec' },
17
- { name: 'Crush', value: 'crush', available: true, successLabel: 'Crush', skillsDir: '.crush' },
18
- { name: 'Cursor', value: 'cursor', available: true, successLabel: 'Cursor', skillsDir: '.cursor' },
19
- { name: 'Factory Droid', value: 'factory', available: true, successLabel: 'Factory Droid', skillsDir: '.factory' },
20
- { name: 'Gemini CLI', value: 'gemini', available: true, successLabel: 'Gemini CLI', skillsDir: '.gemini' },
21
- { name: 'GitHub Copilot', value: 'github-copilot', available: true, successLabel: 'GitHub Copilot', skillsDir: '.github', detectionPaths: ['.github/copilot-instructions.md', '.github/instructions', '.github/workflows/copilot-setup-steps.yml', '.github/prompts', '.github/agents', '.github/skills', '.github/.mcp.json'] },
22
- { name: 'iFlow', value: 'iflow', available: true, successLabel: 'iFlow', skillsDir: '.iflow' },
23
- { name: 'Junie', value: 'junie', available: true, successLabel: 'Junie', skillsDir: '.junie' },
24
- { name: 'Kilo Code', value: 'kilocode', available: true, successLabel: 'Kilo Code', skillsDir: '.kilocode' },
25
- { name: 'Kiro', value: 'kiro', available: true, successLabel: 'Kiro', skillsDir: '.kiro' },
12
+ { name: 'Cline', value: 'cline', available: true, successLabel: 'Cline', skillsDir: '.cline', hasCommands: true },
13
+ { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex', hasCommands: true },
14
+ { name: 'CodeBuddy Code (CLI)', value: 'codebuddy', available: true, successLabel: 'CodeBuddy Code', skillsDir: '.codebuddy', hasCommands: true },
15
+ { name: 'Continue', value: 'continue', available: true, successLabel: 'Continue (VS Code / JetBrains / Cli)', skillsDir: '.continue', hasCommands: true },
16
+ { name: 'CoStrict', value: 'costrict', available: true, successLabel: 'CoStrict', skillsDir: '.cospec', hasCommands: true },
17
+ { name: 'Crush', value: 'crush', available: true, successLabel: 'Crush', skillsDir: '.crush', hasCommands: true },
18
+ { name: 'Cursor', value: 'cursor', available: true, successLabel: 'Cursor', skillsDir: '.cursor', hasCommands: true },
19
+ { name: 'Factory Droid', value: 'factory', available: true, successLabel: 'Factory Droid', skillsDir: '.factory', hasCommands: true },
20
+ { name: 'Gemini CLI', value: 'gemini', available: true, successLabel: 'Gemini CLI', skillsDir: '.gemini', hasCommands: true },
21
+ { name: 'GitHub Copilot', value: 'github-copilot', available: true, successLabel: 'GitHub Copilot', skillsDir: '.github', detectionPaths: ['.github/copilot-instructions.md', '.github/instructions', '.github/workflows/copilot-setup-steps.yml', '.github/prompts', '.github/agents', '.github/skills', '.github/.mcp.json'], hasCommands: true },
22
+ { name: 'iFlow', value: 'iflow', available: true, successLabel: 'iFlow', skillsDir: '.iflow', hasCommands: true },
23
+ { name: 'Junie', value: 'junie', available: true, successLabel: 'Junie', skillsDir: '.junie', hasCommands: true },
24
+ { name: 'Kilo Code', value: 'kilocode', available: true, successLabel: 'Kilo Code', skillsDir: '.kilocode', hasCommands: true },
25
+ { name: 'Kiro', value: 'kiro', available: true, successLabel: 'Kiro', skillsDir: '.kiro', hasCommands: true },
26
26
  { name: 'OpenCode', value: 'opencode', available: true, successLabel: 'OpenCode', skillsDir: '.opencode', hasCommands: true },
27
- { name: 'Pi', value: 'pi', available: true, successLabel: 'Pi', skillsDir: '.pi' },
28
- { name: 'Qoder', value: 'qoder', available: true, successLabel: 'Qoder', skillsDir: '.qoder' },
29
- { name: 'Lingma', value: 'lingma', available: true, successLabel: 'Lingma', skillsDir: '.lingma' },
30
- { name: 'Qwen Code', value: 'qwen', available: true, successLabel: 'Qwen Code', skillsDir: '.qwen' },
31
- { name: 'RooCode', value: 'roocode', available: true, successLabel: 'RooCode', skillsDir: '.roo' },
32
- { name: 'Windsurf', value: 'windsurf', available: true, successLabel: 'Windsurf', skillsDir: '.windsurf' },
27
+ { name: 'Pi', value: 'pi', available: true, successLabel: 'Pi', skillsDir: '.pi', hasCommands: true },
28
+ { name: 'Qoder', value: 'qoder', available: true, successLabel: 'Qoder', skillsDir: '.qoder', hasCommands: true },
29
+ { name: 'Lingma', value: 'lingma', available: true, successLabel: 'Lingma', skillsDir: '.lingma', hasCommands: true },
30
+ { name: 'Qwen Code', value: 'qwen', available: true, successLabel: 'Qwen Code', skillsDir: '.qwen', hasCommands: true },
31
+ { name: 'RooCode', value: 'roocode', available: true, successLabel: 'RooCode', skillsDir: '.roo', hasCommands: true },
32
+ { name: 'Windsurf', value: 'windsurf', available: true, successLabel: 'Windsurf', skillsDir: '.windsurf', hasCommands: true },
33
33
  { name: 'AGENTS.md (works with Amp, VS Code, …)', value: 'agents', available: false, successLabel: 'your AGENTS.md-compatible assistant' }
34
34
  ];
35
35
  //# sourceMappingURL=config.js.map
package/dist/core/init.js CHANGED
@@ -384,8 +384,8 @@ export class InitCommand {
384
384
  const skillsDir = path.join(projectPath, tool.skillsDir, 'skills');
385
385
  removedSkillCount += await removeSkillDirs(skillsDir);
386
386
  }
387
- // Generate commands if delivery includes commands
388
- if (shouldGenerateCommands) {
387
+ // Generate commands if delivery includes commands and tool supports them
388
+ if (shouldGenerateCommands && hasCommands) {
389
389
  const adapter = CommandAdapterRegistry.get(tool.value);
390
390
  if (adapter) {
391
391
  const generatedCommands = generateCommands(commandContents, adapter);
@@ -19,6 +19,18 @@ export async function removeSkillDirs(skillsDir) {
19
19
  // Ignore errors
20
20
  }
21
21
  }
22
+ // Remove empty parent skills directory
23
+ try {
24
+ if (fs.existsSync(skillsDir)) {
25
+ const remaining = await fs.promises.readdir(skillsDir);
26
+ if (remaining.length === 0) {
27
+ await fs.promises.rmdir(skillsDir);
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ // Ignore errors
33
+ }
22
34
  return removed;
23
35
  }
24
36
  export async function removeUnselectedSkillDirs(skillsDir, desiredWorkflows) {
@@ -144,12 +144,12 @@ export class UpdateCommand {
144
144
  }
145
145
  removedDeselectedSkillCount += await removeUnselectedSkillDirs(skillsDir, desiredWorkflows);
146
146
  }
147
- // Delete skill directories if delivery is commands-only
148
- if (!shouldGenerateSkills) {
147
+ // Delete skill directories if delivery is commands-only or tool uses commands
148
+ if (!shouldGenerateSkills || tool.hasCommands) {
149
149
  removedSkillCount += await removeSkillDirs(skillsDir);
150
150
  }
151
- // Generate commands if delivery includes commands
152
- if (shouldGenerateCommands) {
151
+ // Generate commands if delivery includes commands and tool supports them
152
+ if (shouldGenerateCommands && tool.hasCommands) {
153
153
  const adapter = CommandAdapterRegistry.get(tool.value);
154
154
  if (adapter) {
155
155
  const generatedCommands = generateCommands(commandContents, adapter);
package/package.json CHANGED
@@ -1,83 +1,87 @@
1
- {
2
- "name": "synarcx",
3
- "version": "0.3.3",
4
- "description": "Structured engineering workflows for AI coding assistants — persistent project memory, spec-driven development, and architecture drift prevention across every session.",
5
- "keywords": [
6
- "ai-workflow",
7
- "claude-code",
8
- "cursor",
9
- "spec-driven-development",
10
- "ai-coding-assistant",
11
- "architecture-drift",
12
- "persistent-context",
13
- "engineering-workflow",
14
- "ai-coding-workflow",
15
- "specification",
16
- "claude-code-workflow",
17
- "ai-context-management"
18
- ],
19
- "homepage": "https://github.com/funara/synarcx",
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/funara/synarcx.git"
23
- },
24
- "license": "MIT",
25
- "author": "Adhi Rahmadian",
26
- "type": "module",
27
- "publishConfig": {
28
- "access": "public"
29
- },
30
- "exports": {
31
- ".": {
32
- "types": "./dist/index.d.ts",
33
- "default": "./dist/index.js"
34
- }
35
- },
36
- "bin": {
37
- "synarcx": "bin/synarcx.js"
38
- },
39
- "files": [
40
- "dist",
41
- "bin",
42
- "schemas",
43
- "scripts/postinstall.js",
44
- "!dist/**/*.test.js",
45
- "!dist/**/__tests__",
46
- "!dist/**/*.map"
47
- ],
48
- "scripts": {
49
- "lint": "eslint src/",
50
- "build": "node build.js",
51
- "dev": "tsc --watch",
52
- "dev:cli": "pnpm build && node bin/synarcx.js",
53
- "test": "vitest run",
54
- "test:watch": "vitest",
55
- "test:ui": "vitest --ui",
56
- "test:coverage": "vitest --coverage",
57
- "test:postinstall": "node scripts/postinstall.js",
58
- "prepare": "pnpm run build",
59
- "postinstall": "node scripts/postinstall.js"
60
- },
61
- "engines": {
62
- "node": ">=20.19.0"
63
- },
64
- "devDependencies": {
65
- "@types/node": "^24.2.0",
66
- "@vitest/ui": "^3.2.4",
67
- "eslint": "^9.39.2",
68
- "typescript": "^5.9.3",
69
- "typescript-eslint": "^8.50.1",
70
- "vitest": "^3.2.4"
71
- },
72
- "dependencies": {
73
- "@inquirer/core": "^10.2.2",
74
- "@inquirer/prompts": "^7.8.0",
75
- "chalk": "^5.5.0",
76
- "commander": "^14.0.0",
77
- "cross-spawn": "7.0.6",
78
- "fast-glob": "^3.3.3",
79
- "ora": "^8.2.0",
80
- "yaml": "^2.8.2",
81
- "zod": "^4.0.17"
82
- }
83
- }
1
+ {
2
+ "name": "synarcx",
3
+ "version": "0.3.4",
4
+ "description": "Structured engineering workflows for AI coding assistants — persistent project memory, spec-driven development, and architecture drift prevention across every session.",
5
+ "keywords": [
6
+ "ai-workflow",
7
+ "claude-code",
8
+ "cursor",
9
+ "opencode",
10
+ "codex",
11
+ "gemini",
12
+ "spec-driven-development",
13
+ "ai-coding-assistant",
14
+ "architecture-drift",
15
+ "persistent-context",
16
+ "engineering-workflow",
17
+ "ai-coding-workflow",
18
+ "specification",
19
+ "claude-code-workflow",
20
+ "ai-context-management"
21
+ ],
22
+ "homepage": "https://github.com/funara/synarcx",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/funara/synarcx.git"
26
+ },
27
+ "license": "MIT",
28
+ "author": "Adhi Rahmadian",
29
+ "type": "module",
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "default": "./dist/index.js"
37
+ }
38
+ },
39
+ "bin": {
40
+ "synarcx": "./dist/index.js"
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "bin",
45
+ "schemas",
46
+ "scripts/postinstall.js",
47
+ "!dist/**/*.test.js",
48
+ "!dist/**/__tests__",
49
+ "!dist/**/*.map"
50
+ ],
51
+ "scripts": {
52
+ "lint": "eslint src/",
53
+ "build": "node build.js",
54
+ "dev": "tsc --watch",
55
+ "dev:cli": "pnpm build && node bin/synarcx.js",
56
+ "test": "vitest run",
57
+ "test:watch": "vitest",
58
+ "test:ui": "vitest --ui",
59
+ "test:coverage": "vitest --coverage",
60
+ "test:postinstall": "node scripts/postinstall.js",
61
+ "prepare": "pnpm run build",
62
+ "postinstall": "node scripts/postinstall.js"
63
+ },
64
+ "engines": {
65
+ "node": ">=20.19.0"
66
+ },
67
+ "devDependencies": {
68
+ "@types/node": "^24.2.0",
69
+ "@vitest/ui": "^3.2.4",
70
+ "eslint": "^9.39.2",
71
+ "typescript": "^5.9.3",
72
+ "typescript-eslint": "^8.50.1",
73
+ "vitest": "^3.2.4"
74
+ },
75
+ "dependencies": {
76
+ "@inquirer/core": "^10.2.2",
77
+ "@inquirer/prompts": "^7.8.0",
78
+ "chalk": "^5.5.0",
79
+ "commander": "^14.0.0",
80
+ "cross-spawn": "7.0.6",
81
+ "fast-glob": "^3.3.3",
82
+ "ora": "^8.2.0",
83
+ "synarcx": "link:",
84
+ "yaml": "^2.8.2",
85
+ "zod": "^4.0.17"
86
+ }
87
+ }