@stravica-ai/digital-operator-pa 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -0
  3. package/bin/desk +9 -0
  4. package/bin/distill +2 -0
  5. package/bin/estate-sync +2 -0
  6. package/bin/launch +2 -0
  7. package/bin/memory-sync +2 -0
  8. package/bin/migrate-inspect +2 -0
  9. package/bin/pa +2 -0
  10. package/bin/pa-coordinator-hook +2 -0
  11. package/bin/pa-init +2 -0
  12. package/bin/research +2 -0
  13. package/bin/scheduler +2 -0
  14. package/bin/secrets +2 -0
  15. package/bin/slice +2 -0
  16. package/bin/smoke +9 -0
  17. package/bin/sync +2 -0
  18. package/dist/engineering-pa-cli/README.md +205 -0
  19. package/dist/engineering-pa-cli/bin/estate-sync +2 -0
  20. package/dist/engineering-pa-cli/bin/launch +2 -0
  21. package/dist/engineering-pa-cli/bin/pa +2 -0
  22. package/dist/engineering-pa-cli/bin/pa-coordinator-hook +12 -0
  23. package/dist/engineering-pa-cli/bin/research +2 -0
  24. package/dist/engineering-pa-cli/bin/scheduler +2 -0
  25. package/dist/engineering-pa-cli/bin/secrets +2 -0
  26. package/dist/engineering-pa-cli/bin/smoke +9 -0
  27. package/dist/engineering-pa-cli/bin/sync +2 -0
  28. package/dist/engineering-pa-cli/config/coordinator-allowlist.json +118 -0
  29. package/dist/engineering-pa-cli/docs/coordinator-hook.md +211 -0
  30. package/dist/engineering-pa-cli/docs/estate-sync.md +412 -0
  31. package/dist/engineering-pa-cli/docs/gsc.md +175 -0
  32. package/dist/engineering-pa-cli/docs/lint-linkedin.md +139 -0
  33. package/dist/engineering-pa-cli/docs/secrets.md +221 -0
  34. package/dist/engineering-pa-cli/docs/smoke.md +113 -0
  35. package/dist/engineering-pa-cli/docs/staging-alias.md +114 -0
  36. package/dist/engineering-pa-cli/index.mjs +17 -0
  37. package/dist/engineering-pa-cli/package.json +37 -0
  38. package/dist/engineering-pa-cli/src/autonomy/cli.mjs +329 -0
  39. package/dist/engineering-pa-cli/src/autonomy/envelope.mjs +301 -0
  40. package/dist/engineering-pa-cli/src/coordinator-hook/cli.mjs +140 -0
  41. package/dist/engineering-pa-cli/src/coordinator-hook/config.mjs +134 -0
  42. package/dist/engineering-pa-cli/src/coordinator-hook/message.mjs +47 -0
  43. package/dist/engineering-pa-cli/src/coordinator-hook/policy.mjs +211 -0
  44. package/dist/engineering-pa-cli/src/coordinator-hook/repo-root.mjs +44 -0
  45. package/dist/engineering-pa-cli/src/coordinator-hook/self.mjs +30 -0
  46. package/dist/engineering-pa-cli/src/environment/cli.mjs +287 -0
  47. package/dist/engineering-pa-cli/src/environment/probes.mjs +302 -0
  48. package/dist/engineering-pa-cli/src/gsc/auth.mjs +148 -0
  49. package/dist/engineering-pa-cli/src/gsc/cli.mjs +93 -0
  50. package/dist/engineering-pa-cli/src/gsc/cloudflare.mjs +318 -0
  51. package/dist/engineering-pa-cli/src/gsc/commands/add-property.mjs +70 -0
  52. package/dist/engineering-pa-cli/src/gsc/commands/list-properties.mjs +33 -0
  53. package/dist/engineering-pa-cli/src/gsc/commands/pull-analytics.mjs +130 -0
  54. package/dist/engineering-pa-cli/src/gsc/commands/submit-sitemap.mjs +41 -0
  55. package/dist/engineering-pa-cli/src/gsc/commands/verify-via-cf-dns.mjs +189 -0
  56. package/dist/engineering-pa-cli/src/knowledge/call-log.mjs +59 -0
  57. package/dist/engineering-pa-cli/src/knowledge/cli.mjs +242 -0
  58. package/dist/engineering-pa-cli/src/knowledge/eval.mjs +446 -0
  59. package/dist/engineering-pa-cli/src/knowledge/formatters.mjs +331 -0
  60. package/dist/engineering-pa-cli/src/knowledge/graph.mjs +710 -0
  61. package/dist/engineering-pa-cli/src/launch/README.md +214 -0
  62. package/dist/engineering-pa-cli/src/launch/cli.mjs +51 -0
  63. package/dist/engineering-pa-cli/src/launch/commands/launch.mjs +106 -0
  64. package/dist/engineering-pa-cli/src/launch/identity.mjs +43 -0
  65. package/dist/engineering-pa-cli/src/launch/planner.mjs +44 -0
  66. package/dist/engineering-pa-cli/src/launch/repo-root.mjs +53 -0
  67. package/dist/engineering-pa-cli/src/launch/runner.mjs +147 -0
  68. package/dist/engineering-pa-cli/src/launch/task-loader.mjs +85 -0
  69. package/dist/engineering-pa-cli/src/lint/cli.mjs +61 -0
  70. package/dist/engineering-pa-cli/src/lint/commands/linkedin.mjs +133 -0
  71. package/dist/engineering-pa-cli/src/lint/detectors.mjs +90 -0
  72. package/dist/engineering-pa-cli/src/lint/linter.mjs +69 -0
  73. package/dist/engineering-pa-cli/src/lint/reporter.mjs +32 -0
  74. package/dist/engineering-pa-cli/src/lint/rules.mjs +132 -0
  75. package/dist/engineering-pa-cli/src/pa/cli.mjs +369 -0
  76. package/dist/engineering-pa-cli/src/pa/doc-groups.mjs +164 -0
  77. package/dist/engineering-pa-cli/src/pa/io.mjs +80 -0
  78. package/dist/engineering-pa-cli/src/pa/project-cli.mjs +385 -0
  79. package/dist/engineering-pa-cli/src/pa/projects.mjs +352 -0
  80. package/dist/engineering-pa-cli/src/pa/repo-root.mjs +64 -0
  81. package/dist/engineering-pa-cli/src/pa/session.mjs +254 -0
  82. package/dist/engineering-pa-cli/src/pa/work-cli.mjs +164 -0
  83. package/dist/engineering-pa-cli/src/pa/work.mjs +196 -0
  84. package/dist/engineering-pa-cli/src/pa/workstreams.mjs +201 -0
  85. package/dist/engineering-pa-cli/src/research/README.md +360 -0
  86. package/dist/engineering-pa-cli/src/research/briefs/extractor.md +103 -0
  87. package/dist/engineering-pa-cli/src/research/briefs/searcher.md +113 -0
  88. package/dist/engineering-pa-cli/src/research/briefs/synthesizer.md +124 -0
  89. package/dist/engineering-pa-cli/src/research/briefs/verifier.md +86 -0
  90. package/dist/engineering-pa-cli/src/research/cli.mjs +141 -0
  91. package/dist/engineering-pa-cli/src/research/commands/gates.mjs +176 -0
  92. package/dist/engineering-pa-cli/src/research/commands/list.mjs +56 -0
  93. package/dist/engineering-pa-cli/src/research/commands/mark.mjs +97 -0
  94. package/dist/engineering-pa-cli/src/research/commands/paths.mjs +69 -0
  95. package/dist/engineering-pa-cli/src/research/commands/prune.mjs +86 -0
  96. package/dist/engineering-pa-cli/src/research/commands/run.mjs +94 -0
  97. package/dist/engineering-pa-cli/src/research/commands/show.mjs +43 -0
  98. package/dist/engineering-pa-cli/src/research/docs/operator-present-flow.md +120 -0
  99. package/dist/engineering-pa-cli/src/research/format.mjs +59 -0
  100. package/dist/engineering-pa-cli/src/research/promote.mjs +260 -0
  101. package/dist/engineering-pa-cli/src/research/schema/finding.schema.json +55 -0
  102. package/dist/engineering-pa-cli/src/research/schema/gates.schema.json +34 -0
  103. package/dist/engineering-pa-cli/src/research/schema/manifest.schema.json +59 -0
  104. package/dist/engineering-pa-cli/src/research/schema/plan.schema.json +41 -0
  105. package/dist/engineering-pa-cli/src/research/schema/sources.schema.json +31 -0
  106. package/dist/engineering-pa-cli/src/research/store/findings.mjs +61 -0
  107. package/dist/engineering-pa-cli/src/research/store/gates.mjs +73 -0
  108. package/dist/engineering-pa-cli/src/research/store/index.mjs +312 -0
  109. package/dist/engineering-pa-cli/src/research/store/manifest.mjs +56 -0
  110. package/dist/engineering-pa-cli/src/research/store/plan.mjs +59 -0
  111. package/dist/engineering-pa-cli/src/research/store/sources.mjs +44 -0
  112. package/dist/engineering-pa-cli/src/research/store/validate.mjs +92 -0
  113. package/dist/engineering-pa-cli/src/research/workflows/research-normal.js +573 -0
  114. package/dist/engineering-pa-cli/src/scheduler/cli.mjs +197 -0
  115. package/dist/engineering-pa-cli/src/secrets/cli.mjs +254 -0
  116. package/dist/engineering-pa-cli/src/secrets/commands/backup-template.mjs +67 -0
  117. package/dist/engineering-pa-cli/src/secrets/commands/backup.mjs +85 -0
  118. package/dist/engineering-pa-cli/src/secrets/commands/delete.mjs +58 -0
  119. package/dist/engineering-pa-cli/src/secrets/commands/find.mjs +36 -0
  120. package/dist/engineering-pa-cli/src/secrets/commands/get.mjs +49 -0
  121. package/dist/engineering-pa-cli/src/secrets/commands/init.mjs +69 -0
  122. package/dist/engineering-pa-cli/src/secrets/commands/list.mjs +37 -0
  123. package/dist/engineering-pa-cli/src/secrets/commands/rotate.mjs +46 -0
  124. package/dist/engineering-pa-cli/src/secrets/commands/set.mjs +123 -0
  125. package/dist/engineering-pa-cli/src/secrets/commands/status.mjs +146 -0
  126. package/dist/engineering-pa-cli/src/secrets/commands/vaults.mjs +57 -0
  127. package/dist/engineering-pa-cli/src/secrets/commands/verify.mjs +143 -0
  128. package/dist/engineering-pa-cli/src/secrets/vault.mjs +766 -0
  129. package/dist/engineering-pa-cli/src/smoke/checks.mjs +199 -0
  130. package/dist/engineering-pa-cli/src/smoke/cli.mjs +108 -0
  131. package/dist/engineering-pa-cli/src/smoke/commands/run.mjs +237 -0
  132. package/dist/engineering-pa-cli/src/smoke/runner.mjs +191 -0
  133. package/dist/engineering-pa-cli/src/staging-alias/cli.mjs +91 -0
  134. package/dist/engineering-pa-cli/src/staging-alias/cloudflare.mjs +380 -0
  135. package/dist/engineering-pa-cli/src/staging-alias/commands/list.mjs +36 -0
  136. package/dist/engineering-pa-cli/src/staging-alias/commands/set.mjs +188 -0
  137. package/dist/engineering-pa-cli/src/staging-alias/commands/status.mjs +113 -0
  138. package/dist/engineering-pa-cli/src/staging-alias/commands/unset.mjs +95 -0
  139. package/dist/engineering-pa-cli/src/staging-alias/sites.mjs +105 -0
  140. package/dist/engineering-pa-cli/src/sync/cli.mjs +151 -0
  141. package/dist/engineering-pa-cli/src/sync/git.mjs +149 -0
  142. package/dist/engineering-pa-cli/src/sync/lock.mjs +30 -0
  143. package/dist/engineering-pa-cli/src/sync/regenerated-artifacts.mjs +114 -0
  144. package/dist/engineering-pa-cli/src/sync/registry-scope.mjs +260 -0
  145. package/dist/engineering-pa-cli/src/sync/run.mjs +531 -0
  146. package/dist/engineering-pa-cli/src/sync/runner.mjs +62 -0
  147. package/dist/engineering-pa-cli/src/sync/runs-digest.mjs +138 -0
  148. package/dist/engineering-pa-core/README.md +60 -0
  149. package/dist/engineering-pa-core/bin/desk +9 -0
  150. package/dist/engineering-pa-core/bin/distill +2 -0
  151. package/dist/engineering-pa-core/bin/memory-sync +2 -0
  152. package/dist/engineering-pa-core/bin/slice +2 -0
  153. package/dist/engineering-pa-core/docs/autonomy-envelope-tracker.md +111 -0
  154. package/dist/engineering-pa-core/docs/blueprints/README.md +45 -0
  155. package/dist/engineering-pa-core/docs/blueprints/docker-services/blueprint.md +168 -0
  156. package/dist/engineering-pa-core/docs/blueprints/git-identity/blueprint.md +116 -0
  157. package/dist/engineering-pa-core/docs/blueprints/ideas/custom-workspace-views.md +9 -0
  158. package/dist/engineering-pa-core/docs/blueprints/ideas/knowledge-domain-patterns.md +15 -0
  159. package/dist/engineering-pa-core/docs/blueprints/ideas/office-integration.md +11 -0
  160. package/dist/engineering-pa-core/docs/blueprints/ideas/team-scaling.md +9 -0
  161. package/dist/engineering-pa-core/docs/blueprints/ideas/work-personal-separation.md +9 -0
  162. package/dist/engineering-pa-core/docs/blueprints/scheduled-distillation/blueprint.md +129 -0
  163. package/dist/engineering-pa-core/docs/blueprints/tool-integration/blueprint.md +110 -0
  164. package/dist/engineering-pa-core/docs/commands/init.md +159 -0
  165. package/dist/engineering-pa-core/docs/commands/schedule.md +98 -0
  166. package/dist/engineering-pa-core/docs/commands/upgrade.md +67 -0
  167. package/dist/engineering-pa-core/docs/entity-location-map.md +93 -0
  168. package/dist/engineering-pa-core/docs/knowledge-scaffold.md +121 -0
  169. package/dist/engineering-pa-core/docs/lock.md +155 -0
  170. package/dist/engineering-pa-core/docs/memory-sync.md +28 -0
  171. package/dist/engineering-pa-core/docs/pa-operating-model.md +457 -0
  172. package/dist/engineering-pa-core/docs/scheduling.md +35 -0
  173. package/dist/engineering-pa-core/docs/standards/README.md +24 -0
  174. package/dist/engineering-pa-core/docs/standards/briefing-contract.md +161 -0
  175. package/dist/engineering-pa-core/docs/standards/tooling.md +240 -0
  176. package/dist/engineering-pa-core/docs/tools/distill.md +230 -0
  177. package/dist/engineering-pa-core/docs/tools/memory-sync.md +98 -0
  178. package/dist/engineering-pa-core/docs/tools/scheduler.md +243 -0
  179. package/dist/engineering-pa-core/docs/tools/slice.md +150 -0
  180. package/dist/engineering-pa-core/docs/upstream-issue-filing.md +88 -0
  181. package/dist/engineering-pa-core/docs/working-directory.md +29 -0
  182. package/dist/engineering-pa-core/docs/workspace-operations.md +46 -0
  183. package/dist/engineering-pa-core/index.mjs +21 -0
  184. package/dist/engineering-pa-core/knowledge/README.md +53 -0
  185. package/dist/engineering-pa-core/knowledge/canonical/.gitkeep +0 -0
  186. package/dist/engineering-pa-core/knowledge/content-voice/README.md +64 -0
  187. package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-baseline.md +133 -0
  188. package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-shape.md +58 -0
  189. package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-taxonomy.md +33 -0
  190. package/dist/engineering-pa-core/knowledge/content-voice/content-pipeline-routing.md +58 -0
  191. package/dist/engineering-pa-core/knowledge/content-voice/new-tell-capture-procedure.md +40 -0
  192. package/dist/engineering-pa-core/knowledge/content-voice/voice-guide-shape.md +43 -0
  193. package/dist/engineering-pa-core/knowledge/delegation-dispatch/README.md +34 -0
  194. package/dist/engineering-pa-core/knowledge/delegation-dispatch/briefing-contract.md +77 -0
  195. package/dist/engineering-pa-core/knowledge/delegation-dispatch/delegation-modes.md +84 -0
  196. package/dist/engineering-pa-core/knowledge/delegation-dispatch/dispatch-envelope.md +238 -0
  197. package/dist/engineering-pa-core/knowledge/delegation-dispatch/task-groups-and-orchestrators.md +62 -0
  198. package/dist/engineering-pa-core/knowledge/delegation-dispatch/team-improvement-loop.md +48 -0
  199. package/dist/engineering-pa-core/knowledge/delegation-dispatch/tool-development-policy.md +48 -0
  200. package/dist/engineering-pa-core/knowledge/engineering-discipline/README.md +33 -0
  201. package/dist/engineering-pa-core/knowledge/engineering-discipline/blast-radius-and-safety.md +50 -0
  202. package/dist/engineering-pa-core/knowledge/engineering-discipline/investigate-root-causes.md +48 -0
  203. package/dist/engineering-pa-core/knowledge/engineering-discipline/role-ladder.md +57 -0
  204. package/dist/engineering-pa-core/knowledge/engineering-discipline/verify-runtime-behaviour.md +53 -0
  205. package/dist/engineering-pa-core/knowledge/engineering-discipline/worktree-isolation.md +50 -0
  206. package/dist/engineering-pa-core/knowledge/knowledge-memory/README.md +33 -0
  207. package/dist/engineering-pa-core/knowledge/knowledge-memory/claude-md-hygiene.md +47 -0
  208. package/dist/engineering-pa-core/knowledge/knowledge-memory/journal-and-self-improvement.md +53 -0
  209. package/dist/engineering-pa-core/knowledge/knowledge-memory/knowledge-retrieval-discipline.md +62 -0
  210. package/dist/engineering-pa-core/knowledge/knowledge-memory/librarian-synthesis-mandate.md +56 -0
  211. package/dist/engineering-pa-core/knowledge/knowledge-memory/staging-and-observations.md +58 -0
  212. package/dist/engineering-pa-core/knowledge/operator-interface/README.md +32 -0
  213. package/dist/engineering-pa-core/knowledge/operator-interface/communication-style.md +33 -0
  214. package/dist/engineering-pa-core/knowledge/operator-interface/escalation-and-correction.md +45 -0
  215. package/dist/engineering-pa-core/knowledge/operator-interface/push-back-discipline.md +42 -0
  216. package/dist/engineering-pa-core/knowledge/operator-interface/session-boot-and-end.md +56 -0
  217. package/dist/engineering-pa-core/knowledge/platform-tooling/README.md +37 -0
  218. package/dist/engineering-pa-core/knowledge/platform-tooling/desk-cli-reference.md +52 -0
  219. package/dist/engineering-pa-core/knowledge/platform-tooling/environment-awareness.md +91 -0
  220. package/dist/engineering-pa-core/knowledge/platform-tooling/mcp-servers-catalogue.md +52 -0
  221. package/dist/engineering-pa-core/knowledge/platform-tooling/pa-cli-reference.md +55 -0
  222. package/dist/engineering-pa-core/knowledge/platform-tooling/scheduling-and-launchd.md +56 -0
  223. package/dist/engineering-pa-core/knowledge/platform-tooling/tool-discovery-discipline.md +49 -0
  224. package/dist/engineering-pa-core/knowledge/platform-tooling/working-directory-vs-project-root.md +43 -0
  225. package/dist/engineering-pa-core/knowledge/platform-tooling/workspace-server.md +51 -0
  226. package/dist/engineering-pa-core/knowledge/raw/.gitkeep +0 -0
  227. package/dist/engineering-pa-core/knowledge/scaffold/domains.json +5 -0
  228. package/dist/engineering-pa-core/knowledge/schema/.gitkeep +0 -0
  229. package/dist/engineering-pa-core/knowledge/work-management/README.md +33 -0
  230. package/dist/engineering-pa-core/knowledge/work-management/desk-cli.md +84 -0
  231. package/dist/engineering-pa-core/knowledge/work-management/progress-md.md +48 -0
  232. package/dist/engineering-pa-core/knowledge/work-management/projects.md +64 -0
  233. package/dist/engineering-pa-core/knowledge/work-management/spawn-log.md +48 -0
  234. package/dist/engineering-pa-core/knowledge/work-management/work-items.md +67 -0
  235. package/dist/engineering-pa-core/package.json +26 -0
  236. package/dist/engineering-pa-core/roles/agent-ops/definition.md +79 -0
  237. package/dist/engineering-pa-core/roles/dispatch-briefer/definition.md +195 -0
  238. package/dist/engineering-pa-core/roles/librarian/definition.md +176 -0
  239. package/dist/engineering-pa-core/roles/pa/definition.md +93 -0
  240. package/dist/engineering-pa-core/roles/system-admin/definition.md +106 -0
  241. package/dist/engineering-pa-core/roles/tool-developer/definition.md +116 -0
  242. package/dist/engineering-pa-core/roles/writer/definition.md +130 -0
  243. package/dist/engineering-pa-core/schema/autonomy-envelope.schema.json +61 -0
  244. package/dist/engineering-pa-core/schema/project.json +114 -0
  245. package/dist/engineering-pa-core/schema/schedule.json +63 -0
  246. package/dist/engineering-pa-core/schema/work-item.json +92 -0
  247. package/dist/engineering-pa-core/src/config/pa-package-name.mjs +30 -0
  248. package/dist/engineering-pa-core/src/desk/cli.mjs +95 -0
  249. package/dist/engineering-pa-core/src/desk/commands.mjs +398 -0
  250. package/dist/engineering-pa-core/src/desk/format.mjs +84 -0
  251. package/dist/engineering-pa-core/src/desk/repo.mjs +172 -0
  252. package/dist/engineering-pa-core/src/desk/team-scope.mjs +142 -0
  253. package/dist/engineering-pa-core/src/distill/cli.mjs +112 -0
  254. package/dist/engineering-pa-core/src/distill/prereqs.mjs +171 -0
  255. package/dist/engineering-pa-core/src/distill/prompt.mjs +74 -0
  256. package/dist/engineering-pa-core/src/distill/run.mjs +230 -0
  257. package/dist/engineering-pa-core/src/distill/runner.mjs +86 -0
  258. package/dist/engineering-pa-core/src/distill/staging.mjs +59 -0
  259. package/dist/engineering-pa-core/src/knowledge/retrieval/backlink-indexer.mjs +154 -0
  260. package/dist/engineering-pa-core/src/knowledge/retrieval/graph-builder.mjs +186 -0
  261. package/dist/engineering-pa-core/src/knowledge/retrieval/index-builder.mjs +225 -0
  262. package/dist/engineering-pa-core/src/knowledge/retrieval/query.mjs +263 -0
  263. package/dist/engineering-pa-core/src/lock/lock.mjs +202 -0
  264. package/dist/engineering-pa-core/src/memory-sync/cli-support.mjs +12 -0
  265. package/dist/engineering-pa-core/src/memory-sync/cli.mjs +56 -0
  266. package/dist/engineering-pa-core/src/memory-sync/commands/pull.mjs +44 -0
  267. package/dist/engineering-pa-core/src/memory-sync/commands/push.mjs +46 -0
  268. package/dist/engineering-pa-core/src/memory-sync/mirror.mjs +114 -0
  269. package/dist/engineering-pa-core/src/memory-sync/repo.mjs +65 -0
  270. package/dist/engineering-pa-core/src/scheduler/detect.mjs +111 -0
  271. package/dist/engineering-pa-core/src/scheduler/host.mjs +38 -0
  272. package/dist/engineering-pa-core/src/scheduler/index.mjs +13 -0
  273. package/dist/engineering-pa-core/src/scheduler/install.mjs +854 -0
  274. package/dist/engineering-pa-core/src/scheduler/list.mjs +168 -0
  275. package/dist/engineering-pa-core/src/scheduler/remove.mjs +176 -0
  276. package/dist/engineering-pa-core/src/scheduler/verify.mjs +435 -0
  277. package/dist/engineering-pa-core/src/session-boot/autonomy-injection.mjs +84 -0
  278. package/dist/engineering-pa-core/src/slice/cli.mjs +139 -0
  279. package/dist/engineering-pa-core/src/slice/inputs.mjs +174 -0
  280. package/dist/engineering-pa-core/src/slice/prompt.mjs +94 -0
  281. package/dist/engineering-pa-core/src/slice/prompts/dave-boot.md +91 -0
  282. package/dist/engineering-pa-core/src/slice/run.mjs +334 -0
  283. package/dist/engineering-pa-core-extensions-atlassian/README.md +31 -0
  284. package/dist/engineering-pa-core-extensions-atlassian/index.mjs +9 -0
  285. package/dist/engineering-pa-core-extensions-atlassian/package.json +19 -0
  286. package/dist/engineering-pa-core-extensions-n8n/README.md +29 -0
  287. package/dist/engineering-pa-core-extensions-n8n/index.mjs +8 -0
  288. package/dist/engineering-pa-core-extensions-n8n/package.json +19 -0
  289. package/dist/engineering-pa-librarian/README.md +38 -0
  290. package/dist/engineering-pa-librarian/index.mjs +12 -0
  291. package/dist/engineering-pa-librarian/package.json +19 -0
  292. package/dist/engineering-pa-migrate-inspect/README.md +131 -0
  293. package/dist/engineering-pa-migrate-inspect/bin/migrate-inspect +2 -0
  294. package/dist/engineering-pa-migrate-inspect/package.json +21 -0
  295. package/dist/engineering-pa-migrate-inspect/src/age-key-migrate.mjs +83 -0
  296. package/dist/engineering-pa-migrate-inspect/src/cli.mjs +97 -0
  297. package/dist/engineering-pa-migrate-inspect/src/inspector.mjs +237 -0
  298. package/dist/engineering-pa-migrate-inspect/src/platforms/linux.mjs +87 -0
  299. package/dist/engineering-pa-migrate-inspect/src/platforms/macos.mjs +105 -0
  300. package/dist/engineering-pa-migrate-inspect/src/runner.mjs +87 -0
  301. package/dist/engineering-pa-runbook/README.md +103 -0
  302. package/dist/engineering-pa-runbook/package.json +18 -0
  303. package/dist/engineering-pa-runbook/reference/dex-template.runbook.json +66 -0
  304. package/dist/engineering-pa-runbook/reference/hq-dave.runbook.json +69 -0
  305. package/dist/engineering-pa-runbook/reference/smarthome01.runbook.json +92 -0
  306. package/dist/engineering-pa-runbook/schema/inspection.schema.json +113 -0
  307. package/dist/engineering-pa-runbook/schema/runbook.schema.json +67 -0
  308. package/dist/engineering-pa-runbook/src/validator.mjs +167 -0
  309. package/dist/engineering-pa-scaffold/README.md +164 -0
  310. package/dist/engineering-pa-scaffold/bin/pa-init +2 -0
  311. package/dist/engineering-pa-scaffold/index.mjs +42 -0
  312. package/dist/engineering-pa-scaffold/package.json +22 -0
  313. package/dist/engineering-pa-scaffold/src/cli.mjs +115 -0
  314. package/dist/engineering-pa-scaffold/src/commands/init.mjs +169 -0
  315. package/dist/engineering-pa-scaffold/src/generator.mjs +354 -0
  316. package/dist/engineering-pa-scaffold/src/prompts.mjs +125 -0
  317. package/dist/engineering-pa-scaffold/src/runner.mjs +142 -0
  318. package/dist/engineering-pa-scaffold/templates/CLAUDE.md.template +196 -0
  319. package/dist/engineering-pa-scaffold/templates/operator-README.md.template +44 -0
  320. package/dist/engineering-pa-types-engineering/README.md +35 -0
  321. package/dist/engineering-pa-types-engineering/docs/commands/product-build.md +120 -0
  322. package/dist/engineering-pa-types-engineering/index.mjs +9 -0
  323. package/dist/engineering-pa-types-engineering/package.json +19 -0
  324. package/dist/engineering-pa-types-engineering/roles/product-engineer/definition.md +650 -0
  325. package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/build-spec.md +82 -0
  326. package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/preflight-checklist.md +158 -0
  327. package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/worker-brief.md +130 -0
  328. package/dist/engineering-pa-workspace/README.md +197 -0
  329. package/dist/engineering-pa-workspace/app/assets/md.js +187 -0
  330. package/dist/engineering-pa-workspace/app/assets/modal.js +120 -0
  331. package/dist/engineering-pa-workspace/app/assets/theme.css +132 -0
  332. package/dist/engineering-pa-workspace/app/assets/theme.js +159 -0
  333. package/dist/engineering-pa-workspace/app/banner.js +320 -0
  334. package/dist/engineering-pa-workspace/app/delegations.html +345 -0
  335. package/dist/engineering-pa-workspace/app/home.html +1060 -0
  336. package/dist/engineering-pa-workspace/app/index.html +361 -0
  337. package/dist/engineering-pa-workspace/app/knowledge-map.html +163 -0
  338. package/dist/engineering-pa-workspace/app/knowledge.html +304 -0
  339. package/dist/engineering-pa-workspace/app/nav.json +75 -0
  340. package/dist/engineering-pa-workspace/app/notes.html +199 -0
  341. package/dist/engineering-pa-workspace/app/onboarding.html +592 -0
  342. package/dist/engineering-pa-workspace/app/profile.html +243 -0
  343. package/dist/engineering-pa-workspace/app/project-detail.html +432 -0
  344. package/dist/engineering-pa-workspace/app/projects.html +297 -0
  345. package/dist/engineering-pa-workspace/app/repos.html +598 -0
  346. package/dist/engineering-pa-workspace/app/schedules.html +486 -0
  347. package/dist/engineering-pa-workspace/app/secrets.html +164 -0
  348. package/dist/engineering-pa-workspace/app/staging.html +319 -0
  349. package/dist/engineering-pa-workspace/app/tasks.html +465 -0
  350. package/dist/engineering-pa-workspace/app/vendor/chart.umd.min.js +21 -0
  351. package/dist/engineering-pa-workspace/app/viewer.html +116 -0
  352. package/dist/engineering-pa-workspace/docs/DAEMON.md +104 -0
  353. package/dist/engineering-pa-workspace/docs/page-blueprint.md +286 -0
  354. package/dist/engineering-pa-workspace/docs/status-mon.md +168 -0
  355. package/dist/engineering-pa-workspace/index.mjs +12 -0
  356. package/dist/engineering-pa-workspace/nav.json.example +8 -0
  357. package/dist/engineering-pa-workspace/package.json +27 -0
  358. package/dist/engineering-pa-workspace/src/api.mjs +2086 -0
  359. package/dist/engineering-pa-workspace/src/install-daemon.mjs +573 -0
  360. package/dist/engineering-pa-workspace/src/nav.mjs +190 -0
  361. package/dist/engineering-pa-workspace/src/secrets-api.mjs +175 -0
  362. package/dist/engineering-pa-workspace/src/server.mjs +516 -0
  363. package/dist/engineering-pa-workspace/src/status-mon/poll.mjs +220 -0
  364. package/dist/engineering-pa-workspace/src/status-mon/poller.mjs +113 -0
  365. package/dist/engineering-pa-workspace/src/status-mon/run.mjs +133 -0
  366. package/dist/engineering-pa-workspace/src/supervisor.mjs +264 -0
  367. package/dist/engineering-pa-workspace/src/ws.mjs +633 -0
  368. package/index.mjs +60 -0
  369. package/package.json +58 -0
  370. package/templates/banned-ai-tells.md +102 -0
  371. package/templates/purpose.md +105 -0
  372. package/templates/voice-guide.md +98 -0
