@milpa/comal 0.2.1 → 0.2.3

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 (121) hide show
  1. package/README.md +1 -1
  2. package/backend/contracts/remote-commands-v1.json +0 -12
  3. package/backend/contracts/remote-relay-answers-v1.json +209 -0
  4. package/package.json +3 -1
  5. package/skills/mv3/SKILL.md +44 -0
  6. package/skills/mv3/skill.json +4 -0
  7. package/src/agent.mjs +299 -32
  8. package/src/auto-guard.mjs +40 -3
  9. package/src/autocompact.mjs +233 -0
  10. package/src/bash-timeouts.mjs +29 -0
  11. package/src/child-env.mjs +23 -0
  12. package/src/cli.mjs +232 -63
  13. package/src/code-run-artifact.mjs +30 -0
  14. package/src/code-run-journal.mjs +135 -0
  15. package/src/code-run-session-proof.mjs +50 -0
  16. package/src/code-run-session.mjs +97 -0
  17. package/src/code-run-worker.mjs +20 -4
  18. package/src/code-run.mjs +49 -14
  19. package/src/codex-provider.mjs +4 -4
  20. package/src/compaction-notice.mjs +22 -0
  21. package/src/compaction.mjs +162 -23
  22. package/src/connection-settings.mjs +36 -4
  23. package/src/context-pressure.mjs +5 -4
  24. package/src/context.mjs +27 -22
  25. package/src/execution-metrics.mjs +36 -5
  26. package/src/file-recovery-proof.mjs +9 -1
  27. package/src/file-recovery.mjs +36 -3
  28. package/src/gemini-provider.mjs +5 -3
  29. package/src/git-integration-operations.mjs +2 -1
  30. package/src/git-plumbing.mjs +2 -1
  31. package/src/git-source.mjs +2 -1
  32. package/src/git-workspaces.mjs +2 -1
  33. package/src/house.mjs +13 -1
  34. package/src/i18n/cli-es.mjs +12 -1
  35. package/src/i18n/es.mjs +133 -2
  36. package/src/judges.mjs +2 -1
  37. package/src/mcp.mjs +2 -1
  38. package/src/model-controls.mjs +16 -2
  39. package/src/model-deadline.mjs +2 -2
  40. package/src/openai-provider.mjs +8 -4
  41. package/src/operations.mjs +17 -2
  42. package/src/package-identity.mjs +68 -0
  43. package/src/peer-probe.mjs +16 -0
  44. package/src/permissions.mjs +99 -6
  45. package/src/plugin-catalog.mjs +19 -4
  46. package/src/plugin-config.mjs +18 -1
  47. package/src/plugin-controls.mjs +31 -8
  48. package/src/plugin-trust.mjs +15 -6
  49. package/src/plugins/chrome-lab/bridge.mjs +19 -6
  50. package/src/plugins/chrome-lab/client.mjs +242 -12
  51. package/src/plugins/chrome-lab/index.mjs +106 -24
  52. package/src/plugins/chrome-lab/legacy-fill.mjs +25 -0
  53. package/src/plugins/chrome-lab/native-reply.mjs +31 -0
  54. package/src/plugins/omarchy/catalog.mjs +96 -0
  55. package/src/plugins/omarchy/environment.mjs +78 -0
  56. package/src/plugins/omarchy/guide.mjs +54 -0
  57. package/src/plugins/omarchy/index.mjs +213 -0
  58. package/src/plugins/omarchy/runner.mjs +62 -0
  59. package/src/plugins/omarchy/text.mjs +26 -0
  60. package/src/plugins/omarchy/tiers.mjs +157 -0
  61. package/src/plugins/open-relay/actions.mjs +212 -16
  62. package/src/plugins/open-relay/client.mjs +93 -35
  63. package/src/plugins/open-relay/decision.mjs +89 -0
  64. package/src/plugins/open-relay/dossier.mjs +23 -5
  65. package/src/plugins/open-relay/index.mjs +68 -28
  66. package/src/plugins/open-relay/lookup.mjs +41 -4
  67. package/src/plugins/open-relay/notices.mjs +48 -4
  68. package/src/plugins/open-relay/panel.mjs +59 -0
  69. package/src/plugins/open-relay/watch.mjs +198 -85
  70. package/src/plugins.mjs +12 -1
  71. package/src/process-lock.mjs +20 -12
  72. package/src/provider-auth.mjs +6 -3
  73. package/src/provider-profiles.mjs +13 -3
  74. package/src/provider.mjs +175 -30
  75. package/src/read-only-check.mjs +12 -4
  76. package/src/relay/broker.mjs +160 -0
  77. package/src/relay/cards.mjs +702 -0
  78. package/src/relay/flow.mjs +886 -0
  79. package/src/relay/follow.mjs +119 -0
  80. package/src/relay/git.mjs +23 -0
  81. package/src/relay/hub-client.mjs +163 -0
  82. package/src/relay/state.mjs +55 -0
  83. package/src/remote-control.mjs +115 -12
  84. package/src/remote-relay.mjs +468 -0
  85. package/src/session-bus.mjs +13 -3
  86. package/src/session-provider-settings.mjs +2 -2
  87. package/src/skill-runtime.mjs +8 -6
  88. package/src/source-ownership.mjs +3 -1
  89. package/src/swarm-view.mjs +53 -0
  90. package/src/tool-manifest.mjs +71 -0
  91. package/src/tool-packs.mjs +22 -6
  92. package/src/tool-schema.mjs +14 -2
  93. package/src/tools.mjs +96 -27
  94. package/src/tui/connection-transition.mjs +10 -0
  95. package/src/tui/controller.mjs +35 -9
  96. package/src/tui/discovery.mjs +13 -8
  97. package/src/tui/inbound-blocks.mjs +5 -1
  98. package/src/tui/screen.mjs +78 -15
  99. package/src/tui/swarm-panel.mjs +217 -0
  100. package/src/turn-timing.mjs +82 -0
  101. package/src/usage-accounting.mjs +12 -1
  102. package/src/vision.mjs +6 -1
  103. package/src/visual/chrome.mjs +379 -0
  104. package/src/visual/fingerprint.mjs +30 -0
  105. package/src/visual/fixtures.mjs +201 -0
  106. package/src/visual/gate.mjs +92 -0
  107. package/src/visual/judge.mjs +114 -0
  108. package/src/visual/ledger.mjs +160 -0
  109. package/src/visual/measure.mjs +145 -0
  110. package/src/visual/names.mjs +7 -0
  111. package/src/visual/operations.mjs +211 -0
  112. package/src/visual/pixel-diff.mjs +96 -0
  113. package/src/visual/png.mjs +103 -0
  114. package/src/visual/registry.mjs +265 -0
  115. package/src/visual/report.mjs +64 -0
  116. package/src/visual/verify.mjs +292 -0
  117. package/src/work-assertions.mjs +15 -4
  118. package/src/work-plan.mjs +166 -30
  119. package/src/work-state.mjs +4 -4
  120. package/src/workflows/chrome-task-adoption.mjs +7 -3
  121. package/src/workspace-serve.mjs +59 -0
