kastell 2.1.0 → 2.2.1

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 (501) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +39 -0
  3. package/CHANGELOG.md +1266 -1216
  4. package/LICENSE +201 -201
  5. package/NOTICE +5 -5
  6. package/README.md +1 -1
  7. package/README.tr.md +1 -1
  8. package/bin/kastell +2 -2
  9. package/bin/kastell-mcp +5 -5
  10. package/dist/adapters/coolify.js +92 -92
  11. package/dist/adapters/dokploy.js +99 -99
  12. package/dist/adapters/shared.d.ts.map +1 -1
  13. package/dist/adapters/shared.js +4 -2
  14. package/dist/adapters/shared.js.map +1 -1
  15. package/dist/commands/add.d.ts.map +1 -1
  16. package/dist/commands/add.js +6 -9
  17. package/dist/commands/add.js.map +1 -1
  18. package/dist/commands/auth.d.ts.map +1 -1
  19. package/dist/commands/auth.js +12 -12
  20. package/dist/commands/auth.js.map +1 -1
  21. package/dist/commands/doctor.d.ts +1 -0
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +23 -8
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/evidence.d.ts.map +1 -1
  26. package/dist/commands/evidence.js +8 -9
  27. package/dist/commands/evidence.js.map +1 -1
  28. package/dist/commands/fix.d.ts +1 -0
  29. package/dist/commands/fix.d.ts.map +1 -1
  30. package/dist/commands/fix.js +24 -5
  31. package/dist/commands/fix.js.map +1 -1
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +4 -7
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/interactive/backup-maintenance.d.ts +8 -0
  36. package/dist/commands/interactive/backup-maintenance.d.ts.map +1 -0
  37. package/dist/commands/interactive/backup-maintenance.js +120 -0
  38. package/dist/commands/interactive/backup-maintenance.js.map +1 -0
  39. package/dist/commands/interactive/index.d.ts +4 -0
  40. package/dist/commands/interactive/index.d.ts.map +1 -0
  41. package/dist/commands/interactive/index.js +94 -0
  42. package/dist/commands/interactive/index.js.map +1 -0
  43. package/dist/commands/interactive/menu.d.ts +23 -0
  44. package/dist/commands/interactive/menu.d.ts.map +1 -0
  45. package/dist/commands/interactive/menu.js +121 -0
  46. package/dist/commands/interactive/menu.js.map +1 -0
  47. package/dist/commands/interactive/monitoring.d.ts +5 -0
  48. package/dist/commands/interactive/monitoring.d.ts.map +1 -0
  49. package/dist/commands/interactive/monitoring.js +96 -0
  50. package/dist/commands/interactive/monitoring.js.map +1 -0
  51. package/dist/commands/interactive/plugins.d.ts +2 -0
  52. package/dist/commands/interactive/plugins.d.ts.map +1 -0
  53. package/dist/commands/interactive/plugins.js +30 -0
  54. package/dist/commands/interactive/plugins.js.map +1 -0
  55. package/dist/commands/interactive/security.d.ts +9 -0
  56. package/dist/commands/interactive/security.d.ts.map +1 -0
  57. package/dist/commands/interactive/security.js +535 -0
  58. package/dist/commands/interactive/security.js.map +1 -0
  59. package/dist/commands/interactive/server-management.d.ts +5 -0
  60. package/dist/commands/interactive/server-management.d.ts.map +1 -0
  61. package/dist/commands/interactive/server-management.js +79 -0
  62. package/dist/commands/interactive/server-management.js.map +1 -0
  63. package/dist/commands/interactive/shared.d.ts +12 -0
  64. package/dist/commands/interactive/shared.d.ts.map +1 -0
  65. package/dist/commands/interactive/shared.js +30 -0
  66. package/dist/commands/interactive/shared.js.map +1 -0
  67. package/dist/commands/interactive.d.ts.map +1 -1
  68. package/dist/commands/interactive.js +29 -0
  69. package/dist/commands/interactive.js.map +1 -1
  70. package/dist/commands/lock.js +1 -1
  71. package/dist/commands/lock.js.map +1 -1
  72. package/dist/commands/plugin.d.ts +8 -0
  73. package/dist/commands/plugin.d.ts.map +1 -0
  74. package/dist/commands/plugin.js +87 -0
  75. package/dist/commands/plugin.js.map +1 -0
  76. package/dist/commands/regression.d.ts.map +1 -1
  77. package/dist/commands/regression.js +1 -2
  78. package/dist/commands/regression.js.map +1 -1
  79. package/dist/commands/restart.d.ts.map +1 -1
  80. package/dist/commands/restart.js +3 -2
  81. package/dist/commands/restart.js.map +1 -1
  82. package/dist/commands/schedule.js +2 -2
  83. package/dist/commands/schedule.js.map +1 -1
  84. package/dist/core/audit/checkIds.d.ts +516 -0
  85. package/dist/core/audit/checkIds.d.ts.map +1 -0
  86. package/dist/core/audit/checkIds.js +515 -0
  87. package/dist/core/audit/checkIds.js.map +1 -0
  88. package/dist/core/audit/checks/accounts.d.ts.map +1 -1
  89. package/dist/core/audit/checks/accounts.js +23 -22
  90. package/dist/core/audit/checks/accounts.js.map +1 -1
  91. package/dist/core/audit/checks/auth.d.ts.map +1 -1
  92. package/dist/core/audit/checks/auth.js +23 -22
  93. package/dist/core/audit/checks/auth.js.map +1 -1
  94. package/dist/core/audit/checks/backup.d.ts.map +1 -1
  95. package/dist/core/audit/checks/backup.js +9 -8
  96. package/dist/core/audit/checks/backup.js.map +1 -1
  97. package/dist/core/audit/checks/banners.d.ts.map +1 -1
  98. package/dist/core/audit/checks/banners.js +7 -6
  99. package/dist/core/audit/checks/banners.js.map +1 -1
  100. package/dist/core/audit/checks/boot.d.ts.map +1 -1
  101. package/dist/core/audit/checks/boot.js +12 -11
  102. package/dist/core/audit/checks/boot.js.map +1 -1
  103. package/dist/core/audit/checks/cloudmeta.d.ts.map +1 -1
  104. package/dist/core/audit/checks/cloudmeta.js +7 -6
  105. package/dist/core/audit/checks/cloudmeta.js.map +1 -1
  106. package/dist/core/audit/checks/crypto.d.ts +0 -5
  107. package/dist/core/audit/checks/crypto.d.ts.map +1 -1
  108. package/dist/core/audit/checks/crypto.js +20 -19
  109. package/dist/core/audit/checks/crypto.js.map +1 -1
  110. package/dist/core/audit/checks/ddos.d.ts.map +1 -1
  111. package/dist/core/audit/checks/ddos.js +9 -8
  112. package/dist/core/audit/checks/ddos.js.map +1 -1
  113. package/dist/core/audit/checks/dns.d.ts.map +1 -1
  114. package/dist/core/audit/checks/dns.js +9 -8
  115. package/dist/core/audit/checks/dns.js.map +1 -1
  116. package/dist/core/audit/checks/docker.d.ts.map +1 -1
  117. package/dist/core/audit/checks/docker.js +65 -64
  118. package/dist/core/audit/checks/docker.js.map +1 -1
  119. package/dist/core/audit/checks/fileintegrity.d.ts.map +1 -1
  120. package/dist/core/audit/checks/fileintegrity.js +11 -10
  121. package/dist/core/audit/checks/fileintegrity.js.map +1 -1
  122. package/dist/core/audit/checks/filesystem.d.ts.map +1 -1
  123. package/dist/core/audit/checks/filesystem.js +21 -20
  124. package/dist/core/audit/checks/filesystem.js.map +1 -1
  125. package/dist/core/audit/checks/firewall.d.ts.map +1 -1
  126. package/dist/core/audit/checks/firewall.js +18 -17
  127. package/dist/core/audit/checks/firewall.js.map +1 -1
  128. package/dist/core/audit/checks/httpHeaders.d.ts.map +1 -1
  129. package/dist/core/audit/checks/httpHeaders.js +7 -6
  130. package/dist/core/audit/checks/httpHeaders.js.map +1 -1
  131. package/dist/core/audit/checks/incidentready.d.ts.map +1 -1
  132. package/dist/core/audit/checks/incidentready.js +13 -12
  133. package/dist/core/audit/checks/incidentready.js.map +1 -1
  134. package/dist/core/audit/checks/kernel.d.ts.map +1 -1
  135. package/dist/core/audit/checks/kernel.js +32 -31
  136. package/dist/core/audit/checks/kernel.js.map +1 -1
  137. package/dist/core/audit/checks/logging.d.ts.map +1 -1
  138. package/dist/core/audit/checks/logging.js +21 -20
  139. package/dist/core/audit/checks/logging.js.map +1 -1
  140. package/dist/core/audit/checks/mac.d.ts.map +1 -1
  141. package/dist/core/audit/checks/mac.js +11 -10
  142. package/dist/core/audit/checks/mac.js.map +1 -1
  143. package/dist/core/audit/checks/malware.d.ts.map +1 -1
  144. package/dist/core/audit/checks/malware.js +12 -11
  145. package/dist/core/audit/checks/malware.js.map +1 -1
  146. package/dist/core/audit/checks/memory.d.ts.map +1 -1
  147. package/dist/core/audit/checks/memory.js +12 -11
  148. package/dist/core/audit/checks/memory.js.map +1 -1
  149. package/dist/core/audit/checks/network.d.ts.map +1 -1
  150. package/dist/core/audit/checks/network.js +22 -21
  151. package/dist/core/audit/checks/network.js.map +1 -1
  152. package/dist/core/audit/checks/nginx.d.ts.map +1 -1
  153. package/dist/core/audit/checks/nginx.js +17 -16
  154. package/dist/core/audit/checks/nginx.js.map +1 -1
  155. package/dist/core/audit/checks/resourcelimits.d.ts.map +1 -1
  156. package/dist/core/audit/checks/resourcelimits.js +9 -8
  157. package/dist/core/audit/checks/resourcelimits.js.map +1 -1
  158. package/dist/core/audit/checks/scheduling.d.ts.map +1 -1
  159. package/dist/core/audit/checks/scheduling.js +13 -12
  160. package/dist/core/audit/checks/scheduling.js.map +1 -1
  161. package/dist/core/audit/checks/secrets.d.ts.map +1 -1
  162. package/dist/core/audit/checks/secrets.js +16 -15
  163. package/dist/core/audit/checks/secrets.js.map +1 -1
  164. package/dist/core/audit/checks/services.d.ts.map +1 -1
  165. package/dist/core/audit/checks/services.js +26 -25
  166. package/dist/core/audit/checks/services.js.map +1 -1
  167. package/dist/core/audit/checks/ssh.d.ts.map +1 -1
  168. package/dist/core/audit/checks/ssh.js +23 -22
  169. package/dist/core/audit/checks/ssh.js.map +1 -1
  170. package/dist/core/audit/checks/supplychain.d.ts.map +1 -1
  171. package/dist/core/audit/checks/supplychain.js +13 -12
  172. package/dist/core/audit/checks/supplychain.js.map +1 -1
  173. package/dist/core/audit/checks/time.d.ts.map +1 -1
  174. package/dist/core/audit/checks/time.js +10 -9
  175. package/dist/core/audit/checks/time.js.map +1 -1
  176. package/dist/core/audit/checks/tls.d.ts.map +1 -1
  177. package/dist/core/audit/checks/tls.js +9 -8
  178. package/dist/core/audit/checks/tls.js.map +1 -1
  179. package/dist/core/audit/checks/updates.d.ts.map +1 -1
  180. package/dist/core/audit/checks/updates.js +12 -11
  181. package/dist/core/audit/checks/updates.js.map +1 -1
  182. package/dist/core/audit/compliance/categories/index.d.ts +3 -0
  183. package/dist/core/audit/compliance/categories/index.d.ts.map +1 -0
  184. package/dist/core/audit/compliance/categories/index.js +737 -0
  185. package/dist/core/audit/compliance/categories/index.js.map +1 -0
  186. package/dist/core/audit/compliance/helpers.d.ts +17 -0
  187. package/dist/core/audit/compliance/helpers.d.ts.map +1 -0
  188. package/dist/core/audit/compliance/helpers.js +40 -0
  189. package/dist/core/audit/compliance/helpers.js.map +1 -0
  190. package/dist/core/audit/compliance/mapper.d.ts +4 -16
  191. package/dist/core/audit/compliance/mapper.d.ts.map +1 -1
  192. package/dist/core/audit/compliance/mapper.js +3 -776
  193. package/dist/core/audit/compliance/mapper.js.map +1 -1
  194. package/dist/core/audit/fix-history.d.ts +16 -7
  195. package/dist/core/audit/fix-history.d.ts.map +1 -1
  196. package/dist/core/audit/fix-history.js +25 -2
  197. package/dist/core/audit/fix-history.js.map +1 -1
  198. package/dist/core/audit/fix.d.ts +17 -2
  199. package/dist/core/audit/fix.d.ts.map +1 -1
  200. package/dist/core/audit/fix.js +115 -42
  201. package/dist/core/audit/fix.js.map +1 -1
  202. package/dist/core/audit/formatters/badge.js +20 -20
  203. package/dist/core/audit/index.d.ts.map +1 -1
  204. package/dist/core/audit/index.js +3 -2
  205. package/dist/core/audit/index.js.map +1 -1
  206. package/dist/core/audit/snapshot.d.ts.map +1 -1
  207. package/dist/core/audit/snapshot.js +6 -2
  208. package/dist/core/audit/snapshot.js.map +1 -1
  209. package/dist/core/audit/types.d.ts +11 -1
  210. package/dist/core/audit/types.d.ts.map +1 -1
  211. package/dist/core/audit/watch.d.ts.map +1 -1
  212. package/dist/core/audit/watch.js +3 -2
  213. package/dist/core/audit/watch.js.map +1 -1
  214. package/dist/core/backup.d.ts.map +1 -1
  215. package/dist/core/backup.js +10 -5
  216. package/dist/core/backup.js.map +1 -1
  217. package/dist/core/bot/handlers.d.ts.map +1 -1
  218. package/dist/core/bot/handlers.js +2 -17
  219. package/dist/core/bot/handlers.js.map +1 -1
  220. package/dist/core/completions.d.ts.map +1 -1
  221. package/dist/core/completions.js +632 -610
  222. package/dist/core/completions.js.map +1 -1
  223. package/dist/core/deploy.d.ts.map +1 -1
  224. package/dist/core/deploy.js +7 -4
  225. package/dist/core/deploy.js.map +1 -1
  226. package/dist/core/doctor-fix.d.ts +1 -1
  227. package/dist/core/doctor-fix.d.ts.map +1 -1
  228. package/dist/core/doctor-fix.js +17 -2
  229. package/dist/core/doctor-fix.js.map +1 -1
  230. package/dist/core/doctor.d.ts.map +1 -1
  231. package/dist/core/doctor.js +2 -1
  232. package/dist/core/doctor.js.map +1 -1
  233. package/dist/core/firewall.d.ts +0 -1
  234. package/dist/core/firewall.d.ts.map +1 -1
  235. package/dist/core/firewall.js +2 -13
  236. package/dist/core/firewall.js.map +1 -1
  237. package/dist/core/lock/auth.d.ts +7 -0
  238. package/dist/core/lock/auth.d.ts.map +1 -0
  239. package/dist/core/lock/auth.js +59 -0
  240. package/dist/core/lock/auth.js.map +1 -0
  241. package/dist/core/lock/docker.d.ts +4 -0
  242. package/dist/core/lock/docker.d.ts.map +1 -0
  243. package/dist/core/lock/docker.js +28 -0
  244. package/dist/core/lock/docker.js.map +1 -0
  245. package/dist/core/lock/index.d.ts +11 -0
  246. package/dist/core/lock/index.d.ts.map +1 -0
  247. package/dist/core/lock/index.js +247 -0
  248. package/dist/core/lock/index.js.map +1 -0
  249. package/dist/core/lock/monitoring.d.ts +4 -0
  250. package/dist/core/lock/monitoring.d.ts.map +1 -0
  251. package/dist/core/lock/monitoring.js +55 -0
  252. package/dist/core/lock/monitoring.js.map +1 -0
  253. package/dist/core/lock/network.d.ts +6 -0
  254. package/dist/core/lock/network.d.ts.map +1 -0
  255. package/dist/core/lock/network.js +59 -0
  256. package/dist/core/lock/network.js.map +1 -0
  257. package/dist/core/lock/ssh.d.ts +5 -0
  258. package/dist/core/lock/ssh.d.ts.map +1 -0
  259. package/dist/core/lock/ssh.js +49 -0
  260. package/dist/core/lock/ssh.js.map +1 -0
  261. package/dist/core/lock/system.d.ts +9 -0
  262. package/dist/core/lock/system.d.ts.map +1 -0
  263. package/dist/core/lock/system.js +80 -0
  264. package/dist/core/lock/system.js.map +1 -0
  265. package/dist/core/lock/types.d.ts +41 -0
  266. package/dist/core/lock/types.d.ts.map +1 -0
  267. package/dist/core/lock/types.js +2 -0
  268. package/dist/core/lock/types.js.map +1 -0
  269. package/dist/core/maintain.d.ts.map +1 -1
  270. package/dist/core/maintain.js +3 -1
  271. package/dist/core/maintain.js.map +1 -1
  272. package/dist/core/manage.d.ts.map +1 -1
  273. package/dist/core/manage.js +7 -4
  274. package/dist/core/manage.js.map +1 -1
  275. package/dist/core/notify.d.ts.map +1 -1
  276. package/dist/core/notify.js +2 -1
  277. package/dist/core/notify.js.map +1 -1
  278. package/dist/core/notifyStore.d.ts.map +1 -1
  279. package/dist/core/notifyStore.js +3 -1
  280. package/dist/core/notifyStore.js.map +1 -1
  281. package/dist/core/plugin.d.ts +23 -0
  282. package/dist/core/plugin.d.ts.map +1 -0
  283. package/dist/core/plugin.js +107 -0
  284. package/dist/core/plugin.js.map +1 -0
  285. package/dist/core/provision.d.ts.map +1 -1
  286. package/dist/core/provision.js +9 -4
  287. package/dist/core/provision.js.map +1 -1
  288. package/dist/core/scheduleManager.d.ts +2 -1
  289. package/dist/core/scheduleManager.d.ts.map +1 -1
  290. package/dist/core/scheduleManager.js +13 -7
  291. package/dist/core/scheduleManager.js.map +1 -1
  292. package/dist/index.js +34 -2
  293. package/dist/index.js.map +1 -1
  294. package/dist/mcp/index.js +5 -9
  295. package/dist/mcp/index.js.map +1 -1
  296. package/dist/mcp/schemas/audit.d.ts +34 -0
  297. package/dist/mcp/schemas/audit.d.ts.map +1 -0
  298. package/dist/mcp/schemas/audit.js +23 -0
  299. package/dist/mcp/schemas/audit.js.map +1 -0
  300. package/dist/mcp/schemas/common.d.ts +16 -0
  301. package/dist/mcp/schemas/common.d.ts.map +1 -0
  302. package/dist/mcp/schemas/common.js +14 -0
  303. package/dist/mcp/schemas/common.js.map +1 -0
  304. package/dist/mcp/schemas/health.d.ts +14 -0
  305. package/dist/mcp/schemas/health.d.ts.map +1 -0
  306. package/dist/mcp/schemas/health.js +13 -0
  307. package/dist/mcp/schemas/health.js.map +1 -0
  308. package/dist/mcp/schemas/index.d.ts +5 -0
  309. package/dist/mcp/schemas/index.d.ts.map +1 -0
  310. package/dist/mcp/schemas/index.js +5 -0
  311. package/dist/mcp/schemas/index.js.map +1 -0
  312. package/dist/mcp/schemas/server.d.ts +18 -0
  313. package/dist/mcp/schemas/server.d.ts.map +1 -0
  314. package/dist/mcp/schemas/server.js +16 -0
  315. package/dist/mcp/schemas/server.js.map +1 -0
  316. package/dist/mcp/server.d.ts.map +1 -1
  317. package/dist/mcp/server.js +71 -40
  318. package/dist/mcp/server.js.map +1 -1
  319. package/dist/mcp/tools/serverAudit.d.ts +63 -1
  320. package/dist/mcp/tools/serverAudit.d.ts.map +1 -1
  321. package/dist/mcp/tools/serverAudit.js +63 -6
  322. package/dist/mcp/tools/serverAudit.js.map +1 -1
  323. package/dist/mcp/tools/serverBackup.d.ts +100 -2
  324. package/dist/mcp/tools/serverBackup.d.ts.map +1 -1
  325. package/dist/mcp/tools/serverBackup.handlers.d.ts.map +1 -1
  326. package/dist/mcp/tools/serverBackup.handlers.js +9 -0
  327. package/dist/mcp/tools/serverBackup.handlers.js.map +1 -1
  328. package/dist/mcp/tools/serverBackup.js +74 -0
  329. package/dist/mcp/tools/serverBackup.js.map +1 -1
  330. package/dist/mcp/tools/serverCompare.d.ts +33 -0
  331. package/dist/mcp/tools/serverCompare.d.ts.map +1 -1
  332. package/dist/mcp/tools/serverCompare.js +45 -2
  333. package/dist/mcp/tools/serverCompare.js.map +1 -1
  334. package/dist/mcp/tools/serverDoctor.d.ts +14 -0
  335. package/dist/mcp/tools/serverDoctor.d.ts.map +1 -1
  336. package/dist/mcp/tools/serverDoctor.js +16 -1
  337. package/dist/mcp/tools/serverDoctor.js.map +1 -1
  338. package/dist/mcp/tools/serverEvidence.d.ts +13 -0
  339. package/dist/mcp/tools/serverEvidence.d.ts.map +1 -1
  340. package/dist/mcp/tools/serverEvidence.js +17 -2
  341. package/dist/mcp/tools/serverEvidence.js.map +1 -1
  342. package/dist/mcp/tools/serverExplain.d.ts +17 -0
  343. package/dist/mcp/tools/serverExplain.d.ts.map +1 -1
  344. package/dist/mcp/tools/serverExplain.js +33 -1
  345. package/dist/mcp/tools/serverExplain.js.map +1 -1
  346. package/dist/mcp/tools/serverFix.d.ts +78 -0
  347. package/dist/mcp/tools/serverFix.d.ts.map +1 -1
  348. package/dist/mcp/tools/serverFix.js +87 -0
  349. package/dist/mcp/tools/serverFix.js.map +1 -1
  350. package/dist/mcp/tools/serverFleet.d.ts +24 -1
  351. package/dist/mcp/tools/serverFleet.d.ts.map +1 -1
  352. package/dist/mcp/tools/serverFleet.js +24 -1
  353. package/dist/mcp/tools/serverFleet.js.map +1 -1
  354. package/dist/mcp/tools/serverGuard.d.ts +12 -0
  355. package/dist/mcp/tools/serverGuard.d.ts.map +1 -1
  356. package/dist/mcp/tools/serverGuard.js +16 -0
  357. package/dist/mcp/tools/serverGuard.js.map +1 -1
  358. package/dist/mcp/tools/serverInfo.d.ts +77 -1
  359. package/dist/mcp/tools/serverInfo.d.ts.map +1 -1
  360. package/dist/mcp/tools/serverInfo.js +77 -4
  361. package/dist/mcp/tools/serverInfo.js.map +1 -1
  362. package/dist/mcp/tools/serverLock.d.ts +10 -0
  363. package/dist/mcp/tools/serverLock.d.ts.map +1 -1
  364. package/dist/mcp/tools/serverLock.js +15 -3
  365. package/dist/mcp/tools/serverLock.js.map +1 -1
  366. package/dist/mcp/tools/serverLogs.d.ts +43 -0
  367. package/dist/mcp/tools/serverLogs.d.ts.map +1 -1
  368. package/dist/mcp/tools/serverLogs.js +28 -0
  369. package/dist/mcp/tools/serverLogs.js.map +1 -1
  370. package/dist/mcp/tools/serverMaintain.d.ts +47 -0
  371. package/dist/mcp/tools/serverMaintain.d.ts.map +1 -1
  372. package/dist/mcp/tools/serverMaintain.js +75 -41
  373. package/dist/mcp/tools/serverMaintain.js.map +1 -1
  374. package/dist/mcp/tools/serverManage.d.ts +50 -0
  375. package/dist/mcp/tools/serverManage.d.ts.map +1 -1
  376. package/dist/mcp/tools/serverManage.js +49 -0
  377. package/dist/mcp/tools/serverManage.js.map +1 -1
  378. package/dist/mcp/tools/serverPlugin.d.ts +30 -0
  379. package/dist/mcp/tools/serverPlugin.d.ts.map +1 -0
  380. package/dist/mcp/tools/serverPlugin.js +47 -0
  381. package/dist/mcp/tools/serverPlugin.js.map +1 -0
  382. package/dist/mcp/tools/serverProvision.d.ts +22 -0
  383. package/dist/mcp/tools/serverProvision.d.ts.map +1 -1
  384. package/dist/mcp/tools/serverProvision.js +22 -2
  385. package/dist/mcp/tools/serverProvision.js.map +1 -1
  386. package/dist/mcp/tools/serverSecure.d.ts +120 -0
  387. package/dist/mcp/tools/serverSecure.d.ts.map +1 -1
  388. package/dist/mcp/tools/serverSecure.handlers.d.ts.map +1 -1
  389. package/dist/mcp/tools/serverSecure.handlers.js +39 -98
  390. package/dist/mcp/tools/serverSecure.handlers.js.map +1 -1
  391. package/dist/mcp/tools/serverSecure.js +101 -0
  392. package/dist/mcp/tools/serverSecure.js.map +1 -1
  393. package/dist/mcp/utils.d.ts +1 -0
  394. package/dist/mcp/utils.d.ts.map +1 -1
  395. package/dist/mcp/utils.js +5 -1
  396. package/dist/mcp/utils.js.map +1 -1
  397. package/dist/plugin/loader.d.ts +10 -0
  398. package/dist/plugin/loader.d.ts.map +1 -0
  399. package/dist/plugin/loader.js +88 -0
  400. package/dist/plugin/loader.js.map +1 -0
  401. package/dist/plugin/registry.d.ts +16 -0
  402. package/dist/plugin/registry.d.ts.map +1 -0
  403. package/dist/plugin/registry.js +101 -0
  404. package/dist/plugin/registry.js.map +1 -0
  405. package/dist/plugin/sdk/constants.d.ts +3 -0
  406. package/dist/plugin/sdk/constants.d.ts.map +1 -0
  407. package/dist/plugin/sdk/constants.js +3 -0
  408. package/dist/plugin/sdk/constants.js.map +1 -0
  409. package/dist/plugin/sdk/types.d.ts +29 -0
  410. package/dist/plugin/sdk/types.d.ts.map +1 -0
  411. package/dist/plugin/sdk/types.js +2 -0
  412. package/dist/plugin/sdk/types.js.map +1 -0
  413. package/dist/plugin/validate.d.ts +3 -0
  414. package/dist/plugin/validate.d.ts.map +1 -0
  415. package/dist/plugin/validate.js +31 -0
  416. package/dist/plugin/validate.js.map +1 -0
  417. package/dist/providers/base.d.ts.map +1 -1
  418. package/dist/providers/base.js +2 -1
  419. package/dist/providers/base.js.map +1 -1
  420. package/dist/providers/linode.d.ts +1 -0
  421. package/dist/providers/linode.d.ts.map +1 -1
  422. package/dist/providers/linode.js +4 -0
  423. package/dist/providers/linode.js.map +1 -1
  424. package/dist/utils/cloudInit.js +58 -58
  425. package/dist/utils/config.d.ts +3 -0
  426. package/dist/utils/config.d.ts.map +1 -1
  427. package/dist/utils/config.js +11 -6
  428. package/dist/utils/config.js.map +1 -1
  429. package/dist/utils/encryption.d.ts.map +1 -1
  430. package/dist/utils/encryption.js +4 -1
  431. package/dist/utils/encryption.js.map +1 -1
  432. package/dist/utils/errorMapper.d.ts.map +1 -1
  433. package/dist/utils/errorMapper.js +2 -1
  434. package/dist/utils/errorMapper.js.map +1 -1
  435. package/dist/utils/errors.d.ts +1 -0
  436. package/dist/utils/errors.d.ts.map +1 -1
  437. package/dist/utils/errors.js +3 -0
  438. package/dist/utils/errors.js.map +1 -1
  439. package/dist/utils/migration.d.ts.map +1 -1
  440. package/dist/utils/migration.js +25 -14
  441. package/dist/utils/migration.js.map +1 -1
  442. package/dist/utils/paths.d.ts +4 -0
  443. package/dist/utils/paths.d.ts.map +1 -1
  444. package/dist/utils/paths.js +4 -0
  445. package/dist/utils/paths.js.map +1 -1
  446. package/dist/utils/safeMode.d.ts.map +1 -1
  447. package/dist/utils/safeMode.js +3 -2
  448. package/dist/utils/safeMode.js.map +1 -1
  449. package/dist/utils/secureWrite.d.ts.map +1 -1
  450. package/dist/utils/secureWrite.js +2 -1
  451. package/dist/utils/secureWrite.js.map +1 -1
  452. package/dist/utils/securityLogger.d.ts.map +1 -1
  453. package/dist/utils/securityLogger.js +7 -3
  454. package/dist/utils/securityLogger.js.map +1 -1
  455. package/dist/utils/version.d.ts +4 -0
  456. package/dist/utils/version.d.ts.map +1 -0
  457. package/dist/utils/version.js +22 -0
  458. package/dist/utils/version.js.map +1 -0
  459. package/dist/utils/yamlConfig.d.ts.map +1 -1
  460. package/dist/utils/yamlConfig.js +3 -2
  461. package/dist/utils/yamlConfig.js.map +1 -1
  462. package/kastell-plugin/.claude-plugin/plugin.json +20 -0
  463. package/kastell-plugin/.mcp.json +8 -0
  464. package/kastell-plugin/README.md +113 -0
  465. package/kastell-plugin/agents/.gitkeep +0 -0
  466. package/kastell-plugin/agents/kastell-auditor.md +77 -0
  467. package/kastell-plugin/agents/scripts/bucket_mapper.sh +101 -0
  468. package/kastell-plugin/agents/scripts/trend_report.sh +91 -0
  469. package/kastell-plugin/hooks/destroy-block.cjs +31 -0
  470. package/kastell-plugin/hooks/hooks.json +57 -0
  471. package/kastell-plugin/hooks/pre-commit-audit-guard.cjs +75 -0
  472. package/kastell-plugin/hooks/session-audit.cjs +86 -0
  473. package/kastell-plugin/hooks/session-log.cjs +56 -0
  474. package/kastell-plugin/hooks/stop-quality-check.cjs +72 -0
  475. package/kastell-plugin/skills/.gitkeep +0 -0
  476. package/kastell-plugin/skills/kastell-careful/SKILL.md +64 -0
  477. package/kastell-plugin/skills/kastell-ops/SKILL.md +139 -0
  478. package/kastell-plugin/skills/kastell-ops/references/commands.md +45 -0
  479. package/kastell-plugin/skills/kastell-ops/references/mcp-tools.md +50 -0
  480. package/kastell-plugin/skills/kastell-ops/references/patterns.md +145 -0
  481. package/kastell-plugin/skills/kastell-ops/references/pitfalls.md +136 -0
  482. package/kastell-plugin/skills/kastell-ops/scripts/check_coverage.sh +101 -0
  483. package/kastell-plugin/skills/kastell-ops/scripts/fleet_report.sh +73 -0
  484. package/kastell-plugin/skills/kastell-ops/scripts/parse_audit.sh +76 -0
  485. package/kastell-plugin/skills/kastell-research/SKILL.md +90 -0
  486. package/kastell-plugin/skills/kastell-scaffold/SKILL.md +104 -0
  487. package/kastell-plugin/skills/kastell-scaffold/references/template-audit-check.md +150 -0
  488. package/kastell-plugin/skills/kastell-scaffold/references/template-command.md +80 -0
  489. package/kastell-plugin/skills/kastell-scaffold/references/template-mcp-tool.md +72 -0
  490. package/kastell-plugin/skills/kastell-scaffold/references/template-provider.md +67 -0
  491. package/kastell-plugin/skills/kastell-scaffold/scripts/scaffold.sh +180 -0
  492. package/kastell-plugin/skills/kastell-scaffold/templates/check-test.ts.tpl +27 -0
  493. package/kastell-plugin/skills/kastell-scaffold/templates/check.ts.tpl +50 -0
  494. package/kastell-plugin/skills/kastell-scaffold/templates/command-core.ts.tpl +18 -0
  495. package/kastell-plugin/skills/kastell-scaffold/templates/command-test.ts.tpl +17 -0
  496. package/kastell-plugin/skills/kastell-scaffold/templates/command.ts.tpl +25 -0
  497. package/kastell-plugin/skills/kastell-scaffold/templates/mcp-tool-test.ts.tpl +30 -0
  498. package/kastell-plugin/skills/kastell-scaffold/templates/mcp-tool.ts.tpl +29 -0
  499. package/kastell-plugin/skills/kastell-scaffold/templates/provider-test.ts.tpl +34 -0
  500. package/kastell-plugin/skills/kastell-scaffold/templates/provider.ts.tpl +32 -0
  501. package/package.json +122 -113
