nexakit 0.0.0-stage → 0.2.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 (438) hide show
  1. package/.claude-plugin/marketplace.json +28 -0
  2. package/LICENSE +26 -0
  3. package/README.md +79 -2
  4. package/agents/claude/docs-researcher.md +9 -0
  5. package/agents/claude/implementation-tutor.md +9 -0
  6. package/agents/claude/project-explorer.md +9 -0
  7. package/agents/claude/quality-reviewer.md +9 -0
  8. package/agents/claude/requirements-analyst.md +9 -0
  9. package/agents/claude/solution-architect.md +9 -0
  10. package/agents/codex/docs-researcher.toml +10 -0
  11. package/agents/codex/implementation-tutor.toml +10 -0
  12. package/agents/codex/project-explorer.toml +10 -0
  13. package/agents/codex/quality-reviewer.toml +10 -0
  14. package/agents/codex/requirements-analyst.toml +11 -0
  15. package/agents/codex/solution-architect.toml +10 -0
  16. package/assets/brand/README.md +38 -0
  17. package/assets/brand/agent-toolkit-mark.png +0 -0
  18. package/assets/brand/agent-toolkit-mark.svg +13 -0
  19. package/assets/brand/agent-toolkit-tui-hero.png +0 -0
  20. package/assets/brand/nexakit-readme-hero.png +0 -0
  21. package/assets/brand/nexakit-readme-hero.svg +21 -0
  22. package/assets/runtime/package-lock.json +1425 -0
  23. package/bin/agent-task.js +14 -0
  24. package/bin/agent-toolkit-gemini.js +13 -0
  25. package/bin/agent-toolkit-inbox.js +14 -0
  26. package/bin/agent-toolkit-mcp.js +17 -0
  27. package/bin/agent-toolkit.js +13 -0
  28. package/bin/nexakit.js +13 -0
  29. package/bin/project-memory-mcp.js +22 -0
  30. package/bin/project-memory.js +7 -0
  31. package/catalogs/skills/api-design-principles/LICENSE.txt +21 -0
  32. package/catalogs/skills/api-design-principles/SKILL.md +110 -0
  33. package/catalogs/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  34. package/catalogs/skills/api-design-principles/assets/rest-api-template.py +185 -0
  35. package/catalogs/skills/api-design-principles/references/details.md +413 -0
  36. package/catalogs/skills/api-design-principles/references/graphql-schema-design.md +589 -0
  37. package/catalogs/skills/api-design-principles/references/rest-best-practices.md +408 -0
  38. package/catalogs/skills/nodejs-backend-patterns/LICENSE.txt +21 -0
  39. package/catalogs/skills/nodejs-backend-patterns/SKILL.md +45 -0
  40. package/catalogs/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
  41. package/catalogs/skills/nodejs-backend-patterns/references/details.md +599 -0
  42. package/catalogs/skills/supabase-postgres-best-practices/CHANGELOG.md +73 -0
  43. package/catalogs/skills/supabase-postgres-best-practices/LICENSE.txt +21 -0
  44. package/catalogs/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  45. package/catalogs/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  46. package/catalogs/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  47. package/catalogs/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  48. package/catalogs/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  49. package/catalogs/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  50. package/catalogs/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  51. package/catalogs/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  52. package/catalogs/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  53. package/catalogs/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  54. package/catalogs/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  55. package/catalogs/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  56. package/catalogs/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  57. package/catalogs/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  58. package/catalogs/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  59. package/catalogs/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  60. package/catalogs/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  61. package/catalogs/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  62. package/catalogs/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  63. package/catalogs/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  64. package/catalogs/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  65. package/catalogs/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  66. package/catalogs/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  67. package/catalogs/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  68. package/catalogs/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  69. package/catalogs/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  70. package/catalogs/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  71. package/catalogs/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  72. package/catalogs/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  73. package/catalogs/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  74. package/catalogs/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  75. package/catalogs/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  76. package/catalogs/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  77. package/catalogs/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  78. package/catalogs/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  79. package/catalogs/skills/vercel-composition-patterns/AGENTS.md +946 -0
  80. package/catalogs/skills/vercel-composition-patterns/LICENSE.txt +27 -0
  81. package/catalogs/skills/vercel-composition-patterns/README.md +60 -0
  82. package/catalogs/skills/vercel-composition-patterns/SKILL.md +89 -0
  83. package/catalogs/skills/vercel-composition-patterns/metadata.json +11 -0
  84. package/catalogs/skills/vercel-composition-patterns/rules/_sections.md +29 -0
  85. package/catalogs/skills/vercel-composition-patterns/rules/_template.md +24 -0
  86. package/catalogs/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  87. package/catalogs/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  88. package/catalogs/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  89. package/catalogs/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  90. package/catalogs/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  91. package/catalogs/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  92. package/catalogs/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  93. package/catalogs/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  94. package/catalogs/skills/vercel-react-best-practices/AGENTS.md +3810 -0
  95. package/catalogs/skills/vercel-react-best-practices/LICENSE.txt +27 -0
  96. package/catalogs/skills/vercel-react-best-practices/README.md +123 -0
  97. package/catalogs/skills/vercel-react-best-practices/SKILL.md +149 -0
  98. package/catalogs/skills/vercel-react-best-practices/metadata.json +15 -0
  99. package/catalogs/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  100. package/catalogs/skills/vercel-react-best-practices/rules/_template.md +28 -0
  101. package/catalogs/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  102. package/catalogs/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  103. package/catalogs/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  104. package/catalogs/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  105. package/catalogs/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  106. package/catalogs/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  107. package/catalogs/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  108. package/catalogs/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  109. package/catalogs/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  110. package/catalogs/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  111. package/catalogs/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  112. package/catalogs/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  113. package/catalogs/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  114. package/catalogs/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  115. package/catalogs/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  116. package/catalogs/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  117. package/catalogs/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  118. package/catalogs/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  119. package/catalogs/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  120. package/catalogs/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  121. package/catalogs/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  122. package/catalogs/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  123. package/catalogs/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  124. package/catalogs/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  125. package/catalogs/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  126. package/catalogs/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  127. package/catalogs/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  128. package/catalogs/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  129. package/catalogs/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  130. package/catalogs/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  131. package/catalogs/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  132. package/catalogs/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  133. package/catalogs/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  134. package/catalogs/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  135. package/catalogs/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  136. package/catalogs/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  137. package/catalogs/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  138. package/catalogs/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  139. package/catalogs/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  140. package/catalogs/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  141. package/catalogs/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  142. package/catalogs/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  143. package/catalogs/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  144. package/catalogs/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  145. package/catalogs/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  146. package/catalogs/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  147. package/catalogs/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  148. package/catalogs/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  149. package/catalogs/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  150. package/catalogs/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  151. package/catalogs/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  152. package/catalogs/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  153. package/catalogs/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  154. package/catalogs/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  155. package/catalogs/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  156. package/catalogs/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  157. package/catalogs/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  158. package/catalogs/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  159. package/catalogs/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  160. package/catalogs/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  161. package/catalogs/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  162. package/catalogs/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  163. package/catalogs/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  164. package/catalogs/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  165. package/catalogs/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  166. package/catalogs/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  167. package/catalogs/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  168. package/catalogs/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  169. package/catalogs/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  170. package/catalogs/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  171. package/catalogs/skills/webapp-testing/LICENSE.txt +202 -0
  172. package/catalogs/skills/webapp-testing/SKILL.md +96 -0
  173. package/catalogs/skills/webapp-testing/examples/console_logging.py +35 -0
  174. package/catalogs/skills/webapp-testing/examples/element_discovery.py +40 -0
  175. package/catalogs/skills/webapp-testing/examples/static_html_automation.py +33 -0
  176. package/catalogs/skills/webapp-testing/scripts/with_server.py +106 -0
  177. package/catalogs/skills.json +1115 -0
  178. package/docs/skills/evidencias/2026-10-28-evaluacion-inicial-mcp-seguridad.md +118 -0
  179. package/docs/skills/evidencias/2026-10-28-incorporacion-mcp-seguridad.json +152 -0
  180. package/docs/skills/evidencias/2026-10-28-recomendador-preparacion.md +50 -0
  181. package/package.json +73 -4
  182. package/plugins/nexakit-modelo/.claude-plugin/plugin.json +1 -0
  183. package/plugins/nexakit-modelo/hooks/hooks.json +1 -0
  184. package/plugins/nexakit-modelo/hooks/register.js +48 -0
  185. package/plugins/nexakit-modelo/hooks/status.js +8 -0
  186. package/plugins/nexakit-modelo/tests/register.test.ts +21 -0
  187. package/plugins/nexakit-panel/.claude-plugin/plugin.json +1 -0
  188. package/plugins/nexakit-panel/README.md +20 -0
  189. package/plugins/nexakit-panel/hooks/hooks.json +1 -0
  190. package/plugins/nexakit-panel/hooks/lienzo.js +382 -0
  191. package/plugins/nexakit-panel/hooks/panel.js +279 -0
  192. package/plugins/nexakit-panel/hooks/register.tsx +248 -0
  193. package/plugins/nexakit-panel/tests/lienzo.test.ts +142 -0
  194. package/plugins/nexakit-panel/tests/panel.test.ts +240 -0
  195. package/plugins/nexakit-panel/tests/register.test.ts +167 -0
  196. package/plugins/nexakit-panel/types/index.d.ts +41 -0
  197. package/plugins/nexakit-sesion/.claude-plugin/plugin.json +1 -0
  198. package/plugins/nexakit-sesion/README.md +12 -0
  199. package/plugins/nexakit-sesion/hooks/aviso.js +38 -0
  200. package/plugins/nexakit-sesion/hooks/hooks.json +1 -0
  201. package/plugins/nexakit-sesion/hooks/register.js +28 -0
  202. package/plugins/nexakit-sesion/tests/register.test.ts +96 -0
  203. package/plugins/niveles/.claude-plugin/plugin.json +5 -0
  204. package/plugins/niveles/agents/nivel-alto.md +13 -0
  205. package/plugins/niveles/agents/nivel-exigente.md +13 -0
  206. package/plugins/niveles/agents/nivel-ligero.md +13 -0
  207. package/plugins/niveles/agents/nivel-normal.md +13 -0
  208. package/schemas/agent-client-adapter.schema.json +786 -0
  209. package/schemas/agent-client-auth-diagnostic.schema.json +801 -0
  210. package/schemas/agent-client-isolated-variant.schema.json +105 -0
  211. package/schemas/agent-client-isolated-verification.schema.json +99 -0
  212. package/schemas/agent-client-managed-preferences-invocation.schema.json +67 -0
  213. package/schemas/agent-client-managed-preferences.schema.json +63 -0
  214. package/schemas/agent-client-native-diagnostics.schema.json +85 -0
  215. package/schemas/agent-client-native-evaluation.schema.json +171 -0
  216. package/schemas/agent-client-native-preflight.schema.json +90 -0
  217. package/schemas/agent-client-output.schema.json +551 -0
  218. package/schemas/agent-client-runtime-fixture.schema.json +90 -0
  219. package/schemas/agent-client-runtime-local.schema.json +95 -0
  220. package/schemas/agent-client-runtime.schema.json +1288 -0
  221. package/schemas/agent-client-selective-config.schema.json +77 -0
  222. package/schemas/agent-client-supervised-local.schema.json +135 -0
  223. package/schemas/agent-client-supervised.schema.json +186 -0
  224. package/schemas/agent-model-preference.schema.json +573 -0
  225. package/schemas/agent-model-selection.schema.json +311 -0
  226. package/schemas/agent-task-approvals.schema.json +362 -0
  227. package/schemas/agent-task-prepare.schema.json +1324 -0
  228. package/schemas/agent-task-verify.schema.json +198 -0
  229. package/schemas/project-memory-update.schema.json +33 -0
  230. package/schemas/project-memory.schema.json +298 -0
  231. package/schemas/skill-catalog.schema.json +246 -0
  232. package/schemas/task-workflow-plan-output.schema.json +35 -0
  233. package/scripts/prepare-package.js +6 -0
  234. package/scripts/validate-skill-catalog.js +41 -0
  235. package/skills/cerrar-avisens/SKILL.md +12 -0
  236. package/skills/cerrar-memoria/SKILL.md +96 -0
  237. package/skills/cerrar-memoria/references/cierre.md +76 -0
  238. package/skills/decision-records/SKILL.md +27 -0
  239. package/skills/decision-records/agents/openai.yaml +7 -0
  240. package/skills/decision-records/references/adr-template.md +35 -0
  241. package/skills/differential-review/LICENSE.txt +427 -0
  242. package/skills/differential-review/SKILL.md +225 -0
  243. package/skills/differential-review/adversarial.md +203 -0
  244. package/skills/differential-review/agents/openai.yaml +6 -0
  245. package/skills/differential-review/assets/trail-of-bits-mark.svg +1 -0
  246. package/skills/differential-review/methodology.md +234 -0
  247. package/skills/differential-review/patterns.md +300 -0
  248. package/skills/differential-review/reporting.md +369 -0
  249. package/skills/elegir-modelo/SKILL.md +68 -0
  250. package/skills/elegir-modelo/modelos.mjs +108 -0
  251. package/skills/frontend-design/LICENSE.txt +177 -0
  252. package/skills/frontend-design/SKILL.md +71 -0
  253. package/skills/gemini/SKILL.md +52 -0
  254. package/skills/imagen/SKILL.md +12 -0
  255. package/skills/investigar/SKILL.md +11 -0
  256. package/skills/mcp-builder/LICENSE.txt +202 -0
  257. package/skills/mcp-builder/SKILL.md +236 -0
  258. package/skills/mcp-builder/reference/evaluation.md +602 -0
  259. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  260. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  261. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  262. package/skills/mcp-builder/scripts/connections.py +151 -0
  263. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  264. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  265. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  266. package/skills/ordenar-proyecto/SKILL.md +56 -0
  267. package/skills/project-handoff/SKILL.md +53 -0
  268. package/skills/project-handoff/agents/openai.yaml +7 -0
  269. package/skills/project-handoff/references/handoff-template.md +35 -0
  270. package/skills/quality-gate/LICENSE.txt +26 -0
  271. package/skills/quality-gate/SKILL.md +44 -0
  272. package/skills/quality-gate/agents/openai.yaml +7 -0
  273. package/skills/quality-gate/references/review-checklist.md +42 -0
  274. package/skills/revisar/SKILL.md +11 -0
  275. package/skills/revisar-skill/LICENSE-find-skills.txt +26 -0
  276. package/skills/revisar-skill/SKILL.md +94 -0
  277. package/skills/revision-cruzada/SKILL.md +59 -0
  278. package/skills/web-design-guidelines/AGENTS.md +156 -0
  279. package/skills/web-design-guidelines/LICENSE.txt +21 -0
  280. package/skills/web-design-guidelines/SKILL.md +29 -0
  281. package/src/agent-models.js +131 -0
  282. package/src/brand.js +117 -0
  283. package/src/claude-code-runner.js +642 -0
  284. package/src/cli-executable.js +88 -0
  285. package/src/cli.js +778 -0
  286. package/src/client-adapter-plan.js +271 -0
  287. package/src/client-auth-diagnostic-parser.js +211 -0
  288. package/src/client-auth-diagnostic.js +257 -0
  289. package/src/client-isolated-variant.js +106 -0
  290. package/src/client-isolated-verification.js +130 -0
  291. package/src/client-local-platform.js +14 -0
  292. package/src/client-managed-preferences-invocation.js +209 -0
  293. package/src/client-managed-preferences.js +78 -0
  294. package/src/client-native-access.js +134 -0
  295. package/src/client-native-diagnostics.js +253 -0
  296. package/src/client-native-evaluation.js +106 -0
  297. package/src/client-native-preflight-files.js +68 -0
  298. package/src/client-native-preflight.js +95 -0
  299. package/src/client-output-json.js +118 -0
  300. package/src/client-output-parser.js +278 -0
  301. package/src/client-runtime-admission.js +80 -0
  302. package/src/client-runtime-coordinator.js +70 -0
  303. package/src/client-runtime-core.js +92 -0
  304. package/src/client-runtime-fixture-permit.js +20 -0
  305. package/src/client-runtime-fixture-protocol.js +39 -0
  306. package/src/client-runtime-state.js +67 -0
  307. package/src/client-runtime-store-files.js +91 -0
  308. package/src/client-runtime-store.js +239 -0
  309. package/src/client-runtime-supervisor.js +146 -0
  310. package/src/client-selective-config.js +195 -0
  311. package/src/client-selective-files.js +126 -0
  312. package/src/client-supervised-codes.js +32 -0
  313. package/src/client-supervised-contract.js +52 -0
  314. package/src/client-supervised-coordinator.js +36 -0
  315. package/src/client-supervised-permit.js +20 -0
  316. package/src/client-supervised-protocol.js +37 -0
  317. package/src/client-supervised-store.js +167 -0
  318. package/src/client-supervised-supervisor.js +167 -0
  319. package/src/client-supervised.js +160 -0
  320. package/src/codex-cli-runner.js +358 -0
  321. package/src/codex-delivery.js +101 -0
  322. package/src/connect.js +703 -0
  323. package/src/doctor.js +795 -0
  324. package/src/gemini-cli.js +76 -0
  325. package/src/gemini-files.js +45 -0
  326. package/src/gemini-tools.js +249 -0
  327. package/src/init.js +473 -0
  328. package/src/install-lock.js +127 -0
  329. package/src/install-registry.js +61 -0
  330. package/src/legacy-repair.js +71 -0
  331. package/src/level-agents.js +111 -0
  332. package/src/link-states.js +172 -0
  333. package/src/memory-connection-artifacts.js +192 -0
  334. package/src/memory-connection-descriptor.js +158 -0
  335. package/src/memory-connection-diagnostic.js +177 -0
  336. package/src/memory-connection-files.js +191 -0
  337. package/src/memory-connection-manifest.js +118 -0
  338. package/src/memory-connection-package.js +176 -0
  339. package/src/memory-connection-plan.js +211 -0
  340. package/src/memory-connection-skill.js +211 -0
  341. package/src/memory-connection-toml.js +153 -0
  342. package/src/memory-locator.js +118 -0
  343. package/src/memory-mcp-policy.js +181 -0
  344. package/src/memory-mcp-server.js +166 -0
  345. package/src/memory-mcp-transport.js +59 -0
  346. package/src/missing-dependencies.js +21 -0
  347. package/src/model-command.js +147 -0
  348. package/src/model-preference.js +235 -0
  349. package/src/model-selection.js +368 -0
  350. package/src/native/managed-preferences.c +100 -0
  351. package/src/native/managed-preferences.h +17 -0
  352. package/src/package-lock-path.js +13 -0
  353. package/src/panel-cli.js +182 -0
  354. package/src/peer-handoff.js +27 -0
  355. package/src/peer-inbox-cli.js +211 -0
  356. package/src/peer-review-mcp.js +210 -0
  357. package/src/peer-review-store.js +532 -0
  358. package/src/platform.js +24 -0
  359. package/src/project-root.js +41 -0
  360. package/src/project-signals.js +339 -0
  361. package/src/recommend-report.js +77 -0
  362. package/src/review-instructions.js +211 -0
  363. package/src/review-policy.js +35 -0
  364. package/src/revision-adapters.js +157 -0
  365. package/src/revision-context.js +86 -0
  366. package/src/revision-isolation.js +222 -0
  367. package/src/revision-process.js +103 -0
  368. package/src/revision-provenance.js +89 -0
  369. package/src/revision-snapshot.js +120 -0
  370. package/src/revision.js +242 -0
  371. package/src/runtime-fixtures/runtime-supervisor/child.cjs +3 -0
  372. package/src/runtime-fixtures/runtime-supervisor/fixture.cjs +49 -0
  373. package/src/runtime-fixtures/supervised/child.cjs +3 -0
  374. package/src/runtime-fixtures/supervised/fixture.cjs +47 -0
  375. package/src/sensitive-data.js +21 -0
  376. package/src/setup-apply.js +231 -0
  377. package/src/setup-plan.js +231 -0
  378. package/src/setup-state.js +277 -0
  379. package/src/setup-tui.js +555 -0
  380. package/src/skill-catalog-add.js +91 -0
  381. package/src/skill-catalog-audit.js +68 -0
  382. package/src/skill-catalog.js +170 -0
  383. package/src/skill-files.js +39 -0
  384. package/src/skill-recommendations.js +1673 -0
  385. package/src/skill-scan-report.js +14 -0
  386. package/src/skill-scan.js +178 -0
  387. package/src/stable-command.js +53 -0
  388. package/src/stable-install.js +222 -0
  389. package/src/status.js +200 -0
  390. package/src/superpowers.js +133 -0
  391. package/src/sync-apply.js +227 -0
  392. package/src/sync-files.js +109 -0
  393. package/src/sync-inspect.js +394 -0
  394. package/src/sync-ledger.js +94 -0
  395. package/src/sync-markdown.js +151 -0
  396. package/src/sync-proposal.js +84 -0
  397. package/src/sync-record.js +459 -0
  398. package/src/sync.js +360 -0
  399. package/src/task-approvals.js +367 -0
  400. package/src/task-cli.js +79 -0
  401. package/src/task-external-verifier.js +584 -0
  402. package/src/task-prepare-files.js +115 -0
  403. package/src/task-prepare.js +180 -0
  404. package/src/task-verify-cli.js +67 -0
  405. package/src/task-verify-files.js +188 -0
  406. package/src/task-verify.js +118 -0
  407. package/src/task-workflow-mcp.js +544 -0
  408. package/src/task-workflow-store.js +254 -0
  409. package/src/terminal-text.js +68 -0
  410. package/src/toolkit-cli.js +543 -0
  411. package/src/toolkit-commands-guide.js +107 -0
  412. package/src/toolkit-setup.js +614 -0
  413. package/src/usage-metrics.js +43 -0
  414. package/templates/agent-team/01-encargo.md +158 -0
  415. package/templates/agent-team/02-propuesta.md +132 -0
  416. package/templates/agent-team/03-revision.md +150 -0
  417. package/templates/agent-team/README.md +213 -0
  418. package/templates/model-inventory/01-inventario.md +154 -0
  419. package/templates/model-inventory/README.md +115 -0
  420. package/templates/project-memory/README.md +67 -0
  421. package/templates/project-memory/project-memory.example.json +53 -0
  422. package/templates/project-memory/skill/project-id/SKILL.md +37 -0
  423. package/templates/project-memory/skill/project-id/references/project-profile.md +44 -0
  424. package/templates/project-memory/vault/00-INICIO/Estado actual.md +44 -0
  425. package/templates/project-memory/vault/00-INICIO/Fuentes de verdad.md +30 -0
  426. package/templates/project-memory/vault/00-INICIO/Inicio del proyecto.md +44 -0
  427. package/templates/project-memory/vault/00-INICIO/Mantenimiento de la memoria.md +26 -0
  428. package/templates/project-memory/vault/00-INICIO/Mapa de la memoria.md +33 -0
  429. package/templates/project-memory/vault/00-INICIO/Registro de sincronizaci/303/263n.md" +28 -0
  430. package/templates/project-memory/vault/01-PRODUCTO/Producto.md +16 -0
  431. package/templates/project-memory/vault/02-ARQUITECTURA/Arquitectura.md +16 -0
  432. package/templates/project-memory/vault/03-IMPLEMENTACION/Implementaci/303/263n.md +15 -0
  433. package/templates/project-memory/vault/04-DECISIONES/Decisiones.md +19 -0
  434. package/templates/project-memory/vault/05-ENTREGAS/Entregas.md +12 -0
  435. package/templates/project-memory/vault/06-OPERACION/Operaci/303/263n.md +15 -0
  436. package/templates/project-memory/vault/07-AGENTES/Protocolo de agentes.md +33 -0
  437. package/templates/project-memory/vault/08-RECURSOS/Recursos.md +12 -0
  438. package/templates/project-memory/vault/09-ARCHIVO/README.md +5 -0