@@ -0,0 +1,164 @@
1
+ # @stravica-ai/engineering-pa-scaffold
2
+
3
+ Identity: `@stravica-ai/engineering-pa-scaffold` — `pa-init` scaffolder + onboarding flows.
4
+
5
+ ## Status
6
+
7
+ | Mode | Status | Lands in |
8
+ |---|---|---|
9
+ | `--mode=solo` | **implemented** | Phase 1 Task 5 |
10
+ | `--mode=lead` | not implemented | Phase 3 |
11
+ | `--mode=member` | not implemented | Phase 5 |
12
+
13
+ Workspace-internal: `"private": true`, not individually published. The
14
+ operator-facing surface ships via the public `@stravica-ai/digital-operator-pa`
15
+ package; `pa-init` is exposed as one of its bin entries.
16
+
17
+ ## Install / invoke
18
+
19
+ The bin is `pa-init`. After installing `@stravica-ai/digital-operator-pa` into an
20
+ empty staging directory (or invoking via `pnpm exec`), run:
21
+
22
+ ```bash
23
+ pa-init --mode=solo --name=dave --operator=Baz --target=./dave-instance
24
+ ```
25
+
26
+ Or interactively, with three prompts:
27
+
28
+ ```bash
29
+ pa-init --mode=solo
30
+ # Operator name (the human this PA serves, e.g. 'Baz'): Baz
31
+ # PA name (kebab-case identity, e.g. 'dave'): dave
32
+ # Target directory [/current/cwd]: /home/baz/dave
33
+ ```
34
+
35
+ ## Commands
36
+
37
+ ```bash
38
+ pa-init --help # usage; exits 0
39
+ pa-init --mode=solo # interactive solo onboarding
40
+ pa-init --mode=solo --name=NAME --operator=OP --target=DIR
41
+ # flag-driven solo onboarding
42
+ pa-init --mode=solo --non-interactive --name=... --operator=... --target=...
43
+ # CI mode; refuses to prompt
44
+ pa-init --mode=lead # exits 2 ("not implemented in Phase 1")
45
+ pa-init --mode=member --invite=T # exits 2 ("not implemented in Phase 1")
46
+ ```
47
+
48
+ ### Flags
49
+
50
+ | Flag | Purpose |
51
+ |---|---|
52
+ | `--mode=MODE` | `solo` \| `lead` \| `member` (only `solo` ships in Phase 1) |
53
+ | `--name=PA_NAME` | PA identity. Kebab-case, lowercase, 2-40 chars, starts with a letter. |
54
+ | `--operator=NAME` | Operator (human) name. Free-form, 1-80 chars. |
55
+ | `--target=DIR` | Target directory. Must be empty or not exist. |
56
+ | `--purpose=TEXT` | Optional one-line PA purpose statement. Has a sane default. |
57
+ | `--non-interactive` | Refuse to prompt. Requires all values via flags. CI-friendly. |
58
+ | `--skip-install` | Skip the post-scaffold `pnpm install` + `pa status` check (test-friendly). |
59
+ | `-h`, `--help` | Show usage, exit 0. |
60
+
61
+ ## Exit codes (tooling standard §6)
62
+
63
+ | Code | Meaning |
64
+ |---|---|
65
+ | 0 | OK |
66
+ | 1 | Usage error — invalid flags, missing required values in non-interactive mode, invalid PA name, non-empty target. |
67
+ | 2 | Operational failure — `pnpm install` or `pa status` exited non-zero. |
68
+ | 3 | Transport / IO failure — couldn't spawn a subprocess. |
69
+
70
+ ## What `--mode=solo` generates
71
+
72
+ ```
73
+ {target}/
74
+ ├── CLAUDE.md # PA identity, rendered from the bundled template
75
+ ├── README.md # operator-repo orientation
76
+ ├── package.json # depends on @stravica-ai/digital-operator-pa
77
+ ├── .gitignore # node, .session, .vault keys, *.pid, runs.jsonl
78
+ ├── .nvmrc # 24
79
+ ├── .git/ # initialised so desk's .git-walk works
80
+ ├── operator/
81
+ │ ├── profile/profile.md # placeholder; PA leads intake to fill
82
+ │ ├── knowledge/
83
+ │ │ ├── domains.json # base 5 domains per methodology
84
+ │ │ └── index.json # empty
85
+ │ └── extensions/
86
+ │ ├── manifest.json # empty (extensions land in Phase 2)
87
+ │ ├── roles/, tools/, workspace/ # empty, .gitkeep'd
88
+ ├── agents/{paName}/
89
+ │ ├── CLAUDE.md # same as root CLAUDE.md (PA identity)
90
+ │ ├── journal.md # empty stub
91
+ │ ├── next-session.md # empty stub
92
+ │ ├── spawn-log.json # {"version":"1.0", "spawns":[]}
93
+ │ └── staging/ # empty, .gitkeep'd
94
+ ├── work/ # empty, .gitkeep'd
95
+ ├── projects/ # empty, .gitkeep'd
96
+ ├── schedules/ # empty, .gitkeep'd
97
+ └── .vault/ # empty, .gitkeep'd
98
+ ```
99
+
100
+ ### Base knowledge domains
101
+
102
+ Seeded into `operator/knowledge/domains.json` per the knowledge-system
103
+ methodology (5 core engineering-PA domains):
104
+
105
+ - `engineering` — the discipline
106
+ - `ops` — operational rules and process
107
+ - `agent-ops` — agentic team management
108
+ - `knowledge-meta` — the librarian and methodology
109
+ - `operator-profile` — who the operator is
110
+
111
+ Operators extend per-deployment (finance, sales, legal, etc.); the scaffolder
112
+ ships only the core set.
113
+
114
+ ## Project layout
115
+
116
+ ```
117
+ packages/scaffold/
118
+ bin/pa-init # node shebang shim — imports src/cli.mjs
119
+ index.mjs # package entry — re-exports public surface
120
+ package.json # name, version, bin: pa-init
121
+ README.md # this file (the spec)
122
+ src/
123
+ cli.mjs # arg parsing, verb routing, exit-code translation
124
+ prompts.mjs # interactive prompts + validators (readline seam)
125
+ generator.mjs # PURE: plan-of-files given a config
126
+ runner.mjs # CHOKEPOINT: writes files, spawns pnpm/pa/git
127
+ commands/
128
+ init.mjs # --mode=solo orchestration
129
+ templates/
130
+ CLAUDE.md.template # PA identity template, {PA_NAME}/{OPERATOR_NAME}/{PURPOSE}/{COMMUNICATION_STYLE} tokens
131
+ operator-README.md.template# operator-repo README template
132
+ test/
133
+ index.test.mjs # package surface
134
+ cli.test.mjs # bin-via-child-process tests (parsing + exit codes + happy path)
135
+ prompts.test.mjs # validator + promptValues seam tests
136
+ generator.test.mjs # pure plan-composition tests
137
+ runner.test.mjs # chokepoint tests with fake-spawn seam
138
+ ```
139
+
140
+ ### Chokepoint pattern (tooling standard §7)
141
+
142
+ Every external effect is in `src/runner.mjs`:
143
+
144
+ - `writePlan(targetDir, plan)` — sole filesystem-write surface
145
+ - `runProcess({ cmd, args, cwd, seam })` — sole `child_process.spawn` surface
146
+ - `installDeps`, `paStatus`, `initGitRepo` — thin wrappers around `runProcess`
147
+
148
+ Nothing else in the scaffolder reaches the disk or the OS. Tests inject a
149
+ fake `seam.spawn` to verify framing without executing real subprocesses.
150
+
151
+ ## Tests
152
+
153
+ ```bash
154
+ pnpm --filter @stravica-ai/engineering-pa-scaffold test
155
+ # or, from the package directory:
156
+ node --test 'test/**/*.test.mjs'
157
+ ```
158
+
159
+ ## The tooling standard
160
+
161
+ This tool complies with [the tooling standard](../../CONTRIBUTING.md#standards)
162
+ in full: JS only, zero npm runtime deps, `node:test`, `node:util.parseArgs`
163
+ with `strict: true`, camelCase JSON, chokepoint pattern for external effects,
164
+ README-as-contract, four-exit-code contract.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('../src/cli.mjs').then((m) => m.main(process.argv.slice(2)));
@@ -0,0 +1,42 @@
1
+ // @stravica-ai/engineering-pa-scaffold — pa-init scaffolder + onboarding flows.
2
+ //
3
+ // Phase 1 Task 5 lands the real --mode=solo flow. --mode=lead and
4
+ // --mode=member follow in Phase 3/5.
5
+
6
+ import { dirname, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+
11
+ export const name = './';
12
+ export const version = '0.1.1';
13
+ export const modes = ['solo', 'lead', 'member'];
14
+
15
+ /**
16
+ * Absolute path to the bundled CLAUDE.md template. The scaffolder reads
17
+ * this file, substitutes `{PA_NAME}` / `{OPERATOR_NAME}` / `{PURPOSE}` /
18
+ * `{COMMUNICATION_STYLE}` placeholders, and writes the result to the
19
+ * operator repo's `CLAUDE.md` and `agents/{paName}/CLAUDE.md`.
20
+ */
21
+ export const CLAUDE_MD_TEMPLATE = resolve(__dirname, 'templates', 'CLAUDE.md.template');
22
+
23
+ /** Absolute path to the operator-repo README template. */
24
+ export const OPERATOR_README_TEMPLATE = resolve(
25
+ __dirname,
26
+ 'templates',
27
+ 'operator-README.md.template',
28
+ );
29
+
30
+ export { main } from './src/cli.mjs';
31
+ export { runInit } from './src/commands/init.mjs';
32
+ export {
33
+ buildPlan,
34
+ buildPlanFromTemplates,
35
+ buildRenderConfig,
36
+ BASE_DOMAINS,
37
+ } from './src/generator.mjs';
38
+ export {
39
+ validateOperatorName,
40
+ validatePaName,
41
+ validateTargetPath,
42
+ } from './src/prompts.mjs';
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@stravica-ai/engineering-pa-scaffold",
3
+ "version": "0.1.1",
4
+ "description": "pa-init scaffolder + onboarding flows (solo, lead, member).",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "bin": {
11
+ "pa-init": "bin/pa-init"
12
+ },
13
+ "private": true,
14
+ "license": "MIT",
15
+ "engines": {
16
+ "node": ">=24"
17
+ },
18
+ "scripts": {
19
+ "test": "node --test --test-isolation=none 'test/**/*.test.mjs'"
20
+ },
21
+ "//": "test pins --test-isolation=none: default process-isolation mode silently undercounts (drops passed tests from totals) when a test awaits async work while stdout is patched by a capture() helper — see packages/cli/test/secrets. Counts must never lie."
22
+ }
@@ -0,0 +1,115 @@
1
+ // pa-init — onboarding scaffolder.
2
+ //
3
+ // Verb routing + arg parsing + exit-code translation. Domain code lives in
4
+ // `commands/`, prompts in `prompts.mjs`, file generation in `generator.mjs`,
5
+ // and the spawn/IO chokepoint in `runner.mjs`. cli.mjs is the only module
6
+ // that knows about `process.exit`.
7
+ //
8
+ // Exit codes (tooling standard §6):
9
+ // 0 ok
10
+ // 1 usage error
11
+ // 2 logical / operational failure
12
+ // 3 transport / IO failure
13
+
14
+ import { parseArgs } from 'node:util';
15
+
16
+ import { runInit } from './commands/init.mjs';
17
+
18
+ const USAGE = `pa-init — scaffold a new personal-assistant operator repo
19
+
20
+ Usage:
21
+ pa-init --mode=solo [--name=PA_NAME] [--target=DIR] [--non-interactive] [--operator=NAME] [--purpose=TEXT]
22
+ pa-init --help
23
+
24
+ Modes:
25
+ solo Single-operator instance, no team library (Phase 1)
26
+ lead Team-lead instance with team library (Phase 5 — not yet implemented)
27
+ member --invite=TOKEN Join an existing team library (Phase 5 — not yet implemented)
28
+
29
+ Common flags:
30
+ --name=PA_NAME PA identity (kebab-case, lowercase, no spaces). Prompted if absent.
31
+ --target=DIR Target directory. Prompted if absent. Must be empty or not exist.
32
+ --operator=NAME Operator (human) name. Prompted if absent.
33
+ --purpose=TEXT One-line PA purpose statement. Defaults to a generic line.
34
+ --non-interactive Refuse to prompt; require all values via flags. CI-friendly.
35
+ --skip-install Skip post-scaffold pnpm install + pa status (for testing).
36
+ -h, --help Show this help.
37
+
38
+ Exit codes:
39
+ 0 ok | 1 usage error | 2 operational failure | 3 transport/IO failure
40
+ `;
41
+
42
+ /**
43
+ * Entry point invoked by bin/pa-init. Returns nothing — exits the process
44
+ * directly with the resolved code. Throws are translated to exit code 3
45
+ * (transport/IO) if they carry no `exitCode`; otherwise to the carried code.
46
+ */
47
+ export async function main(argv) {
48
+ let parsed;
49
+ try {
50
+ parsed = parseArgs({
51
+ args: argv,
52
+ options: {
53
+ help: { type: 'boolean', short: 'h' },
54
+ mode: { type: 'string' },
55
+ name: { type: 'string' },
56
+ target: { type: 'string' },
57
+ operator: { type: 'string' },
58
+ purpose: { type: 'string' },
59
+ invite: { type: 'string' },
60
+ 'non-interactive': { type: 'boolean' },
61
+ 'skip-install': { type: 'boolean' },
62
+ },
63
+ strict: true,
64
+ allowPositionals: false,
65
+ });
66
+ } catch (err) {
67
+ process.stderr.write(`pa-init: ${err.message}\n`);
68
+ process.stderr.write(USAGE);
69
+ return exitWith(1);
70
+ }
71
+
72
+ if (parsed.values.help) {
73
+ process.stdout.write(USAGE);
74
+ return exitWith(0);
75
+ }
76
+
77
+ const mode = parsed.values.mode;
78
+ if (!mode) {
79
+ process.stderr.write('pa-init: --mode is required (solo | lead | member)\n');
80
+ process.stderr.write(USAGE);
81
+ return exitWith(1);
82
+ }
83
+
84
+ if (mode === 'lead' || mode === 'member') {
85
+ process.stderr.write(
86
+ `pa-init: --mode=${mode} is not implemented in Phase 1 (lands in Phase 3/5)\n`,
87
+ );
88
+ return exitWith(2);
89
+ }
90
+
91
+ if (mode !== 'solo') {
92
+ process.stderr.write(`pa-init: unknown mode '${mode}' (expected solo | lead | member)\n`);
93
+ process.stderr.write(USAGE);
94
+ return exitWith(1);
95
+ }
96
+
97
+ try {
98
+ const code = await runInit({
99
+ paName: parsed.values.name,
100
+ targetDir: parsed.values.target,
101
+ operatorName: parsed.values.operator,
102
+ purpose: parsed.values.purpose,
103
+ nonInteractive: parsed.values['non-interactive'] === true,
104
+ skipInstall: parsed.values['skip-install'] === true,
105
+ });
106
+ return exitWith(code ?? 0);
107
+ } catch (err) {
108
+ process.stderr.write(`pa-init: ${err.message || err}\n`);
109
+ return exitWith(err && typeof err.exitCode === 'number' ? err.exitCode : 3);
110
+ }
111
+ }
112
+
113
+ function exitWith(code) {
114
+ process.exit(code);
115
+ }
@@ -0,0 +1,169 @@
1
+ // init.mjs — `pa-init --mode=solo` orchestration.
2
+ //
3
+ // Flow:
4
+ // 1. Gather config: prompts (interactive) or flag-only (non-interactive).
5
+ // 2. Build the plan (pure generator).
6
+ // 3. Pre-flight: target dir empty / missing.
7
+ // 4. Write the plan to disk.
8
+ // 5. Init git (so desk's .git-walk finds the operator repo root).
9
+ // 6. (Optional) Install dependencies + run `pa status` to verify boot.
10
+ //
11
+ // Errors carry an `exitCode`. The CLI translates to `process.exit`.
12
+
13
+ import { resolve } from 'node:path';
14
+
15
+ import { buildPlan, buildRenderConfig } from '../generator.mjs';
16
+ import {
17
+ defaultSeam,
18
+ promptValues,
19
+ validateOperatorName,
20
+ validatePaName,
21
+ validateTargetPath,
22
+ } from '../prompts.mjs';
23
+ import {
24
+ assertTargetIsEmptyOrMissing,
25
+ initGitRepo,
26
+ installDeps,
27
+ paStatus,
28
+ writePlan,
29
+ } from '../runner.mjs';
30
+
31
+ /**
32
+ * Entry point for `--mode=solo`. Returns an exit code.
33
+ */
34
+ export async function runInit(options) {
35
+ const config = await gatherConfig(options);
36
+
37
+ process.stdout.write(`\npa-init: scaffolding ${config.paName} for ${config.operatorName}\n`);
38
+ process.stdout.write(` target: ${config.targetDir}\n`);
39
+
40
+ await assertTargetIsEmptyOrMissing(config.targetDir);
41
+
42
+ const plan = await buildPlan(config);
43
+ await writePlan(config.targetDir, plan);
44
+ process.stdout.write(` wrote ${countEntries(plan)} entries\n`);
45
+
46
+ const gitCode = await initGitRepo({ targetDir: config.targetDir });
47
+ if (gitCode !== 0) {
48
+ process.stderr.write(`pa-init: git init exited with ${gitCode}\n`);
49
+ return 2;
50
+ }
51
+
52
+ if (options.skipInstall) {
53
+ process.stdout.write(' skip-install set — leaving install + pa status to caller\n');
54
+ process.stdout.write('\npa-init: done.\n');
55
+ writeNextStepMessage(config);
56
+ return 0;
57
+ }
58
+
59
+ process.stdout.write('\npa-init: running pnpm install …\n');
60
+ const installCode = await installDeps({ targetDir: config.targetDir });
61
+ if (installCode !== 0) {
62
+ process.stderr.write(`pa-init: pnpm install exited with ${installCode}\n`);
63
+ return 2;
64
+ }
65
+
66
+ process.stdout.write('\npa-init: running pa status …\n');
67
+ const statusCode = await paStatus({ targetDir: config.targetDir });
68
+ if (statusCode !== 0) {
69
+ process.stderr.write(`pa-init: pa status exited with ${statusCode}\n`);
70
+ return 2;
71
+ }
72
+
73
+ process.stdout.write('\npa-init: done.\n');
74
+ writeNextStepMessage(config);
75
+ return 0;
76
+ }
77
+
78
+ /**
79
+ * Emit the "next step" guidance after a successful pa-init. Points the
80
+ * operator at `pa session` — the standard entry point for booting their
81
+ * PA — and offers an optional shell alias keyed off the PA name they
82
+ * just scaffolded.
83
+ */
84
+ function writeNextStepMessage(config) {
85
+ const { paName, targetDir } = config;
86
+ const lines = [
87
+ '',
88
+ 'Next step — start your PA:',
89
+ '',
90
+ ` cd ${targetDir}`,
91
+ ' pa session',
92
+ '',
93
+ 'Optional: add a shell alias for muscle memory. Add this to ~/.zshrc or ~/.bashrc:',
94
+ '',
95
+ ` alias ${paName}='pa session'`,
96
+ '',
97
+ `After reloading your shell, just type \`${paName}\` to start a session.`,
98
+ '',
99
+ ];
100
+ process.stdout.write(lines.join('\n'));
101
+ }
102
+
103
+ async function gatherConfig(options) {
104
+ const targetDirDefault = resolve(process.cwd());
105
+ const supplied = {
106
+ paName: options.paName || null,
107
+ operatorName: options.operatorName || null,
108
+ targetDir: options.targetDir || null,
109
+ targetDirDefault,
110
+ };
111
+
112
+ let resolvedValues;
113
+ if (options.nonInteractive) {
114
+ const missing = [];
115
+ if (!supplied.paName) missing.push('--name');
116
+ if (!supplied.operatorName) missing.push('--operator');
117
+ if (!supplied.targetDir) missing.push('--target');
118
+ if (missing.length > 0) {
119
+ const e = new Error(
120
+ `non-interactive mode requires all values via flags; missing: ${missing.join(', ')}`,
121
+ );
122
+ e.exitCode = 1;
123
+ throw e;
124
+ }
125
+ resolvedValues = applyValidatorsOrThrow({
126
+ paName: supplied.paName,
127
+ operatorName: supplied.operatorName,
128
+ targetDir: supplied.targetDir,
129
+ });
130
+ } else {
131
+ const seam = defaultSeam();
132
+ try {
133
+ resolvedValues = await promptValues(seam, supplied);
134
+ } finally {
135
+ seam.close();
136
+ }
137
+ }
138
+
139
+ return buildRenderConfig({
140
+ paName: resolvedValues.paName,
141
+ operatorName: resolvedValues.operatorName,
142
+ targetDir: resolvedValues.targetDir,
143
+ purpose: options.purpose,
144
+ });
145
+ }
146
+
147
+ function applyValidatorsOrThrow(supplied) {
148
+ const checks = [
149
+ ['name', supplied.paName, validatePaName],
150
+ ['operator', supplied.operatorName, validateOperatorName],
151
+ ['target', supplied.targetDir, validateTargetPath],
152
+ ];
153
+ const out = {};
154
+ const keys = { name: 'paName', operator: 'operatorName', target: 'targetDir' };
155
+ for (const [flag, value, validator] of checks) {
156
+ const result = validator(value);
157
+ if (!result.ok) {
158
+ const e = new Error(`invalid --${flag}: ${result.reason}`);
159
+ e.exitCode = 1;
160
+ throw e;
161
+ }
162
+ out[keys[flag]] = result.value;
163
+ }
164
+ return out;
165
+ }
166
+
167
+ function countEntries(plan) {
168
+ return plan.length;
169
+ }