@@ -0,0 +1,136 @@
1
+ # Kastell Pitfalls
2
+
3
+ Known traps, symptoms, and fixes. Severity: HIGH (blocks correct behavior), MEDIUM (causes test/maintenance pain), LOW (minor inconsistency).
4
+
5
+ ---
6
+
7
+ ## 1. Adapter Bypass (HIGH)
8
+
9
+ **Symptom:** `if (server.platform === 'coolify') { port = 8000 } else { port = 3000 }` in `src/commands/`
10
+
11
+ **Root cause:** Command accesses platform properties directly instead of using the adapter.
12
+
13
+ **Fix:** Use `getAdapter(platform)` from `factory.ts` and read `adapter.port`, `adapter.defaultLogService`, `adapter.platformPorts`.
14
+
15
+ ```typescript
16
+ // WRONG
17
+ const port = server.platform === 'coolify' ? 8000 : 3000;
18
+
19
+ // CORRECT
20
+ import { getAdapter } from '../../src/adapters/factory.js';
21
+ const adapter = getAdapter(server.platform);
22
+ const port = adapter.port;
23
+ ```
24
+
25
+ ---
26
+
27
+ ## 2. Business Logic in Commands (HIGH)
28
+
29
+ **Symptom:** Complex calculations, API calls, try/catch blocks, or SSH calls in `src/commands/*.ts`.
30
+
31
+ **Root cause:** Logic was not extracted to `src/core/`.
32
+
33
+ **Fix:** Extract all logic to a new `src/core/<name>.ts` function. Command only calls core and displays the result.
34
+
35
+ ---
36
+
37
+ ## 3. UI in Core (HIGH)
38
+
39
+ **Symptom:** `chalk.green(...)`, `ora('...').start()`, or `console.log()` in `src/core/*.ts`.
40
+
41
+ **Root cause:** Core function was handling display instead of returning data.
42
+
43
+ **Fix:** Core functions return plain data objects. The command layer (or MCP handler) handles display using chalk/ora.
44
+
45
+ ---
46
+
47
+ ## 4. Direct Adapter Import (MEDIUM)
48
+
49
+ **Symptom:** `import { CoolifyAdapter } from '../../src/adapters/coolify.js'` in a command or core file.
50
+
51
+ **Root cause:** Bypasses the factory cache and breaks the abstraction boundary.
52
+
53
+ **Fix:** Always use `getAdapter(platform)` from `src/adapters/factory.ts`.
54
+
55
+ ---
56
+
57
+ ## 5. Inline Adapter Mocks in Tests (MEDIUM)
58
+
59
+ **Symptom:** `const adapter = { healthCheck: jest.fn(), port: 8000, ... }` scattered across test files.
60
+
61
+ **Root cause:** Not using the centralized mock factory.
62
+
63
+ **Fix:** Use `createMockAdapter()` from `tests/helpers/mockAdapter.ts`. When the `PlatformAdapter` interface gains new methods, only `mockAdapter.ts` needs updating.
64
+
65
+ ---
66
+
67
+ ## 6. SSH Batch Grouping (MEDIUM)
68
+
69
+ **Symptom:** Audit or health commands call `sshExec` 4-6 times sequentially, each fetching partially overlapping data.
70
+
71
+ **Root cause:** Each check independently fetches data instead of using shared batched results.
72
+
73
+ **Fix:** Batch fast config commands together (single SSH call), batch slow probe commands together. Use head limits appropriate to the data volume (e.g., `head -50` for audit log checks).
74
+
75
+ ---
76
+
77
+ ## 7. Jest requireActual Crash (MEDIUM)
78
+
79
+ **Symptom:** Tests crash on Node v24+ with an error related to `jest.requireActual`.
80
+
81
+ **Root cause:** `jest.requireActual` behavior changed in Node v24.
82
+
83
+ **Fix:** Use inline `jest.fn()` mocks instead of `jest.requireActual`. For module-level mocks, use `jest.mock()` with a factory function.
84
+
85
+ ---
86
+
87
+ ## 8. Module-Level Side Effects (MEDIUM)
88
+
89
+ **Symptom:** Test imports a module that registers listeners or modifies globals at load time, causing unexpected behavior when other tests run.
90
+
91
+ **Root cause:** Module has top-level side effects (e.g., `process.on('SIGINT', ...)` at module scope).
92
+
93
+ **Fix:** Mock the module in ALL test files that import it, not just the direct test file. Side effects occur at import time.
94
+
95
+ ---
96
+
97
+ ## 9. Hardcoded Port Numbers (LOW)
98
+
99
+ **Symptom:** `8000` or `3000` literals appear in `src/commands/` or `src/core/` files.
100
+
101
+ **Root cause:** Port copied from constants instead of read from adapter.
102
+
103
+ **Fix:** Use `adapter.port` for platform HTTP port, `adapter.platformPorts` for firewall protection list.
104
+
105
+ ---
106
+
107
+ ## 10. PROVIDER_REGISTRY Mismatch (LOW)
108
+
109
+ **Symptom:** New provider works via direct code path but fails CLI validation, completion, or `--provider` flag parsing.
110
+
111
+ **Root cause:** Provider added to `src/providers/` but not added to `PROVIDER_REGISTRY` in `src/constants.ts`.
112
+
113
+ **Fix:** Always add to `PROVIDER_REGISTRY` first — it is the single source of truth for provider enumeration, validation, and display.
114
+
115
+ ---
116
+
117
+ ## 11. SSH Timeout Too Short (LOW)
118
+
119
+ **Symptom:** Long-running commands (lock, audit, update) fail silently or with cryptic timeout errors.
120
+
121
+ **Root cause:** Default SSH timeout (30s) is insufficient for operations like platform update (~3 minutes).
122
+
123
+ **Fix:** Use 180s timeout for slow operations:
124
+ ```typescript
125
+ await sshExec(ip, command, { timeout: 180_000 });
126
+ ```
127
+
128
+ ---
129
+
130
+ ## 12. describe.each + clearAllMocks (LOW)
131
+
132
+ **Symptom:** Tests pass individually but fail when the full suite runs. Mock call counts are wrong in later tests.
133
+
134
+ **Root cause:** `jest.clearAllMocks()` clears call history but does not reset mock implementations. `describe.each` reuses the same mock instance across parameterized runs.
135
+
136
+ **Fix:** Use `jest.resetAllMocks()` in `beforeEach` when using `describe.each`. This resets both call history and implementations.
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env bash
2
+ # check_coverage.sh — Compare audit check count vs test count.
3
+ # Usage: bash check_coverage.sh [project-root]
4
+ #
5
+ # Counts audit checks defined in src/core/audit/checks/ and matching tests.
6
+ # Requires: node
7
+
8
+ set -euo pipefail
9
+
10
+ PROJECT_ROOT="${1:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
11
+
12
+ node -e "
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const root = process.argv[1];
17
+ const checksDir = path.join(root, 'src', 'core', 'audit', 'checks');
18
+
19
+ if (!fs.existsSync(checksDir)) {
20
+ console.error('Error: ' + checksDir + ' not found');
21
+ process.exit(1);
22
+ }
23
+
24
+ // Read all .ts files in checks dir (excluding index.ts)
25
+ const checkFiles = fs.readdirSync(checksDir)
26
+ .filter(f => f.endsWith('.ts') && f !== 'index.ts');
27
+
28
+ let totalChecks = 0;
29
+ const uniqueIds = new Set();
30
+ const perFile = [];
31
+
32
+ for (const file of checkFiles) {
33
+ const content = fs.readFileSync(path.join(checksDir, file), 'utf8');
34
+ const ids = [...content.matchAll(/id:\s*['\"]([^'\"]+)['\"]/g)].map(m => m[1]);
35
+ totalChecks += ids.length;
36
+ ids.forEach(id => uniqueIds.add(id));
37
+ perFile.push({ name: file.replace('.ts', ''), checks: ids.length });
38
+ }
39
+
40
+ // Count categories from index.ts
41
+ let categories = 0;
42
+ const indexPath = path.join(checksDir, 'index.ts');
43
+ if (fs.existsSync(indexPath)) {
44
+ const indexContent = fs.readFileSync(indexPath, 'utf8');
45
+ categories = (indexContent.match(/sectionName/g) || []).length;
46
+ }
47
+
48
+ // Find audit test files recursively
49
+ function findTests(dir) {
50
+ let count = 0;
51
+ if (!fs.existsSync(dir)) return 0;
52
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
53
+ const full = path.join(dir, entry.name);
54
+ if (entry.isDirectory()) count += findTests(full);
55
+ else if (entry.name.endsWith('.test.ts') && entry.name.includes('audit') ||
56
+ full.includes('audit') && entry.name.endsWith('.test.ts')) {
57
+ count++;
58
+ }
59
+ }
60
+ return count;
61
+ }
62
+ const testCount = findTests(path.join(root, 'src'));
63
+
64
+ // Pre-index all test file contents once (avoids N+1 file reads)
65
+ const testIndex = new Set();
66
+ function indexTests(dir) {
67
+ try {
68
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
69
+ const full = path.join(dir, entry.name);
70
+ if (entry.isDirectory()) indexTests(full);
71
+ else if (entry.name.endsWith('.test.ts')) {
72
+ const content = fs.readFileSync(full, 'utf8');
73
+ // Extract referenced module names from imports and test descriptions
74
+ for (const match of content.matchAll(/['\"]([^'\"]*audit[^'\"]*)['\"]|from\s+['\"]([^'\"]+)['\"]/g)) {
75
+ const ref = match[1] || match[2] || '';
76
+ ref.split('/').forEach(part => testIndex.add(part.replace('.js', '').replace('.ts', '')));
77
+ }
78
+ }
79
+ }
80
+ } catch {}
81
+ }
82
+ indexTests(path.join(root, 'src'));
83
+ function hasTestFor(name) { return testIndex.has(name); }
84
+
85
+ console.log('=== Audit Check Coverage ===');
86
+ console.log('Project: ' + root);
87
+ console.log('');
88
+ console.log('Check source files: ' + checkFiles.length);
89
+ console.log('Categories: ' + categories);
90
+ console.log('Checks defined: ' + totalChecks);
91
+ console.log('Unique check IDs: ' + uniqueIds.size);
92
+ console.log('Audit test files: ' + testCount);
93
+ console.log('');
94
+ console.log('Per-file breakdown:');
95
+
96
+ perFile.sort((a, b) => a.name.localeCompare(b.name));
97
+ for (const f of perFile) {
98
+ const tested = hasTestFor(f.name) ? '✓' : '✗';
99
+ console.log(' ' + tested + ' ' + f.name.padEnd(20) + ' ' + String(f.checks).padStart(3) + ' checks');
100
+ }
101
+ " "$PROJECT_ROOT"
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env bash
2
+ # fleet_report.sh — Generate a fleet-wide server score table.
3
+ # Usage: kastell fleet --json | bash fleet_report.sh
4
+ # OR: bash fleet_report.sh < fleet-output.json
5
+ # OR: bash fleet_report.sh fleet-output.json
6
+ #
7
+ # Requires: node
8
+
9
+ set -euo pipefail
10
+
11
+ if [[ -n "${1:-}" && -f "$1" ]]; then
12
+ INPUT=$(cat "$1")
13
+ elif [[ ! -t 0 ]]; then
14
+ INPUT=$(cat)
15
+ else
16
+ echo "Usage: kastell fleet --json | bash fleet_report.sh" >&2
17
+ exit 1
18
+ fi
19
+
20
+ node -e "
21
+ const data = JSON.parse(process.argv[1]);
22
+ const servers = data.servers || data.fleet || data || [];
23
+
24
+ if (!Array.isArray(servers) || servers.length === 0) {
25
+ console.log('No servers found in fleet data.');
26
+ process.exit(0);
27
+ }
28
+
29
+ // Header
30
+ const cols = { name: 20, ip: 16, provider: 12, mode: 8, score: 6, health: 10 };
31
+ const pad = (s, n) => String(s || '-').slice(0, n).padEnd(n);
32
+ const sep = '-'.repeat(Object.values(cols).reduce((a, b) => a + b + 3, 0));
33
+
34
+ console.log('=== Kastell Fleet Report ===');
35
+ console.log('Servers: ' + servers.length);
36
+ console.log('');
37
+ console.log(
38
+ pad('Name', cols.name) + ' | ' +
39
+ pad('IP', cols.ip) + ' | ' +
40
+ pad('Provider', cols.provider) + ' | ' +
41
+ pad('Mode', cols.mode) + ' | ' +
42
+ pad('Score', cols.score) + ' | ' +
43
+ pad('Health', cols.health)
44
+ );
45
+ console.log(sep);
46
+
47
+ // Sort by score (lowest first = needs attention)
48
+ const sorted = [...servers].sort((a, b) => (a.score ?? 0) - (b.score ?? 0));
49
+
50
+ for (const s of sorted) {
51
+ const score = s.score ?? s.auditScore ?? '-';
52
+ const health = s.health ?? s.status ?? '-';
53
+ const icon = health === 'ONLINE' ? '●' : health === 'DEGRADED' ? '◐' : '○';
54
+ console.log(
55
+ pad(s.name, cols.name) + ' | ' +
56
+ pad(s.ip, cols.ip) + ' | ' +
57
+ pad(s.provider, cols.provider) + ' | ' +
58
+ pad(s.mode, cols.mode) + ' | ' +
59
+ pad(score, cols.score) + ' | ' +
60
+ icon + ' ' + pad(health, cols.health - 2)
61
+ );
62
+ }
63
+
64
+ // Summary
65
+ const scores = sorted.map(s => s.score ?? s.auditScore).filter(s => typeof s === 'number');
66
+ if (scores.length > 0) {
67
+ const avg = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);
68
+ const min = Math.min(...scores);
69
+ const max = Math.max(...scores);
70
+ console.log('');
71
+ console.log('Avg: ' + avg + ' | Min: ' + min + ' | Max: ' + max);
72
+ }
73
+ " "$INPUT"
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env bash
2
+ # parse_audit.sh — Parse kastell audit JSON into 5 security domain summaries.
3
+ # Usage: kastell audit --server <name> --json | bash parse_audit.sh
4
+ # OR: bash parse_audit.sh < audit-output.json
5
+ # OR: bash parse_audit.sh audit-output.json
6
+ #
7
+ # Requires: node (uses inline JS for JSON parsing — no jq dependency)
8
+
9
+ set -euo pipefail
10
+
11
+ # Read JSON from file arg, stdin, or pipe
12
+ if [[ -n "${1:-}" && -f "$1" ]]; then
13
+ INPUT=$(cat "$1")
14
+ elif [[ ! -t 0 ]]; then
15
+ INPUT=$(cat)
16
+ else
17
+ echo "Usage: kastell audit --server <name> --json | bash parse_audit.sh" >&2
18
+ echo " OR: bash parse_audit.sh <audit-json-file>" >&2
19
+ exit 1
20
+ fi
21
+
22
+ node -e "
23
+ const data = JSON.parse(process.argv[1]);
24
+ const checks = data.checks || data.results || [];
25
+
26
+ // 5 security domain mapping
27
+ const DOMAINS = {
28
+ 'Perimeter': ['Network', 'Firewall', 'DNS Security'],
29
+ 'Authentication': ['SSH', 'Auth', 'Crypto', 'Accounts'],
30
+ 'Runtime': ['Docker', 'Services', 'Boot', 'Scheduling'],
31
+ 'Internals': ['Filesystem', 'Logging', 'Kernel', 'Memory'],
32
+ 'Compliance': ['Updates', 'File Integrity', 'Malware', 'MAC', 'Secrets',
33
+ 'Cloud Metadata', 'Supply Chain', 'Backup Hygiene',
34
+ 'Resource Limits', 'Incident Readiness', 'Banners', 'Time',
35
+ 'TLS', 'HTTP Security Headers'],
36
+ };
37
+
38
+ // Map categories to domains
39
+ const catToDomain = {};
40
+ for (const [domain, cats] of Object.entries(DOMAINS)) {
41
+ for (const cat of cats) catToDomain[cat.toLowerCase()] = domain;
42
+ }
43
+
44
+ // Bucket checks
45
+ const buckets = {};
46
+ for (const d of Object.keys(DOMAINS)) buckets[d] = { passed: 0, failed: 0, critical: [] };
47
+
48
+ for (const c of checks) {
49
+ const cat = (c.category || '').toLowerCase();
50
+ let domain = 'Compliance'; // default
51
+ for (const [key, val] of Object.entries(catToDomain)) {
52
+ if (cat.includes(key)) { domain = val; break; }
53
+ }
54
+ if (c.passed) buckets[domain].passed++;
55
+ else {
56
+ buckets[domain].failed++;
57
+ if (c.severity === 'critical') buckets[domain].critical.push(c.id || c.name);
58
+ }
59
+ }
60
+
61
+ // Output
62
+ const score = data.score ?? data.overallScore ?? 'N/A';
63
+ console.log('=== Kastell Audit Domain Summary ===');
64
+ console.log('Overall Score: ' + score + '/100');
65
+ console.log('');
66
+
67
+ for (const [domain, b] of Object.entries(buckets)) {
68
+ const total = b.passed + b.failed;
69
+ const pct = total > 0 ? Math.round(b.passed / total * 100) : 0;
70
+ const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));
71
+ console.log(domain + ': ' + b.passed + '/' + total + ' (' + pct + '%) ' + bar);
72
+ if (b.critical.length > 0) {
73
+ console.log(' Critical: ' + b.critical.slice(0, 3).join(', '));
74
+ }
75
+ }
76
+ " "$INPUT"
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: kastell-research
3
+ description: Read-only Kastell codebase exploration. Use when tracing a bug across files, mapping callsites before refactoring, or exploring unfamiliar subsystems. Runs in isolated context with Explore agent.
4
+ context: fork
5
+ agent: Explore
6
+ allowed-tools: Read, Grep, Glob
7
+ effort: medium
8
+ memory: project
9
+ ---
10
+
11
+ # Kastell Research
12
+
13
+ ## Purpose
14
+
15
+ Explore the Kastell codebase using read-only tools (Read, Grep, Glob). Runs in a forked Explore agent with Kastell architecture knowledge inlined.
16
+
17
+ ## When to Use
18
+
19
+ - **Bug investigation:** Trace a bug from CLI command through core logic to adapters/providers. Start at the command file, follow imports to core, check utils and adapters.
20
+ - **Feature mapping:** Map all callsites of a function, trace the import chain, understand how subsystems connect before making changes.
21
+ - **Architecture question:** Understand how audit categories work, how the adapter dispatch flows, or how lock hardening steps are structured.
22
+
23
+ ## Live Codebase
24
+
25
+ **Commands:**
26
+ !`node -e "import('fs').then(f=>console.log(f.readdirSync('src/commands').filter(x=>x.endsWith('.ts')).map(x=>x.replace('.ts','')).join(', '))).catch(()=>console.log('commands dir not found'))"`
27
+ **Provider registry:**
28
+ !`node -e "import('fs').then(f=>{const c=f.readFileSync('src/constants.ts','utf8');const m=c.match(/PROVIDER_REGISTRY[\s\S]{0,200}/);console.log(m?m[0].split('\n').slice(0,4).join('\n'):'not found')}).catch(()=>console.log('constants.ts not found'))"`
29
+
30
+ ## Architecture Map
31
+
32
+ ```
33
+ src/
34
+ commands/ # 31 thin CLI wrappers (parse args + delegate only)
35
+ core/ # Business logic (ALL computation here)
36
+ audit/ # 30 audit categories, 457+ checks
37
+ lock/ # 24-step server hardening
38
+ providers/ # Cloud API: hetzner, digitalocean, vultr, linode
39
+ adapters/ # Platform abstraction: coolify, dokploy
40
+ factory.ts # getAdapter(platform) — entry point
41
+ mcp/
42
+ server.ts # 13 tool registrations
43
+ tools/ # Handler files
44
+ utils/ # ssh, config, cloudInit, modeGuard
45
+ types/ # ServerMode, ServerRecord, Platform
46
+ constants.ts # PROVIDER_REGISTRY
47
+ ```
48
+
49
+ ## Layer Flow
50
+
51
+ Commands (parse args) --> Core (business logic) --> Providers (cloud API) / Adapters (platform ops). MCP tools also delegate to Core.
52
+
53
+ ## Research Workflows
54
+
55
+ **Bug investigation:**
56
+ 1. Find the command file (`src/commands/<name>.ts`)
57
+ 2. Follow the core import (`src/core/<name>.ts`)
58
+ 3. Check adapter/provider calls
59
+ 4. Check utils (ssh, config)
60
+
61
+ **Feature mapping:**
62
+ 1. Grep for the function name
63
+ 2. Follow import chain
64
+ 3. Map all callsites
65
+ 4. Check test coverage in `__tests__/`
66
+
67
+ **Architecture question:**
68
+ 1. Read the Architecture Map above
69
+ 2. Read `kastell-plugin/skills/kastell-ops/SKILL.md` for full detail (adapter contract, provider registry, layer rules)
70
+ 3. Trace specific files
71
+
72
+ ## Debug by Symptom
73
+
74
+ Common failure patterns and where to look first:
75
+
76
+ | Symptom | Start Here | Then Check |
77
+ |---------|-----------|------------|
78
+ | SSH auth failure | `src/utils/ssh.ts` → `sshExec()` | `assertValidIp()`, server config `~/.kastell/servers.json`, banner parsing |
79
+ | Provider API error | `src/providers/<name>.ts` | `withProviderErrorHandling()` in `src/utils/retry.ts`, API token config |
80
+ | Audit check false positive | `src/core/audit/checks/<category>.ts` | SSH command output parsing, regex pattern, `sshExec` mock in test |
81
+ | Fix rejected (SAFE tier) | `src/core/fix.ts` → `resolveTier()` | `FORBIDDEN_PATTERNS`, shell redirect/pipe in fixCommand string |
82
+ | MCP tool error | `src/mcp/tools/<name>.ts` | Handler → core delegation, Zod schema validation, `result.content` format |
83
+ | Lock step failure | `src/core/lock.ts` | Step's SSH command, `sshExec` stderr, cloud-init completion |
84
+ | Config not found | `src/utils/config.ts` | `~/.kastell/` dir existence, `servers.json` format, migration from `~/.quicklify/` |
85
+
86
+ **Known pitfalls:** See `kastell-plugin/skills/kastell-ops/references/pitfalls.md`
87
+
88
+ ## ARGUMENTS
89
+
90
+ $ARGUMENTS
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: kastell-scaffold
3
+ description: Generate new Kastell components from templates. Creates boilerplate for CLI commands, audit checks, providers, and MCP tools following current architecture (commands thin, core fat, adapters dispatch).
4
+ context: fork
5
+ disable-model-invocation: true
6
+ effort: medium
7
+ allowed-tools: Read, Edit, Write, Bash, Glob, Grep
8
+ argument-hint: "[check|command|provider|mcp-tool] [name]"
9
+ ---
10
+
11
+ # Kastell Scaffold
12
+
13
+ ## Purpose
14
+
15
+ Generate boilerplate files for new Kastell components. Each template follows the post-P63/P64 architecture: commands are thin wrappers, business logic lives in core/, providers handle cloud API, adapters abstract platform ops.
16
+
17
+ ## Usage
18
+
19
+ ```
20
+ /kastell:scaffold command server-migrate # creates command + core + test files
21
+ /kastell:scaffold check filesystem-perms # creates audit check + catalog update
22
+ /kastell:scaffold provider ovhcloud # creates provider + registry entry + test
23
+ /kastell:scaffold mcp-tool server_migrate # creates MCP tool + registration + test
24
+ ```
25
+
26
+ `$ARGUMENTS[0]` is the component type. `$ARGUMENTS[1]` is the component name.
27
+
28
+ ## Architecture Rules
29
+
30
+ These rules apply in every generated file. The forked subagent does not automatically have kastell-ops context — enforce these rules explicitly.
31
+
32
+ | Layer | Path | Rule |
33
+ |----------|-------------------|--------------------------------------------------------------|
34
+ | Commands | src/commands/ | Parse args + delegate. ZERO business logic. |
35
+ | Core | src/core/ | ALL business logic. No chalk/ora/UI imports. |
36
+ | Providers| src/providers/ | Cloud API per provider. Extends BaseProvider. |
37
+ | Adapters | src/adapters/ | Platform ops via PlatformAdapter. Access via getAdapter(). |
38
+ | MCP | src/mcp/tools/ | Zod schema + handler. Delegates to core. |
39
+
40
+ **Critical:** Never import CoolifyAdapter or DokployAdapter directly. Always use `getAdapter(platform)` from `src/adapters/factory.ts`.
41
+
42
+ **ESM:** `"type": "module"` — use `import`, not `require`. All imports use `.js` extension.
43
+
44
+ ## Existing Components
45
+
46
+ **Commands:**
47
+ !`node -e "import('fs').then(f=>console.log(f.readdirSync('src/commands').filter(x=>x.endsWith('.ts')).map(x=>x.replace('.ts','')).join(', '))).catch(()=>console.log('commands dir not found'))"`
48
+ **Providers:**
49
+ !`node -e "import('fs').then(f=>console.log(f.readdirSync('src/providers').filter(x=>x.endsWith('.ts')&&x!=='base.ts').map(x=>x.replace('.ts','')).join(', '))).catch(()=>console.log('providers dir not found'))"`
50
+ **MCP tools:**
51
+ !`node -e "import('fs').then(f=>console.log(f.readdirSync('src/mcp/tools').filter(x=>x.endsWith('.ts')).map(x=>x.replace('.ts','')).join(', '))).catch(()=>console.log('mcp/tools dir not found'))"`
52
+ **Audit categories:**
53
+ !`node -e "import('fs').then(f=>console.log(f.readdirSync('src/core/audit',{withFileTypes:true}).filter(d=>d.isDirectory()).map(d=>d.name).join(', '))).catch(()=>console.log('audit dir not found'))"`
54
+
55
+ ## Script (Deterministic)
56
+
57
+ Run the scaffold script to generate boilerplate files:
58
+
59
+ ```bash
60
+ bash scripts/scaffold.sh $ARGUMENTS[0] $ARGUMENTS[1]
61
+ ```
62
+
63
+ The script reads `.tpl` templates from `templates/`, replaces `__NAME__`/`__NAME_PASCAL__`/`__NAME_CAMEL__`/`__NAME_UPPER__` placeholders, and creates files in the project. Add `--dry-run` to preview without writing.
64
+
65
+ **Files generated per type:**
66
+ - `command` → 3 files: `src/commands/`, `src/core/`, `src/__tests__/core/`
67
+ - `check` → 2 files: `src/core/audit/checks/`, `src/__tests__/core/audit/checks/`
68
+ - `provider` → 2 files: `src/providers/`, `src/__tests__/providers/`
69
+ - `mcp-tool` → 2 files: `src/mcp/tools/`, `src/__tests__/mcp/`
70
+
71
+ ## Template Reference (Context for LLM)
72
+
73
+ After running the script, read the matching reference for registration details:
74
+
75
+ | Type | Reference File |
76
+ |------------|------------------------------------------------|
77
+ | `command` | references/template-command.md |
78
+ | `check` | references/template-audit-check.md |
79
+ | `provider` | references/template-provider.md |
80
+ | `mcp-tool` | references/template-mcp-tool.md |
81
+
82
+ ## After Generation
83
+
84
+ Perform these steps after creating the boilerplate files:
85
+
86
+ - [ ] Write tests first (TDD preferred — test core, not command)
87
+ - [ ] Register the component:
88
+ - Commands: add import in `src/index.ts`
89
+ - MCP tools: `registerTool()` in `src/mcp/server.ts`
90
+ - Providers: add to `PROVIDER_REGISTRY` in `src/constants.ts`
91
+ - Audit checks: add entry to `src/core/audit/catalog.ts`
92
+ - [ ] Run `npm run build && npm test && npm run lint`
93
+ - [ ] Update README.md
94
+
95
+ ## Skill/Agent Oluşturma Kuralları (Yeni skill/agent scaffold ediliyorsa)
96
+
97
+ Yeni skill veya agent oluşturulurken aşağıdaki koşullar ZORUNLU:
98
+ - [ ] **Ersin kriteri:** scripts/ klasörü oluştur — deterministik iş LLM'e bırakılmayacak
99
+ - [ ] **Progressive disclosure:** SKILL.md < 500 satır, detaylar references/ klasöründe
100
+ - [ ] **Frontmatter:** `effort` + `allowed-tools` ekle (minimum zorunlu)
101
+ - [ ] **Yan etki varsa:** `disable-model-invocation: true` ekle
102
+ - [ ] **Agent ise:** `maxTurns` belirle, `memory` scope tanımla
103
+ - [ ] **Script dili:** Shell (sh/bash) tercih et — Node.js ekosistemiyle uyumlu
104
+ - [ ] **Evaluation:** Gerçek task'ta test et, struggle noktalarını gözlemle