@uluops/setup 0.2.0 → 0.6.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.
Files changed (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -89
  3. package/assets/auto-tracker-save.mjs +142 -0
  4. package/assets/claude-code/agents/anxiety-reader-agent.md +464 -0
  5. package/assets/{agents → claude-code/agents}/api-contract-validator-agent.md +9 -228
  6. package/assets/{agents → claude-code/agents}/aristotle-analyst-agent.md +51 -4
  7. package/assets/{agents → claude-code/agents}/aristotle-explorer-agent.md +6 -2
  8. package/assets/{agents → claude-code/agents}/aristotle-forecaster-agent.md +15 -230
  9. package/assets/{agents → claude-code/agents}/aristotle-validator-agent.md +12 -252
  10. package/assets/{agents → claude-code/agents}/assumption-excavator-agent.md +21 -247
  11. package/assets/{agents → claude-code/agents}/code-auditor-agent.md +12 -255
  12. package/assets/{agents → claude-code/agents}/code-optimizer-agent.md +15 -236
  13. package/assets/{agents → claude-code/agents}/code-validator-agent.md +31 -300
  14. package/assets/claude-code/agents/docs-validator-agent.md +472 -0
  15. package/assets/{agents → claude-code/agents}/frontend-validator-agent.md +15 -258
  16. package/assets/{agents → claude-code/agents}/mcp-validator-agent.md +8 -252
  17. package/assets/{agents → claude-code/agents}/pre-implementation-architect-agent.md +8 -224
  18. package/assets/{agents → claude-code/agents}/prompt-engineer-agent.md +57 -290
  19. package/assets/{agents → claude-code/agents}/prompt-pattern-analyzer-agent.md +10 -225
  20. package/assets/{agents → claude-code/agents}/prompt-quality-validator-agent.md +11 -249
  21. package/assets/{agents → claude-code/agents}/public-interface-validator-agent.md +15 -268
  22. package/assets/claude-code/agents/release-readiness-agent.md +495 -0
  23. package/assets/{agents → claude-code/agents}/security-analyst-agent.md +236 -480
  24. package/assets/{agents → claude-code/agents}/test-architect-agent.md +16 -259
  25. package/assets/{agents → claude-code/agents}/type-safety-validator-agent.md +23 -266
  26. package/assets/{agents → claude-code/agents}/workflow-synthesis-agent.md +23 -226
  27. package/assets/claude-code/commands/agents/anxiety-reader.md +157 -0
  28. package/assets/{commands → claude-code/commands}/agents/api-contract.md +156 -135
  29. package/assets/{commands → claude-code/commands}/agents/architect.md +156 -135
  30. package/assets/claude-code/commands/agents/aristotle-analyst.md +157 -0
  31. package/assets/claude-code/commands/agents/aristotle-explorer.md +157 -0
  32. package/assets/claude-code/commands/agents/aristotle-forecaster.md +157 -0
  33. package/assets/claude-code/commands/agents/aristotle-validator.md +157 -0
  34. package/assets/{commands → claude-code/commands}/agents/assumption-excavator.md +49 -6
  35. package/assets/{commands → claude-code/commands}/agents/audit.md +156 -136
  36. package/assets/{commands → claude-code/commands}/agents/docs-validate.md +156 -133
  37. package/assets/{commands → claude-code/commands}/agents/frontend.md +156 -135
  38. package/assets/{commands → claude-code/commands}/agents/mcp-validate.md +156 -136
  39. package/assets/{commands → claude-code/commands}/agents/optimize.md +156 -133
  40. package/assets/{commands → claude-code/commands}/agents/pattern-analyzer.md +150 -126
  41. package/assets/{commands → claude-code/commands}/agents/prompt-quality.md +155 -134
  42. package/assets/claude-code/commands/agents/prompt-validate.md +155 -0
  43. package/assets/{commands → claude-code/commands}/agents/public-interface.md +156 -134
  44. package/assets/{commands → claude-code/commands}/agents/release.md +156 -135
  45. package/assets/{commands → claude-code/commands}/agents/security.md +156 -137
  46. package/assets/{commands → claude-code/commands}/agents/test-review.md +156 -136
  47. package/assets/{commands → claude-code/commands}/agents/type-safety.md +156 -135
  48. package/assets/{commands → claude-code/commands}/agents/validate.md +156 -134
  49. package/assets/claude-code/commands/agents/workflow-synthesis.md +157 -0
  50. package/assets/claude-code/commands/pipelines/aristotle.md +143 -0
  51. package/assets/claude-code/commands/pipelines/ship.md +188 -0
  52. package/assets/claude-code/commands/workflows/post-implementation.md +60 -0
  53. package/assets/claude-code/commands/workflows/pre-implementation.md +46 -0
  54. package/assets/claude-code/commands/workflows/prompt-audit.md +44 -0
  55. package/assets/codex/agents/anxiety-reader-agent.toml +462 -0
  56. package/assets/codex/agents/api-contract-validator-agent.toml +738 -0
  57. package/assets/codex/agents/aristotle-analyst-agent.toml +750 -0
  58. package/assets/codex/agents/aristotle-explorer-agent.toml +155 -0
  59. package/assets/codex/agents/aristotle-forecaster-agent.toml +449 -0
  60. package/assets/codex/agents/aristotle-validator-agent.toml +424 -0
  61. package/assets/codex/agents/assumption-excavator-agent.toml +1126 -0
  62. package/assets/codex/agents/code-auditor-agent.toml +815 -0
  63. package/assets/codex/agents/code-optimizer-agent.toml +652 -0
  64. package/assets/codex/agents/code-validator-agent.toml +573 -0
  65. package/assets/codex/agents/docs-validator-agent.toml +468 -0
  66. package/assets/codex/agents/frontend-validator-agent.toml +598 -0
  67. package/assets/codex/agents/mcp-validator-agent.toml +580 -0
  68. package/assets/codex/agents/pre-implementation-architect-agent.toml +817 -0
  69. package/assets/codex/agents/prompt-engineer-agent.toml +922 -0
  70. package/assets/codex/agents/prompt-pattern-analyzer-agent.toml +689 -0
  71. package/assets/codex/agents/prompt-quality-validator-agent.toml +777 -0
  72. package/assets/codex/agents/public-interface-validator-agent.toml +695 -0
  73. package/assets/codex/agents/release-readiness-agent.toml +491 -0
  74. package/assets/codex/agents/security-analyst-agent.toml +847 -0
  75. package/assets/codex/agents/test-architect-agent.toml +615 -0
  76. package/assets/codex/agents/type-safety-validator-agent.toml +686 -0
  77. package/assets/codex/agents/workflow-synthesis-agent.toml +631 -0
  78. package/assets/gemini-cli/agents/anxiety-reader-agent.md +470 -0
  79. package/assets/gemini-cli/agents/api-contract-validator-agent.md +747 -0
  80. package/assets/gemini-cli/agents/aristotle-analyst-agent.md +758 -0
  81. package/assets/gemini-cli/agents/aristotle-explorer-agent.md +163 -0
  82. package/assets/gemini-cli/agents/aristotle-forecaster-agent.md +457 -0
  83. package/assets/gemini-cli/agents/aristotle-validator-agent.md +432 -0
  84. package/assets/gemini-cli/agents/assumption-excavator-agent.md +1134 -0
  85. package/assets/gemini-cli/agents/code-auditor-agent.md +827 -0
  86. package/assets/gemini-cli/agents/code-optimizer-agent.md +661 -0
  87. package/assets/gemini-cli/agents/code-validator-agent.md +582 -0
  88. package/assets/gemini-cli/agents/docs-validator-agent.md +477 -0
  89. package/assets/gemini-cli/agents/frontend-validator-agent.md +610 -0
  90. package/assets/gemini-cli/agents/mcp-validator-agent.md +589 -0
  91. package/assets/gemini-cli/agents/pre-implementation-architect-agent.md +826 -0
  92. package/assets/gemini-cli/agents/prompt-engineer-agent.md +931 -0
  93. package/assets/gemini-cli/agents/prompt-pattern-analyzer-agent.md +698 -0
  94. package/assets/gemini-cli/agents/prompt-quality-validator-agent.md +786 -0
  95. package/assets/gemini-cli/agents/public-interface-validator-agent.md +707 -0
  96. package/assets/gemini-cli/agents/release-readiness-agent.md +500 -0
  97. package/assets/gemini-cli/agents/security-analyst-agent.md +859 -0
  98. package/assets/gemini-cli/agents/test-architect-agent.md +624 -0
  99. package/assets/gemini-cli/agents/type-safety-validator-agent.md +695 -0
  100. package/assets/gemini-cli/agents/workflow-synthesis-agent.md +639 -0
  101. package/assets/gemini-cli/commands/agents/anxiety-reader.toml +155 -0
  102. package/assets/gemini-cli/commands/agents/api-contract.toml +154 -0
  103. package/assets/gemini-cli/commands/agents/architect.toml +154 -0
  104. package/assets/gemini-cli/commands/agents/aristotle-analyst.toml +155 -0
  105. package/assets/gemini-cli/commands/agents/aristotle-explorer.toml +155 -0
  106. package/assets/gemini-cli/commands/agents/aristotle-forecaster.toml +155 -0
  107. package/assets/gemini-cli/commands/agents/aristotle-validator.toml +155 -0
  108. package/assets/gemini-cli/commands/agents/assumption-excavator.toml +155 -0
  109. package/assets/gemini-cli/commands/agents/audit.toml +154 -0
  110. package/assets/gemini-cli/commands/agents/docs-validate.toml +154 -0
  111. package/assets/gemini-cli/commands/agents/frontend.toml +154 -0
  112. package/assets/gemini-cli/commands/agents/mcp-validate.toml +154 -0
  113. package/assets/gemini-cli/commands/agents/optimize.toml +154 -0
  114. package/assets/gemini-cli/commands/agents/pattern-analyzer.toml +148 -0
  115. package/assets/gemini-cli/commands/agents/prompt-quality.toml +153 -0
  116. package/assets/gemini-cli/commands/agents/prompt-validate.toml +153 -0
  117. package/assets/gemini-cli/commands/agents/public-interface.toml +154 -0
  118. package/assets/gemini-cli/commands/agents/release.toml +154 -0
  119. package/assets/gemini-cli/commands/agents/security.toml +154 -0
  120. package/assets/gemini-cli/commands/agents/test-review.toml +154 -0
  121. package/assets/gemini-cli/commands/agents/type-safety.toml +154 -0
  122. package/assets/gemini-cli/commands/agents/validate.toml +154 -0
  123. package/assets/gemini-cli/commands/agents/workflow-synthesis.toml +155 -0
  124. package/assets/gemini-cli/commands/pipelines/aristotle.toml +139 -0
  125. package/assets/gemini-cli/commands/pipelines/ship.toml +184 -0
  126. package/assets/gemini-cli/commands/workflows/post-implementation.toml +56 -0
  127. package/assets/gemini-cli/commands/workflows/pre-implementation.toml +42 -0
  128. package/assets/gemini-cli/commands/workflows/prompt-audit.toml +40 -0
  129. package/assets/opencode/agents/anxiety-reader-agent.md +472 -0
  130. package/assets/opencode/agents/api-contract-validator-agent.md +749 -0
  131. package/assets/opencode/agents/aristotle-analyst-agent.md +760 -0
  132. package/assets/opencode/agents/aristotle-explorer-agent.md +164 -0
  133. package/assets/opencode/agents/aristotle-forecaster-agent.md +459 -0
  134. package/assets/opencode/agents/aristotle-validator-agent.md +434 -0
  135. package/assets/opencode/agents/assumption-excavator-agent.md +1136 -0
  136. package/assets/opencode/agents/code-auditor-agent.md +826 -0
  137. package/assets/opencode/agents/code-optimizer-agent.md +663 -0
  138. package/assets/opencode/agents/code-validator-agent.md +584 -0
  139. package/assets/opencode/agents/docs-validator-agent.md +479 -0
  140. package/assets/opencode/agents/frontend-validator-agent.md +609 -0
  141. package/assets/opencode/agents/mcp-validator-agent.md +591 -0
  142. package/assets/opencode/agents/pre-implementation-architect-agent.md +828 -0
  143. package/assets/opencode/agents/prompt-engineer-agent.md +933 -0
  144. package/assets/opencode/agents/prompt-pattern-analyzer-agent.md +700 -0
  145. package/assets/opencode/agents/prompt-quality-validator-agent.md +788 -0
  146. package/assets/opencode/agents/public-interface-validator-agent.md +706 -0
  147. package/assets/opencode/agents/release-readiness-agent.md +502 -0
  148. package/assets/opencode/agents/security-analyst-agent.md +858 -0
  149. package/assets/opencode/agents/test-architect-agent.md +626 -0
  150. package/assets/opencode/agents/type-safety-validator-agent.md +697 -0
  151. package/assets/opencode/agents/workflow-synthesis-agent.md +641 -0
  152. package/dist/cli.js +22 -380
  153. package/dist/commands/helpers.d.ts +73 -0
  154. package/dist/commands/helpers.js +274 -0
  155. package/dist/commands/setup.d.ts +13 -0
  156. package/dist/commands/setup.js +93 -0
  157. package/dist/commands/uninstall.d.ts +3 -0
  158. package/dist/commands/uninstall.js +126 -0
  159. package/dist/commands/verify.d.ts +1 -0
  160. package/dist/commands/verify.js +28 -0
  161. package/dist/harnesses/claude-code.d.ts +8 -0
  162. package/dist/harnesses/claude-code.js +74 -0
  163. package/dist/harnesses/codex.d.ts +15 -0
  164. package/dist/harnesses/codex.js +54 -0
  165. package/dist/harnesses/gemini-cli.d.ts +12 -0
  166. package/dist/harnesses/gemini-cli.js +80 -0
  167. package/dist/harnesses/index.d.ts +27 -0
  168. package/dist/harnesses/index.js +54 -0
  169. package/dist/harnesses/opencode.d.ts +14 -0
  170. package/dist/harnesses/opencode.js +139 -0
  171. package/dist/harnesses/types.d.ts +106 -0
  172. package/dist/harnesses/types.js +26 -0
  173. package/dist/lib/agent-transform.d.ts +12 -0
  174. package/dist/lib/agent-transform.js +129 -0
  175. package/dist/lib/asset-catalog.d.ts +9 -0
  176. package/dist/lib/asset-catalog.js +56 -0
  177. package/dist/lib/atomic-write.d.ts +11 -0
  178. package/dist/lib/atomic-write.js +28 -0
  179. package/dist/lib/config-merger.d.ts +9 -2
  180. package/dist/lib/config-merger.js +44 -7
  181. package/dist/lib/display.d.ts +14 -0
  182. package/dist/lib/display.js +66 -0
  183. package/dist/lib/file-ops.d.ts +11 -0
  184. package/dist/lib/file-ops.js +40 -4
  185. package/dist/lib/hash.d.ts +1 -0
  186. package/dist/lib/hash.js +2 -1
  187. package/dist/lib/health.d.ts +2 -0
  188. package/dist/lib/health.js +10 -0
  189. package/dist/lib/manifest.d.ts +51 -5
  190. package/dist/lib/manifest.js +146 -13
  191. package/dist/lib/paths.d.ts +30 -3
  192. package/dist/lib/paths.js +98 -12
  193. package/dist/lib/settings-merger.d.ts +31 -8
  194. package/dist/lib/settings-merger.js +87 -24
  195. package/dist/lib/version.d.ts +2 -0
  196. package/dist/lib/version.js +10 -0
  197. package/dist/steps/agents.d.ts +4 -1
  198. package/dist/steps/agents.js +48 -9
  199. package/dist/steps/auth.js +26 -10
  200. package/dist/steps/cli.d.ts +53 -0
  201. package/dist/steps/cli.js +90 -0
  202. package/dist/steps/commands.d.ts +6 -1
  203. package/dist/steps/commands.js +36 -9
  204. package/dist/steps/detect.d.ts +3 -0
  205. package/dist/steps/detect.js +11 -0
  206. package/dist/steps/mcp.d.ts +6 -2
  207. package/dist/steps/mcp.js +39 -22
  208. package/dist/steps/metrics.d.ts +26 -10
  209. package/dist/steps/metrics.js +108 -108
  210. package/dist/steps/shell.d.ts +2 -0
  211. package/dist/steps/shell.js +26 -9
  212. package/dist/steps/signup.d.ts +7 -4
  213. package/dist/steps/signup.js +29 -20
  214. package/dist/steps/verify.d.ts +2 -2
  215. package/dist/steps/verify.js +118 -112
  216. package/package.json +40 -14
  217. package/assets/agents/docs-validator-agent.md +0 -490
  218. package/assets/agents/release-readiness-agent.md +0 -482
  219. package/assets/commands/agents/aristotle-analyst.md +0 -115
  220. package/assets/commands/agents/aristotle-explorer.md +0 -92
  221. package/assets/commands/agents/aristotle-forecaster.md +0 -114
  222. package/assets/commands/agents/aristotle-validator.md +0 -114
  223. package/assets/commands/agents/prompt-validate.md +0 -135
  224. package/assets/commands/agents/workflow-synthesis.md +0 -101
  225. package/assets/commands/workflows/aristotle.md +0 -543
  226. package/assets/commands/workflows/post-implementation.md +0 -577
  227. package/assets/commands/workflows/pre-implementation.md +0 -670
  228. package/assets/commands/workflows/prompt-audit.md +0 -754
  229. package/assets/commands/workflows/ship.md +0 -721
  230. package/dist/test/auth.test.d.ts +0 -1
  231. package/dist/test/auth.test.js +0 -43
  232. package/dist/test/config-io.test.d.ts +0 -1
  233. package/dist/test/config-io.test.js +0 -56
  234. package/dist/test/config-merger.test.d.ts +0 -1
  235. package/dist/test/config-merger.test.js +0 -94
  236. package/dist/test/detect.test.d.ts +0 -1
  237. package/dist/test/detect.test.js +0 -25
  238. package/dist/test/file-ops.test.d.ts +0 -1
  239. package/dist/test/file-ops.test.js +0 -100
  240. package/dist/test/hash.test.d.ts +0 -1
  241. package/dist/test/hash.test.js +0 -14
  242. package/dist/test/manifest.test.d.ts +0 -1
  243. package/dist/test/manifest.test.js +0 -78
  244. package/dist/test/paths.test.d.ts +0 -1
  245. package/dist/test/paths.test.js +0 -30
  246. package/dist/test/settings-merger.test.d.ts +0 -1
  247. package/dist/test/settings-merger.test.js +0 -167
  248. package/dist/test/shell-profile.test.d.ts +0 -1
  249. package/dist/test/shell-profile.test.js +0 -40
  250. package/dist/test/shell.test.d.ts +0 -1
  251. package/dist/test/shell.test.js +0 -71
  252. package/dist/test/signup.test.d.ts +0 -1
  253. package/dist/test/signup.test.js +0 -83
package/dist/cli.js CHANGED
@@ -1,393 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
3
  import chalk from "chalk";
4
- import { readFile, readdir } from "node:fs/promises";
5
- import { join, dirname } from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import { detect } from "./steps/detect.js";
8
- import { resolveApiKey } from "./steps/auth.js";
9
- import { signup } from "./steps/signup.js";
10
- import { installMcp, uninstallMcp } from "./steps/mcp.js";
11
- import { installAgents, uninstallAgents } from "./steps/agents.js";
12
- import { installCommands, uninstallCommands } from "./steps/commands.js";
13
- import { writeShellExport, removeShellExport } from "./steps/shell.js";
14
- import { verify } from "./steps/verify.js";
15
- import { installMetrics, uninstallMetrics } from "./steps/metrics.js";
16
- import { loadManifest, saveManifest, deleteManifest, } from "./lib/manifest.js";
17
- import { getClaudeHome, getAgentsDir, ASSETS_DIR } from "./lib/paths.js";
18
- const __dirname = dirname(fileURLToPath(import.meta.url));
19
- async function getVersion() {
20
- const pkgPath = join(__dirname, "..", "package.json");
21
- const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
22
- return pkg.version;
23
- }
24
- const ok = (msg) => console.log(` ${chalk.green("✓")} ${msg}`);
25
- const warn = (msg) => console.log(` ${chalk.yellow("⚠")} ${msg}`);
26
- const fail = (msg) => console.log(` ${chalk.red("✗")} ${msg}`);
27
- const info = (msg) => console.log(` ${msg}`);
28
- async function runSetup(opts) {
29
- const version = await getVersion();
30
- console.log();
31
- console.log(` ${chalk.dim("⟨u⟩")} ${chalk.cyan.bold("ulu")}${chalk.bold("·ops")}`);
32
- console.log(` ${chalk.dim("operating intelligence as infrastructure")}`);
33
- console.log();
34
- console.log(` Setup v${version}`);
35
- console.log();
36
- if (opts.dryRun) {
37
- info(chalk.dim("(dry run — no changes will be made)\n"));
38
- }
39
- // Detect environment
40
- const env = await detect();
41
- // Resolve API key — via signup or existing key
42
- let apiKey;
43
- let email = null;
44
- try {
45
- if (opts.signup) {
46
- info("Create your UluOps account\n");
47
- const auth = await signup();
48
- apiKey = auth.apiKey;
49
- email = auth.email;
50
- ok(`Account created (${email})`);
51
- ok(`API key generated`);
52
- }
53
- else {
54
- const auth = await resolveApiKey({
55
- apiKeyFlag: opts.apiKey,
56
- skipValidation: opts.skipValidation,
57
- interactive: !opts.yes && !opts.apiKey && !process.env["ULUOPS_API_KEY"],
58
- });
59
- apiKey = auth.apiKey;
60
- email = auth.email;
61
- if (email) {
62
- ok(`Key validated (${email})`);
63
- }
64
- else if (opts.skipValidation) {
65
- ok("Key accepted (validation skipped)");
66
- }
67
- else {
68
- ok("Key validated");
69
- }
70
- }
71
- }
72
- catch (err) {
73
- fail(err instanceof Error ? err.message : String(err));
74
- process.exit(1);
75
- }
76
- console.log();
77
- // Load existing manifest for update detection
78
- const existingManifest = await loadManifest();
79
- // Show update info if re-running with newer version
80
- if (existingManifest && existingManifest.version !== version) {
81
- info(`Updating ${chalk.dim(existingManifest.version)} → ${chalk.green(version)}`);
82
- console.log();
83
- }
84
- else if (existingManifest) {
85
- info(chalk.dim(`Already at v${version} — checking for changes`));
86
- console.log();
87
- }
88
- // Check for conflicts on first install
89
- if (!existingManifest && !opts.yes && !opts.dryRun) {
90
- await checkConflicts(opts.localDefs);
91
- }
92
- // MCP config
93
- const mcpResult = await installMcp(apiKey, opts.scope, opts.dryRun);
94
- ok(`MCP config → ${mcpResult.configPath} (2 servers)`);
95
- // Agents
96
- const agentsResult = await installAgents(opts.localDefs, opts.dryRun, existingManifest?.agents);
97
- const agentParts = [];
98
- if (agentsResult.copied > 0)
99
- agentParts.push(`${agentsResult.copied} copied`);
100
- if (agentsResult.skipped > 0)
101
- agentParts.push(`${agentsResult.skipped} unchanged`);
102
- if (agentsResult.removed > 0)
103
- agentParts.push(`${agentsResult.removed} removed`);
104
- ok(`${agentsResult.files.length} agents → ${opts.localDefs ? "./uluops/agents/" : "~/.claude/agents/"}${agentParts.length ? ` (${agentParts.join(", ")})` : ""}`);
105
- // Commands
106
- const commandsResult = await installCommands(opts.localDefs, opts.dryRun, existingManifest?.commands);
107
- const totalCommands = commandsResult.agentCommands + commandsResult.workflowCommands;
108
- const cmdSkipped = commandsResult.skipped;
109
- const cmdTotal = commandsResult.files.length;
110
- const cmdParts = [];
111
- if (totalCommands > 0)
112
- cmdParts.push(`${totalCommands} copied`);
113
- if (cmdSkipped > 0)
114
- cmdParts.push(`${cmdSkipped} unchanged`);
115
- if (commandsResult.removed > 0)
116
- cmdParts.push(`${commandsResult.removed} removed`);
117
- ok(`${cmdTotal} commands → ${opts.localDefs ? "./uluops/commands/" : "~/.claude/commands/"}${cmdParts.length ? ` (${cmdParts.join(", ")})` : ""}`);
118
- // Agent metrics (SubagentStop hook for auto-capture)
119
- const metricsResult = await installMetrics(opts.dryRun);
120
- if (metricsResult.hookConfigured) {
121
- const parts = [];
122
- if (metricsResult.toolFilesCopied > 0)
123
- parts.push(`${metricsResult.toolFilesCopied} files`);
124
- parts.push("hook configured");
125
- ok(`Agent metrics → ~/.claude/tools/agent-metrics/ (${parts.join(", ")})`);
126
- }
127
- else {
128
- warn("Agent metrics hook not configured (tool files not found)");
129
- }
130
- // Health check
131
- if (!opts.skipValidation && !opts.dryRun) {
132
- try {
133
- const [trackerOk, registryOk] = await Promise.all([
134
- checkEndpoint("https://api.uluops.ai/api/v1/health"),
135
- checkEndpoint("https://api.uluops.ai/api/v1/registry/health"),
136
- ]);
137
- if (trackerOk && registryOk) {
138
- ok("Health check passed — both APIs reachable");
139
- }
140
- else {
141
- warn("Some APIs unreachable (MCP tools may have limited functionality)");
142
- }
143
- }
144
- catch {
145
- warn("Health check skipped (network issue)");
146
- }
147
- }
148
- // Shell export
149
- let shellModified = false;
150
- if (opts.shell && env.shellProfile) {
151
- await writeShellExport(env.shellProfile, apiKey, opts.dryRun);
152
- ok(`ULUOPS_API_KEY added to ${env.shellProfile}`);
153
- shellModified = true;
154
- }
155
- else if (opts.shell) {
156
- warn("--shell requested but no supported shell detected ($SHELL). Skipping.");
157
- }
158
- // Save manifest
159
- if (!opts.dryRun) {
160
- await saveManifest({
161
- version,
162
- installedAt: new Date().toISOString(),
163
- mcpScope: opts.scope,
164
- mcpConfigPath: mcpResult.configPath,
165
- defsScope: opts.localDefs ? "local" : "global",
166
- defsPath: opts.localDefs
167
- ? join(process.cwd(), "uluops")
168
- : getClaudeHome(),
169
- shellModified,
170
- agents: agentsResult.files,
171
- commands: commandsResult.files,
172
- metricsHookInstalled: metricsResult.hookConfigured,
173
- });
174
- }
175
- printSetupSummary({
176
- agentCount: agentsResult.files.length,
177
- commandCount: cmdTotal,
178
- apiKey,
179
- });
180
- }
181
- // MCP tool count across both servers. Update when server toolsets change.
182
- const TOOL_COUNT = 73;
183
- const AGENT_LIST = [
184
- ["/agents:validate", "Code quality", "sonnet"],
185
- ["/agents:type-safety", "TypeScript", "sonnet"],
186
- ["/agents:test-review", "Test quality", "sonnet"],
187
- ["/agents:optimize", "Performance", "sonnet"],
188
- ["/agents:frontend", "React/a11y", "sonnet"],
189
- ["/agents:mcp-validate", "MCP compliance", "sonnet"],
190
- ["/agents:architect", "Design review", "sonnet"],
191
- ["/agents:audit", "Runtime bugs", "opus"],
192
- ["/agents:security", "OWASP", "sonnet"],
193
- ["/agents:api-contract", "API alignment", "sonnet"],
194
- ["/agents:release", "Publish ready", "sonnet"],
195
- ["/agents:public-interface", "README/exports", "sonnet"],
196
- ["/agents:docs-validate", "Documentation", "sonnet"],
197
- ["/agents:prompt-validate", "Prompt review", "sonnet"],
198
- ["/agents:prompt-quality", "Prompt quality", "sonnet"],
199
- ["/agents:pattern-analyzer", "Patterns", "sonnet"],
200
- ["/agents:aristotle-explorer", "Categories", "opus"],
201
- ["/agents:aristotle-analyst", "Four causes", "opus"],
202
- ["/agents:aristotle-validator", "Teleology", "opus"],
203
- ["/agents:aristotle-forecaster", "Potentiality", "opus"],
204
- ["/agents:assumption-excavator", "Assumptions", "sonnet"],
205
- ["/agents:workflow-synthesis", "Cross-agent synthesis", "opus"],
206
- ];
207
- function printSetupSummary(opts) {
208
- console.log();
209
- console.log(` ${chalk.dim("━".repeat(46))}`);
210
- console.log();
211
- console.log(` ${chalk.bold("Setup complete!")} ${TOOL_COUNT} MCP tools · ${opts.agentCount} agents · ${opts.commandCount} slash commands · metrics`);
212
- console.log();
213
- printAgentList();
214
- info("For SDK/CLI usage, add to your shell profile:");
215
- info(` ${chalk.cyan(`export ULUOPS_API_KEY="${opts.apiKey}"`)}`);
216
- console.log();
217
- info(`Run again to update: ${chalk.cyan("npx @uluops/setup")}`);
218
- console.log();
219
- // Restart warning — last and prominent
220
- console.log(` ${chalk.dim("━".repeat(46))}`);
221
- console.log();
222
- console.log(` ${chalk.yellow.bold("Restart Claude Code to load agents.")}`);
223
- console.log();
224
- info("After restart, verify with:");
225
- info(` ${chalk.cyan("/agents:validate --help")}`);
226
- console.log();
227
- info("Then try:");
228
- info(` ${chalk.cyan("/workflows:post-implementation .")}`);
229
- console.log();
230
- }
231
- function printAgentList() {
232
- info(chalk.bold("WORKFLOWS"));
233
- info(` ${chalk.cyan("/workflows:pre-implementation")} Design review before coding`);
234
- info(` ${chalk.cyan("/workflows:post-implementation")} Iterative validation loop`);
235
- info(` ${chalk.cyan("/workflows:ship")} Final gate before shipping`);
236
- info(` ${chalk.cyan("/workflows:prompt-audit")} Audit agent prompts`);
237
- console.log();
238
- info(` ${chalk.cyan("/workflows:aristotle")} Four-cause teleological analysis`);
239
- console.log();
240
- info(`${chalk.bold("AGENTS")} (run individually)${" ".repeat(26)}${chalk.dim("MODEL")}`);
241
- for (const [cmd, desc, model] of AGENT_LIST) {
242
- info(` ${chalk.cyan(cmd.padEnd(34))}${desc.padEnd(17)}${chalk.dim(model)}`);
243
- }
244
- console.log();
245
- info(chalk.dim(` This is the starter set. Browse 135+ agents at registry.uluops.ai`));
246
- console.log();
247
- }
248
- async function runUninstall(opts) {
249
- const version = await getVersion();
250
- console.log();
251
- console.log(` ${chalk.dim("⟨u⟩")} ${chalk.cyan.bold("ulu")}${chalk.bold("·ops")} ${chalk.red("Uninstall")} v${version}`);
252
- console.log();
253
- if (opts.dryRun) {
254
- info(chalk.dim("(dry run — no changes will be made)\n"));
255
- }
256
- const manifest = await loadManifest();
257
- if (!manifest) {
258
- warn("No manifest found — nothing to uninstall.");
259
- return;
260
- }
261
- // Remove agents
262
- if (!opts.dryRun) {
263
- const removed = await uninstallAgents(manifest.agents, manifest.defsPath);
264
- ok(`Removed ${removed} agent(s)`);
265
- }
266
- else {
267
- ok(`Would remove ${manifest.agents.length} agent(s)`);
268
- }
269
- // Remove commands
270
- if (!opts.dryRun) {
271
- const removed = await uninstallCommands(manifest.commands, manifest.defsPath);
272
- ok(`Removed ${removed} command(s)`);
273
- }
274
- else {
275
- ok(`Would remove ${manifest.commands.length} command(s)`);
276
- }
277
- // Remove MCP config
278
- if (!opts.dryRun) {
279
- await uninstallMcp(manifest.mcpConfigPath);
280
- ok(`Removed MCP servers from ${manifest.mcpConfigPath}`);
281
- }
282
- else {
283
- ok(`Would remove MCP servers from ${manifest.mcpConfigPath}`);
284
- }
285
- // Remove agent metrics hook and tool files
286
- if (manifest.metricsHookInstalled) {
287
- if (!opts.dryRun) {
288
- await uninstallMetrics(false);
289
- ok("Removed agent-metrics hook and tool files");
290
- }
291
- else {
292
- ok("Would remove agent-metrics hook and tool files");
293
- }
294
- }
295
- // Remove shell export
296
- if (manifest.shellModified) {
297
- const { getShellProfile } = await import("./lib/paths.js");
298
- const profile = getShellProfile();
299
- if (profile && !opts.dryRun) {
300
- await removeShellExport(profile.path);
301
- ok(`Removed export from ${profile.path}`);
302
- }
303
- else if (profile) {
304
- ok(`Would remove export from ${profile.path}`);
305
- }
306
- }
307
- // Delete manifest
308
- if (!opts.dryRun) {
309
- await deleteManifest();
310
- ok("Manifest deleted");
311
- }
312
- console.log();
313
- info("UluOps has been removed. Restart Claude Code to complete.");
314
- console.log();
315
- }
316
- async function runVerify() {
317
- const version = await getVersion();
318
- console.log();
319
- console.log(` ${chalk.dim("⟨u⟩")} ${chalk.cyan.bold("ulu")}${chalk.bold("·ops")} Installation Check v${version}`);
320
- console.log();
321
- const result = await verify();
322
- for (const check of result.checks) {
323
- if (check.passed) {
324
- ok(check.label);
325
- }
326
- else {
327
- fail(`${check.label}${check.detail ? ` — ${check.detail}` : ""}`);
328
- }
329
- }
330
- console.log();
331
- if (result.ok) {
332
- info(chalk.green("All checks passed."));
333
- }
334
- else {
335
- info(chalk.red("Some checks failed. Run npx @uluops/setup to fix."));
336
- }
337
- console.log();
338
- process.exit(result.ok ? 0 : 1);
339
- }
340
- async function checkConflicts(localDefs) {
341
- const destDir = getAgentsDir(localDefs);
342
- const srcDir = join(ASSETS_DIR, "agents");
343
- let existingFiles;
344
- let assetFiles;
345
- try {
346
- existingFiles = await readdir(destDir);
347
- assetFiles = await readdir(srcDir);
348
- }
349
- catch {
350
- return; // Directory doesn't exist yet
351
- }
352
- const conflicts = assetFiles.filter((f) => existingFiles.includes(f));
353
- if (conflicts.length === 0)
354
- return;
355
- warn(`Found ${conflicts.length} existing agents that match UluOps definitions:`);
356
- for (const f of conflicts.slice(0, 5)) {
357
- info(` ${f}`);
358
- }
359
- if (conflicts.length > 5) {
360
- info(` ... and ${conflicts.length - 5} more`);
361
- }
362
- console.log();
363
- info("These will be overwritten.");
364
- console.log();
365
- const { confirm } = await import("@inquirer/prompts");
366
- const proceed = await confirm({ message: "Continue?", default: true });
367
- if (!proceed) {
368
- process.exit(0);
369
- }
370
- }
371
- async function checkEndpoint(url) {
372
- try {
373
- const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
374
- return res.ok;
375
- }
376
- catch {
377
- return false;
378
- }
379
- }
4
+ import { info, printAgentList } from "./lib/display.js";
5
+ import { getVersion } from "./lib/version.js";
6
+ import { resolveHarnessName, listHarnesses, HarnessNotTestedError, } from "./harnesses/index.js";
7
+ import { runSetup } from "./commands/setup.js";
8
+ import { runUninstall } from "./commands/uninstall.js";
9
+ import { runVerify } from "./commands/verify.js";
380
10
  async function main() {
381
11
  const version = await getVersion();
382
12
  const program = new Command()
383
13
  .name("uluops-setup")
384
- .description("Zero-friction installer for UluOps + Claude Code")
14
+ .description("Zero-friction installer for UluOps agentic harnesses")
385
15
  .version(version)
386
16
  .option("--api-key <key>", "API key (skip prompt)")
387
17
  .option("--signup", "Create a new account (email + password, no browser)")
388
- .option("--scope <mode>", 'MCP config scope: "global" or "local"', "global")
389
- .option("--local-defs", "Save agents/commands locally instead of ~/.claude/", false)
18
+ .option("--harness <name>", `Target harness: ${listHarnesses().join(", ")} (aliases: claude, oc, gemini)`, "claude-code")
19
+ .option("--scope <mode>", 'MCP connectivity scope: "global" (~/.claude.json) or "local" (.mcp.json)', "global")
20
+ .option("--local-defs", "Save agents/commands locally (./uluops/) for project isolation", false)
390
21
  .option("--shell", "Write API key export to shell profile", false)
22
+ .option("--with-cli", "Install @uluops/cli globally without prompting")
23
+ .option("--no-cli", "Skip @uluops/cli install without prompting (takes precedence over --with-cli)")
391
24
  .option("--skip-validation", "Accept API key without verifying", false)
392
25
  .option("--list", "Show available agents and workflows without installing")
393
26
  .option("--verify", "Check existing installation health")
@@ -400,7 +33,7 @@ async function main() {
400
33
  console.log();
401
34
  console.log(` ${chalk.dim("⟨u⟩")} ${chalk.cyan.bold("ulu")}${chalk.bold("·ops")} v${version} — available agents and workflows`);
402
35
  console.log();
403
- printAgentList();
36
+ await printAgentList();
404
37
  info(`Install with: ${chalk.cyan("npx @uluops/setup")}`);
405
38
  console.log();
406
39
  return;
@@ -418,18 +51,27 @@ async function main() {
418
51
  process.exit(1);
419
52
  }
420
53
  const scope = opts.scope === "local" ? "local" : "global";
54
+ // Resolve harness name (supports aliases)
55
+ const harnessName = resolveHarnessName(opts.harness);
421
56
  await runSetup({
422
57
  apiKey: opts.apiKey,
423
58
  signup: opts.signup ?? false,
424
59
  scope,
425
60
  localDefs: opts.localDefs,
426
61
  shell: opts.shell,
62
+ withCli: opts.withCli,
63
+ cli: opts.cli,
427
64
  skipValidation: opts.skipValidation,
428
65
  dryRun: opts.dryRun,
429
66
  yes: opts.yes,
67
+ harness: harnessName,
430
68
  });
431
69
  }
432
70
  main().catch((err) => {
71
+ if (err instanceof HarnessNotTestedError) {
72
+ console.error(chalk.yellow(`\n ${err.message}\n`));
73
+ process.exit(1);
74
+ }
433
75
  const msg = err instanceof Error ? err.message : String(err);
434
76
  console.error(chalk.red(`\n Error: ${msg}\n`));
435
77
  process.exit(1);
@@ -0,0 +1,73 @@
1
+ import { detect } from "../steps/detect.js";
2
+ import type { McpResult } from "../steps/mcp.js";
3
+ import type { AgentsResult } from "../steps/agents.js";
4
+ import type { CommandsResult } from "../steps/commands.js";
5
+ import type { MetricsResult } from "../steps/metrics.js";
6
+ import type { CliExecutor, CliInstallResult } from "../steps/cli.js";
7
+ import type { HarnessProfile } from "../harnesses/index.js";
8
+ /** Resolve API key via flag, env, file, signup, or interactive prompt. Returns env detection + key. */
9
+ export declare function initContext(opts: {
10
+ apiKey?: string;
11
+ signup: boolean;
12
+ skipValidation: boolean;
13
+ yes: boolean;
14
+ }): Promise<{
15
+ env: Awaited<ReturnType<typeof detect>>;
16
+ apiKey: string;
17
+ }>;
18
+ /** Write MCP server entries to harness config and report warnings. */
19
+ export declare function configureMcpStep(profile: HarnessProfile, apiKey: string, opts: {
20
+ scope: "global" | "local";
21
+ dryRun: boolean;
22
+ }): Promise<McpResult>;
23
+ /** Copy agent definitions from assets to harness directory. */
24
+ export declare function installAgentsDefs(profile: HarnessProfile, opts: {
25
+ localDefs: boolean;
26
+ dryRun: boolean;
27
+ }, prev?: string[]): Promise<AgentsResult>;
28
+ /** Copy slash-command definitions from assets (Claude Code only). */
29
+ export declare function installCommandsDefs(profile: HarnessProfile, opts: {
30
+ localDefs: boolean;
31
+ dryRun: boolean;
32
+ }, prev?: string[]): Promise<CommandsResult>;
33
+ /** Install agent-metrics hook and tool files (Claude Code only). */
34
+ export declare function configureMetricsStep(profile: HarnessProfile, opts: {
35
+ dryRun: boolean;
36
+ }): Promise<MetricsResult>;
37
+ /**
38
+ * Decide whether to install `@uluops/cli` globally and do it (or not).
39
+ *
40
+ * Decision matrix:
41
+ * - `--no-cli` (opts.cli === false) → skip, no prompt
42
+ * - `--with-cli` (opts.withCli === true) → install, no prompt
43
+ * - Neither flag + non-interactive (--yes / --api-key / no TTY) → skip
44
+ * - Neither flag + interactive → prompt (default Y)
45
+ *
46
+ * Returns null when the step did not run (skipped). Returns a `CliInstallResult`
47
+ * when an install attempt was made, with details for the manifest.
48
+ */
49
+ export declare function configureCliStep(opts: {
50
+ withCli?: boolean;
51
+ cli?: boolean;
52
+ yes: boolean;
53
+ apiKey?: string;
54
+ dryRun: boolean;
55
+ executor?: CliExecutor;
56
+ }): Promise<CliInstallResult | null>;
57
+ /** Ping tracker and registry health endpoints. */
58
+ export declare function runHealthCheck(opts: {
59
+ skipValidation: boolean;
60
+ dryRun: boolean;
61
+ }): Promise<void>;
62
+ /** Optionally write ULUOPS_API_KEY export to shell profile. */
63
+ export declare function configureShell(env: {
64
+ shellProfile: string | null;
65
+ }, apiKey: string, opts: {
66
+ shell: boolean;
67
+ yes: boolean;
68
+ dryRun: boolean;
69
+ }): Promise<boolean>;
70
+ /** Interactive y/N confirmation before writing API key to shell profile. */
71
+ export declare function confirmShellWrite(profilePath: string): Promise<boolean>;
72
+ /** Warn if existing agent files will be overwritten and prompt for confirmation. */
73
+ export declare function checkConflicts(profile: HarnessProfile, localDefs: boolean): Promise<void>;