package/README.md CHANGED
@@ -28,7 +28,7 @@ comal --help
28
28
 
29
29
  Keep the PATH line in your shell startup file if you use that prefix. If your Node manager already provides a user prefix, you can omit `--prefix "$HOME/.local"`. The package registers the `comal` executable; you do not need to create a shell alias.
30
30
 
31
- You can pin a version with `npx @milpa/comal@0.2.1` or `npm install --global @milpa/comal@0.2.1`. The local release manifest preserves SHA-256 and SHA-512 integrity is checked against npm at publish time. No independent publisher signature is claimed.
31
+ You can pin a version with `npx @milpa/comal@0.2.3` or `npm install --global @milpa/comal@0.2.3`. The local release manifest preserves SHA-256 and SHA-512 integrity is checked against npm at publish time. No independent publisher signature is claimed.
32
32
 
33
33
  ## Test without account or model
34
34
 
@@ -91,18 +91,6 @@
91
91
  "description": "Model capability support and provenance",
92
92
  "argument_pattern": "(?:refresh)?"
93
93
  },
94
- {
95
- "name": "permissions",
96
- "arguments": "",
97
- "description": "Permission mode, saved rules and recent decisions (read-only)",
98
- "argument_pattern": ""
99
- },
100
- {
101
- "name": "autonomy",
102
- "arguments": "",
103
- "description": "Current autonomy level (read-only)",
104
- "argument_pattern": ""
105
- },
106
94
  {
107
95
  "name": "plugins",
108
96
  "arguments": "[status|list]",
@@ -0,0 +1,209 @@
1
+ {
2
+ "protocol": "comal.remote.relay.answers.v1",
3
+ "description": "Typed browser answers to /relay cards (remote.inputs.enqueue kind=relay). Admission in Milpa is a useful pre-check, never authority: the local Comal host claims each control, revalidates it (ledger by request_id, session and epoch, local arm, expiry, card still pending, remote.inputs.validate, live relayd read) and only then mutates with the same functions as its terminal cards. The browser never sends tokens, idempotency keys, paths or ADR text. Owned by the Comal Node repository; the backend keeps a byte-identical copy.",
4
+ "control_ttl_seconds": 600,
5
+ "step_up_seconds": 600,
6
+ "arm_max_seconds": 28800,
7
+ "actions": {
8
+ "plan.approve": {
9
+ "card": "plan",
10
+ "fields": [
11
+ "digest",
12
+ "projection_sha256"
13
+ ],
14
+ "text": "none",
15
+ "text_max": 0,
16
+ "caps": [
17
+ "plans"
18
+ ],
19
+ "step_up": "recent_login"
20
+ },
21
+ "plan.reject": {
22
+ "card": "plan",
23
+ "fields": [
24
+ "digest"
25
+ ],
26
+ "text": "required",
27
+ "text_max": 4096,
28
+ "caps": [
29
+ "plans"
30
+ ],
31
+ "step_up": "none"
32
+ },
33
+ "question.option": {
34
+ "card": "question",
35
+ "fields": [
36
+ "option_index",
37
+ "option_label_sha256"
38
+ ],
39
+ "text": "optional",
40
+ "text_max": 1024,
41
+ "caps": [
42
+ "decide",
43
+ "converse"
44
+ ],
45
+ "step_up": "none"
46
+ },
47
+ "question.reply": {
48
+ "card": "question",
49
+ "fields": [],
50
+ "text": "required",
51
+ "text_max": 4096,
52
+ "caps": [
53
+ "converse"
54
+ ],
55
+ "step_up": "none"
56
+ },
57
+ "question.ack": {
58
+ "card": "question",
59
+ "fields": [],
60
+ "text": "none",
61
+ "text_max": 0,
62
+ "caps": [
63
+ "converse"
64
+ ],
65
+ "step_up": "none"
66
+ },
67
+ "criteria.accept": {
68
+ "card": "criteria",
69
+ "fields": [
70
+ "digest"
71
+ ],
72
+ "text": "none",
73
+ "text_max": 0,
74
+ "caps": [
75
+ "plans"
76
+ ],
77
+ "step_up": "recent_login"
78
+ },
79
+ "criteria.reject": {
80
+ "card": "criteria",
81
+ "fields": [
82
+ "digest"
83
+ ],
84
+ "text": "required",
85
+ "text_max": 4096,
86
+ "caps": [
87
+ "plans"
88
+ ],
89
+ "step_up": "none"
90
+ }
91
+ },
92
+ "outcomes": {
93
+ "applied": [
94
+ "approved",
95
+ "rejected",
96
+ "decided",
97
+ "answered",
98
+ "acked"
99
+ ],
100
+ "stale": [
101
+ "already_decided",
102
+ "stale",
103
+ "card_gone",
104
+ "epoch",
105
+ "digest",
106
+ "projection",
107
+ "option",
108
+ "not_pending",
109
+ "kind"
110
+ ],
111
+ "refused": [
112
+ "local_arm_off",
113
+ "local_in_progress",
114
+ "revoked",
115
+ "relay_unavailable",
116
+ "delegation",
117
+ "cap_missing",
118
+ "host_legacy",
119
+ "invalid",
120
+ "host_error"
121
+ ],
122
+ "expired": [
123
+ "expired"
124
+ ]
125
+ },
126
+ "terminal_only": [
127
+ "task.resume",
128
+ "review.override",
129
+ "review.retry",
130
+ "relay.trust",
131
+ "project.create",
132
+ "project.start",
133
+ "project.stop",
134
+ "project.attach",
135
+ "swarm.start",
136
+ "budget"
137
+ ],
138
+ "control": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "properties": {
142
+ "action": {
143
+ "enum": [
144
+ "plan.approve",
145
+ "plan.reject",
146
+ "question.option",
147
+ "question.reply",
148
+ "question.ack",
149
+ "criteria.accept",
150
+ "criteria.reject"
151
+ ]
152
+ },
153
+ "card_id": {
154
+ "type": "string",
155
+ "pattern": "^[a-f0-9]{32}$"
156
+ },
157
+ "card_seq": {
158
+ "type": "string",
159
+ "pattern": "^[1-9][0-9]{0,8}$"
160
+ },
161
+ "host_epoch": {
162
+ "type": "string",
163
+ "pattern": "^[a-f0-9]{32}$"
164
+ },
165
+ "project": {
166
+ "type": "string",
167
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,59}$"
168
+ },
169
+ "swarm": {
170
+ "type": "string",
171
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,119}$"
172
+ },
173
+ "subject": {
174
+ "type": "string",
175
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,199}$"
176
+ },
177
+ "digest": {
178
+ "type": "string",
179
+ "pattern": "^[a-f0-9]{64}$"
180
+ },
181
+ "projection_sha256": {
182
+ "type": "string",
183
+ "pattern": "^[a-f0-9]{64}$"
184
+ },
185
+ "option_index": {
186
+ "type": "integer",
187
+ "minimum": 0,
188
+ "maximum": 3
189
+ },
190
+ "option_label_sha256": {
191
+ "type": "string",
192
+ "pattern": "^[a-f0-9]{64}$"
193
+ },
194
+ "text": {
195
+ "type": "string",
196
+ "maxLength": 4096
197
+ }
198
+ },
199
+ "required": [
200
+ "action",
201
+ "card_id",
202
+ "card_seq",
203
+ "host_epoch",
204
+ "project",
205
+ "swarm",
206
+ "subject"
207
+ ]
208
+ }
209
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milpa/comal",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Comal: governed operations, execution receipts, and programming assistance in any language",
5
5
  "type": "module",
