saasgadget 0.1.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 (515) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +48 -0
  3. package/dist/agents/business-analyst.d.ts +14 -0
  4. package/dist/agents/business-analyst.d.ts.map +1 -0
  5. package/dist/agents/business-analyst.js +70 -0
  6. package/dist/agents/business-analyst.js.map +1 -0
  7. package/dist/agents/code-inspector.d.ts +19 -0
  8. package/dist/agents/code-inspector.d.ts.map +1 -0
  9. package/dist/agents/code-inspector.js +149 -0
  10. package/dist/agents/code-inspector.js.map +1 -0
  11. package/dist/agents/competitor-tracker.d.ts +19 -0
  12. package/dist/agents/competitor-tracker.d.ts.map +1 -0
  13. package/dist/agents/competitor-tracker.js +190 -0
  14. package/dist/agents/competitor-tracker.js.map +1 -0
  15. package/dist/agents/finance-auditor.d.ts +14 -0
  16. package/dist/agents/finance-auditor.d.ts.map +1 -0
  17. package/dist/agents/finance-auditor.js +73 -0
  18. package/dist/agents/finance-auditor.js.map +1 -0
  19. package/dist/agents/gtm-strategist.d.ts +14 -0
  20. package/dist/agents/gtm-strategist.d.ts.map +1 -0
  21. package/dist/agents/gtm-strategist.js +73 -0
  22. package/dist/agents/gtm-strategist.js.map +1 -0
  23. package/dist/agents/orchestrator.d.ts +52 -0
  24. package/dist/agents/orchestrator.d.ts.map +1 -0
  25. package/dist/agents/orchestrator.js +174 -0
  26. package/dist/agents/orchestrator.js.map +1 -0
  27. package/dist/agents/sdk-client.d.ts +48 -0
  28. package/dist/agents/sdk-client.d.ts.map +1 -0
  29. package/dist/agents/sdk-client.js +119 -0
  30. package/dist/agents/sdk-client.js.map +1 -0
  31. package/dist/agents/security-compliance.d.ts +14 -0
  32. package/dist/agents/security-compliance.d.ts.map +1 -0
  33. package/dist/agents/security-compliance.js +87 -0
  34. package/dist/agents/security-compliance.js.map +1 -0
  35. package/dist/agents/skeptic-reviewer.d.ts +14 -0
  36. package/dist/agents/skeptic-reviewer.d.ts.map +1 -0
  37. package/dist/agents/skeptic-reviewer.js +65 -0
  38. package/dist/agents/skeptic-reviewer.js.map +1 -0
  39. package/dist/agents/skills-directory.d.ts +36 -0
  40. package/dist/agents/skills-directory.d.ts.map +1 -0
  41. package/dist/agents/skills-directory.js +108 -0
  42. package/dist/agents/skills-directory.js.map +1 -0
  43. package/dist/cli/commands/auth.d.ts +8 -0
  44. package/dist/cli/commands/auth.d.ts.map +1 -0
  45. package/dist/cli/commands/auth.js +90 -0
  46. package/dist/cli/commands/auth.js.map +1 -0
  47. package/dist/cli/commands/doctor.d.ts +10 -0
  48. package/dist/cli/commands/doctor.d.ts.map +1 -0
  49. package/dist/cli/commands/doctor.js +240 -0
  50. package/dist/cli/commands/doctor.js.map +1 -0
  51. package/dist/cli/commands/fix.d.ts +4 -0
  52. package/dist/cli/commands/fix.d.ts.map +1 -0
  53. package/dist/cli/commands/fix.js +344 -0
  54. package/dist/cli/commands/fix.js.map +1 -0
  55. package/dist/cli/commands/init.d.ts +8 -0
  56. package/dist/cli/commands/init.d.ts.map +1 -0
  57. package/dist/cli/commands/init.js +109 -0
  58. package/dist/cli/commands/init.js.map +1 -0
  59. package/dist/cli/commands/mcp.d.ts +4 -0
  60. package/dist/cli/commands/mcp.d.ts.map +1 -0
  61. package/dist/cli/commands/mcp.js +441 -0
  62. package/dist/cli/commands/mcp.js.map +1 -0
  63. package/dist/cli/commands/new.d.ts +4 -0
  64. package/dist/cli/commands/new.d.ts.map +1 -0
  65. package/dist/cli/commands/new.js +193 -0
  66. package/dist/cli/commands/new.js.map +1 -0
  67. package/dist/cli/commands/pack.d.ts +4 -0
  68. package/dist/cli/commands/pack.d.ts.map +1 -0
  69. package/dist/cli/commands/pack.js +312 -0
  70. package/dist/cli/commands/pack.js.map +1 -0
  71. package/dist/cli/commands/plan.d.ts +4 -0
  72. package/dist/cli/commands/plan.d.ts.map +1 -0
  73. package/dist/cli/commands/plan.js +250 -0
  74. package/dist/cli/commands/plan.js.map +1 -0
  75. package/dist/cli/commands/research.d.ts +7 -0
  76. package/dist/cli/commands/research.d.ts.map +1 -0
  77. package/dist/cli/commands/research.js +331 -0
  78. package/dist/cli/commands/research.js.map +1 -0
  79. package/dist/cli/commands/scan.d.ts +4 -0
  80. package/dist/cli/commands/scan.d.ts.map +1 -0
  81. package/dist/cli/commands/scan.js +434 -0
  82. package/dist/cli/commands/scan.js.map +1 -0
  83. package/dist/cli/commands/session.d.ts +4 -0
  84. package/dist/cli/commands/session.d.ts.map +1 -0
  85. package/dist/cli/commands/session.js +343 -0
  86. package/dist/cli/commands/session.js.map +1 -0
  87. package/dist/cli/commands/settings.d.ts +8 -0
  88. package/dist/cli/commands/settings.d.ts.map +1 -0
  89. package/dist/cli/commands/settings.js +302 -0
  90. package/dist/cli/commands/settings.js.map +1 -0
  91. package/dist/cli/commands/start.d.ts +10 -0
  92. package/dist/cli/commands/start.d.ts.map +1 -0
  93. package/dist/cli/commands/start.js +185 -0
  94. package/dist/cli/commands/start.js.map +1 -0
  95. package/dist/cli/commands/types.d.ts +15 -0
  96. package/dist/cli/commands/types.d.ts.map +1 -0
  97. package/dist/cli/commands/types.js +2 -0
  98. package/dist/cli/commands/types.js.map +1 -0
  99. package/dist/cli/flag-resolver.d.ts +17 -0
  100. package/dist/cli/flag-resolver.d.ts.map +1 -0
  101. package/dist/cli/flag-resolver.js +57 -0
  102. package/dist/cli/flag-resolver.js.map +1 -0
  103. package/dist/cli/output/formatter.d.ts +22 -0
  104. package/dist/cli/output/formatter.d.ts.map +1 -0
  105. package/dist/cli/output/formatter.js +40 -0
  106. package/dist/cli/output/formatter.js.map +1 -0
  107. package/dist/cli/output/hints.d.ts +7 -0
  108. package/dist/cli/output/hints.d.ts.map +1 -0
  109. package/dist/cli/output/hints.js +27 -0
  110. package/dist/cli/output/hints.js.map +1 -0
  111. package/dist/cli/output/json-writer.d.ts +7 -0
  112. package/dist/cli/output/json-writer.d.ts.map +1 -0
  113. package/dist/cli/output/json-writer.js +19 -0
  114. package/dist/cli/output/json-writer.js.map +1 -0
  115. package/dist/cli/output/markdown-writer.d.ts +7 -0
  116. package/dist/cli/output/markdown-writer.d.ts.map +1 -0
  117. package/dist/cli/output/markdown-writer.js +75 -0
  118. package/dist/cli/output/markdown-writer.js.map +1 -0
  119. package/dist/cli/tui/banner.d.ts +2 -0
  120. package/dist/cli/tui/banner.d.ts.map +1 -0
  121. package/dist/cli/tui/banner.js +46 -0
  122. package/dist/cli/tui/banner.js.map +1 -0
  123. package/dist/cli/tui/colors.d.ts +22 -0
  124. package/dist/cli/tui/colors.d.ts.map +1 -0
  125. package/dist/cli/tui/colors.js +79 -0
  126. package/dist/cli/tui/colors.js.map +1 -0
  127. package/dist/cli/tui/dashboard.d.ts +20 -0
  128. package/dist/cli/tui/dashboard.d.ts.map +1 -0
  129. package/dist/cli/tui/dashboard.js +140 -0
  130. package/dist/cli/tui/dashboard.js.map +1 -0
  131. package/dist/cli/tui/prompt.d.ts +55 -0
  132. package/dist/cli/tui/prompt.d.ts.map +1 -0
  133. package/dist/cli/tui/prompt.js +193 -0
  134. package/dist/cli/tui/prompt.js.map +1 -0
  135. package/dist/cli/tui/slash-commands.d.ts +43 -0
  136. package/dist/cli/tui/slash-commands.d.ts.map +1 -0
  137. package/dist/cli/tui/slash-commands.js +439 -0
  138. package/dist/cli/tui/slash-commands.js.map +1 -0
  139. package/dist/config/config-store.d.ts +27 -0
  140. package/dist/config/config-store.d.ts.map +1 -0
  141. package/dist/config/config-store.js +125 -0
  142. package/dist/config/config-store.js.map +1 -0
  143. package/dist/config/presets.d.ts +15 -0
  144. package/dist/config/presets.d.ts.map +1 -0
  145. package/dist/config/presets.js +91 -0
  146. package/dist/config/presets.js.map +1 -0
  147. package/dist/config/tool-profiles.d.ts +29 -0
  148. package/dist/config/tool-profiles.d.ts.map +1 -0
  149. package/dist/config/tool-profiles.js +56 -0
  150. package/dist/config/tool-profiles.js.map +1 -0
  151. package/dist/contracts/agent-invoker.d.ts +9 -0
  152. package/dist/contracts/agent-invoker.d.ts.map +1 -0
  153. package/dist/contracts/agent-invoker.js +2 -0
  154. package/dist/contracts/agent-invoker.js.map +1 -0
  155. package/dist/contracts/agent.d.ts +36 -0
  156. package/dist/contracts/agent.d.ts.map +1 -0
  157. package/dist/contracts/agent.js +2 -0
  158. package/dist/contracts/agent.js.map +1 -0
  159. package/dist/contracts/config-store.d.ts +13 -0
  160. package/dist/contracts/config-store.d.ts.map +1 -0
  161. package/dist/contracts/config-store.js +2 -0
  162. package/dist/contracts/config-store.js.map +1 -0
  163. package/dist/contracts/crawler.d.ts +17 -0
  164. package/dist/contracts/crawler.d.ts.map +1 -0
  165. package/dist/contracts/crawler.js +2 -0
  166. package/dist/contracts/crawler.js.map +1 -0
  167. package/dist/contracts/exporter.d.ts +18 -0
  168. package/dist/contracts/exporter.d.ts.map +1 -0
  169. package/dist/contracts/exporter.js +11 -0
  170. package/dist/contracts/exporter.js.map +1 -0
  171. package/dist/contracts/index.d.ts +14 -0
  172. package/dist/contracts/index.d.ts.map +1 -0
  173. package/dist/contracts/index.js +2 -0
  174. package/dist/contracts/index.js.map +1 -0
  175. package/dist/contracts/mcp-tool-provider.d.ts +18 -0
  176. package/dist/contracts/mcp-tool-provider.d.ts.map +1 -0
  177. package/dist/contracts/mcp-tool-provider.js +2 -0
  178. package/dist/contracts/mcp-tool-provider.js.map +1 -0
  179. package/dist/contracts/report-pack-generator.d.ts +20 -0
  180. package/dist/contracts/report-pack-generator.d.ts.map +1 -0
  181. package/dist/contracts/report-pack-generator.js +2 -0
  182. package/dist/contracts/report-pack-generator.js.map +1 -0
  183. package/dist/contracts/search-provider.d.ts +15 -0
  184. package/dist/contracts/search-provider.d.ts.map +1 -0
  185. package/dist/contracts/search-provider.js +2 -0
  186. package/dist/contracts/search-provider.js.map +1 -0
  187. package/dist/contracts/session-manager.d.ts +36 -0
  188. package/dist/contracts/session-manager.d.ts.map +1 -0
  189. package/dist/contracts/session-manager.js +2 -0
  190. package/dist/contracts/session-manager.js.map +1 -0
  191. package/dist/index.d.ts +3 -0
  192. package/dist/index.d.ts.map +1 -0
  193. package/dist/index.js +299 -0
  194. package/dist/index.js.map +1 -0
  195. package/dist/lib/ai/provider-factory.d.ts +64 -0
  196. package/dist/lib/ai/provider-factory.d.ts.map +1 -0
  197. package/dist/lib/ai/provider-factory.js +249 -0
  198. package/dist/lib/ai/provider-factory.js.map +1 -0
  199. package/dist/lib/audit-logger.d.ts +10 -0
  200. package/dist/lib/audit-logger.d.ts.map +1 -0
  201. package/dist/lib/audit-logger.js +101 -0
  202. package/dist/lib/audit-logger.js.map +1 -0
  203. package/dist/lib/auth.d.ts +39 -0
  204. package/dist/lib/auth.d.ts.map +1 -0
  205. package/dist/lib/auth.js +219 -0
  206. package/dist/lib/auth.js.map +1 -0
  207. package/dist/lib/competitor-scheduler.d.ts +73 -0
  208. package/dist/lib/competitor-scheduler.d.ts.map +1 -0
  209. package/dist/lib/competitor-scheduler.js +235 -0
  210. package/dist/lib/competitor-scheduler.js.map +1 -0
  211. package/dist/lib/crawler.d.ts +17 -0
  212. package/dist/lib/crawler.d.ts.map +1 -0
  213. package/dist/lib/crawler.js +168 -0
  214. package/dist/lib/crawler.js.map +1 -0
  215. package/dist/lib/errors.d.ts +34 -0
  216. package/dist/lib/errors.d.ts.map +1 -0
  217. package/dist/lib/errors.js +63 -0
  218. package/dist/lib/errors.js.map +1 -0
  219. package/dist/lib/exporter.d.ts +9 -0
  220. package/dist/lib/exporter.d.ts.map +1 -0
  221. package/dist/lib/exporter.js +100 -0
  222. package/dist/lib/exporter.js.map +1 -0
  223. package/dist/lib/html-cleaner.d.ts +19 -0
  224. package/dist/lib/html-cleaner.d.ts.map +1 -0
  225. package/dist/lib/html-cleaner.js +144 -0
  226. package/dist/lib/html-cleaner.js.map +1 -0
  227. package/dist/lib/http.d.ts +18 -0
  228. package/dist/lib/http.d.ts.map +1 -0
  229. package/dist/lib/http.js +83 -0
  230. package/dist/lib/http.js.map +1 -0
  231. package/dist/lib/lockfile.d.ts +10 -0
  232. package/dist/lib/lockfile.d.ts.map +1 -0
  233. package/dist/lib/lockfile.js +56 -0
  234. package/dist/lib/lockfile.js.map +1 -0
  235. package/dist/lib/mcp-registry.d.ts +47 -0
  236. package/dist/lib/mcp-registry.d.ts.map +1 -0
  237. package/dist/lib/mcp-registry.js +212 -0
  238. package/dist/lib/mcp-registry.js.map +1 -0
  239. package/dist/lib/profile-resolver.d.ts +28 -0
  240. package/dist/lib/profile-resolver.d.ts.map +1 -0
  241. package/dist/lib/profile-resolver.js +72 -0
  242. package/dist/lib/profile-resolver.js.map +1 -0
  243. package/dist/lib/profile-store.d.ts +14 -0
  244. package/dist/lib/profile-store.d.ts.map +1 -0
  245. package/dist/lib/profile-store.js +80 -0
  246. package/dist/lib/profile-store.js.map +1 -0
  247. package/dist/lib/rate-limiter.d.ts +32 -0
  248. package/dist/lib/rate-limiter.d.ts.map +1 -0
  249. package/dist/lib/rate-limiter.js +124 -0
  250. package/dist/lib/rate-limiter.js.map +1 -0
  251. package/dist/lib/sandbox.d.ts +25 -0
  252. package/dist/lib/sandbox.d.ts.map +1 -0
  253. package/dist/lib/sandbox.js +134 -0
  254. package/dist/lib/sandbox.js.map +1 -0
  255. package/dist/lib/search.d.ts +22 -0
  256. package/dist/lib/search.d.ts.map +1 -0
  257. package/dist/lib/search.js +147 -0
  258. package/dist/lib/search.js.map +1 -0
  259. package/dist/lib/secret-scanner.d.ts +26 -0
  260. package/dist/lib/secret-scanner.d.ts.map +1 -0
  261. package/dist/lib/secret-scanner.js +74 -0
  262. package/dist/lib/secret-scanner.js.map +1 -0
  263. package/dist/lib/url.d.ts +17 -0
  264. package/dist/lib/url.d.ts.map +1 -0
  265. package/dist/lib/url.js +51 -0
  266. package/dist/lib/url.js.map +1 -0
  267. package/dist/mcp/progressive-discovery.d.ts +21 -0
  268. package/dist/mcp/progressive-discovery.d.ts.map +1 -0
  269. package/dist/mcp/progressive-discovery.js +86 -0
  270. package/dist/mcp/progressive-discovery.js.map +1 -0
  271. package/dist/mcp/ptc-executor.d.ts +92 -0
  272. package/dist/mcp/ptc-executor.d.ts.map +1 -0
  273. package/dist/mcp/ptc-executor.js +199 -0
  274. package/dist/mcp/ptc-executor.js.map +1 -0
  275. package/dist/mcp/server.d.ts +29 -0
  276. package/dist/mcp/server.d.ts.map +1 -0
  277. package/dist/mcp/server.js +299 -0
  278. package/dist/mcp/server.js.map +1 -0
  279. package/dist/mcp/tool-codegen.d.ts +33 -0
  280. package/dist/mcp/tool-codegen.d.ts.map +1 -0
  281. package/dist/mcp/tool-codegen.js +129 -0
  282. package/dist/mcp/tool-codegen.js.map +1 -0
  283. package/dist/mcp/tool-examples.d.ts +22 -0
  284. package/dist/mcp/tool-examples.d.ts.map +1 -0
  285. package/dist/mcp/tool-examples.js +117 -0
  286. package/dist/mcp/tool-examples.js.map +1 -0
  287. package/dist/mcp/tools/classify-signals.d.ts +67 -0
  288. package/dist/mcp/tools/classify-signals.d.ts.map +1 -0
  289. package/dist/mcp/tools/classify-signals.js +124 -0
  290. package/dist/mcp/tools/classify-signals.js.map +1 -0
  291. package/dist/mcp/tools/compute-risk-score.d.ts +97 -0
  292. package/dist/mcp/tools/compute-risk-score.d.ts.map +1 -0
  293. package/dist/mcp/tools/compute-risk-score.js +171 -0
  294. package/dist/mcp/tools/compute-risk-score.js.map +1 -0
  295. package/dist/mcp/tools/generate-plan.d.ts +99 -0
  296. package/dist/mcp/tools/generate-plan.d.ts.map +1 -0
  297. package/dist/mcp/tools/generate-plan.js +200 -0
  298. package/dist/mcp/tools/generate-plan.js.map +1 -0
  299. package/dist/mcp/tools/generate-report-pack.d.ts +119 -0
  300. package/dist/mcp/tools/generate-report-pack.d.ts.map +1 -0
  301. package/dist/mcp/tools/generate-report-pack.js +304 -0
  302. package/dist/mcp/tools/generate-report-pack.js.map +1 -0
  303. package/dist/mcp/tools/run-skeptic-review.d.ts +33 -0
  304. package/dist/mcp/tools/run-skeptic-review.d.ts.map +1 -0
  305. package/dist/mcp/tools/run-skeptic-review.js +157 -0
  306. package/dist/mcp/tools/run-skeptic-review.js.map +1 -0
  307. package/dist/mcp/tools/scan-saas-repo.d.ts +103 -0
  308. package/dist/mcp/tools/scan-saas-repo.d.ts.map +1 -0
  309. package/dist/mcp/tools/scan-saas-repo.js +421 -0
  310. package/dist/mcp/tools/scan-saas-repo.js.map +1 -0
  311. package/dist/mcp/tools/scrape-competitor.d.ts +38 -0
  312. package/dist/mcp/tools/scrape-competitor.d.ts.map +1 -0
  313. package/dist/mcp/tools/scrape-competitor.js +124 -0
  314. package/dist/mcp/tools/scrape-competitor.js.map +1 -0
  315. package/dist/mcp/tools/search-tools.d.ts +37 -0
  316. package/dist/mcp/tools/search-tools.d.ts.map +1 -0
  317. package/dist/mcp/tools/search-tools.js +109 -0
  318. package/dist/mcp/tools/search-tools.js.map +1 -0
  319. package/dist/packs/business-viability.d.ts +30 -0
  320. package/dist/packs/business-viability.d.ts.map +1 -0
  321. package/dist/packs/business-viability.js +37 -0
  322. package/dist/packs/business-viability.js.map +1 -0
  323. package/dist/packs/competitor-intel.d.ts +34 -0
  324. package/dist/packs/competitor-intel.d.ts.map +1 -0
  325. package/dist/packs/competitor-intel.js +72 -0
  326. package/dist/packs/competitor-intel.js.map +1 -0
  327. package/dist/packs/financial-audit.d.ts +40 -0
  328. package/dist/packs/financial-audit.d.ts.map +1 -0
  329. package/dist/packs/financial-audit.js +74 -0
  330. package/dist/packs/financial-audit.js.map +1 -0
  331. package/dist/packs/pitch-deck.d.ts +38 -0
  332. package/dist/packs/pitch-deck.d.ts.map +1 -0
  333. package/dist/packs/pitch-deck.js +80 -0
  334. package/dist/packs/pitch-deck.js.map +1 -0
  335. package/dist/packs/smm-gtm.d.ts +38 -0
  336. package/dist/packs/smm-gtm.d.ts.map +1 -0
  337. package/dist/packs/smm-gtm.js +83 -0
  338. package/dist/packs/smm-gtm.js.map +1 -0
  339. package/dist/packs/tech-audit.d.ts +34 -0
  340. package/dist/packs/tech-audit.d.ts.map +1 -0
  341. package/dist/packs/tech-audit.js +43 -0
  342. package/dist/packs/tech-audit.js.map +1 -0
  343. package/dist/project-templates/build-proof.d.ts +24 -0
  344. package/dist/project-templates/build-proof.d.ts.map +1 -0
  345. package/dist/project-templates/build-proof.js +108 -0
  346. package/dist/project-templates/build-proof.js.map +1 -0
  347. package/dist/project-templates/quickstart-renderer.d.ts +16 -0
  348. package/dist/project-templates/quickstart-renderer.d.ts.map +1 -0
  349. package/dist/project-templates/quickstart-renderer.js +57 -0
  350. package/dist/project-templates/quickstart-renderer.js.map +1 -0
  351. package/dist/project-templates/registry.d.ts +68 -0
  352. package/dist/project-templates/registry.d.ts.map +1 -0
  353. package/dist/project-templates/registry.js +328 -0
  354. package/dist/project-templates/registry.js.map +1 -0
  355. package/dist/project-templates/templates.d.ts +3 -0
  356. package/dist/project-templates/templates.d.ts.map +1 -0
  357. package/dist/project-templates/templates.js +188 -0
  358. package/dist/project-templates/templates.js.map +1 -0
  359. package/dist/prompts/biz-viability.d.ts +10 -0
  360. package/dist/prompts/biz-viability.d.ts.map +1 -0
  361. package/dist/prompts/biz-viability.js +35 -0
  362. package/dist/prompts/biz-viability.js.map +1 -0
  363. package/dist/prompts/catalog.d.ts +16 -0
  364. package/dist/prompts/catalog.d.ts.map +1 -0
  365. package/dist/prompts/catalog.js +17 -0
  366. package/dist/prompts/catalog.js.map +1 -0
  367. package/dist/prompts/competitor-intel.d.ts +10 -0
  368. package/dist/prompts/competitor-intel.d.ts.map +1 -0
  369. package/dist/prompts/competitor-intel.js +37 -0
  370. package/dist/prompts/competitor-intel.js.map +1 -0
  371. package/dist/prompts/finance-audit.d.ts +10 -0
  372. package/dist/prompts/finance-audit.d.ts.map +1 -0
  373. package/dist/prompts/finance-audit.js +35 -0
  374. package/dist/prompts/finance-audit.js.map +1 -0
  375. package/dist/prompts/fix-sprint-plan.d.ts +10 -0
  376. package/dist/prompts/fix-sprint-plan.d.ts.map +1 -0
  377. package/dist/prompts/fix-sprint-plan.js +45 -0
  378. package/dist/prompts/fix-sprint-plan.js.map +1 -0
  379. package/dist/prompts/gtm-smm.d.ts +10 -0
  380. package/dist/prompts/gtm-smm.d.ts.map +1 -0
  381. package/dist/prompts/gtm-smm.js +35 -0
  382. package/dist/prompts/gtm-smm.js.map +1 -0
  383. package/dist/prompts/orchestrator-dispatch.d.ts +40 -0
  384. package/dist/prompts/orchestrator-dispatch.d.ts.map +1 -0
  385. package/dist/prompts/orchestrator-dispatch.js +92 -0
  386. package/dist/prompts/orchestrator-dispatch.js.map +1 -0
  387. package/dist/prompts/pitch-deck.d.ts +10 -0
  388. package/dist/prompts/pitch-deck.d.ts.map +1 -0
  389. package/dist/prompts/pitch-deck.js +36 -0
  390. package/dist/prompts/pitch-deck.js.map +1 -0
  391. package/dist/prompts/prompt-template.d.ts +16 -0
  392. package/dist/prompts/prompt-template.d.ts.map +1 -0
  393. package/dist/prompts/prompt-template.js +22 -0
  394. package/dist/prompts/prompt-template.js.map +1 -0
  395. package/dist/prompts/repo-audit-deep.d.ts +10 -0
  396. package/dist/prompts/repo-audit-deep.d.ts.map +1 -0
  397. package/dist/prompts/repo-audit-deep.js +39 -0
  398. package/dist/prompts/repo-audit-deep.js.map +1 -0
  399. package/dist/prompts/repo-scan-quick.d.ts +35 -0
  400. package/dist/prompts/repo-scan-quick.d.ts.map +1 -0
  401. package/dist/prompts/repo-scan-quick.js +69 -0
  402. package/dist/prompts/repo-scan-quick.js.map +1 -0
  403. package/dist/prompts/skeptic-review.d.ts +10 -0
  404. package/dist/prompts/skeptic-review.d.ts.map +1 -0
  405. package/dist/prompts/skeptic-review.js +40 -0
  406. package/dist/prompts/skeptic-review.js.map +1 -0
  407. package/dist/schemas/agent-step-sequence.d.ts +41 -0
  408. package/dist/schemas/agent-step-sequence.d.ts.map +1 -0
  409. package/dist/schemas/agent-step-sequence.js +25 -0
  410. package/dist/schemas/agent-step-sequence.js.map +1 -0
  411. package/dist/schemas/artifact-envelope.v1.d.ts +69 -0
  412. package/dist/schemas/artifact-envelope.v1.d.ts.map +1 -0
  413. package/dist/schemas/artifact-envelope.v1.js +24 -0
  414. package/dist/schemas/artifact-envelope.v1.js.map +1 -0
  415. package/dist/schemas/business-viability.v1.d.ts +223 -0
  416. package/dist/schemas/business-viability.v1.d.ts.map +1 -0
  417. package/dist/schemas/business-viability.v1.js +47 -0
  418. package/dist/schemas/business-viability.v1.js.map +1 -0
  419. package/dist/schemas/common.d.ts +9 -0
  420. package/dist/schemas/common.d.ts.map +1 -0
  421. package/dist/schemas/common.js +8 -0
  422. package/dist/schemas/common.js.map +1 -0
  423. package/dist/schemas/competitor-intel.v1.d.ts +239 -0
  424. package/dist/schemas/competitor-intel.v1.d.ts.map +1 -0
  425. package/dist/schemas/competitor-intel.v1.js +59 -0
  426. package/dist/schemas/competitor-intel.v1.js.map +1 -0
  427. package/dist/schemas/config.d.ts +133 -0
  428. package/dist/schemas/config.d.ts.map +1 -0
  429. package/dist/schemas/config.js +142 -0
  430. package/dist/schemas/config.js.map +1 -0
  431. package/dist/schemas/financial-audit.v1.d.ts +139 -0
  432. package/dist/schemas/financial-audit.v1.d.ts.map +1 -0
  433. package/dist/schemas/financial-audit.v1.js +50 -0
  434. package/dist/schemas/financial-audit.v1.js.map +1 -0
  435. package/dist/schemas/fix-result.v1.d.ts +104 -0
  436. package/dist/schemas/fix-result.v1.d.ts.map +1 -0
  437. package/dist/schemas/fix-result.v1.js +41 -0
  438. package/dist/schemas/fix-result.v1.js.map +1 -0
  439. package/dist/schemas/founder-profile.d.ts +76 -0
  440. package/dist/schemas/founder-profile.d.ts.map +1 -0
  441. package/dist/schemas/founder-profile.js +54 -0
  442. package/dist/schemas/founder-profile.js.map +1 -0
  443. package/dist/schemas/investor-readiness.v1.d.ts +20 -0
  444. package/dist/schemas/investor-readiness.v1.d.ts.map +1 -0
  445. package/dist/schemas/investor-readiness.v1.js +15 -0
  446. package/dist/schemas/investor-readiness.v1.js.map +1 -0
  447. package/dist/schemas/mcp-server-entry.d.ts +37 -0
  448. package/dist/schemas/mcp-server-entry.d.ts.map +1 -0
  449. package/dist/schemas/mcp-server-entry.js +23 -0
  450. package/dist/schemas/mcp-server-entry.js.map +1 -0
  451. package/dist/schemas/pitch-deck.v1.d.ts +141 -0
  452. package/dist/schemas/pitch-deck.v1.d.ts.map +1 -0
  453. package/dist/schemas/pitch-deck.v1.js +57 -0
  454. package/dist/schemas/pitch-deck.v1.js.map +1 -0
  455. package/dist/schemas/plan.v1.d.ts +97 -0
  456. package/dist/schemas/plan.v1.d.ts.map +1 -0
  457. package/dist/schemas/plan.v1.js +41 -0
  458. package/dist/schemas/plan.v1.js.map +1 -0
  459. package/dist/schemas/project-template.d.ts +101 -0
  460. package/dist/schemas/project-template.d.ts.map +1 -0
  461. package/dist/schemas/project-template.js +59 -0
  462. package/dist/schemas/project-template.js.map +1 -0
  463. package/dist/schemas/research-result.v1.d.ts +45 -0
  464. package/dist/schemas/research-result.v1.d.ts.map +1 -0
  465. package/dist/schemas/research-result.v1.js +20 -0
  466. package/dist/schemas/research-result.v1.js.map +1 -0
  467. package/dist/schemas/roadmap.v1.d.ts +49 -0
  468. package/dist/schemas/roadmap.v1.d.ts.map +1 -0
  469. package/dist/schemas/roadmap.v1.js +22 -0
  470. package/dist/schemas/roadmap.v1.js.map +1 -0
  471. package/dist/schemas/scan-result.v1.d.ts +87 -0
  472. package/dist/schemas/scan-result.v1.d.ts.map +1 -0
  473. package/dist/schemas/scan-result.v1.js +22 -0
  474. package/dist/schemas/scan-result.v1.js.map +1 -0
  475. package/dist/schemas/session.d.ts +165 -0
  476. package/dist/schemas/session.d.ts.map +1 -0
  477. package/dist/schemas/session.js +70 -0
  478. package/dist/schemas/session.js.map +1 -0
  479. package/dist/schemas/smm-gtm.v1.d.ts +175 -0
  480. package/dist/schemas/smm-gtm.v1.d.ts.map +1 -0
  481. package/dist/schemas/smm-gtm.v1.js +60 -0
  482. package/dist/schemas/smm-gtm.v1.js.map +1 -0
  483. package/dist/schemas/tech-audit.v1.d.ts +254 -0
  484. package/dist/schemas/tech-audit.v1.d.ts.map +1 -0
  485. package/dist/schemas/tech-audit.v1.js +61 -0
  486. package/dist/schemas/tech-audit.v1.js.map +1 -0
  487. package/dist/session/agent-session.d.ts +20 -0
  488. package/dist/session/agent-session.d.ts.map +1 -0
  489. package/dist/session/agent-session.js +53 -0
  490. package/dist/session/agent-session.js.map +1 -0
  491. package/dist/session/compaction/memory-pointers.d.ts +17 -0
  492. package/dist/session/compaction/memory-pointers.d.ts.map +1 -0
  493. package/dist/session/compaction/memory-pointers.js +46 -0
  494. package/dist/session/compaction/memory-pointers.js.map +1 -0
  495. package/dist/session/compaction/selective-retention.d.ts +19 -0
  496. package/dist/session/compaction/selective-retention.d.ts.map +1 -0
  497. package/dist/session/compaction/selective-retention.js +36 -0
  498. package/dist/session/compaction/selective-retention.js.map +1 -0
  499. package/dist/session/compaction/trajectory-summarizer.d.ts +22 -0
  500. package/dist/session/compaction/trajectory-summarizer.d.ts.map +1 -0
  501. package/dist/session/compaction/trajectory-summarizer.js +34 -0
  502. package/dist/session/compaction/trajectory-summarizer.js.map +1 -0
  503. package/dist/session/sdk-hooks.d.ts +31 -0
  504. package/dist/session/sdk-hooks.d.ts.map +1 -0
  505. package/dist/session/sdk-hooks.js +56 -0
  506. package/dist/session/sdk-hooks.js.map +1 -0
  507. package/dist/session/session-manager.d.ts +42 -0
  508. package/dist/session/session-manager.d.ts.map +1 -0
  509. package/dist/session/session-manager.js +236 -0
  510. package/dist/session/session-manager.js.map +1 -0
  511. package/dist/session/token-tracker.d.ts +31 -0
  512. package/dist/session/token-tracker.d.ts.map +1 -0
  513. package/dist/session/token-tracker.js +66 -0
  514. package/dist/session/token-tracker.js.map +1 -0
  515. package/package.json +80 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Copilot SDK session hooks — permission enforcement, audit logging, tool guards.
