@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,114 @@
1
+ # pa staging-alias
2
+
3
+ Canonical `staging.<site>` subdomain pattern for the operator's
4
+ Cloudflare-Workers-hosted sites. One command flips the alias to the
5
+ branch under review.
6
+
7
+ ## Pattern
8
+
9
+ ```
10
+ +-----------------------------+
11
+ staging.stravica.ai ---->| stravica-ai-staging |
12
+ (CF Custom Domain) | (router worker, env= |
13
+ | STAGING_TARGET=<preview>) |
14
+ +--------------+---------------+
15
+ |
16
+ v
17
+ +-------------------------------------------------+
18
+ | 350f46a0-stravica-ai.barry-ab9.workers.dev |
19
+ | (workers.dev preview URL — version-pinned) |
20
+ +-------------------------------------------------+
21
+ |
22
+ v
23
+ +-----------------------------+
24
+ | stravica-ai (source worker)|
25
+ | prod -> stravica.ai apex |
26
+ +-----------------------------+
27
+ ```
28
+
29
+ Why a router worker?
30
+
31
+ Two CF Workers limitations forced this shape:
32
+
33
+ 1. **Custom Domains always serve the production deployment.** You cannot
34
+ bind a CF Custom Domain (`staging.stravica.ai`) directly to a
35
+ specific version of the source worker — it always serves whatever
36
+ `wrangler deploy` last promoted to 100%.
37
+ 2. **Preview URLs cannot run on a non-`workers.dev` subdomain.** CF
38
+ explicitly states: "You cannot currently configure Preview URLs to
39
+ run on a subdomain other than workers.dev." So a CNAME from
40
+ `staging.stravica.ai` → `<prefix>-stravica-ai.barry-ab9.workers.dev`
41
+ is rejected by the CF edge (cross-user CNAME).
42
+
43
+ The router-worker indirection sidesteps both. It's a 25-line proxy that
44
+ fetches `STAGING_TARGET` and returns the upstream response unchanged.
45
+ Updating the staging target = re-deploying the router with a new
46
+ `STAGING_TARGET` binding — a single API call.
47
+
48
+ ## Multi-account safety drill
49
+
50
+ Cloudflare has multiple accounts in this estate (Stravica dedicated,
51
+ Clive-shared). Using the wrong account's keys would catastrophically
52
+ write to the wrong tenant. Every `set` / `unset` runs:
53
+
54
+ 1. Look up the site in the registry.
55
+ 2. Load the vault keys for the site's `accountKey` (`stravica` /
56
+ `clive` / ...).
57
+ 3. `GET /accounts/{account_id}` — read the account's display name.
58
+ 4. Compare against `expectedAccountName` from the site registry.
59
+ 5. ABORT (exit 2) on mismatch.
60
+ 6. Only then write.
61
+
62
+ The drill output is echoed on stdout: `account verified: "X" (id)`.
63
+
64
+ ## Usage
65
+
66
+ ```bash
67
+ # Wire staging.stravica.ai to the latest preview deployment of the
68
+ # source worker. CF doesn't tag versions with branch, so this picks
69
+ # the newest version — operator must have just pushed the branch.
70
+ pa staging-alias set --site stravica.ai --branch peer-review
71
+
72
+ # Pin a specific version explicitly (precise, branch tagging not needed).
73
+ pa staging-alias set --site stravica.ai --branch peer-review \
74
+ --version 350f46a0-c38e-48a5-8395-216d3b290dac
75
+
76
+ # Inspect current state.
77
+ pa staging-alias status --site stravica.ai
78
+
79
+ # Across all registered sites.
80
+ pa staging-alias list
81
+
82
+ # Remove the alias (binding + router worker).
83
+ pa staging-alias unset --site stravica.ai
84
+ ```
85
+
86
+ ## Adding a fourth site
87
+
88
+ Edit `src/staging-alias/sites.mjs`. Add one entry:
89
+
90
+ ```js
91
+ 'newsite.com': {
92
+ hostname: 'newsite.com',
93
+ sourceWorker: 'newsite',
94
+ routerWorker: 'newsite-staging',
95
+ accountKey: 'newsite', // or 'stravica' / 'clive' if shared
96
+ expectedAccountName: "Owner's Account",
97
+ zoneName: 'newsite.com',
98
+ },
99
+ ```
100
+
101
+ …and store the vault keys: `CLOUDFLARE_PAGES_API_KEY_NEWSITE` +
102
+ `CLOUDFLARE_PAGES_ACCOUNT_ID_NEWSITE`.
103
+
104
+ ## Exit codes
105
+
106
+ - `0` ok
107
+ - `1` usage error (bad flags, unknown site, no versions on source worker)
108
+ - `2` operational failure (account-drill mismatch, CF API write failed)
109
+ - `3` transport/IO failure (network down, non-JSON CF response)
110
+
111
+ ## Tests
112
+
113
+ `node --test packages/cli/test/staging-alias/`. All CF API calls are
114
+ mocked; no real account is touched in tests.
@@ -0,0 +1,17 @@
1
+ // @stravica-ai/engineering-pa-cli — operator-facing CLIs.
2
+ //
3
+ // Bin entries: pa, secrets, scheduler, sync, smoke, launch (declared in package.json).
4
+ // desk, distill, memory-sync own their bin entries on @stravica-ai/engineering-pa-core.
5
+ //
6
+ // Public surface is intentionally narrow — most consumers spawn the bin
7
+ // shims. This module exports the underlying run/main functions for
8
+ // in-process composition (e.g. by `pa workspace` proxying to `ws.mjs`).
9
+
10
+ export const name = './';
11
+ export const version = '0.1.1';
12
+ export const bins = ['pa', 'secrets', 'scheduler', 'sync', 'smoke', 'launch'];
13
+
14
+ export { run as runSmokeCli } from './src/smoke/cli.mjs';
15
+ export { run as runSchedulerCli } from './src/scheduler/cli.mjs';
16
+ export { run as runLaunchCli } from './src/launch/cli.mjs';
17
+ export { runSmoke } from './src/smoke/commands/run.mjs';
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@stravica-ai/engineering-pa-cli",
3
+ "version": "0.2.2",
4
+ "description": "Operator-facing CLIs — pa, secrets, scheduler, sync, smoke, launch.",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs",
9
+ "./src/*": "./src/*"
10
+ },
11
+ "bin": {
12
+ "pa": "bin/pa",
13
+ "secrets": "bin/secrets",
14
+ "scheduler": "bin/scheduler",
15
+ "estate-sync": "bin/estate-sync",
16
+ "sync": "bin/sync",
17
+ "smoke": "bin/smoke",
18
+ "launch": "bin/launch",
19
+ "research": "bin/research",
20
+ "pa-coordinator-hook": "bin/pa-coordinator-hook"
21
+ },
22
+ "dependencies": {
23
+ "@stravica-ai/engineering-pa-core": "workspace:*",
24
+ "@stravica-ai/engineering-pa-migrate-inspect": "workspace:*",
25
+ "google-auth-library": "^9.15.0",
26
+ "googleapis": "^144.0.0"
27
+ },
28
+ "private": true,
29
+ "license": "MIT",
30
+ "engines": {
31
+ "node": ">=24"
32
+ },
33
+ "scripts": {
34
+ "test": "node --test --test-isolation=none 'test/**/*.test.mjs'"
35
+ },
36
+ "//": "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."
37
+ }
@@ -0,0 +1,329 @@
1
+ // cli.mjs — argv router for `pa autonomy <verb>`.
2
+ //
3
+ // Verbs:
4
+ // pa autonomy init <agent> [--owner <name>]
5
+ // pa autonomy get <agent> [<task-type>] [--format table|json]
6
+ // pa autonomy set <agent> <task-type> <state> [--label <text>] [--note <text>]
7
+ // pa autonomy list [<agent>] [--format table|json]
8
+ //
9
+ // Exit codes (tooling standard §6):
10
+ // 0 ok | 1 usage | 2 invalid state / unknown agent / envelope parse
11
+ // 3 IO failure
12
+
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'node:fs';
14
+ import { join, dirname } from 'node:path';
15
+ import { getRepoRoot } from '../pa/repo-root.mjs';
16
+ import {
17
+ VALID_STATES,
18
+ parseEnvelope,
19
+ renderEnvelope,
20
+ extractHistory,
21
+ validateFrontmatter,
22
+ nowIso,
23
+ emptyEnvelope,
24
+ } from './envelope.mjs';
25
+
26
+ const USAGE = `pa autonomy — per-agent per-task-type approval state
27
+
28
+ Usage:
29
+ pa autonomy init <agent> [--owner <name>]
30
+ Create an empty envelope for <agent>. Errors if the envelope already
31
+ exists. --owner defaults to \$USER or "operator".
32
+
33
+ pa autonomy get <agent> [<task-type>] [--format table|json]
34
+ Print current state. Task-type optional — prints full table if omitted.
35
+
36
+ pa autonomy set <agent> <task-type> <state> [--label <text>] [--note <text>]
37
+ Update state for the given task type. Creates the task type if it
38
+ doesn't exist yet. State: fullyApproved | checkBeforeCommitting |
39
+ needsFullSupervision.
40
+
41
+ pa autonomy list [<agent>] [--format table|json]
42
+ List envelopes (all agents, or one). Flags stale envelopes (>30 days).
43
+
44
+ pa autonomy -h, --help
45
+ Show this help.
46
+
47
+ Envelope files live at <repo-root>/agents/<agent>/autonomy-envelope.md.
48
+ Repo-root resolution: DAVE_REPO_ROOT / PA_REPO_ROOT env var, else walk
49
+ upward from cwd looking for a .git entry.
50
+
51
+ Schema: @stravica-ai/engineering-pa-core/schema/autonomy-envelope.schema.json.
52
+
53
+ Exit codes (tooling standard §6):
54
+ 0 ok | 1 usage error | 2 invalid state / unknown agent / parse
55
+ 3 IO failure
56
+ `;
57
+
58
+ export async function run(argv) {
59
+ if (!argv.length || argv[0] === '-h' || argv[0] === '--help') {
60
+ process.stdout.write(USAGE);
61
+ return 0;
62
+ }
63
+ const verb = argv[0];
64
+ const rest = argv.slice(1);
65
+ try {
66
+ switch (verb) {
67
+ case 'init': return await doInit(rest);
68
+ case 'get': return await doGet(rest);
69
+ case 'set': return await doSet(rest);
70
+ case 'list': return await doList(rest);
71
+ default:
72
+ process.stderr.write(`[pa autonomy] unknown verb: ${verb}\n`);
73
+ process.stderr.write(USAGE);
74
+ return 1;
75
+ }
76
+ } catch (err) {
77
+ process.stderr.write(`[pa autonomy] ${err.message || err}\n`);
78
+ return err.exitCode ?? 2;
79
+ }
80
+ }
81
+
82
+ async function doInit(rest) {
83
+ const { positionals, flags } = parseArgs(rest, ['owner']);
84
+ if (positionals.length !== 1) {
85
+ process.stderr.write('[pa autonomy init] expected: pa autonomy init <agent> [--owner <name>]\n');
86
+ return 1;
87
+ }
88
+ const [agent] = positionals;
89
+ const owner = flags.owner || process.env.USER || 'operator';
90
+ const envelopePath = await resolveEnvelopePath(agent);
91
+ if (existsSync(envelopePath)) {
92
+ process.stderr.write(`[pa autonomy init] envelope already exists at ${envelopePath}\n`);
93
+ return 2;
94
+ }
95
+ const { frontmatter } = emptyEnvelope(agent, owner);
96
+ mkdirSync(dirname(envelopePath), { recursive: true });
97
+ writeFileSync(envelopePath, renderEnvelope(frontmatter, []));
98
+ process.stdout.write(`Initialised autonomy envelope for '${agent}' at ${envelopePath}\n`);
99
+ return 0;
100
+ }
101
+
102
+ async function doGet(rest) {
103
+ const { positionals, flags } = parseArgs(rest, ['format']);
104
+ if (positionals.length < 1 || positionals.length > 2) {
105
+ process.stderr.write('[pa autonomy get] expected: pa autonomy get <agent> [<task-type>] [--format json]\n');
106
+ return 1;
107
+ }
108
+ const [agent, taskType] = positionals;
109
+ const format = flags.format || 'table';
110
+ const envelope = await loadEnvelopeOrHint(agent);
111
+ if (taskType) {
112
+ const entry = envelope.frontmatter.taskTypes.find((t) => t.id === taskType);
113
+ if (!entry) {
114
+ process.stderr.write(`[pa autonomy get] task type '${taskType}' not present on ${agent}'s envelope\n`);
115
+ return 2;
116
+ }
117
+ if (format === 'json') {
118
+ process.stdout.write(JSON.stringify(entry, null, 2) + '\n');
119
+ } else {
120
+ process.stdout.write(formatEntry(entry) + '\n');
121
+ }
122
+ return 0;
123
+ }
124
+ if (format === 'json') {
125
+ process.stdout.write(JSON.stringify({
126
+ agent: envelope.frontmatter.agent,
127
+ owner: envelope.frontmatter.owner,
128
+ updated: envelope.frontmatter.updated,
129
+ taskTypes: envelope.frontmatter.taskTypes,
130
+ }, null, 2) + '\n');
131
+ } else {
132
+ process.stdout.write(formatEnvelopeTable(envelope) + '\n');
133
+ }
134
+ return 0;
135
+ }
136
+
137
+ async function doSet(rest) {
138
+ const { positionals, flags } = parseArgs(rest, ['label', 'note']);
139
+ if (positionals.length !== 3) {
140
+ process.stderr.write('[pa autonomy set] expected: pa autonomy set <agent> <task-type> <state> [--label <text>] [--note <text>]\n');
141
+ return 1;
142
+ }
143
+ const [agent, taskType, state] = positionals;
144
+ if (!VALID_STATES.includes(state)) {
145
+ process.stderr.write(`[pa autonomy set] invalid state '${state}' — must be one of: ${VALID_STATES.join(', ')}\n`);
146
+ return 2;
147
+ }
148
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(taskType)) {
149
+ process.stderr.write(`[pa autonomy set] invalid task-type slug '${taskType}' — must match ^[a-z0-9][a-z0-9-]*$\n`);
150
+ return 2;
151
+ }
152
+ const envelope = await loadEnvelopeOrHint(agent);
153
+ const now = nowIso();
154
+ const existing = envelope.frontmatter.taskTypes.find((t) => t.id === taskType);
155
+ if (existing) {
156
+ existing.state = state;
157
+ existing.stateSince = now;
158
+ if (flags.label) existing.label = flags.label;
159
+ if (flags.note !== undefined) existing.operatorNote = flags.note;
160
+ } else {
161
+ envelope.frontmatter.taskTypes.push({
162
+ id: taskType,
163
+ label: flags.label || taskType.replace(/-/g, ' '),
164
+ state,
165
+ stateSince: now,
166
+ ...(flags.note !== undefined ? { operatorNote: flags.note } : {}),
167
+ });
168
+ }
169
+ envelope.frontmatter.updated = now;
170
+ envelope.history.push({
171
+ at: now,
172
+ taskTypeId: taskType,
173
+ state,
174
+ note: flags.note ?? null,
175
+ });
176
+ validateFrontmatter(envelope.frontmatter);
177
+ const envelopePath = await resolveEnvelopePath(agent);
178
+ writeFileSync(envelopePath, renderEnvelope(envelope.frontmatter, envelope.history));
179
+ process.stdout.write(`Set ${agent}/${taskType} → ${state}\n`);
180
+ return 0;
181
+ }
182
+
183
+ async function doList(rest) {
184
+ const { positionals, flags } = parseArgs(rest, ['format']);
185
+ const format = flags.format || 'table';
186
+ const agents = positionals.length === 1
187
+ ? [positionals[0]]
188
+ : await discoverAgents();
189
+ const results = [];
190
+ for (const agent of agents) {
191
+ const envelopePath = await resolveEnvelopePath(agent);
192
+ if (!existsSync(envelopePath)) {
193
+ results.push({ agent, present: false, staleDays: null, taskTypeCount: 0 });
194
+ continue;
195
+ }
196
+ try {
197
+ const source = readFileSync(envelopePath, 'utf8');
198
+ const { frontmatter } = parseEnvelope(source);
199
+ const updatedMs = Date.parse(frontmatter.updated || '');
200
+ const staleDays = Number.isFinite(updatedMs)
201
+ ? Math.floor((Date.now() - updatedMs) / (1000 * 60 * 60 * 24))
202
+ : null;
203
+ results.push({
204
+ agent,
205
+ present: true,
206
+ staleDays,
207
+ taskTypeCount: (frontmatter.taskTypes ?? []).length,
208
+ updated: frontmatter.updated,
209
+ });
210
+ } catch (err) {
211
+ results.push({ agent, present: true, error: err.message });
212
+ }
213
+ }
214
+ if (format === 'json') {
215
+ process.stdout.write(JSON.stringify(results, null, 2) + '\n');
216
+ } else {
217
+ if (results.length === 0) {
218
+ process.stdout.write('No agents found under <repo-root>/agents/.\n');
219
+ } else {
220
+ process.stdout.write('Agent | State | Task types | Updated\n');
221
+ process.stdout.write('----------------|-----------------------|------------|-------------------\n');
222
+ for (const r of results) {
223
+ if (!r.present) {
224
+ process.stdout.write(`${pad(r.agent, 15)} | (no envelope) | - | -\n`);
225
+ continue;
226
+ }
227
+ if (r.error) {
228
+ process.stdout.write(`${pad(r.agent, 15)} | ERROR: ${r.error}\n`);
229
+ continue;
230
+ }
231
+ const stale = r.staleDays != null && r.staleDays > 30 ? ` (stale ${r.staleDays}d)` : '';
232
+ process.stdout.write(`${pad(r.agent, 15)} | present${stale.padEnd(14)} | ${String(r.taskTypeCount).padStart(10)} | ${r.updated ?? '-'}\n`);
233
+ }
234
+ }
235
+ }
236
+ return 0;
237
+ }
238
+
239
+ function parseArgs(rest, allowedFlags) {
240
+ const positionals = [];
241
+ const flags = {};
242
+ const allowed = new Set(allowedFlags);
243
+ for (let i = 0; i < rest.length; i++) {
244
+ const arg = rest[i];
245
+ if (arg.startsWith('--')) {
246
+ const eqIdx = arg.indexOf('=');
247
+ const name = eqIdx === -1 ? arg.slice(2) : arg.slice(2, eqIdx);
248
+ if (!allowed.has(name)) {
249
+ const err = new Error(`unknown flag --${name}`);
250
+ err.exitCode = 1;
251
+ throw err;
252
+ }
253
+ const value = eqIdx === -1 ? rest[++i] : arg.slice(eqIdx + 1);
254
+ if (value == null) {
255
+ const err = new Error(`flag --${name} requires a value`);
256
+ err.exitCode = 1;
257
+ throw err;
258
+ }
259
+ flags[name] = value;
260
+ } else {
261
+ positionals.push(arg);
262
+ }
263
+ }
264
+ return { positionals, flags };
265
+ }
266
+
267
+ async function resolveEnvelopePath(agent) {
268
+ const root = await getRepoRoot();
269
+ return join(root, 'agents', agent, 'autonomy-envelope.md');
270
+ }
271
+
272
+ async function loadEnvelopeOrHint(agent) {
273
+ const envelopePath = await resolveEnvelopePath(agent);
274
+ if (!existsSync(envelopePath)) {
275
+ const err = new Error(
276
+ `no envelope for '${agent}' at ${envelopePath} — run \`pa autonomy init ${agent}\` first`,
277
+ );
278
+ err.exitCode = 2;
279
+ throw err;
280
+ }
281
+ const source = readFileSync(envelopePath, 'utf8');
282
+ const parsed = parseEnvelope(source);
283
+ validateFrontmatter(parsed.frontmatter);
284
+ const history = extractHistory(parsed.body);
285
+ return { frontmatter: parsed.frontmatter, history };
286
+ }
287
+
288
+ async function discoverAgents() {
289
+ const root = await getRepoRoot();
290
+ const agentsDir = join(root, 'agents');
291
+ if (!existsSync(agentsDir)) return [];
292
+ return readdirSync(agentsDir).filter((name) => {
293
+ if (name.startsWith('.')) return false;
294
+ return statSync(join(agentsDir, name)).isDirectory();
295
+ });
296
+ }
297
+
298
+ function formatEntry(entry) {
299
+ const parts = [
300
+ `id: ${entry.id}`,
301
+ `label: ${entry.label}`,
302
+ `state: ${entry.state}`,
303
+ entry.stateSince ? `stateSince: ${entry.stateSince}` : null,
304
+ entry.operatorNote ? `operatorNote: ${entry.operatorNote}` : null,
305
+ ].filter((x) => x != null);
306
+ return parts.join('\n');
307
+ }
308
+
309
+ function formatEnvelopeTable(envelope) {
310
+ const fm = envelope.frontmatter;
311
+ const lines = [];
312
+ lines.push(`Envelope: ${fm.agent} Owner: ${fm.owner} Updated: ${fm.updated}`);
313
+ lines.push('');
314
+ if (!fm.taskTypes || fm.taskTypes.length === 0) {
315
+ lines.push('(no task types configured)');
316
+ return lines.join('\n');
317
+ }
318
+ lines.push('Task type | State | Since');
319
+ lines.push('-------------------------|--------------------------|-------------------');
320
+ for (const t of fm.taskTypes) {
321
+ lines.push(`${pad(t.id, 25)} | ${pad(t.state, 24)} | ${t.stateSince ?? '-'}`);
322
+ }
323
+ return lines.join('\n');
324
+ }
325
+
326
+ function pad(str, n) {
327
+ const s = String(str ?? '');
328
+ return s.length >= n ? s : s + ' '.repeat(n - s.length);
329
+ }