@@ -0,0 +1,231 @@
1
+ import { planReviewInstructions, applyReviewInstructions } from './review-instructions.js';
2
+ // Applies the confirmation, block by block, in the fixed order of setup-plan.js. The state is gathered again right
3
+ // before applying, so what changed meanwhile is respected. The first block that fails stops the run: what was
4
+ // applied stays, nothing is undone, and running `npx nexakit` again resumes from the real state.
5
+ import fs from 'node:fs/promises';
6
+ import path from 'node:path';
7
+ import { connectMemory } from './connect.js';
8
+ import { diagnoseMemory } from './doctor.js';
9
+ import { initializeMemory } from './init.js';
10
+ import { acquireLock } from './install-lock.js';
11
+ import { AGENT_NAMES, buildConfirmation } from './setup-plan.js';
12
+ import { gatherSetupState } from './setup-state.js';
13
+ import {
14
+ applyProjectSkillInstall,
15
+ applyToolkitDetach,
16
+ planProjectSkillInstall,
17
+ planToolkitDetach,
18
+ writeSetupAnswers,
19
+ } from './skill-recommendations.js';
20
+ import { planStableCommand, writeStableCommand } from './stable-command.js';
21
+ import { ensureStableInstall, nexakitDir } from './stable-install.js';
22
+ import { packageVersion, setupToolkit } from './toolkit-setup.js';
23
+ import { applySuperpowers } from './superpowers.js';
24
+
25
+ const RETRY = 'Vuelve a ejecutar `npx nexakit` para reintentar.';
26
+
27
+ // Project skill folders: Claude reads .claude/skills; Codex and Antigravity share .agents/skills.
28
+ function projectAgent(agents) {
29
+ const claude = agents.includes('claude');
30
+ const shared = agents.includes('codex') || agents.includes('antigravity');
31
+ if (claude && shared) return 'all';
32
+ if (claude) return 'claude';
33
+ return agents.includes('codex') ? 'codex' : 'antigravity';
34
+ }
35
+
36
+ // An older memory may not declare an agent (Antigravity came later): declare it, enabled, with the same skill.
37
+ // Only this repository's memory is touched, and the read-modify-replace runs under the install lock.
38
+ async function ensureMemoryAgent(vaultPath, agent, repositoryRoot, lock) {
39
+ const file = path.join(vaultPath, 'project-memory.json');
40
+ await lock.assertHeld();
41
+ const manifest = JSON.parse(await fs.readFile(file, 'utf8'));
42
+ const source = await fs.realpath(manifest.source?.repositoryPath ?? '').catch(() => null);
43
+ if (source !== (await fs.realpath(repositoryRoot)))
44
+ throw new Error('La memoria es de otro proyecto; no se modifica.');
45
+ const current = manifest.agents.find((entry) => entry.id === agent);
46
+ if (current?.enabled) return;
47
+ if (current) current.enabled = true;
48
+ else
49
+ manifest.agents.push({
50
+ id: agent,
51
+ enabled: true,
52
+ skillName: manifest.agents[0]?.skillName ?? manifest.project.id,
53
+ });
54
+ const temporary = `${file}.${process.pid}.tmp`;
55
+ await fs.writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\n`, { flag: 'wx' });
56
+ try {
57
+ await lock.assertHeld();
58
+ await fs.rename(temporary, file);
59
+ } finally {
60
+ await fs.rm(temporary, { force: true });
61
+ }
62
+ }
63
+
64
+ async function withLock(homeDirectory, acquire, fn) {
65
+ const lock = await acquire(nexakitDir(homeDirectory));
66
+ try {
67
+ return await fn(lock);
68
+ } finally {
69
+ await lock.release();
70
+ }
71
+ }
72
+
73
+ export async function applySetup(
74
+ options,
75
+ answers,
76
+ { onProgress = () => {}, runNpm, packageSpec, acquire = acquireLock, gather = gatherSetupState } = {},
77
+ ) {
78
+ const memoryPath = answers.memory.decision === 'path' ? answers.memory.path : null;
79
+ // The chosen memory path is always inspected again, also one typed in "otra carpeta…".
80
+ const stateOptions = { ...options, memoryPaths: memoryPath ? [memoryPath] : [] };
81
+ const state = await gather(stateOptions);
82
+ const confirmation = buildConfirmation(state, answers);
83
+ const { homeDirectory } = state;
84
+ const { catalog, toolkitRoot, environment, codexHome, nodePath, runCommand } = state.internal;
85
+ let linkRoot = state.internal.linkRoot;
86
+ const done = [];
87
+ let finalCheck = null;
88
+
89
+ const blocks = {
90
+ 'stable-copy': () =>
91
+ withLock(homeDirectory, acquire, async (lock) => {
92
+ const result = await ensureStableInstall({
93
+ homeDirectory,
94
+ version: await packageVersion(toolkitRoot),
95
+ lock,
96
+ ...(runNpm && { runNpm }),
97
+ ...(packageSpec && { packageSpec }),
98
+ });
99
+ linkRoot = path.join(nexakitDir(homeDirectory), 'actual');
100
+ return result;
101
+ }),
102
+ 'stable-command': () =>
103
+ withLock(homeDirectory, acquire, async (lock) =>
104
+ writeStableCommand(await planStableCommand({ homeDirectory, nodePath, toolkitRoot: linkRoot }), lock),
105
+ ),
106
+ 'project-skills': async () => {
107
+ const chosen = answers.skills.chosen;
108
+ if (chosen.length) {
109
+ const plan = await planProjectSkillInstall({
110
+ projectRoot: state.project.root,
111
+ skillNames: chosen,
112
+ agent: projectAgent(answers.agents),
113
+ mode: 'symlink',
114
+ catalog,
115
+ toolkitRoot,
116
+ homeDirectory,
117
+ });
118
+ await applyProjectSkillInstall(plan, {
119
+ ...(runNpm && { runNpm }),
120
+ ...(packageSpec && { packageSpec }),
121
+ acquire,
122
+ });
123
+ }
124
+ if (confirmation.removeSkills.length) {
125
+ const detach = await planToolkitDetach({
126
+ projectRoot: state.project.root,
127
+ skillNames: confirmation.removeSkills,
128
+ catalog,
129
+ toolkitRoot,
130
+ homeDirectory,
131
+ });
132
+ await applyToolkitDetach(detach);
133
+ }
134
+ },
135
+ 'review-instructions': () =>
136
+ withLock(homeDirectory, acquire, async (lock) => {
137
+ const plan = await planReviewInstructions({
138
+ homeDirectory,
139
+ environment,
140
+ codexHome,
141
+ agents: answers.agents,
142
+ });
143
+ await applyReviewInstructions(plan, lock);
144
+ }),
145
+ 'memory-init': async () => {
146
+ const report = initializeMemory({
147
+ destination: memoryPath,
148
+ projectId: state.project.id,
149
+ projectName: state.project.displayName,
150
+ sourcePath: state.project.root,
151
+ syncMode: 'none',
152
+ agents: answers.agents,
153
+ apply: true,
154
+ });
155
+ if (report.status === 'conflict')
156
+ throw new Error('La carpeta de la memoria ya tiene archivos que no son de nexakit.');
157
+ const diagnosis = await diagnoseMemory(memoryPath);
158
+ if (diagnosis.summary.errors > 0)
159
+ throw new Error('La memoria se creó, pero su comprobación encontró errores.');
160
+ },
161
+ answers: () =>
162
+ withLock(homeDirectory, acquire, (lock) => writeSetupAnswers(state.project.root, answers, lock)),
163
+ 'final-check': async () => {
164
+ const after = buildConfirmation(await gather(stateOptions), answers).lines;
165
+ const pending = after.filter((line) => ['+', '−', '↻'].includes(line.mark)).map((line) => line.text);
166
+ const warnings = after.filter((line) => line.mark === '!').map((line) => line.text);
167
+ const memoryErrors = memoryPath ? (await diagnoseMemory(memoryPath)).summary.errors : 0;
168
+ if (memoryErrors) pending.push('la memoria tiene errores');
169
+ finalCheck = pending.length
170
+ ? { ok: false, message: `quedó pendiente: ${pending.join('; ')}.`, warnings }
171
+ : {
172
+ ok: true,
173
+ message: warnings.length ? `responde, con avisos: ${warnings.join('; ')}.` : 'todo responde',
174
+ warnings,
175
+ };
176
+ },
177
+ };
178
+ const runBlock = async (id) => {
179
+ if (blocks[id]) return blocks[id]();
180
+ const [kind, agent] = id.split(':');
181
+ if (kind === 'global-skills') {
182
+ return setupToolkit({
183
+ agent,
184
+ apply: true,
185
+ homeDirectory,
186
+ toolkitRoot,
187
+ environment,
188
+ codexHome,
189
+ ...(runNpm && { runNpm }),
190
+ ...(packageSpec && { packageSpec }),
191
+ acquire,
192
+ });
193
+ }
194
+ if (kind === 'superpowers') {
195
+ return applySuperpowers(agent, state.superpowers?.[agent], { environment, ...(runCommand && { runCommand }) });
196
+ }
197
+ if (kind === 'memory-connect') {
198
+ await withLock(homeDirectory, acquire, (lock) =>
199
+ ensureMemoryAgent(memoryPath, agent, state.project.root, lock),
200
+ );
201
+ const report = await connectMemory(
202
+ { targetPath: memoryPath, agentId: agent, apply: true },
203
+ { homeDirectory, nodePath, toolkitRoot: linkRoot, ...(runCommand && { runCommand }) },
204
+ );
205
+ if (report.status === 'conflict') {
206
+ const reason = report.components.find((component) => component.action === 'conflict')?.message ?? '';
207
+ throw new Error(`No se pudo conectar la memoria a ${AGENT_NAMES[agent]}: ${reason}`);
208
+ }
209
+ return report;
210
+ }
211
+ throw new Error(`Bloque desconocido: ${id}`);
212
+ };
213
+
214
+ for (const { id } of confirmation.blocks) {
215
+ onProgress(id, 'start');
216
+ try {
217
+ await runBlock(id);
218
+ } catch (error) {
219
+ const detail = error instanceof Error ? error.details?.join(' ') || error.message : String(error);
220
+ const message = id.startsWith('memory-connect:')
221
+ ? `${detail.startsWith('No se pudo') ? detail : `No se pudo conectar la memoria a ${AGENT_NAMES[id.split(':')[1]]}: ${detail}`} ${RETRY}`
222
+ : `Falló «${confirmation.blocks.find((block) => block.id === id).label}»: ${detail} ${RETRY}`;
223
+ onProgress(id, 'failed', message);
224
+ return { ok: false, done, failed: { id, message }, finalCheck };
225
+ }
226
+ done.push(id);
227
+ onProgress(id, 'done');
228
+ }
229
+ // A final check that finds something still pending is a failure: the person must not read «Listo».
230
+ return { ok: finalCheck?.ok ?? true, done, finalCheck };
231
+ }
@@ -0,0 +1,231 @@
1
+ // Pure: turns what nexakit found (setup-state.js) and the person's answers into the confirmation summary, in short
2
+ // sentences, and the ordered blocks that apply it. No I/O, so every screen and every decision is testable.
3
+
4
+ export const AGENTS = Object.freeze(['claude', 'codex', 'antigravity']);
5
+ export const AGENT_NAMES = Object.freeze({
6
+ claude: 'Claude Code',
7
+ codex: 'Codex',
8
+ antigravity: 'Antigravity',
9
+ });
10
+ // Claude reads project skills from .claude/skills; Codex and Antigravity share .agents/skills.
11
+ const folderOf = (agent) => (agent === 'claude' ? 'claude' : 'codex');
12
+ const FOLDER_PATHS = Object.freeze({ claude: '.claude/skills', codex: '.agents/skills' });
13
+ const PENDING_LINKS = new Set(['missing', 'replace']);
14
+
15
+ export function joinNames(names) {
16
+ return names.length <= 1 ? names.join('') : `${names.slice(0, -1).join(', ')} y ${names.at(-1)}`;
17
+ }
18
+ // ~/… for paths under the home folder, with either separator (Windows uses \\).
19
+ export const shortPath = (target, homeDirectory) =>
20
+ homeDirectory &&
21
+ (target === homeDirectory ||
22
+ target.startsWith(`${homeDirectory}/`) ||
23
+ target.startsWith(`${homeDirectory}\\`))
24
+ ? `~${target.slice(homeDirectory.length)}`
25
+ : target;
26
+ const plural = (count, one, many) => (count === 1 ? one : many);
27
+
28
+ // "frontend usa React", "el README menciona Tauri": the reason for a suggestion, from where the signal was found.
29
+ export function shortReason(label, source) {
30
+ const file = source.replace(/\s*\(.*\)$/u, '');
31
+ const parts = file.split('/');
32
+ const folder = parts.length > 1 ? parts.slice(0, -1).join('/') : null;
33
+ if (/^readme\.md$/iu.test(parts.at(-1)))
34
+ return folder ? `${folder}/README menciona ${label}` : `el README menciona ${label}`;
35
+ return folder ? `${folder} usa ${label}` : `el proyecto usa ${label}`;
36
+ }
37
+
38
+ const linkStates = (skill, agents) =>
39
+ [...new Set(agents.map(folderOf))].map((folder) => [folder, skill.links?.[folder] ?? 'missing']);
40
+
41
+ export function suggestedAnswers(state) {
42
+ const names = new Set(state.skills.map((skill) => skill.name));
43
+ const saved = state.savedAnswers;
44
+ if (saved) {
45
+ const answered = new Set([...saved.skills.chosen, ...saved.skills.discarded]);
46
+ const chosen = state.skills
47
+ .filter(
48
+ (skill) => saved.skills.chosen.includes(skill.name) || (skill.suggested && !answered.has(skill.name)),
49
+ )
50
+ .map((skill) => skill.name);
51
+ return {
52
+ version: 1,
53
+ skills: { chosen, discarded: saved.skills.discarded.filter((name) => names.has(name)) },
54
+ agents: [...saved.agents],
55
+ memory: { ...saved.memory },
56
+ };
57
+ }
58
+ const installed = (skill) => Object.values(skill.links ?? {}).includes('installed');
59
+ const found = AGENTS.filter((agent) => state.agentsFound[agent]);
60
+ const memory = state.memory.existing
61
+ ? { decision: 'path', path: state.memory.existing.vaultPath }
62
+ : state.project.git
63
+ ? { decision: 'path', path: state.memory.suggestedPath }
64
+ : { decision: 'later' };
65
+ return {
66
+ version: 1,
67
+ skills: {
68
+ chosen: state.skills.filter((skill) => skill.suggested || installed(skill)).map((skill) => skill.name),
69
+ discarded: [],
70
+ },
71
+ agents: found.length ? found : [...AGENTS],
72
+ memory,
73
+ };
74
+ }
75
+
76
+ const sameAnswers = (a, b) => JSON.stringify(a) === JSON.stringify(b);
77
+
78
+ export function buildConfirmation(state, answers) {
79
+ const lines = [];
80
+ const blocks = [];
81
+ const add = (mark, text) => lines.push({ mark, text });
82
+ const block = (id, label) => blocks.push({ id, label });
83
+ const answersChanged = !state.savedAnswers || !sameAnswers(state.savedAnswers, answers);
84
+ const agents = AGENTS.filter((agent) => answers.agents.includes(agent));
85
+ const home = state.homeDirectory;
86
+
87
+ if (state.stableCopy.needed) {
88
+ add('+', 'Copia estable de nexakit en ~/.nexakit');
89
+ block('stable-copy', 'Copia estable de nexakit');
90
+ }
91
+ if (['falta', 'distinto'].includes(state.stableCommand.state)) {
92
+ add('+', 'Orden nexakit para tus IA');
93
+ block('stable-command', 'Orden nexakit');
94
+ } else if (state.stableCommand.state === 'conflicto') {
95
+ add('!', '~/.nexakit/nexakit existe y no es de nexakit; no lo toco');
96
+ }
97
+
98
+ // Project skills, in the folders of the chosen agents.
99
+ const chosen = state.skills.filter((skill) => answers.skills.chosen.includes(skill.name));
100
+ const toInstall = [],
101
+ conflicts = [],
102
+ readySkills = [];
103
+ for (const skill of chosen) {
104
+ // Per folder: a user folder is left alone, and the skill is still installed where it is missing.
105
+ const states = linkStates(skill, agents);
106
+ for (const [folder, value] of states) if (value === 'conflict') conflicts.push([skill, folder]);
107
+ if (states.some(([, value]) => PENDING_LINKS.has(value))) toInstall.push(skill);
108
+ else if (states.every(([, value]) => value === 'installed')) readySkills.push(skill);
109
+ }
110
+ const removeSkills = state.skills
111
+ .filter(
112
+ (skill) =>
113
+ !answers.skills.chosen.includes(skill.name) && Object.values(skill.links ?? {}).includes('installed'),
114
+ )
115
+ .map((skill) => skill.name);
116
+ if (toInstall.length) {
117
+ add(
118
+ '+',
119
+ `${toInstall.length} ${plural(toInstall.length, 'skill en el proyecto (ignorada en Git)', 'skills en el proyecto (ignoradas en Git)')}`,
120
+ );
121
+ }
122
+ if (removeSkills.length)
123
+ add('−', `Quitar ${removeSkills.length} ${plural(removeSkills.length, 'skill', 'skills')} del proyecto`);
124
+ for (const [skill, folder] of conflicts) {
125
+ add('!', `${skill.name}: ya hay una carpeta tuya con ese nombre en ${FOLDER_PATHS[folder]}; no la toco`);
126
+ }
127
+ if (!toInstall.length && readySkills.length) add('✓', 'Skills del proyecto ya estaban listas');
128
+ if (toInstall.length || removeSkills.length) block('project-skills', 'Skills del proyecto');
129
+
130
+ // Base skills of each chosen agent: only what is missing or repairable; conflicts are reported.
131
+ const globalBlocks = [];
132
+ for (const agent of agents) {
133
+ const global = state.globalSkills[agent] ?? { pending: 0, conflicts: 0 };
134
+ if (global.retiredCount)
135
+ add('−', `Quitar ${global.retiredCount} comandos antiguos de ${AGENT_NAMES[agent]}`);
136
+ if (global.retiredCount && !global.pending) globalBlocks.push(agent);
137
+ if (global.pending) {
138
+ add(
139
+ '+',
140
+ `${global.pending} ${plural(global.pending, 'skill base', 'skills base')} en ${AGENT_NAMES[agent]}`,
141
+ );
142
+ globalBlocks.push(agent);
143
+ }
144
+ if (global.conflicts) {
145
+ add(
146
+ '!',
147
+ `${global.conflicts} ${plural(global.conflicts, 'skill base', 'skills base')} de ${AGENT_NAMES[agent]} ${plural(global.conflicts, 'choca con una carpeta tuya; no la toco', 'chocan con carpetas tuyas; no las toco')}`,
148
+ );
149
+ }
150
+ }
151
+ for (const agent of globalBlocks) block(`global-skills:${agent}`, `Skills base en ${AGENT_NAMES[agent]}`);
152
+
153
+ // Superpowers is required: the work process (brainstorming, plans, debugging, TDD, verification) comes from it.
154
+ const superpowers = state.superpowers ?? {};
155
+ const activeIn = [];
156
+ for (const agent of agents.filter((item) => Object.hasOwn(superpowers, item))) {
157
+ const status = superpowers[agent];
158
+ if (status === 'activo') activeIn.push(AGENT_NAMES[agent]);
159
+ else if (status === 'falta') {
160
+ add('+', `Superpowers en ${AGENT_NAMES[agent]}`);
161
+ block(`superpowers:${agent}`, `Superpowers en ${AGENT_NAMES[agent]}`);
162
+ } else if (status === 'desactivado' && agent !== 'codex') {
163
+ add('↻', `Activar Superpowers en ${AGENT_NAMES[agent]}`);
164
+ block(`superpowers:${agent}`, `Superpowers activo en ${AGENT_NAMES[agent]}`);
165
+ } else if (status === 'desactivado') {
166
+ add('!', `Superpowers está desactivado en ${AGENT_NAMES[agent]}; actívalo desde /plugins`);
167
+ } else {
168
+ add('!', `No pude comprobar Superpowers en ${AGENT_NAMES[agent]}; revisa ${agent === 'claude' ? '/plugin' : '/plugins'}`);
169
+ }
170
+ }
171
+ if (activeIn.length) add('✓', `Superpowers activo en ${joinNames(activeIn)}`);
172
+
173
+ // Memory: create it if needed, then connect it to each chosen agent.
174
+ if (answers.memory.decision === 'path') {
175
+ const target = answers.memory.path;
176
+ const kind = state.memory.kinds?.[target] ?? 'new';
177
+ if (kind === 'invalid') {
178
+ add('!', `${shortPath(target, home)} no está vacía y no es una memoria; elige otra carpeta`);
179
+ } else if (kind === 'foreign') {
180
+ add('!', `${shortPath(target, home)} es la memoria de otro proyecto; elige otra carpeta`);
181
+ } else {
182
+ if (kind === 'new') {
183
+ add('+', `Memoria nueva en ${shortPath(target, home)}`);
184
+ block('memory-init', 'Memoria creada');
185
+ } else {
186
+ add('✓', `Memoria del proyecto en ${shortPath(target, home)}`);
187
+ }
188
+ const connections = state.memory.connections?.[target] ?? {};
189
+ const statusOf = (agent) => connections[agent] ?? (state.agentsFound[agent] ? 'create' : 'unavailable');
190
+ const need = agents.filter((agent) => statusOf(agent) === 'create');
191
+ const connected = agents.filter((agent) => statusOf(agent) === 'unchanged');
192
+ if (need.length)
193
+ add('+', `Conectar la memoria a ${joinNames(need.map((agent) => AGENT_NAMES[agent]))}`);
194
+ else if (connected.length)
195
+ add('✓', `Memoria conectada a ${joinNames(connected.map((agent) => AGENT_NAMES[agent]))}`);
196
+ for (const agent of agents) {
197
+ if (statusOf(agent) === 'conflict')
198
+ add('!', `${AGENT_NAMES[agent]} ya tiene otra memoria con el mismo nombre; no la toco`);
199
+ if (statusOf(agent) === 'unavailable')
200
+ add('!', `No encontré ${AGENT_NAMES[agent]}; no puedo conectarle la memoria`);
201
+ }
202
+ for (const agent of need) block(`memory-connect:${agent}`, `Memoria conectada a ${AGENT_NAMES[agent]}`);
203
+ }
204
+ }
205
+
206
+ const instructionNames = new Set(
207
+ agents.map((agent) => ({ claude: 'CLAUDE.md', codex: 'AGENTS.md', antigravity: 'GEMINI.md' })[agent]),
208
+ );
209
+ const instructionItems = (state.reviewInstructions?.items ?? []).filter((item) =>
210
+ instructionNames.has(item.name),
211
+ );
212
+ for (const item of instructionItems.filter((item) => item.state === 'conflict'))
213
+ add('!', `${item.name}: las instrucciones existentes no se pueden actualizar; no las toco`);
214
+ const pendingInstructions = instructionItems.filter((item) => item.state === 'pending');
215
+ if (pendingInstructions.length) {
216
+ add(
217
+ '+',
218
+ `Reglas de trabajo en tus instrucciones de ${joinNames(pendingInstructions.map((item) => AGENT_NAMES[item.client]))}`,
219
+ );
220
+ block('review-instructions', 'Reglas de trabajo de tus IA');
221
+ }
222
+ if (answersChanged && (blocks.length || state.savedAnswers)) {
223
+ // Saved first, before any block that can fail, so a retry starts from what the person decided.
224
+ blocks.unshift({ id: 'answers', label: 'Respuestas guardadas' });
225
+ if (!blocks.some((item) => item.id === 'project-skills'))
226
+ add('+', 'Guardar tus respuestas en .agent-toolkit (ignorado en Git)');
227
+ }
228
+ if (blocks.length) block('final-check', 'Comprobación final');
229
+ const allReady = !lines.some((line) => ['+', '−', '↻'].includes(line.mark));
230
+ return { lines, blocks, allReady, removeSkills };
231
+ }