6
6
  "private": false,
@@ -19,9 +19,11 @@
19
19
  "files": [
20
20
  "bin",
21
21
  "src",
22
+ "skills",
22
23
  "backend/verifier/transport.mjs",
23
24
  "backend/contracts/artifact-check-v1.schema.json",
24
25
  "backend/contracts/remote-commands-v1.json",
26
+ "backend/contracts/remote-relay-answers-v1.json",
25
27
  "backend/contracts/remote-workspace-v1.schema.json",
26
28
  "governance/source-task-v1.json",
27
29
  "governance/source-task-v2.json",
@@ -0,0 +1,44 @@
1
+ # /mv3 — extensión de Chrome MV3 desde un brief
2
+
3
+ Construyes o corriges una extensión de Chrome Manifest V3 que cumpla los criterios de éxito de un brief. El trabajo termina cuando cada criterio tiene evidencia observable, no cuando el código parece completo.
4
+
5
+ ## 1. Entiende el encargo
6
+
7
+ - Lee completo el brief que nombra la tarea. Si no nombra uno, busca `brief.md`, `docs/brief.md` o `BRIEF*.md`.
8
+ - Mira las imágenes de referencia que nombra la tarea. Si no nombra ninguna, búscalas en `assets/`, `references/` o `visual/`. Son el aspecto esperado, no decoración.
9
+ - Haz la lista de criterios de éxito tal como los numera el brief (C1, C2, …). Si el brief no los numera, numéralos tú en el orden en que aparecen y no inventes criterios que el brief no pide.
10
+ - Revisa lo que ya existe en el workspace antes de crear archivos nuevos.
11
+
12
+ ## 2. Enruta según el tipo de criterio
13
+
14
+ - Usa `ChromeTask` sólo cuando el brief contenga un **DOM de popup** cuyo estado pueda comprobarse con selector/texto o con sus pruebas de comportamiento. Si está ofrecido y el criterio encaja, úsalo **ANTES de `WorkPlanSet`** y antes de adquirir packs o crear archivos. Declara el criterio y sus pruebas en una sola llamada; la casa asigna el proyecto y administra el plan.
15
+ - Para APIs de extensión sin popup —por ejemplo `chrome.action`, `chrome.storage`, `chrome.alarms`, `chrome.tabs` o un service worker— no uses `ChromeTask` como sustituto de una prueba de API aunque esté ofrecido. Después de una adopción popup válida, usa las herramientas `Chrome*` sin duplicar la administración con `WorkPlanSet`.
16
+ - En el resto de casos, o si no está ofrecido, usa el plan genérico con `WorkPlanSet`. La primera llamada debe incluir, además del descubrimiento del brief, una tarea de **implementación temprana** que pueda empezar en cuanto termine ese descubrimiento. No gastes una tarea o una ronda en buscar herramientas antes de tener un criterio que las necesite.
17
+ - Declara el plan inicial sólo con **operaciones ya disponibles**. No pongas herramientas MCP, `VisualVerify` o checks de navegador aún no ofrecidos en tareas futuras: añade la tarea de verificación cuando esas operaciones existan. Cada criterio termina con al menos un check observable en Chrome; leer tu propio código no basta para verificarlo.
18
+
19
+ ## 3. Aspecto visual
20
+
21
+ - Con el flujo coordinado, conserva los fixtures y criterios aceptados por la casa y no abras una segunda administración visual para el mismo trabajo.
22
+ - En el flujo genérico, consulta `/visual status` (pack `visual.accept`) sólo cuando el workspace tenga componentes visuales o el brief pida aceptación visual. Si ya hay un componente aprobado, no cambies su configuración, referencias ni criterios. Si necesitas proponer uno, pide aprobación humana con los comandos exactos de `/visual status`.
23
+ - Nunca apruebes tú referencias ni criterios. Solo la persona aprueba.
24
+ - `VisualVerify` es el check de las tareas con interfaz que tengan componentes registrados.
25
+
26
+ ## 4. Construye
27
+
28
+ - `manifest.json` con `"manifest_version": 3` y solo los permisos que el brief necesita. Explica en el resumen final por qué pide cada permiso.
29
+ - Service worker para la lógica de fondo; recuerda que Chrome lo suspende: guarda el estado en `chrome.storage`, no en variables globales.
30
+ - Content scripts para tocar páginas: el DOM real tiene iframes, shadow DOM y cambios después de cargar. Pruébalos contra páginas que los tengan cuando el brief los toque.
31
+ - Mensajería explícita entre popup, service worker y content scripts. Maneja la respuesta ausente (pestaña cerrada, worker dormido).
32
+
33
+ ## 5. Verifícate en Chrome
34
+
35
+ - Con el flujo coordinado, publica y ejecuta las comprobaciones con las herramientas `Chrome*` ofrecidas por la casa. No configures otro navegador ni un servidor propio para sustituirlas.
36
+ - En el flujo genérico, sirve las páginas con `WorkspaceServe` (pack `workspace.serve`) y observa la extensión cargada con `browser.verify`. Si el navegador no ofrece carga de extensiones, configura `chrome-devtools` con `McpConfigure` usando `npx chrome-devtools-mcp@latest --isolated --categoryExtensions`.
37
+ - Para comportamiento fuera del contrato coordinado, escribe una suite de pruebas dentro de la extensión y córrela en Chrome real contra las páginas servidas. Registra qué casos pasan.
38
+ - Después de cada cambio, vuelve a capturar y a verificar. Una evidencia de antes del cambio ya no vale.
39
+
40
+ ## 6. Reporta
41
+
42
+ - Por cada criterio: la evidencia que lo demuestra (check, prueba, captura) o qué falta.
43
+ - Nunca digas que terminaste mientras un criterio no tenga evidencia.
44
+ - Si se acaba el presupuesto de llamadas, di qué criterios quedan pendientes y que se puede continuar con `--resume`.
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Crea o corrige una extensión de Chrome MV3 a partir de un brief con criterios de éxito y referencias visuales",
3
+ "context": "inline"
4
+ }