3
+ * @module session/sdk-hooks
4
+ */
5
+ import { auditLog } from '../lib/audit-logger.js';
6
+ /** FR-001: enforce guided mode by default. */
7
+ export async function onPermissionRequest(ctx, permission) {
8
+ await auditLog(ctx.sessionId, 'permission_request', { permission, mode: ctx.approvalMode });
9
+ return ctx.approvalMode === 'yolo';
10
+ }
11
+ /** FR-011: log tool invocations before execution. Constitution IV: deny shell/bash. */
12
+ export async function onPreToolUse(ctx, toolName, args) {
13
+ await auditLog(ctx.sessionId, 'tool_pre_use', { toolName, args });
14
+ // Constitution IV: deny shell/bash execution by default
15
+ const deniedTools = ['shell', 'bash', 'exec', 'terminal', 'run_command'];
16
+ if (deniedTools.some((d) => toolName.toLowerCase().includes(d))) {
17
+ await auditLog(ctx.sessionId, 'tool_denied', { toolName, reason: 'Shell execution denied by policy' });
18
+ return { allow: false, reason: 'Shell/bash execution denied by default (Constitution Principle IV).' };
19
+ }
20
+ return { allow: true };
21
+ }
22
+ /** FR-011: log tool result status and elapsed time. */
23
+ export async function onPostToolUse(ctx, toolName, result) {
24
+ await auditLog(ctx.sessionId, 'tool_post_use', {
25
+ toolName,
26
+ isError: result.isError ?? false,
27
+ elapsedMs: result.elapsedMs,
28
+ });
29
+ }
30
+ /** Constitution II: structured audit entry on session start. */
31
+ export async function onSessionStart(ctx) {
32
+ await auditLog(ctx.sessionId, 'session_start', {
33
+ taskType: ctx.taskType,
34
+ approvalMode: ctx.approvalMode,
35
+ timestamp: new Date().toISOString(),
36
+ });
37
+ }
38
+ /** Constitution II: structured audit entry on session end. */
39
+ export async function onSessionEnd(ctx, summary) {
40
+ await auditLog(ctx.sessionId, 'session_end', {
41
+ taskType: ctx.taskType,
42
+ tokensUsed: summary.tokensUsed,
43
+ finalState: summary.finalState,
44
+ timestamp: new Date().toISOString(),
45
+ });
46
+ }
47
+ /** Constitution II: structured audit entry on error. */
48
+ export async function onErrorOccurred(ctx, error) {
49
+ await auditLog(ctx.sessionId, 'error_occurred', {
50
+ errorType: error.type,
51
+ errorMessage: error.message,
52
+ errorContext: error.context,
53
+ timestamp: new Date().toISOString(),
54
+ });
55
+ }
56
+ //# sourceMappingURL=sdk-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-hooks.js","sourceRoot":"","sources":["../../src/session/sdk-hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAQlD,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAmB,EACnB,UAAkB;IAElB,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC;AACrC,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAmB,EACnB,QAAgB,EAChB,IAA6B;IAE7B,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,wDAAwD;IACxD,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC,CAAC;QACvG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qEAAqE,EAAE,CAAC;IACzG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAmB,EACnB,QAAgB,EAChB,MAAgD;IAEhD,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE;QAC7C,QAAQ;QACR,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;QAChC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE;QAC7C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAmB,EACnB,OAAmD;IAEnD,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAmB,EACnB,KAA0E;IAE1E,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE;QAC9C,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,YAAY,EAAE,KAAK,CAAC,OAAO;QAC3B,YAAY,EAAE,KAAK,CAAC,OAAO;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ISessionManager, RepoRef } from '../contracts/session-manager.js';
2
+ import type { Session, SessionState } from '../schemas/session.js';
3
+ export declare class SessionManager implements ISessionManager {
4
+ create(params: {
5
+ userId: string;
6
+ taskType: Session['taskType'];
7
+ repo: string;
8
+ ref: string;
9
+ sourceMode: Session['sourceMode'];
10
+ approvalMode: Session['approvalMode'];
11
+ tokenBudget: number;
12
+ toolProfile: string;
13
+ }): Promise<Session>;
14
+ get(sessionId: string): Promise<Session | null>;
15
+ update(session: Session): Promise<void>;
16
+ /**
17
+ * Transition session state with validation.
18
+ * Throws if the transition is not allowed by the lifecycle rules.
19
+ */
20
+ transition(sessionId: string, newState: SessionState, reason?: string): Promise<Session>;
21
+ /**
22
+ * Create a checkpoint capturing current session progress.
23
+ */
24
+ createCheckpoint(session: Session, summary: string, completedSteps?: string[]): Promise<void>;
25
+ /**
26
+ * Complete a session with cleanup.
27
+ * Sets state to 'completed' and saves final checkpoint.
28
+ */
29
+ complete(sessionId: string, summary?: string): Promise<void>;
30
+ /**
31
+ * Transition to error state with diagnostic info.
32
+ */
33
+ markError(sessionId: string, errorMessage: string): Promise<void>;
34
+ delete(sessionId: string): Promise<void>;
35
+ list(): Promise<Session[]>;
36
+ findLatestScan(repo: string): Promise<Record<string, unknown> | null>;
37
+ addRepos(sessionId: string, repos: RepoRef[]): Promise<Session>;
38
+ removeRepo(sessionId: string, repo: string): Promise<Session>;
39
+ listRepos(sessionId: string): Promise<RepoRef[]>;
40
+ findSessionsByRepo(repo: string): Promise<Session[]>;
41
+ }
42
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAsBnE,qBAAa,cAAe,YAAW,eAAe;IAC9C,MAAM,CAAC,MAAM,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAClC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCd,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAS/C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C;;;OAGG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAuBnB;;OAEG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IAahB;;;OAGG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlE;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAmB1B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAmBrE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB/D,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc7D,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAYhD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAQ3D"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Session manager — ISessionManager implementation with JSON file persistence.
3
+ * @module session/session-manager
4
+ */
5
+ import { readFile, writeFile, readdir, mkdir, rm } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ import { SessionSchema } from '../schemas/session.js';
9
+ import { SessionError } from '../lib/errors.js';
10
+ const SESSIONS_DIR = join(homedir(), '.saasgadget', 'sessions');
11
+ function sessionDir(sessionId) {
12
+ return join(SESSIONS_DIR, sessionId);
13
+ }
14
+ function sessionFile(sessionId) {
15
+ return join(sessionDir(sessionId), 'session.json');
16
+ }
17
+ /** Valid state transitions for session lifecycle. */
18
+ const VALID_TRANSITIONS = {
19
+ active: ['suspended', 'completed', 'error'],
20
+ suspended: ['active'],
21
+ error: ['active'],
22
+ completed: [],
23
+ };
24
+ export class SessionManager {
25
+ async create(params) {
26
+ const timestamp = Date.now();
27
+ const sessionId = `${params.userId}-${params.taskType}-${timestamp}`;
28
+ const session = SessionSchema.parse({
29
+ sessionId,
30
+ userId: params.userId,
31
+ taskType: params.taskType,
32
+ state: 'active',
33
+ repo: params.repo,
34
+ ref: params.ref,
35
+ sourceMode: params.sourceMode,
36
+ approvalMode: params.approvalMode,
37
+ tokenBudget: params.tokenBudget,
38
+ tokensUsed: {
39
+ scanData: 0,
40
+ conversationHistory: 0,
41
+ toolResults: 0,
42
+ reservedOutput: 0,
43
+ total: 0,
44
+ },
45
+ toolProfile: params.toolProfile,
46
+ checkpoints: [],
47
+ conversationHistory: [],
48
+ createdAt: new Date().toISOString(),
49
+ updatedAt: new Date().toISOString(),
50
+ resumeToken: null,
51
+ });
52
+ const dir = sessionDir(sessionId);
53
+ await mkdir(dir, { recursive: true });
54
+ await writeFile(sessionFile(sessionId), JSON.stringify(session, null, 2), 'utf-8');
55
+ return session;
56
+ }
57
+ async get(sessionId) {
58
+ try {
59
+ const raw = await readFile(sessionFile(sessionId), 'utf-8');
60
+ return SessionSchema.parse(JSON.parse(raw));
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ async update(session) {
67
+ const validated = SessionSchema.parse({
68
+ ...session,
69
+ updatedAt: new Date().toISOString(),
70
+ });
71
+ await writeFile(sessionFile(session.sessionId), JSON.stringify(validated, null, 2), 'utf-8');
72
+ }
73
+ /**
74
+ * Transition session state with validation.
75
+ * Throws if the transition is not allowed by the lifecycle rules.
76
+ */
77
+ async transition(sessionId, newState, reason) {
78
+ const session = await this.get(sessionId);
79
+ if (!session) {
80
+ throw new SessionError(`Session not found: ${sessionId}`);
81
+ }
82
+ const allowed = VALID_TRANSITIONS[session.state];
83
+ if (!allowed.includes(newState)) {
84
+ throw new SessionError(`Invalid state transition: ${session.state} → ${newState}. ` +
85
+ `Allowed transitions from '${session.state}': [${allowed.join(', ')}]`);
86
+ }
87
+ session.state = newState;
88
+ if (reason) {
89
+ // Store transition reason in a checkpoint
90
+ await this.createCheckpoint(session, `State → ${newState}: ${reason}`);
91
+ }
92
+ await this.update(session);
93
+ return session;
94
+ }
95
+ /**
96
+ * Create a checkpoint capturing current session progress.
97
+ */
98
+ async createCheckpoint(session, summary, completedSteps) {
99
+ const checkpoint = {
100
+ id: `chk-${Date.now()}`,
101
+ timestamp: new Date().toISOString(),
102
+ summary,
103
+ tokensUsed: session.tokensUsed.total,
104
+ completedSteps: completedSteps ?? [],
105
+ };
106
+ session.checkpoints.push(checkpoint);
107
+ session.resumeToken = checkpoint.id;
108
+ await this.update(session);
109
+ }
110
+ /**
111
+ * Complete a session with cleanup.
112
+ * Sets state to 'completed' and saves final checkpoint.
113
+ */
114
+ async complete(sessionId, summary) {
115
+ const session = await this.get(sessionId);
116
+ if (!session)
117
+ return;
118
+ try {
119
+ await this.createCheckpoint(session, summary ?? 'Session completed');
120
+ session.state = 'completed';
121
+ await this.update(session);
122
+ }
123
+ catch (err) {
124
+ // Best-effort: mark as error if cleanup itself fails
125
+ session.state = 'error';
126
+ await this.update(session).catch(() => { });
127
+ throw err;
128
+ }
129
+ }
130
+ /**
131
+ * Transition to error state with diagnostic info.
132
+ */
133
+ async markError(sessionId, errorMessage) {
134
+ const session = await this.get(sessionId);
135
+ if (!session)
136
+ return;
137
+ session.state = 'error';
138
+ session.checkpoints.push({
139
+ id: `chk-err-${Date.now()}`,
140
+ timestamp: new Date().toISOString(),
141
+ summary: `Error: ${errorMessage}`,
142
+ tokensUsed: session.tokensUsed.total,
143
+ completedSteps: [],
144
+ });
145
+ session.resumeToken = session.checkpoints.at(-1)?.id ?? '';
146
+ await this.update(session);
147
+ }
148
+ async delete(sessionId) {
149
+ try {
150
+ await rm(sessionDir(sessionId), { recursive: true, force: true });
151
+ }
152
+ catch {
153
+ // Already deleted
154
+ }
155
+ }
156
+ async list() {
157
+ try {
158
+ await mkdir(SESSIONS_DIR, { recursive: true });
159
+ const entries = await readdir(SESSIONS_DIR, { withFileTypes: true });
160
+ const sessions = [];
161
+ for (const entry of entries) {
162
+ if (entry.isDirectory()) {
163
+ const session = await this.get(entry.name);
164
+ if (session)
165
+ sessions.push(session);
166
+ }
167
+ }
168
+ return sessions.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
169
+ }
170
+ catch {
171
+ return [];
172
+ }
173
+ }
174
+ async findLatestScan(repo) {
175
+ const sessions = await this.list();
176
+ const scanSession = sessions.find((s) => s.taskType === 'scan' && s.repo === repo && s.state === 'completed');
177
+ if (!scanSession)
178
+ return null;
179
+ try {
180
+ const resultPath = join(sessionDir(scanSession.sessionId), 'scan-result.json');
181
+ const raw = await readFile(resultPath, 'utf-8');
182
+ return JSON.parse(raw);
183
+ }
184
+ catch {
185
+ return null;
186
+ }
187
+ }
188
+ // ─── Multi-Repo Methods (v2) ───────────────────────────
189
+ async addRepos(sessionId, repos) {
190
+ const session = await this.get(sessionId);
191
+ if (!session)
192
+ throw new SessionError(`Session not found: ${sessionId}`);
193
+ const existing = session.additionalRepos ?? [];
194
+ for (const repo of repos) {
195
+ if (repo.repo === session.repo &&
196
+ repo.ref === session.ref)
197
+ continue; // Skip if it's the primary repo
198
+ if (existing.some((r) => r.repo === repo.repo))
199
+ continue; // Already tracked
200
+ existing.push(repo);
201
+ }
202
+ session.additionalRepos = existing;
203
+ session.updatedAt = new Date().toISOString();
204
+ await this.update(session);
205
+ return session;
206
+ }
207
+ async removeRepo(sessionId, repo) {
208
+ const session = await this.get(sessionId);
209
+ if (!session)
210
+ throw new SessionError(`Session not found: ${sessionId}`);
211
+ if (repo === session.repo) {
212
+ throw new SessionError('Cannot remove the primary repo. Use delete() to remove the session.');
213
+ }
214
+ session.additionalRepos = (session.additionalRepos ?? []).filter((r) => r.repo !== repo);
215
+ session.updatedAt = new Date().toISOString();
216
+ await this.update(session);
217
+ return session;
218
+ }
219
+ async listRepos(sessionId) {
220
+ const session = await this.get(sessionId);
221
+ if (!session)
222
+ throw new SessionError(`Session not found: ${sessionId}`);
223
+ const primary = {
224
+ repo: session.repo,
225
+ ref: session.ref,
226
+ sourceMode: session.sourceMode,
227
+ };
228
+ return [primary, ...(session.additionalRepos ?? [])];
229
+ }
230
+ async findSessionsByRepo(repo) {
231
+ const sessions = await this.list();
232
+ return sessions.filter((s) => s.repo === repo ||
233
+ (s.additionalRepos ?? []).some((r) => r.repo === repo));
234
+ }
235
+ }
236
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Token tracker — budget management with category breakdown and compaction triggers.
3
+ * @module session/token-tracker
4
+ */
5
+ import type { TokenUsage } from '../schemas/session.js';
6
+ export interface TokenTrackerOptions {
7
+ budget: number;
8
+ warningThreshold: number;
9
+ blockThreshold: number;
10
+ }
11
+ export declare class TokenTracker {
12
+ private usage;
13
+ private readonly budget;
14
+ private readonly warningThreshold;
15
+ private readonly blockThreshold;
16
+ private warningEmitted;
17
+ constructor(options: TokenTrackerOptions);
18
+ /** Record token usage in a specific category. */
19
+ add(category: keyof Omit<TokenUsage, 'total'>, tokens: number): void;
20
+ /** Get current usage snapshot. */
21
+ getUsage(): TokenUsage;
22
+ /** Get remaining budget. */
23
+ remaining(): number;
24
+ /** Check if compaction should be triggered. */
25
+ needsCompaction(): boolean;
26
+ /** Reduce a category after compaction. */
27
+ reduce(category: keyof Omit<TokenUsage, 'total'>, amount: number): void;
28
+ /** Format a CLI summary with visual progress bar. */
29
+ formatSummary(): string;
30
+ }
31
+ //# sourceMappingURL=token-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/session/token-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,mBAAmB;IAaxC,iDAAiD;IACjD,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAqBpE,kCAAkC;IAClC,QAAQ,IAAI,UAAU;IAItB,4BAA4B;IAC5B,SAAS,IAAI,MAAM;IAInB,+CAA+C;IAC/C,eAAe,IAAI,OAAO;IAI1B,0CAA0C;IAC1C,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvE,qDAAqD;IACrD,aAAa,IAAI,MAAM;CASxB"}
@@ -0,0 +1,66 @@
1
+ import { BudgetExhaustedError } from '../lib/errors.js';
2
+ export class TokenTracker {
3
+ usage;
4
+ budget;
5
+ warningThreshold;
6
+ blockThreshold;
7
+ warningEmitted = false;
8
+ constructor(options) {
9
+ this.budget = options.budget;
10
+ this.warningThreshold = options.warningThreshold;
11
+ this.blockThreshold = options.blockThreshold;
12
+ this.usage = {
13
+ scanData: 0,
14
+ conversationHistory: 0,
15
+ toolResults: 0,
16
+ reservedOutput: 0,
17
+ total: 0,
18
+ };
19
+ }
20
+ /** Record token usage in a specific category. */
21
+ add(category, tokens) {
22
+ this.usage[category] += tokens;
23
+ this.usage.total = this.usage.scanData
24
+ + this.usage.conversationHistory
25
+ + this.usage.toolResults
26
+ + this.usage.reservedOutput;
27
+ if (this.usage.total >= this.budget * this.blockThreshold) {
28
+ throw new BudgetExhaustedError(`Token budget hard limit reached: ${this.usage.total} / ${this.budget} (${Math.round(this.blockThreshold * 100)}% threshold).`);
29
+ }
30
+ if (!this.warningEmitted && this.usage.total >= this.budget * this.warningThreshold) {
31
+ this.warningEmitted = true;
32
+ console.warn(`⚠️ Token budget warning: ${this.usage.total.toLocaleString()} / ${this.budget.toLocaleString()} used (${Math.round((this.usage.total / this.budget) * 100)}%)`);
33
+ }
34
+ }
35
+ /** Get current usage snapshot. */
36
+ getUsage() {
37
+ return { ...this.usage };
38
+ }
39
+ /** Get remaining budget. */
40
+ remaining() {
41
+ return Math.max(0, this.budget - this.usage.total);
42
+ }
43
+ /** Check if compaction should be triggered. */
44
+ needsCompaction() {
45
+ return this.usage.total >= this.budget * this.warningThreshold;
46
+ }
47
+ /** Reduce a category after compaction. */
48
+ reduce(category, amount) {
49
+ this.usage[category] = Math.max(0, this.usage[category] - amount);
50
+ this.usage.total = this.usage.scanData
51
+ + this.usage.conversationHistory
52
+ + this.usage.toolResults
53
+ + this.usage.reservedOutput;
54
+ }
55
+ /** Format a CLI summary with visual progress bar. */
56
+ formatSummary() {
57
+ const pct = Math.min(1, this.usage.total / this.budget);
58
+ const barWidth = 20;
59
+ const filled = Math.round(pct * barWidth);
60
+ const empty = barWidth - filled;
61
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
62
+ const pctStr = `${Math.round(pct * 100)}%`;
63
+ return `[${bar}] ${pctStr} Tokens: ${this.usage.total.toLocaleString()} / ${this.budget.toLocaleString()}`;
64
+ }
65
+ }
66
+ //# sourceMappingURL=token-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/session/token-tracker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "saasgadget",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for solo SaaS founders — scan repos, generate audit reports, plan changes, and manage MCP servers",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "saasgadget": "dist/index.js",
10
+ "sg": "dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE.md"
16
+ ],
17
+ "keywords": [
18
+ "saas",
19
+ "cli",
20
+ "audit",
21
+ "scan",
22
+ "report",
23
+ "mcp",
24
+ "copilot",
25
+ "founder",
26
+ "devtools"
27
+ ],
28
+ "author": "WxZRD Media <support@saasgadget.io>",
29
+ "license": "MIT",
30
+ "homepage": "https://saasgadget.io",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/wxzrd21614/SaaSGadgetCLI.git",
34
+ "directory": "packages/cli"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/wxzrd21614/SaaSGadgetCLI/issues"
38
+ },
39
+ "engines": {
40
+ "node": ">=20.0.0"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc",
48
+ "dev": "tsx src/index.ts",
49
+ "start": "node dist/index.js",
50
+ "prepublishOnly": "pnpm run build",
51
+ "test": "vitest run",
52
+ "test:unit": "vitest run tests/unit/",
53
+ "test:contract": "vitest run tests/contract/",
54
+ "test:integration": "vitest run tests/integration/",
55
+ "test:watch": "vitest",
56
+ "lint": "eslint src/",
57
+ "lint:fix": "eslint src/ tests/ --fix",
58
+ "typecheck": "tsc --noEmit",
59
+ "clean": "rm -rf dist"
60
+ },
61
+ "dependencies": {
62
+ "@github/copilot-sdk": "^0.1.0",
63
+ "@modelcontextprotocol/sdk": "^1.26.0",
64
+ "@saasgadget/shared": "workspace:*",
65
+ "cheerio": "^1.2.0",
66
+ "duck-duck-scrape": "^2.2.0",
67
+ "express": "^5.0.0",
68
+ "natural": "^8.0.0",
69
+ "node-fetch": "^3.3.0",
70
+ "zod": "^4.3.0"
71
+ },
72
+ "optionalDependencies": {
73
+ "@napi-rs/keyring": "^1.2.0"
74
+ },
75
+ "devDependencies": {
76
+ "@types/express": "^4.17.25",
77
+ "jsdom": "^28.1.0",
78
+ "tsx": "^4.19.0"
79
+ }
80
+ }