@intutic/cli 1.3.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +348 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/benchmark.d.ts +31 -0
  8. package/dist/commands/benchmark.d.ts.map +1 -0
  9. package/dist/commands/benchmark.js +211 -0
  10. package/dist/commands/benchmark.js.map +1 -0
  11. package/dist/commands/budget.d.ts +7 -0
  12. package/dist/commands/budget.d.ts.map +1 -0
  13. package/dist/commands/budget.js +68 -0
  14. package/dist/commands/budget.js.map +1 -0
  15. package/dist/commands/budgetCompatibility.test.d.ts +2 -0
  16. package/dist/commands/budgetCompatibility.test.d.ts.map +1 -0
  17. package/dist/commands/budgetCompatibility.test.js +19 -0
  18. package/dist/commands/budgetCompatibility.test.js.map +1 -0
  19. package/dist/commands/connect.d.ts +20 -0
  20. package/dist/commands/connect.d.ts.map +1 -0
  21. package/dist/commands/connect.js +1010 -0
  22. package/dist/commands/connect.js.map +1 -0
  23. package/dist/commands/doctor.d.ts +23 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +429 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/enterprise-install.d.ts +36 -0
  28. package/dist/commands/enterprise-install.d.ts.map +1 -0
  29. package/dist/commands/enterprise-install.js +289 -0
  30. package/dist/commands/enterprise-install.js.map +1 -0
  31. package/dist/commands/eval.d.ts +13 -0
  32. package/dist/commands/eval.d.ts.map +1 -0
  33. package/dist/commands/eval.js +67 -0
  34. package/dist/commands/eval.js.map +1 -0
  35. package/dist/commands/exec.d.ts +34 -0
  36. package/dist/commands/exec.d.ts.map +1 -0
  37. package/dist/commands/exec.js +114 -0
  38. package/dist/commands/exec.js.map +1 -0
  39. package/dist/commands/exec.test.d.ts +2 -0
  40. package/dist/commands/exec.test.d.ts.map +1 -0
  41. package/dist/commands/exec.test.js +29 -0
  42. package/dist/commands/exec.test.js.map +1 -0
  43. package/dist/commands/export.d.ts +21 -0
  44. package/dist/commands/export.d.ts.map +1 -0
  45. package/dist/commands/export.js +116 -0
  46. package/dist/commands/export.js.map +1 -0
  47. package/dist/commands/init.d.ts +13 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +110 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/install-daemon.d.ts +61 -0
  52. package/dist/commands/install-daemon.d.ts.map +1 -0
  53. package/dist/commands/install-daemon.js +696 -0
  54. package/dist/commands/install-daemon.js.map +1 -0
  55. package/dist/commands/install-daemon.test.d.ts +2 -0
  56. package/dist/commands/install-daemon.test.d.ts.map +1 -0
  57. package/dist/commands/install-daemon.test.js +93 -0
  58. package/dist/commands/install-daemon.test.js.map +1 -0
  59. package/dist/commands/login.d.ts +14 -0
  60. package/dist/commands/login.d.ts.map +1 -0
  61. package/dist/commands/login.js +121 -0
  62. package/dist/commands/login.js.map +1 -0
  63. package/dist/commands/logout.d.ts +8 -0
  64. package/dist/commands/logout.d.ts.map +1 -0
  65. package/dist/commands/logout.js +13 -0
  66. package/dist/commands/logout.js.map +1 -0
  67. package/dist/commands/mdm.d.ts +23 -0
  68. package/dist/commands/mdm.d.ts.map +1 -0
  69. package/dist/commands/mdm.js +134 -0
  70. package/dist/commands/mdm.js.map +1 -0
  71. package/dist/commands/policy.d.ts +19 -0
  72. package/dist/commands/policy.d.ts.map +1 -0
  73. package/dist/commands/policy.js +232 -0
  74. package/dist/commands/policy.js.map +1 -0
  75. package/dist/commands/prompt.d.ts +11 -0
  76. package/dist/commands/prompt.d.ts.map +1 -0
  77. package/dist/commands/prompt.js +71 -0
  78. package/dist/commands/prompt.js.map +1 -0
  79. package/dist/commands/skill.d.ts +31 -0
  80. package/dist/commands/skill.d.ts.map +1 -0
  81. package/dist/commands/skill.js +349 -0
  82. package/dist/commands/skill.js.map +1 -0
  83. package/dist/commands/sop-audit.d.ts +17 -0
  84. package/dist/commands/sop-audit.d.ts.map +1 -0
  85. package/dist/commands/sop-audit.js +136 -0
  86. package/dist/commands/sop-audit.js.map +1 -0
  87. package/dist/commands/sops.d.ts +4 -0
  88. package/dist/commands/sops.d.ts.map +1 -0
  89. package/dist/commands/sops.js +88 -0
  90. package/dist/commands/sops.js.map +1 -0
  91. package/dist/commands/status.d.ts +11 -0
  92. package/dist/commands/status.d.ts.map +1 -0
  93. package/dist/commands/status.js +107 -0
  94. package/dist/commands/status.js.map +1 -0
  95. package/dist/commands/syncContext.d.ts +18 -0
  96. package/dist/commands/syncContext.d.ts.map +1 -0
  97. package/dist/commands/syncContext.js +37 -0
  98. package/dist/commands/syncContext.js.map +1 -0
  99. package/dist/commands/traces.d.ts +32 -0
  100. package/dist/commands/traces.d.ts.map +1 -0
  101. package/dist/commands/traces.js +207 -0
  102. package/dist/commands/traces.js.map +1 -0
  103. package/dist/commands/whoami.d.ts +12 -0
  104. package/dist/commands/whoami.d.ts.map +1 -0
  105. package/dist/commands/whoami.js +34 -0
  106. package/dist/commands/whoami.js.map +1 -0
  107. package/dist/config/keychain.d.ts +28 -0
  108. package/dist/config/keychain.d.ts.map +1 -0
  109. package/dist/config/keychain.js +98 -0
  110. package/dist/config/keychain.js.map +1 -0
  111. package/dist/config/paths.d.ts +30 -0
  112. package/dist/config/paths.d.ts.map +1 -0
  113. package/dist/config/paths.js +53 -0
  114. package/dist/config/paths.js.map +1 -0
  115. package/dist/config/store.d.ts +25 -0
  116. package/dist/config/store.d.ts.map +1 -0
  117. package/dist/config/store.js +93 -0
  118. package/dist/config/store.js.map +1 -0
  119. package/dist/harness/aider.d.ts +13 -0
  120. package/dist/harness/aider.d.ts.map +1 -0
  121. package/dist/harness/aider.js +48 -0
  122. package/dist/harness/aider.js.map +1 -0
  123. package/dist/harness/antigravity.d.ts +12 -0
  124. package/dist/harness/antigravity.d.ts.map +1 -0
  125. package/dist/harness/antigravity.js +69 -0
  126. package/dist/harness/antigravity.js.map +1 -0
  127. package/dist/harness/base.d.ts +20 -0
  128. package/dist/harness/base.d.ts.map +1 -0
  129. package/dist/harness/base.js +73 -0
  130. package/dist/harness/base.js.map +1 -0
  131. package/dist/harness/claudeCode.d.ts +2 -0
  132. package/dist/harness/claudeCode.d.ts.map +1 -0
  133. package/dist/harness/claudeCode.js +9 -0
  134. package/dist/harness/claudeCode.js.map +1 -0
  135. package/dist/harness/claudeDesktop.d.ts +18 -0
  136. package/dist/harness/claudeDesktop.d.ts.map +1 -0
  137. package/dist/harness/claudeDesktop.js +69 -0
  138. package/dist/harness/claudeDesktop.js.map +1 -0
  139. package/dist/harness/cline.d.ts +13 -0
  140. package/dist/harness/cline.d.ts.map +1 -0
  141. package/dist/harness/cline.js +75 -0
  142. package/dist/harness/cline.js.map +1 -0
  143. package/dist/harness/codex.d.ts +13 -0
  144. package/dist/harness/codex.d.ts.map +1 -0
  145. package/dist/harness/codex.js +86 -0
  146. package/dist/harness/codex.js.map +1 -0
  147. package/dist/harness/continue.d.ts +14 -0
  148. package/dist/harness/continue.d.ts.map +1 -0
  149. package/dist/harness/continue.js +97 -0
  150. package/dist/harness/continue.js.map +1 -0
  151. package/dist/harness/cursor.d.ts +14 -0
  152. package/dist/harness/cursor.d.ts.map +1 -0
  153. package/dist/harness/cursor.js +65 -0
  154. package/dist/harness/cursor.js.map +1 -0
  155. package/dist/harness/detector.d.ts +29 -0
  156. package/dist/harness/detector.d.ts.map +1 -0
  157. package/dist/harness/detector.js +81 -0
  158. package/dist/harness/detector.js.map +1 -0
  159. package/dist/harness/githubCopilot.d.ts +12 -0
  160. package/dist/harness/githubCopilot.d.ts.map +1 -0
  161. package/dist/harness/githubCopilot.js +54 -0
  162. package/dist/harness/githubCopilot.js.map +1 -0
  163. package/dist/harness/goose.d.ts +13 -0
  164. package/dist/harness/goose.d.ts.map +1 -0
  165. package/dist/harness/goose.js +45 -0
  166. package/dist/harness/goose.js.map +1 -0
  167. package/dist/harness/hermes.d.ts +12 -0
  168. package/dist/harness/hermes.d.ts.map +1 -0
  169. package/dist/harness/hermes.js +51 -0
  170. package/dist/harness/hermes.js.map +1 -0
  171. package/dist/harness/n8n.d.ts +17 -0
  172. package/dist/harness/n8n.d.ts.map +1 -0
  173. package/dist/harness/n8n.js +125 -0
  174. package/dist/harness/n8n.js.map +1 -0
  175. package/dist/harness/openWebUI.d.ts +13 -0
  176. package/dist/harness/openWebUI.d.ts.map +1 -0
  177. package/dist/harness/openWebUI.js +25 -0
  178. package/dist/harness/openWebUI.js.map +1 -0
  179. package/dist/harness/openclaw.d.ts +12 -0
  180. package/dist/harness/openclaw.d.ts.map +1 -0
  181. package/dist/harness/openclaw.js +51 -0
  182. package/dist/harness/openclaw.js.map +1 -0
  183. package/dist/harness/openhands.d.ts +12 -0
  184. package/dist/harness/openhands.d.ts.map +1 -0
  185. package/dist/harness/openhands.js +67 -0
  186. package/dist/harness/openhands.js.map +1 -0
  187. package/dist/harness/pi.d.ts +12 -0
  188. package/dist/harness/pi.d.ts.map +1 -0
  189. package/dist/harness/pi.js +51 -0
  190. package/dist/harness/pi.js.map +1 -0
  191. package/dist/harness/rooCode.d.ts +14 -0
  192. package/dist/harness/rooCode.d.ts.map +1 -0
  193. package/dist/harness/rooCode.js +77 -0
  194. package/dist/harness/rooCode.js.map +1 -0
  195. package/dist/harness/types.d.ts +30 -0
  196. package/dist/harness/types.d.ts.map +1 -0
  197. package/dist/harness/types.js +32 -0
  198. package/dist/harness/types.js.map +1 -0
  199. package/dist/harness/vscodeSettingsWriter.d.ts +40 -0
  200. package/dist/harness/vscodeSettingsWriter.d.ts.map +1 -0
  201. package/dist/harness/vscodeSettingsWriter.js +116 -0
  202. package/dist/harness/vscodeSettingsWriter.js.map +1 -0
  203. package/dist/harness/windsurf.d.ts +14 -0
  204. package/dist/harness/windsurf.d.ts.map +1 -0
  205. package/dist/harness/windsurf.js +64 -0
  206. package/dist/harness/windsurf.js.map +1 -0
  207. package/dist/lib/api.d.ts +48 -0
  208. package/dist/lib/api.d.ts.map +1 -0
  209. package/dist/lib/api.js +128 -0
  210. package/dist/lib/api.js.map +1 -0
  211. package/dist/lib/envInjector.d.ts +24 -0
  212. package/dist/lib/envInjector.d.ts.map +1 -0
  213. package/dist/lib/envInjector.js +149 -0
  214. package/dist/lib/envInjector.js.map +1 -0
  215. package/dist/lib/envInjector.test.d.ts +2 -0
  216. package/dist/lib/envInjector.test.d.ts.map +1 -0
  217. package/dist/lib/envInjector.test.js +32 -0
  218. package/dist/lib/envInjector.test.js.map +1 -0
  219. package/dist/lib/gitHooks.d.ts +19 -0
  220. package/dist/lib/gitHooks.d.ts.map +1 -0
  221. package/dist/lib/gitHooks.js +58 -0
  222. package/dist/lib/gitHooks.js.map +1 -0
  223. package/dist/lib/hash.d.ts +11 -0
  224. package/dist/lib/hash.d.ts.map +1 -0
  225. package/dist/lib/hash.js +18 -0
  226. package/dist/lib/hash.js.map +1 -0
  227. package/dist/lib/logger.d.ts +18 -0
  228. package/dist/lib/logger.d.ts.map +1 -0
  229. package/dist/lib/logger.js +33 -0
  230. package/dist/lib/logger.js.map +1 -0
  231. package/dist/lib/onboarding.d.ts +10 -0
  232. package/dist/lib/onboarding.d.ts.map +1 -0
  233. package/dist/lib/onboarding.js +178 -0
  234. package/dist/lib/onboarding.js.map +1 -0
  235. package/dist/lib/process.d.ts +53 -0
  236. package/dist/lib/process.d.ts.map +1 -0
  237. package/dist/lib/process.js +181 -0
  238. package/dist/lib/process.js.map +1 -0
  239. package/dist/lib/process.test.d.ts +2 -0
  240. package/dist/lib/process.test.d.ts.map +1 -0
  241. package/dist/lib/process.test.js +44 -0
  242. package/dist/lib/process.test.js.map +1 -0
  243. package/package.json +55 -0
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Intutic CLI — Skill Management and Loop Engineering Governance Commands.
3
+ *
4
+ * LLD Phase 8 — Loop Engineering & Ingestion Proposals
5
+ */
6
+ import { existsSync } from 'node:fs';
7
+ import * as fs from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { spawn } from 'node:child_process';
10
+ import { log } from '../lib/logger.js';
11
+ import { loadCredentials, loadConfig } from '../config/store.js';
12
+ import { resolveControlPlaneUrl } from '../config/paths.js';
13
+ import { createApiClient } from '../lib/api.js';
14
+ import pc from 'picocolors';
15
+ // ─── Skill Commands ──────────────────────────────────────────────────
16
+ export async function runSkillList() {
17
+ log.header('Intutic — Skill Discovery');
18
+ const config = loadConfig();
19
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
20
+ const filesToScan = [
21
+ '.cursorrules',
22
+ 'CLAUDE.md',
23
+ '.windsurfrules',
24
+ '.clauderules',
25
+ 'rules.md',
26
+ ];
27
+ const skillsReport = [];
28
+ let found = 0;
29
+ for (const file of filesToScan) {
30
+ const fullPath = join(workspaceRoot, file);
31
+ if (existsSync(fullPath)) {
32
+ found++;
33
+ const content = await fs.readFile(fullPath, 'utf8');
34
+ const lines = content.split('\n');
35
+ console.log(` ${pc.green('✔')} ${pc.bold(file)} (${lines.length} lines)`);
36
+ skillsReport.push({
37
+ filePath: file,
38
+ linesCount: lines.length,
39
+ issuesDetected: 0,
40
+ });
41
+ }
42
+ }
43
+ if (found === 0) {
44
+ log.info('No active skill or rule files found in workspace root.');
45
+ }
46
+ else {
47
+ log.success(`Discovered ${found} local harness configuration/skill files.`);
48
+ }
49
+ // Report discovered skills to the Control Plane
50
+ const creds = await loadCredentials().catch(() => null);
51
+ if (creds && skillsReport.length > 0) {
52
+ try {
53
+ const client = await getClient(config?.devMode);
54
+ await client.post(`/api/v1/workspaces/${creds.workspaceId}/skills/report`, { skills: skillsReport });
55
+ log.dim('Reported local skills to Intutic control plane.');
56
+ }
57
+ catch (err) {
58
+ // Non-blocking
59
+ }
60
+ }
61
+ }
62
+ export async function runSkillAudit() {
63
+ log.header('Intutic — Skill Security Audit');
64
+ const config = loadConfig();
65
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
66
+ const creds = await loadCredentials().catch(() => null);
67
+ let enableLocalSkillAuditDelete = false;
68
+ // Fetch workspace settings to see if auto-delete is enabled
69
+ if (creds) {
70
+ try {
71
+ const client = await getClient(config?.devMode);
72
+ const syncConfig = await client.fetchConfig(creds.workspaceId);
73
+ enableLocalSkillAuditDelete = syncConfig.settings?.enableLocalSkillAuditDelete ?? false;
74
+ }
75
+ catch {
76
+ // fallback to false
77
+ }
78
+ }
79
+ const filesToScan = [
80
+ '.cursorrules',
81
+ 'CLAUDE.md',
82
+ '.windsurfrules',
83
+ '.clauderules',
84
+ ];
85
+ let issues = 0;
86
+ const skillsReport = [];
87
+ for (const file of filesToScan) {
88
+ const fullPath = join(workspaceRoot, file);
89
+ if (existsSync(fullPath)) {
90
+ const content = await fs.readFile(fullPath, 'utf8');
91
+ let fileIssues = 0;
92
+ let contentLines = content.split('\n');
93
+ let fileUpdated = false;
94
+ // 1. Audit for secrets (AWS, Intutic, generic keys)
95
+ if (content.match(/vk_[a-zA-Z0-9]{30,}/)) {
96
+ log.error(`[${file}] Hardcoded Intutic virtual key prefix detected.`);
97
+ fileIssues++;
98
+ }
99
+ if (content.match(/sk-live-[a-zA-Z0-9]{30,}/)) {
100
+ log.error(`[${file}] Hardcoded API secrets detected.`);
101
+ fileIssues++;
102
+ }
103
+ // 2. Audit for unsafe wildcard commands (e.g. rm -rf *, sh *)
104
+ if (content.match(/rm\s+-rf\s+[\*\/]/)) {
105
+ log.warn(`[${file}] Unsafe recursive delete wildcard patterns (rm -rf *) found.`);
106
+ fileIssues++;
107
+ }
108
+ if (content.match(/curl\s+|wget\s+/)) {
109
+ log.warn(`[${file}] Network retrieval commands (curl, wget) found inside rules instructions.`);
110
+ fileIssues++;
111
+ }
112
+ // 3. Auto-delete/prune unsafe lines if setting is enabled
113
+ if (fileIssues > 0 && enableLocalSkillAuditDelete) {
114
+ const filteredLines = contentLines.filter((line) => {
115
+ const isSecret = line.match(/vk_[a-zA-Z0-9]{30,}/) || line.match(/sk-live-[a-zA-Z0-9]{30,}/);
116
+ const isUnsafeCmd = line.match(/rm\s+-rf\s+[\*\/]/) || line.match(/curl\s+|wget\s+/);
117
+ if (isSecret || isUnsafeCmd) {
118
+ fileUpdated = true;
119
+ return false;
120
+ }
121
+ return true;
122
+ });
123
+ if (fileUpdated) {
124
+ await fs.writeFile(fullPath, filteredLines.join('\n'), 'utf8');
125
+ log.success(`[${file}] Auto-pruned unsafe lines/rules during security audit.`);
126
+ }
127
+ }
128
+ issues += fileIssues;
129
+ skillsReport.push({
130
+ filePath: file,
131
+ linesCount: contentLines.length,
132
+ issuesDetected: fileIssues,
133
+ });
134
+ }
135
+ }
136
+ if (issues === 0) {
137
+ log.success('Skill security audit passed. No credentials or critical safety risks detected.');
138
+ }
139
+ else {
140
+ log.warn(`Security audit completed with ${issues} findings. Review warnings above.`);
141
+ }
142
+ // Report findings to Control Plane
143
+ if (creds && skillsReport.length > 0) {
144
+ try {
145
+ const client = await getClient(config?.devMode);
146
+ await client.post(`/api/v1/workspaces/${creds.workspaceId}/skills/report`, { skills: skillsReport });
147
+ }
148
+ catch {
149
+ // Non-blocking
150
+ }
151
+ }
152
+ }
153
+ // ─── Loop Commands ───────────────────────────────────────────────────
154
+ async function getClient(dev) {
155
+ const creds = await loadCredentials();
156
+ if (!creds) {
157
+ log.error('Not authenticated. Run `intutic login` first.');
158
+ process.exit(1);
159
+ }
160
+ const devMode = dev || process.env.INTUTIC_DEV === '1';
161
+ const controlPlaneUrl = resolveControlPlaneUrl(devMode);
162
+ return createApiClient(controlPlaneUrl, creds.apiKey);
163
+ }
164
+ async function resolveLocalSops(sopsArg) {
165
+ if (!sopsArg)
166
+ return [];
167
+ const config = loadConfig();
168
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
169
+ const sopsDir = join(workspaceRoot, '.intutic', 'sops');
170
+ let dirs = [];
171
+ try {
172
+ const entries = await fs.readdir(sopsDir, { withFileTypes: true });
173
+ dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
174
+ }
175
+ catch {
176
+ return [];
177
+ }
178
+ const selectedSops = [];
179
+ const parts = sopsArg.split(',').map((p) => p.trim());
180
+ for (const part of parts) {
181
+ const optIndex = parseInt(part, 10) - 1;
182
+ if (!isNaN(optIndex) && optIndex >= 0 && optIndex < dirs.length) {
183
+ selectedSops.push(dirs[optIndex]);
184
+ }
185
+ else {
186
+ const partLower = part.toLowerCase();
187
+ const matched = dirs.find((d) => d.toLowerCase() === partLower) ||
188
+ dirs.find((d) => d.toLowerCase().includes(partLower));
189
+ if (matched && !selectedSops.includes(matched)) {
190
+ selectedSops.push(matched);
191
+ }
192
+ }
193
+ }
194
+ return selectedSops;
195
+ }
196
+ export async function runLoopStart(opts) {
197
+ log.header('Intutic — Start Loop Run');
198
+ if (!opts.name) {
199
+ log.error('Loop run name is required (--name <name>)');
200
+ process.exit(1);
201
+ }
202
+ const config = loadConfig();
203
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
204
+ const resolvedSops = await resolveLocalSops(opts.sops);
205
+ if (resolvedSops.length > 0) {
206
+ const sessionContextPath = join(workspaceRoot, '.intutic', 'session-context.json');
207
+ await fs.mkdir(join(workspaceRoot, '.intutic'), { recursive: true }).catch(() => { });
208
+ await fs.writeFile(sessionContextPath, JSON.stringify({ activeLocalSops: resolvedSops }, null, 2) + '\n', 'utf-8');
209
+ log.info(`Active local SOPs configuration updated: ${resolvedSops.join(', ')}`);
210
+ }
211
+ const client = await getClient(opts.dev);
212
+ try {
213
+ const res = await client.post('/api/v1/loops/start', {
214
+ name: opts.name,
215
+ budgetLimitUsd: opts.budget,
216
+ sops: resolvedSops,
217
+ autoJudge: opts.autoJudge
218
+ });
219
+ if (res.ok && res.loop) {
220
+ log.success(`Loop run active: ${pc.bold(res.loop.loopRunId)}`);
221
+ log.info(`Budget limit: $${res.loop.budgetLimitUsd} USD`);
222
+ // Write loop env file locally
223
+ const loopEnvPath = join(process.env.HOME || '', '.intutic', 'env', 'loop.env');
224
+ await fs.mkdir(dirname(loopEnvPath), { recursive: true }).catch(() => { });
225
+ await fs.writeFile(loopEnvPath, `INTUTIC_LOOP_RUN_ID=${res.loop.loopRunId}\n`);
226
+ log.dim(`Wrote run context to ~/.intutic/env/loop.env`);
227
+ }
228
+ }
229
+ catch (err) {
230
+ log.error(`Failed to register loop: ${err.message}`);
231
+ }
232
+ }
233
+ export async function runLoopComplete(loopRunId, opts) {
234
+ log.header('Intutic — Complete Loop');
235
+ const client = await getClient(opts.dev);
236
+ try {
237
+ const res = await client.post(`/api/v1/loops/${loopRunId}/complete`);
238
+ if (res.ok) {
239
+ log.success(`Loop run ${loopRunId} completed.`);
240
+ // Clean env
241
+ const loopEnvPath = join(process.env.HOME || '', '.intutic', 'env', 'loop.env');
242
+ await fs.rm(loopEnvPath, { force: true });
243
+ }
244
+ }
245
+ catch (err) {
246
+ log.error(`Failed to complete loop: ${err.message}`);
247
+ }
248
+ }
249
+ export async function runLoopKill(loopRunId, opts) {
250
+ log.header('Intutic — Kill Loop');
251
+ const client = await getClient(opts.dev);
252
+ try {
253
+ const res = await client.post(`/api/v1/loops/${loopRunId}/kill`);
254
+ if (res.ok) {
255
+ log.warn(`Loop run ${loopRunId} marked as KILLED.`);
256
+ const loopEnvPath = join(process.env.HOME || '', '.intutic', 'env', 'loop.env');
257
+ await fs.rm(loopEnvPath, { force: true });
258
+ }
259
+ }
260
+ catch (err) {
261
+ log.error(`Failed to kill loop: ${err.message}`);
262
+ }
263
+ }
264
+ export async function runLoopList(opts) {
265
+ log.header('Intutic — Workspace Loop Runs');
266
+ const client = await getClient(opts.dev);
267
+ try {
268
+ const res = await client.get('/api/v1/loops');
269
+ if (res.ok && res.loops) {
270
+ console.log(` ${pc.bold('Loop Run ID')} | ${pc.bold('Name')} | ${pc.bold('Status')} | ${pc.bold('Token Spend')} | ${pc.bold('Budget Limit')}`);
271
+ console.log(' ' + '-'.repeat(85));
272
+ for (const loop of res.loops) {
273
+ const statusStr = loop.status === 'ACTIVE' ? pc.green(loop.status) : loop.status === 'COMPLETED' ? pc.cyan(loop.status) : pc.red(loop.status);
274
+ console.log(` ${loop.loopRunId.padEnd(21)} | ${loop.name.padEnd(14)} | ${statusStr.padEnd(17)} | $${parseFloat(loop.totalTokenCostUsd).toFixed(4).padEnd(10)} | $${parseFloat(loop.budgetLimitUsd).toFixed(2)}`);
275
+ }
276
+ }
277
+ }
278
+ catch (err) {
279
+ log.error(`Failed to list loops: ${err.message}`);
280
+ }
281
+ }
282
+ export async function runLoopExec(commandAndArgs, opts) {
283
+ if (commandAndArgs.length === 0) {
284
+ log.error('No command provided. Use: intutic loop exec -- <command> [args...]');
285
+ process.exit(1);
286
+ }
287
+ const loopName = opts.name || `exec-${commandAndArgs[0]}`;
288
+ const config = loadConfig();
289
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
290
+ const resolvedSops = await resolveLocalSops(opts.sops);
291
+ if (resolvedSops.length > 0) {
292
+ const sessionContextPath = join(workspaceRoot, '.intutic', 'session-context.json');
293
+ await fs.mkdir(join(workspaceRoot, '.intutic'), { recursive: true }).catch(() => { });
294
+ await fs.writeFile(sessionContextPath, JSON.stringify({ activeLocalSops: resolvedSops }, null, 2) + '\n', 'utf-8');
295
+ log.info(`Active local SOPs configuration updated: ${resolvedSops.join(', ')}`);
296
+ }
297
+ const client = await getClient(opts.dev);
298
+ log.header(`Intutic — Execute Loop Wrapper: ${loopName}`);
299
+ try {
300
+ const res = await client.post('/api/v1/loops/start', {
301
+ name: loopName,
302
+ budgetLimitUsd: opts.budget,
303
+ sops: resolvedSops,
304
+ autoJudge: opts.autoJudge
305
+ });
306
+ if (!res.ok || !res.loop) {
307
+ log.error('Failed to start loop wrapper');
308
+ process.exit(1);
309
+ }
310
+ const loopRunId = res.loop.loopRunId;
311
+ log.success(`Loop run registered: ${loopRunId}`);
312
+ // Execute process with INTUTIC_LOOP_RUN_ID in environment
313
+ const childEnv = {
314
+ ...process.env,
315
+ INTUTIC_LOOP_RUN_ID: loopRunId,
316
+ // For dynamic header routing
317
+ HTTP_X_LOOP_RUN_ID: loopRunId,
318
+ };
319
+ const command = commandAndArgs[0];
320
+ const args = commandAndArgs.slice(1);
321
+ log.info(`Executing wrapper command: ${command} ${args.join(' ')}`);
322
+ const child = spawn(command, args, {
323
+ env: childEnv,
324
+ stdio: 'inherit',
325
+ shell: true,
326
+ });
327
+ child.on('close', async (code) => {
328
+ if (code === 0) {
329
+ await client.post(`/api/v1/loops/${loopRunId}/complete`).catch(() => { });
330
+ log.success(`Loop command execution succeeded. Wrapper loop marked COMPLETED.`);
331
+ }
332
+ else {
333
+ await client.post(`/api/v1/loops/${loopRunId}/kill`).catch(() => { });
334
+ log.warn(`Loop command execution exited with code ${code}. Wrapper loop marked KILLED.`);
335
+ }
336
+ process.exit(code || 0);
337
+ });
338
+ }
339
+ catch (err) {
340
+ log.error(`Loop execution wrapper failed: ${err.message}`);
341
+ process.exit(1);
342
+ }
343
+ }
344
+ function dirname(filePath) {
345
+ const parts = filePath.split('/');
346
+ parts.pop();
347
+ return parts.join('/');
348
+ }
349
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `intutic sop audit` — SOP health, dependency graph, and drift report.
3
+ *
4
+ * Fetches:
5
+ * 1. GET /api/v1/sop/dependency-graph — SOP nodes + cross-reference edges
6
+ * 2. GET /api/v1/sync/report — drift data per harness
7
+ *
8
+ * Outputs a formatted table: SOP ID | Title | Status | Edges | Drift
9
+ * Exits with code 1 if any SOP shows DRIFTED status or if drift is detected.
10
+ *
11
+ * TD-124: CLI intutic sop audit command
12
+ * LLD #8 — Sync Daemon / CLI
13
+ *
14
+ * @module
15
+ */
16
+ export declare function runSopAudit(): Promise<void>;
17
+ //# sourceMappingURL=sop-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sop-audit.d.ts","sourceRoot":"","sources":["../../src/commands/sop-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyIjD"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * `intutic sop audit` — SOP health, dependency graph, and drift report.
3
+ *
4
+ * Fetches:
5
+ * 1. GET /api/v1/sop/dependency-graph — SOP nodes + cross-reference edges
6
+ * 2. GET /api/v1/sync/report — drift data per harness
7
+ *
8
+ * Outputs a formatted table: SOP ID | Title | Status | Edges | Drift
9
+ * Exits with code 1 if any SOP shows DRIFTED status or if drift is detected.
10
+ *
11
+ * TD-124: CLI intutic sop audit command
12
+ * LLD #8 — Sync Daemon / CLI
13
+ *
14
+ * @module
15
+ */
16
+ import pc from 'picocolors';
17
+ import { log } from '../lib/logger.js';
18
+ import { loadCredentials } from '../config/store.js';
19
+ export async function runSopAudit() {
20
+ log.header('Intutic — SOP Audit');
21
+ const creds = await loadCredentials();
22
+ if (!creds) {
23
+ log.error('Not authenticated. Run `intutic login` first.');
24
+ process.exit(1);
25
+ }
26
+ const baseUrl = creds.controlPlaneUrl ?? 'https://api.intutic.ai';
27
+ const headers = {
28
+ Authorization: `Bearer ${creds.apiKey}`,
29
+ 'x-workspace-id': creds.workspaceId ?? '',
30
+ 'Content-Type': 'application/json',
31
+ };
32
+ // ── 1. Fetch dependency graph ──────────────────────────────────────
33
+ let graph = { ok: false, nodes: [], edges: [] };
34
+ try {
35
+ const resp = await fetch(`${baseUrl}/api/v1/sop/dependency-graph`, { headers });
36
+ if (resp.ok) {
37
+ graph = (await resp.json());
38
+ }
39
+ else {
40
+ log.warn(`Dependency graph fetch failed: HTTP ${resp.status}`);
41
+ }
42
+ }
43
+ catch (err) {
44
+ log.warn(`Dependency graph unreachable: ${err instanceof Error ? err.message : String(err)}`);
45
+ }
46
+ // ── 2. Fetch sync/drift report ─────────────────────────────────────
47
+ let syncReport = {};
48
+ try {
49
+ const resp = await fetch(`${baseUrl}/api/v1/sync/report`, { headers });
50
+ if (resp.ok) {
51
+ syncReport = (await resp.json());
52
+ }
53
+ else {
54
+ log.warn(`Sync report fetch failed: HTTP ${resp.status}`);
55
+ }
56
+ }
57
+ catch (err) {
58
+ log.warn(`Sync report unreachable: ${err instanceof Error ? err.message : String(err)}`);
59
+ }
60
+ // Build edge count map
61
+ const edgesFrom = new Map();
62
+ for (const edge of graph.edges) {
63
+ edgesFrom.set(edge.from, (edgesFrom.get(edge.from) ?? 0) + 1);
64
+ }
65
+ // Global drift flag from sync report
66
+ const hasDrift = (syncReport.harnesses ?? []).some((h) => h.drifted);
67
+ // ── 3. Print table ─────────────────────────────────────────────────
68
+ const COL_ID = 22;
69
+ const COL_TITLE = 36;
70
+ const COL_STATUS = 14;
71
+ const COL_EDGES = 7;
72
+ const COL_DRIFT = 8;
73
+ const padR = (s, n) => s.slice(0, n).padEnd(n);
74
+ const padL = (s, n) => s.slice(0, n).padStart(n);
75
+ const header = pc.bold(padR('SOP ID', COL_ID)) +
76
+ ' ' +
77
+ pc.bold(padR('Title', COL_TITLE)) +
78
+ ' ' +
79
+ pc.bold(padR('Status', COL_STATUS)) +
80
+ ' ' +
81
+ pc.bold(padL('Refs', COL_EDGES)) +
82
+ ' ' +
83
+ pc.bold(padL('Drift', COL_DRIFT));
84
+ const divider = '─'.repeat(COL_ID + COL_TITLE + COL_STATUS + COL_EDGES + COL_DRIFT + 8);
85
+ console.log('\n' + header);
86
+ console.log(pc.dim(divider));
87
+ let hasSopIssues = false;
88
+ if (graph.nodes.length === 0) {
89
+ console.log(pc.dim(' (no SOPs found in workspace)'));
90
+ }
91
+ else {
92
+ for (const node of graph.nodes) {
93
+ const refs = edgesFrom.get(node.id) ?? 0;
94
+ const isDrifted = node.status === 'DRIFTED' || node.status === 'DEPRECATED';
95
+ const driftStr = hasDrift ? pc.yellow('⚠ yes') : pc.green(' ok');
96
+ if (isDrifted)
97
+ hasSopIssues = true;
98
+ const statusStr = isDrifted
99
+ ? pc.yellow(padR(node.status, COL_STATUS))
100
+ : node.status === 'ACTIVE'
101
+ ? pc.green(padR(node.status, COL_STATUS))
102
+ : pc.dim(padR(node.status, COL_STATUS));
103
+ console.log(padR(node.id, COL_ID) +
104
+ ' ' +
105
+ padR(node.title, COL_TITLE) +
106
+ ' ' +
107
+ statusStr +
108
+ ' ' +
109
+ padL(String(refs), COL_EDGES) +
110
+ ' ' +
111
+ driftStr);
112
+ }
113
+ }
114
+ console.log(pc.dim(divider));
115
+ console.log();
116
+ // ── 4. Summary ─────────────────────────────────────────────────────
117
+ log.field('Total SOPs', String(graph.nodes.length));
118
+ log.field('Cross-references', String(graph.edges.length));
119
+ if (syncReport.harnesses && syncReport.harnesses.length > 0) {
120
+ const driftedHarnesses = syncReport.harnesses.filter((h) => h.drifted);
121
+ log.field('Harness drift', driftedHarnesses.length > 0
122
+ ? pc.yellow(`${driftedHarnesses.length} drifted (${driftedHarnesses.map((h) => h.harnessType).join(', ')})`)
123
+ : pc.green('none'));
124
+ }
125
+ const exitCode = hasSopIssues || hasDrift ? 1 : 0;
126
+ if (exitCode === 1) {
127
+ console.log();
128
+ log.error('Audit failed — drift or deprecated SOPs detected. Review and remediate.');
129
+ }
130
+ else {
131
+ console.log();
132
+ log.success('Audit passed — all SOPs healthy.');
133
+ }
134
+ process.exit(exitCode);
135
+ }
136
+ //# sourceMappingURL=sop-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sop-audit.js","sourceRoot":"","sources":["../../src/commands/sop-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function runSopsPush(name: string, opts: {
2
+ dev?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=sops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sops.d.ts","sourceRoot":"","sources":["../../src/commands/sops.ts"],"names":[],"mappings":"AAmBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EtF"}
@@ -0,0 +1,88 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { log } from '../lib/logger.js';
4
+ import { loadCredentials, loadConfig } from '../config/store.js';
5
+ import { resolveControlPlaneUrl } from '../config/paths.js';
6
+ import { createApiClient } from '../lib/api.js';
7
+ async function getClient(dev) {
8
+ const creds = await loadCredentials();
9
+ if (!creds) {
10
+ log.error('Not authenticated. Run `intutic login` first.');
11
+ process.exit(1);
12
+ }
13
+ const config = loadConfig();
14
+ const devMode = dev || config?.devMode || process.env.INTUTIC_DEV === '1';
15
+ const controlPlaneUrl = resolveControlPlaneUrl(devMode);
16
+ return createApiClient(controlPlaneUrl, creds.apiKey);
17
+ }
18
+ export async function runSopsPush(name, opts) {
19
+ log.header(`Intutic — Push SOP: ${name}`);
20
+ const config = loadConfig();
21
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
22
+ const sopsDir = join(workspaceRoot, '.intutic', 'sops', name);
23
+ // 1. Verify directory exists
24
+ try {
25
+ const stat = await fs.stat(sopsDir);
26
+ if (!stat.isDirectory()) {
27
+ log.error(`Path is not a directory: ${sopsDir}`);
28
+ process.exit(1);
29
+ }
30
+ }
31
+ catch {
32
+ log.error(`Local SOP folder not found: ${sopsDir}`);
33
+ process.exit(1);
34
+ }
35
+ // 2. Read all markdown files
36
+ let markdownContent = '';
37
+ try {
38
+ const entries = await fs.readdir(sopsDir);
39
+ const mdFiles = entries.filter((e) => e.endsWith('.md'));
40
+ if (mdFiles.length === 0) {
41
+ log.error(`No markdown (.md) files found in local SOP folder: ${sopsDir}`);
42
+ process.exit(1);
43
+ }
44
+ for (const file of mdFiles) {
45
+ const content = await fs.readFile(join(sopsDir, file), 'utf-8');
46
+ markdownContent += content + '\n\n';
47
+ }
48
+ }
49
+ catch (err) {
50
+ log.error(`Error reading SOP files: ${err.message}`);
51
+ process.exit(1);
52
+ }
53
+ const cleanContent = markdownContent.trim();
54
+ if (!cleanContent) {
55
+ log.error('Combined markdown content is empty.');
56
+ process.exit(1);
57
+ }
58
+ // 3. Format title (e.g. "postgres-migration" -> "Postgres Migration")
59
+ const title = name
60
+ .split(/[-_]/)
61
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
62
+ .join(' ');
63
+ // 4. Submit to control plane
64
+ const client = await getClient(opts.dev);
65
+ try {
66
+ const res = await client.post('/api/v1/sops', {
67
+ title,
68
+ markdown_content: cleanContent,
69
+ risk_tier: 'LOW',
70
+ complexity_tier: 'TIER_0',
71
+ version: '1.0.0',
72
+ });
73
+ if (res && res.sopId) {
74
+ log.info(`Successfully promoted local SOP "${name}" to global Workspace SOP!`);
75
+ log.field('SOP ID', res.sopId);
76
+ log.field('Title', title);
77
+ }
78
+ else {
79
+ log.error('Failed to create SOP on the control plane.');
80
+ process.exit(1);
81
+ }
82
+ }
83
+ catch (err) {
84
+ log.error(`Failed to push SOP to control plane: ${err.message}`);
85
+ process.exit(1);
86
+ }
87
+ }
88
+ //# sourceMappingURL=sops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sops.js","sourceRoot":"","sources":["../../src/commands/sops.ts"],"names":[],"mappings":"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"}