@tacuchi/agent-workflow-cli 21.17.0 → 22.0.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 (204) hide show
  1. package/README.md +4 -16
  2. package/dist/adapters/git-cli.js +36 -0
  3. package/dist/adapters/git-cli.js.map +1 -1
  4. package/dist/application/capability/design-handler.js +67 -21
  5. package/dist/application/capability/design-handler.js.map +1 -1
  6. package/dist/application/capability/dispatcher.js +1 -1
  7. package/dist/application/capability/dispatcher.js.map +1 -1
  8. package/dist/application/capability/durable-effect.js +1 -1
  9. package/dist/application/capability/durable-effect.js.map +1 -1
  10. package/dist/application/check-branch-service.js +1 -0
  11. package/dist/application/check-branch-service.js.map +1 -1
  12. package/dist/application/checkpoint-service.js +4 -3
  13. package/dist/application/checkpoint-service.js.map +1 -1
  14. package/dist/application/design/consumer-document.js +179 -0
  15. package/dist/application/design/consumer-document.js.map +1 -0
  16. package/dist/application/design/design-gate-service.js +18 -1
  17. package/dist/application/design/design-gate-service.js.map +1 -1
  18. package/dist/application/design/design-index-service.js +22 -3
  19. package/dist/application/design/design-index-service.js.map +1 -1
  20. package/dist/application/design/design-publish-service.js +27 -6
  21. package/dist/application/design/design-publish-service.js.map +1 -1
  22. package/dist/application/design/design-simple-service.js +34 -22
  23. package/dist/application/design/design-simple-service.js.map +1 -1
  24. package/dist/application/dev-only-services.js +19 -12
  25. package/dist/application/dev-only-services.js.map +1 -1
  26. package/dist/application/docs-canon-service.js +79 -5
  27. package/dist/application/docs-canon-service.js.map +1 -1
  28. package/dist/application/dsn-reader-service.js +12 -47
  29. package/dist/application/dsn-reader-service.js.map +1 -1
  30. package/dist/application/export-service.js +20 -11
  31. package/dist/application/export-service.js.map +1 -1
  32. package/dist/application/flow/flow-service.js +25 -0
  33. package/dist/application/flow/flow-service.js.map +1 -1
  34. package/dist/application/flow/internal-actions.js +5 -0
  35. package/dist/application/flow/internal-actions.js.map +1 -1
  36. package/dist/application/flow/submit.js +152 -22
  37. package/dist/application/flow/submit.js.map +1 -1
  38. package/dist/application/history-table.js +82 -44
  39. package/dist/application/history-table.js.map +1 -1
  40. package/dist/application/history-update-service.js +19 -9
  41. package/dist/application/history-update-service.js.map +1 -1
  42. package/dist/application/hook-git-commit-advisor.js +5 -4
  43. package/dist/application/hook-git-commit-advisor.js.map +1 -1
  44. package/dist/application/hook-sql-mutation-guard.js +1 -1
  45. package/dist/application/hook-sql-mutation-guard.js.map +1 -1
  46. package/dist/application/lifecycle-target.js +1 -0
  47. package/dist/application/lifecycle-target.js.map +1 -1
  48. package/dist/application/local-proposal.js +47 -23
  49. package/dist/application/local-proposal.js.map +1 -1
  50. package/dist/application/mcp-connections-service.js +37 -2
  51. package/dist/application/mcp-connections-service.js.map +1 -1
  52. package/dist/application/mcp-dbhub-launcher.js +22 -50
  53. package/dist/application/mcp-dbhub-launcher.js.map +1 -1
  54. package/dist/application/mcp-doctor-service.js +14 -23
  55. package/dist/application/mcp-doctor-service.js.map +1 -1
  56. package/dist/application/mcp-remove-service.js +3 -3
  57. package/dist/application/mcp-remove-service.js.map +1 -1
  58. package/dist/application/mcp-setup-service.js +4 -4
  59. package/dist/application/mcp-setup-service.js.map +1 -1
  60. package/dist/application/mcp-test-connection-service.js +4 -6
  61. package/dist/application/mcp-test-connection-service.js.map +1 -1
  62. package/dist/application/parsers/phases.js +17 -5
  63. package/dist/application/parsers/phases.js.map +1 -1
  64. package/dist/application/parsers/project-block.js +5 -11
  65. package/dist/application/parsers/project-block.js.map +1 -1
  66. package/dist/application/parsers/sessions-csv.js +16 -14
  67. package/dist/application/parsers/sessions-csv.js.map +1 -1
  68. package/dist/application/parsers/spec-relation.js +15 -11
  69. package/dist/application/parsers/spec-relation.js.map +1 -1
  70. package/dist/application/parsers/tasks.js +25 -1
  71. package/dist/application/parsers/tasks.js.map +1 -1
  72. package/dist/application/persist-service.js +67 -29
  73. package/dist/application/persist-service.js.map +1 -1
  74. package/dist/application/plugin-doctor/skills.js +1 -40
  75. package/dist/application/plugin-doctor/skills.js.map +1 -1
  76. package/dist/application/plugin-doctor-service.js +1 -3
  77. package/dist/application/plugin-doctor-service.js.map +1 -1
  78. package/dist/application/release-data/artifacts.js +1 -0
  79. package/dist/application/release-data/artifacts.js.map +1 -1
  80. package/dist/application/release-data/bundles.js +15 -6
  81. package/dist/application/release-data/bundles.js.map +1 -1
  82. package/dist/application/release-data/common.js +16 -7
  83. package/dist/application/release-data/common.js.map +1 -1
  84. package/dist/application/release-data/sessions.js +36 -8
  85. package/dist/application/release-data/sessions.js.map +1 -1
  86. package/dist/application/render/project-block.js +2 -2
  87. package/dist/application/render/project-block.js.map +1 -1
  88. package/dist/application/resume-service.js +9 -1
  89. package/dist/application/resume-service.js.map +1 -1
  90. package/dist/application/retirement/graph.js +14 -13
  91. package/dist/application/retirement/graph.js.map +1 -1
  92. package/dist/application/retirement/prepare.js +15 -2
  93. package/dist/application/retirement/prepare.js.map +1 -1
  94. package/dist/application/retirement/resolve.js.map +1 -1
  95. package/dist/application/self/clean-legacy.js +2 -4
  96. package/dist/application/self/clean-legacy.js.map +1 -1
  97. package/dist/application/self/mcp-config.js +8 -9
  98. package/dist/application/self/mcp-config.js.map +1 -1
  99. package/dist/application/session-close-service.js +8 -2
  100. package/dist/application/session-close-service.js.map +1 -1
  101. package/dist/application/session-create-service.js +26 -14
  102. package/dist/application/session-create-service.js.map +1 -1
  103. package/dist/application/session-resolver.js +80 -34
  104. package/dist/application/session-resolver.js.map +1 -1
  105. package/dist/application/session-resume-service.js +4 -3
  106. package/dist/application/session-resume-service.js.map +1 -1
  107. package/dist/application/source-boundary-policy.js +483 -0
  108. package/dist/application/source-boundary-policy.js.map +1 -0
  109. package/dist/application/status-service.js +1 -0
  110. package/dist/application/status-service.js.map +1 -1
  111. package/dist/application/workline-index-service.js +42 -20
  112. package/dist/application/workline-index-service.js.map +1 -1
  113. package/dist/application/workspace-migrate/apply.js +2 -4
  114. package/dist/application/workspace-migrate/apply.js.map +1 -1
  115. package/dist/application/workspace-migrate/plan.js +9 -6
  116. package/dist/application/workspace-migrate/plan.js.map +1 -1
  117. package/dist/application/workspace-migrate/preview.js +3 -3
  118. package/dist/application/workspace-migrate/preview.js.map +1 -1
  119. package/dist/application/worktree-service.js +3 -0
  120. package/dist/application/worktree-service.js.map +1 -1
  121. package/dist/cli/commands/capability.js +89 -5
  122. package/dist/cli/commands/capability.js.map +1 -1
  123. package/dist/cli/commands/designs.js +2 -6
  124. package/dist/cli/commands/designs.js.map +1 -1
  125. package/dist/cli/commands/dev-only.js +1 -1
  126. package/dist/cli/commands/dev-only.js.map +1 -1
  127. package/dist/cli/commands/flow.js +3 -1
  128. package/dist/cli/commands/flow.js.map +1 -1
  129. package/dist/cli/commands/index.js +0 -2
  130. package/dist/cli/commands/index.js.map +1 -1
  131. package/dist/cli/commands/mcp.js +53 -55
  132. package/dist/cli/commands/mcp.js.map +1 -1
  133. package/dist/cli/commands/persist.js +27 -21
  134. package/dist/cli/commands/persist.js.map +1 -1
  135. package/dist/cli/commands/resume.js +2 -2
  136. package/dist/cli/commands/resume.js.map +1 -1
  137. package/dist/cli/commands/session-create.js +2 -1
  138. package/dist/cli/commands/session-create.js.map +1 -1
  139. package/dist/cli/help-groups.js +0 -1
  140. package/dist/cli/help-groups.js.map +1 -1
  141. package/dist/cli/main.js +0 -0
  142. package/dist/cli/main.js.map +1 -1
  143. package/dist/cli/parser.js +1 -0
  144. package/dist/cli/parser.js.map +1 -1
  145. package/dist/cli/tui/data/recommended-skills.js +2 -2
  146. package/dist/cli/tui/data/recommended-skills.js.map +1 -1
  147. package/dist/cli/tui/tabs/mcp-tab-helpers.js +1 -1
  148. package/dist/cli/tui/tabs/mcp-tab.js +2 -2
  149. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  150. package/dist/domain/capability/protocol.js.map +1 -1
  151. package/dist/domain/correlative.js +121 -0
  152. package/dist/domain/correlative.js.map +1 -0
  153. package/dist/domain/design/capability.js +18 -0
  154. package/dist/domain/design/capability.js.map +1 -1
  155. package/dist/domain/docs-canon.js +31 -0
  156. package/dist/domain/docs-canon.js.map +1 -0
  157. package/dist/domain/flow/answer.js +57 -1
  158. package/dist/domain/flow/answer.js.map +1 -1
  159. package/dist/domain/flow/authority.js +28 -29
  160. package/dist/domain/flow/authority.js.map +1 -1
  161. package/dist/domain/flow/execution-result.js +13 -1
  162. package/dist/domain/flow/execution-result.js.map +1 -1
  163. package/dist/domain/flow/run-state.js.map +1 -1
  164. package/dist/domain/mcp-entry.js +7 -12
  165. package/dist/domain/mcp-entry.js.map +1 -1
  166. package/dist/domain/retirement/selector.js +16 -14
  167. package/dist/domain/retirement/selector.js.map +1 -1
  168. package/dist/domain/source-boundary.js +3 -0
  169. package/dist/domain/source-boundary.js.map +1 -0
  170. package/dist/domain/workline-node.js +12 -5
  171. package/dist/domain/workline-node.js.map +1 -1
  172. package/dist/runtime/namespace-resolver.js +0 -3
  173. package/dist/runtime/namespace-resolver.js.map +1 -1
  174. package/package.json +5 -5
  175. package/skills/w/SKILL.md +2 -2
  176. package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +14 -9
  177. package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +7 -0
  178. package/skills/w/commands/export-scripts.md +8 -2
  179. package/skills/w/commands/plan-new.md +1 -0
  180. package/skills/w/context/MANIFEST.json +2 -9
  181. package/skills/w/exports/export-scripts/EXPORT.md +13 -9
  182. package/skills/w/loops/CHASSIS.md +1 -1
  183. package/skills/w/loops/plan-exec-loop/LOOP.md +14 -10
  184. package/skills/w/loops/plan-new-loop/LOOP.md +16 -16
  185. package/skills/w/loops/plan-refine-loop/LOOP.md +6 -1
  186. package/skills/w/loops/quick-loop/LOOP.md +2 -2
  187. package/skills/w/loops/spec-refine-loop/LOOP.md +4 -0
  188. package/skills/w/modules/DB-RESEARCH-RULE.md +5 -5
  189. package/skills/w/modules/DB-SCRIPTS-ONLY.md +5 -6
  190. package/skills/w/modules/EXEC-DB-POLICY.md +2 -2
  191. package/skills/w/modules/PLAN-INPUT.md +11 -9
  192. package/skills/w/roles/sql/ROLE.md +9 -9
  193. package/dist/application/decisiones-service.js +0 -31
  194. package/dist/application/decisiones-service.js.map +0 -1
  195. package/dist/application/dev-bootstrap-dsn-service.js +0 -76
  196. package/dist/application/dev-bootstrap-dsn-service.js.map +0 -1
  197. package/dist/application/profile/profile-service.js +0 -199
  198. package/dist/application/profile/profile-service.js.map +0 -1
  199. package/dist/application/tasks-service.js +0 -45
  200. package/dist/application/tasks-service.js.map +0 -1
  201. package/dist/cli/commands/bootstrap-dsn.js +0 -16
  202. package/dist/cli/commands/bootstrap-dsn.js.map +0 -1
  203. package/dist/cli/tui/components/process-list.js +0 -43
  204. package/dist/cli/tui/components/process-list.js.map +0 -1
@@ -21,7 +21,7 @@ description: >-
21
21
 
22
22
  Author database changes as **versioned SQL scripts**, never executing them. Two modes:
23
23
 
24
- - **Read-only** (query): read schema/data via MCP to understand the domain (research, planning).
24
+ - **Read-only** (query): read schema/data through a registered connection to understand the domain (research, planning).
25
25
  - **Write-to-script** (change): every DB mutation is written to the session's `SCRIPTS.sql`; the **user applies it**, never the AI.
26
26
 
27
27
  ## Composed by
@@ -35,11 +35,11 @@ Author database changes as **versioned SQL scripts**, never executing them. Two
35
35
 
36
36
  ### Rule zero — never execute SQL (invariant 4)
37
37
 
38
- The AI **never executes DML/DDL** against any DB, through any channel (MCP, `psql`, `Bash`, an app driver). Migrations stay in `SCRIPTS.sql` and the **user applies them**. If the temptation "verify by applying" appears, refuse and ask the user to run it.
38
+ The AI **never executes DML/DDL** against any DB, through any channel (MCP, `psql`, `Bash`, an app driver). Migrations stay in `SCRIPTS.sql` and external application is a handoff. Local fixture or ephemeral-DB tests may verify the checkout contract; a deployed application is never a closing requirement.
39
39
 
40
- - **Read-only reads via MCP**: `SELECT`, schema inspection, counts — OK. No `INSERT/UPDATE/DELETE/CREATE/ALTER/DROP/TRUNCATE`.
41
- - The DB MCPs (cert/prod) are **READONLY** by contract.
42
- - Single exception, which does NOT relax the rule: if the user explicitly asks "run it yourself against cert", still confirm per block and never assume broadened authorization.
40
+ - **Read-only remote reads**: `SELECT`, schema inspection, counts — research context only. No `INSERT/UPDATE/DELETE/CREATE/ALTER/DROP/TRUNCATE`.
41
+ - Choose only a registered connection; the registry, not environment-name conventions, supplies its exact DSN variable.
42
+ - A remote snapshot is recorded before plan approval and is never refreshed from `plan-exec`.
43
43
 
44
44
  ### Staging — a single `SCRIPTS.sql` per session
45
45
 
@@ -53,7 +53,7 @@ Every statement is **appended** with a pair of comment markers:
53
53
  ```sql
54
54
  -- @category: 01-ddl-tablas
55
55
  -- @stmt: 01-crear-tabla-usuarios
56
- CREATE TABLE IF NOT EXISTS esq_credito.tb_usuarios (
56
+ CREATE TABLE IF NOT EXISTS <schema>.<table> (
57
57
  ...
58
58
  );
59
59
  ```
@@ -90,7 +90,7 @@ CREATE TABLE IF NOT EXISTS esq_credito.tb_usuarios (
90
90
 
91
91
  Only 4 fields. Author/Date/long notes do NOT go in the header (a free block below, if needed). If the engine is not Postgres, state it in `Objeto:`.
92
92
  - **Idempotency**: `CREATE TABLE IF NOT EXISTS`, `DROP ... IF EXISTS`, `CREATE OR REPLACE`, `ON CONFLICT`.
93
- - **Explicit schema** always (`esq_credito.tb_x`, never `public.`).
93
+ - **Explicit schema when the project has one** (`<schema>.<table>`); never invent a schema name or assume `public`.
94
94
  - **CTEs over DO/LOOP**: one transformation = chained `WITH ... AS` + one final `INSERT/UPDATE/DELETE`. Avoid `DO $$ ... LOOP ... END $$` when the result is achievable declaratively (easier to audit and revert). Exception: dynamic object discovery (FKs/columns/constraints) — document the reason in `Objeto:`.
95
95
  - **Parametrized queries** always (never string concatenation) — in any SQL that ends up in app code.
96
96
  - Never create `fn_*`/`sp_*` to reuse logic exclusive to one script; use a CTE or inline.
@@ -124,10 +124,10 @@ CREATE TABLE IF NOT EXISTS esq_credito.tb_usuarios (
124
124
  | `CREATE INDEX idx_...` | `DROP INDEX IF EXISTS idx_...;` |
125
125
  | `CREATE SEQUENCE seq_...` | `DROP SEQUENCE IF EXISTS seq_...;` |
126
126
  | `CREATE OR REPLACE FUNCTION fn_x(...)` | `DROP FUNCTION IF EXISTS fn_x(<signature>);` |
127
- | `UPDATE/DELETE` with a backup in `esq_audit.tb_bkp_*` | `UPDATE … FROM esq_audit.tb_bkp_…` |
127
+ | `UPDATE/DELETE` with a declared backup table | `UPDATE … FROM <backup_schema>.<backup_table>` |
128
128
  | `INSERT INTO tb_x VALUES (...)` | `DELETE FROM tb_x WHERE <natural key / range>;` (never DELETE without WHERE) |
129
129
 
130
- **Irreversible → manual "Fase 5" block** (outside the transaction, one line per case): `TRUNCATE`, `DROP COLUMN`/`DROP TABLE` without backup, lossy `ALTER COLUMN TYPE`, `DROP ... CASCADE`, `DELETE/UPDATE` without a backup in `esq_audit`. To make a destructive change reversible, write the backup in the same forward (`esq_audit.tb_bkp_<table>_sNNN`).
130
+ **Irreversible → manual "Fase 5" block** (outside the transaction, one line per case): `TRUNCATE`, `DROP COLUMN`/`DROP TABLE` without backup, lossy `ALTER COLUMN TYPE`, `DROP ... CASCADE`, `DELETE/UPDATE` without a declared backup. To make a destructive change reversible, write the project-appropriate backup in the same forward (`<backup_schema>.<backup_table>`).
131
131
 
132
132
  ## Output
133
133
 
@@ -1,31 +0,0 @@
1
- import { parseDecisiones } from "./parsers/decisiones.js";
2
- import { relpath } from "./paths.js";
3
- import { canonicalArtifactPath, findArtifact } from "./session-artifacts.js";
4
- import { resolveSessionTarget, sessionReadRequest, } from "./session-resolver.js";
5
- export async function runDecisionesCommand(fs, env, paths, input) {
6
- const resolution = await resolveSessionTarget(fs, paths, sessionReadRequest(input));
7
- if (resolution.outcome !== "resolved")
8
- return { sessionError: resolution };
9
- const session = resolution.session;
10
- const decPath = await findArtifact(session.path, "decisions", fs);
11
- if (!decPath) {
12
- return {
13
- session: session.folder,
14
- path: relpath(canonicalArtifactPath(session.path, "decisions"), env.cwd()),
15
- exists: false,
16
- count: 0,
17
- items: [],
18
- };
19
- }
20
- const pathPosix = relpath(decPath, env.cwd());
21
- const text = await fs.readText(decPath);
22
- const items = parseDecisiones(text, input.full === true);
23
- return {
24
- session: session.folder,
25
- path: pathPosix,
26
- exists: true,
27
- count: items.length,
28
- items,
29
- };
30
- }
31
- //# sourceMappingURL=decisiones-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisiones-service.js","sourceRoot":"","sources":["../../src/application/decisiones-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAqB/B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAA6B;IAE7B,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,IAAI,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC1E,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -1,76 +0,0 @@
1
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
- import { dirname } from "node:path";
3
- export function runBootstrapDsn(paths, input) {
4
- const entries = [];
5
- if (input.certDsn)
6
- entries.push({ key: "DB_CERT_DSN", value: input.certDsn });
7
- if (input.prodDsn)
8
- entries.push({ key: "DB_PROD_DSN", value: input.prodDsn });
9
- if (entries.length === 0) {
10
- return {
11
- error: "Ni DB_CERT_DSN ni DB_PROD_DSN visibles en el entorno actual. Exportalas en ~/.zshenv (macOS/Linux) o System Environment (Windows) y reabrí Claude Code desde una terminal donde 'echo $DB_CERT_DSN' devuelva valor.",
12
- exitCode: 2,
13
- };
14
- }
15
- const path = writeDsnValues(paths, entries);
16
- return { ok: true, path, wrote: entries.map((entry) => entry.key) };
17
- }
18
- export function writeDsnValue(paths, input) {
19
- const path = writeDsnValues(paths, [input]);
20
- return { ok: true, path, key: input.key };
21
- }
22
- /**
23
- * Upsert of every entry into dsn.env, preserving the lines this call does not
24
- * own: the file is shared by every connection the user ever bootstrapped, so a
25
- * whole-file rewrite would drop the DSNs of the other ones.
26
- */
27
- function writeDsnValues(paths, entries) {
28
- const target = paths.userDsnFile();
29
- let lines = readDsnLines(target);
30
- for (const entry of entries) {
31
- lines = upsertDsnLine(lines, entry.key, entry.value);
32
- }
33
- mkdirSync(dirname(target), { recursive: true });
34
- writeFileSync(target, `${lines.join("\n")}\n`, "utf-8");
35
- try {
36
- chmodSync(target, 0o600);
37
- }
38
- catch {
39
- // Best effort: filesystems without POSIX modes (Windows, FAT) must not fail
40
- // a write that already landed. The DSN is still written.
41
- }
42
- return target;
43
- }
44
- function readDsnLines(path) {
45
- if (!existsSync(path))
46
- return [];
47
- const lines = readFileSync(path, "utf-8").split(/\r?\n/);
48
- // Only the empty tail the final newline produces is dropped. Blank lines
49
- // inside the file are the user's own grouping of a file this tool shares with
50
- // them, and an upsert has no business collapsing it.
51
- if (lines[lines.length - 1] === "")
52
- lines.pop();
53
- return lines;
54
- }
55
- function upsertDsnLine(lines, key, value) {
56
- const prefix = `${key}=`;
57
- const next = [];
58
- let replaced = false;
59
- for (const line of lines) {
60
- // Compare the line trimmed: an indented assignment still assigns, and
61
- // leaving it behind would keep a stale credential alive in a file the user
62
- // believes updated. Duplicates of the same key collapse into the first.
63
- if (!line.trimStart().startsWith(prefix)) {
64
- next.push(line);
65
- continue;
66
- }
67
- if (replaced)
68
- continue;
69
- replaced = true;
70
- next.push(`${key}=${value}`);
71
- }
72
- if (!replaced)
73
- next.push(`${key}=${value}`);
74
- return next;
75
- }
76
- //# sourceMappingURL=dev-bootstrap-dsn-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-bootstrap-dsn-service.js","sourceRoot":"","sources":["../../src/application/dev-bootstrap-dsn-service.ts"],"names":[],"mappings":"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"}
@@ -1,199 +0,0 @@
1
- import { isAbsolute, join } from "node:path";
2
- export const ENV_VAR_PROFILE = "AW_PROFILE";
3
- export const USER_CONFIG_RELPATH = join(".config", "agent-workflow", "profile.json");
4
- export const WORKSPACE_PROFILE_FILENAME = "profile.json";
5
- export const DEFAULT_NAMESPACE = "agent-workflow";
6
- export const DEFAULT_PROFILE = Object.freeze({
7
- namespace: DEFAULT_NAMESPACE,
8
- company: "agent-workflow",
9
- claude_md_block: "AW-PROJECT",
10
- mcp_databases: [],
11
- lexicon_path: null,
12
- examples_path: null,
13
- migrate_legacy_rules: [],
14
- custom_anchors: [],
15
- });
16
- export async function resolveProfile(fs, env, input = {}) {
17
- const cwd = env.cwd();
18
- const home = env.homeDir();
19
- const wsNs = (input.workspaceNamespace ?? DEFAULT_NAMESPACE).trim() || DEFAULT_NAMESPACE;
20
- const flagPath = (input.flagPath ?? "").trim();
21
- if (flagPath.length > 0) {
22
- const abs = isAbsolute(flagPath) ? flagPath : join(cwd, flagPath);
23
- return loadOrFail(fs, abs, "flag");
24
- }
25
- const envValue = (env.get(ENV_VAR_PROFILE) ?? "").trim();
26
- if (envValue.length > 0) {
27
- const abs = isAbsolute(envValue) ? envValue : join(cwd, envValue);
28
- return loadOrFail(fs, abs, "env");
29
- }
30
- const userPath = join(home, USER_CONFIG_RELPATH);
31
- if (await fs.exists(userPath)) {
32
- return loadOrFail(fs, userPath, "user-config");
33
- }
34
- const workspacePath = join(cwd, `.${wsNs}`, WORKSPACE_PROFILE_FILENAME);
35
- if (await fs.exists(workspacePath)) {
36
- return loadOrFail(fs, workspacePath, "workspace");
37
- }
38
- // structuredClone also unfreezes the frozen DEFAULT_PROFILE for the caller.
39
- return { profile: structuredClone(DEFAULT_PROFILE), source: "default", path: null };
40
- }
41
- async function loadOrFail(fs, path, source) {
42
- if (!(await fs.exists(path))) {
43
- return {
44
- code: "PROFILE_NOT_FOUND",
45
- message: `profile no encontrado (${source}): ${path}`,
46
- path,
47
- };
48
- }
49
- const text = await fs.readText(path);
50
- const parsed = parseAndValidate(text, path);
51
- if ("code" in parsed)
52
- return parsed;
53
- return { profile: parsed, source, path };
54
- }
55
- function parseAndValidate(text, path) {
56
- let raw;
57
- try {
58
- raw = JSON.parse(text);
59
- }
60
- catch (err) {
61
- return {
62
- code: "PROFILE_INVALID_JSON",
63
- message: `JSON inválido en ${path}: ${err.message}`,
64
- path,
65
- };
66
- }
67
- return validateProfile(raw, path);
68
- }
69
- export function validateProfile(raw, path) {
70
- if (!isObject(raw))
71
- return failSchema("root", "objeto esperado", path);
72
- const scalarErr = validateScalarFields(raw, path);
73
- if (scalarErr !== null)
74
- return scalarErr;
75
- const arrayErr = validateArrayFields(raw, path);
76
- if (arrayErr !== null)
77
- return arrayErr;
78
- return {
79
- namespace: raw.namespace,
80
- company: raw.company,
81
- claude_md_block: raw.claude_md_block,
82
- mcp_databases: raw.mcp_databases.map((d) => ({ ...d })),
83
- lexicon_path: (raw.lexicon_path ?? null),
84
- examples_path: (raw.examples_path ?? null),
85
- migrate_legacy_rules: raw.migrate_legacy_rules.map((r) => ({ ...r })),
86
- custom_anchors: raw.custom_anchors.map((a) => ({ ...a })),
87
- };
88
- }
89
- function validateScalarFields(raw, path) {
90
- if (!isNonEmptyString(raw.namespace) || !isKebab(raw.namespace)) {
91
- return failSchema("namespace", "string kebab no vacío (^[a-z][a-z0-9-]*$)", path);
92
- }
93
- if (!isNonEmptyString(raw.company)) {
94
- return failSchema("company", "string no vacío", path);
95
- }
96
- if (!isNonEmptyString(raw.claude_md_block) ||
97
- !/^[A-Z][A-Z0-9_-]*$/.test(raw.claude_md_block)) {
98
- return failSchema("claude_md_block", "string [A-Z][A-Z0-9_-]*", path);
99
- }
100
- const lexErr = validateNullableString(raw.lexicon_path, "lexicon_path", path);
101
- if (lexErr !== null)
102
- return lexErr;
103
- const exErr = validateNullableString(raw.examples_path, "examples_path", path);
104
- if (exErr !== null)
105
- return exErr;
106
- return null;
107
- }
108
- function validateNullableString(value, field, path) {
109
- if (value === null || value === undefined)
110
- return null;
111
- if (!isNonEmptyString(value))
112
- return failSchema(field, "string no vacío o null", path);
113
- return null;
114
- }
115
- function validateArrayFields(raw, path) {
116
- const mcpErr = validateArray(raw.mcp_databases, "mcp_databases", validateMcpDatabase, path);
117
- if (mcpErr !== null)
118
- return mcpErr;
119
- const ruleErr = validateArray(raw.migrate_legacy_rules, "migrate_legacy_rules", validateLegacyRule, path);
120
- if (ruleErr !== null)
121
- return ruleErr;
122
- const anchorErr = validateArray(raw.custom_anchors, "custom_anchors", validateAnchor, path);
123
- if (anchorErr !== null)
124
- return anchorErr;
125
- return null;
126
- }
127
- function validateArray(value, field, item, path) {
128
- if (!Array.isArray(value))
129
- return failSchema(field, "array", path);
130
- for (let i = 0; i < value.length; i++) {
131
- const err = item(value[i], i, path);
132
- if (err !== null)
133
- return err;
134
- }
135
- return null;
136
- }
137
- function validateMcpDatabase(raw, idx, path) {
138
- const field = `mcp_databases[${idx}]`;
139
- if (!isObject(raw))
140
- return failSchema(field, "objeto esperado", path);
141
- if (!isNonEmptyString(raw.alias))
142
- return failSchema(`${field}.alias`, "string no vacío", path);
143
- if (!isNonEmptyString(raw.host))
144
- return failSchema(`${field}.host`, "string no vacío", path);
145
- if (typeof raw.port !== "number" ||
146
- !Number.isInteger(raw.port) ||
147
- raw.port <= 0 ||
148
- raw.port > 65535) {
149
- return failSchema(`${field}.port`, "entero 1-65535", path);
150
- }
151
- if (!isNonEmptyString(raw.database))
152
- return failSchema(`${field}.database`, "string no vacío", path);
153
- if (raw.schema !== undefined && !isNonEmptyString(raw.schema)) {
154
- return failSchema(`${field}.schema`, "string no vacío o undefined", path);
155
- }
156
- return null;
157
- }
158
- function validateLegacyRule(raw, idx, path) {
159
- const field = `migrate_legacy_rules[${idx}]`;
160
- if (!isObject(raw))
161
- return failSchema(field, "objeto esperado", path);
162
- if (!isNonEmptyString(raw.from))
163
- return failSchema(`${field}.from`, "string no vacío", path);
164
- if (!isNonEmptyString(raw.to))
165
- return failSchema(`${field}.to`, "string no vacío", path);
166
- if (raw.scope !== undefined &&
167
- !["skill", "command", "hook", "anchor"].includes(raw.scope)) {
168
- return failSchema(`${field}.scope`, "skill|command|hook|anchor o undefined", path);
169
- }
170
- return null;
171
- }
172
- function validateAnchor(raw, idx, path) {
173
- const field = `custom_anchors[${idx}]`;
174
- if (!isObject(raw))
175
- return failSchema(field, "objeto esperado", path);
176
- if (!isNonEmptyString(raw.anchor))
177
- return failSchema(`${field}.anchor`, "string no vacío", path);
178
- if (!isNonEmptyString(raw.target))
179
- return failSchema(`${field}.target`, "string no vacío", path);
180
- return null;
181
- }
182
- function isObject(v) {
183
- return typeof v === "object" && v !== null && !Array.isArray(v);
184
- }
185
- function isNonEmptyString(v) {
186
- return typeof v === "string" && v.trim().length > 0;
187
- }
188
- function isKebab(s) {
189
- return /^[a-z][a-z0-9-]*$/.test(s);
190
- }
191
- function failSchema(field, expected, path) {
192
- return {
193
- code: "PROFILE_INVALID_SCHEMA",
194
- message: `${field}: ${expected}`,
195
- field,
196
- ...(path !== undefined ? { path } : {}),
197
- };
198
- }
199
- //# sourceMappingURL=profile-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-service.js","sourceRoot":"","sources":["../../../src/application/profile/profile-service.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import { join } from "node:path";
2
- import { parseTasks } from "./parsers/tasks.js";
3
- import { relpath } from "./paths.js";
4
- import { resolveSessionTarget, sessionReadRequest, } from "./session-resolver.js";
5
- export async function runTasksCommand(fs, env, paths, input) {
6
- const resolution = await resolveSessionTarget(fs, paths, sessionReadRequest(input));
7
- if (resolution.outcome !== "resolved")
8
- return { sessionError: resolution };
9
- const session = resolution.session;
10
- const tasksPath = join(session.path, "TASKS.md");
11
- const cwd = env.cwd();
12
- const verbose = input.verbose === true;
13
- const pathOut = verbose ? tasksPath : relpath(tasksPath, cwd);
14
- if (!(await fs.exists(tasksPath))) {
15
- return {
16
- session: session.folder,
17
- path: pathOut,
18
- exists: false,
19
- total: 0,
20
- open: 0,
21
- closed: 0,
22
- progress_pct: 0,
23
- items: [],
24
- next_open: null,
25
- };
26
- }
27
- const text = await fs.readText(tasksPath);
28
- const parsed = parseTasks(text, !verbose);
29
- let items = parsed.items;
30
- if (input.onlyOpen === true) {
31
- items = items.filter((t) => t.status === "open");
32
- }
33
- return {
34
- session: session.folder,
35
- path: pathOut,
36
- exists: true,
37
- total: parsed.total,
38
- open: parsed.open,
39
- closed: parsed.closed,
40
- progress_pct: parsed.progress_pct,
41
- items,
42
- next_open: parsed.next_open,
43
- };
44
- }
45
- //# sourceMappingURL=tasks-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-service.js","sourceRoot":"","sources":["../../src/application/tasks-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAmC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAwB/B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAAwB;IAExB,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAE9D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAgB,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -1,16 +0,0 @@
1
- import { runBootstrapDsn } from "../../application/dev-bootstrap-dsn-service.js";
2
- import { fail } from "../render.js";
3
- export const bootstrapDsnCommand = {
4
- name: "bootstrap-dsn",
5
- describe: "Persist DB_CERT_DSN/DB_PROD_DSN to the namespace's dsn.env file.",
6
- async execute(_args, ctx) {
7
- const certDsn = ctx.env.get("DB_CERT_DSN");
8
- const prodDsn = ctx.env.get("DB_PROD_DSN");
9
- const result = runBootstrapDsn(ctx.paths, { certDsn, prodDsn });
10
- if ("error" in result) {
11
- return fail("MISSING_DSN", result.error, { error: result.error }, 2);
12
- }
13
- return { ok: true, data: result, exitCode: 0 };
14
- },
15
- };
16
- //# sourceMappingURL=bootstrap-dsn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap-dsn.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap-dsn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAIjF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,kEAAkE;IAC5E,KAAK,CAAC,OAAO,CAAC,KAAiB,EAAE,GAAe;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;CACF,CAAC"}
@@ -1,43 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { colors, icons } from "../theme.js";
4
- import { ListRow } from "./list-row.js";
5
- import { SectionHead } from "./section-head.js";
6
- const STATE_TONE = {
7
- running: "ok",
8
- stopped: "warn",
9
- exited: "dim",
10
- };
11
- const STATE_LABEL = {
12
- running: "running",
13
- stopped: "stopped",
14
- exited: "exited",
15
- };
16
- /** Clock portion (HH:MM) of an ISO timestamp; "?" when unparseable. */
17
- function startedClock(iso) {
18
- const m = /T(\d{2}:\d{2})/.exec(iso);
19
- return m?.[1] ?? "?";
20
- }
21
- /**
22
- * "Procesos lanzados" — the launched source processes (in a visible terminal, or
23
- * background when no terminal was available), with their reconciled state.
24
- * Navigable in process mode.
25
- */
26
- export function ProcessList({ processes, cursor, focused, widthHint }) {
27
- const rightAction = processes.length > 0
28
- ? focused
29
- ? "↑↓ select · x stop · r relaunch · o log · esc"
30
- : "p manage"
31
- : undefined;
32
- return (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: "Procesos lanzados", count: processes.length, marginTop: 1, ...(rightAction ? { rightAction } : {}) }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: processes.length === 0 ? (_jsx(Text, { color: colors.faint, children: "(sin procesos \u2014 lanz\u00E1 un source con \u23CE \u2192 Lanzar en local)" })) : (processes.map((p, i) => (_jsx(ProcessRow, { record: p, active: focused && i === cursor, widthHint: widthHint }, p.id)))) })] }));
33
- }
34
- function ProcessRow({ record, active, widthHint, }) {
35
- const profile = record.profile ?? "default";
36
- const mode = record.launchMode === "terminal"
37
- ? " · terminal"
38
- : record.launchMode === "background"
39
- ? " · bg"
40
- : "";
41
- return (_jsx(ListRow, { icon: icons.diamond, title: `${record.sourceAlias} · ${profile}`, subtitle: `PID ${record.pid} · desde ${startedClock(record.startedAt)}${mode}`, meta: [{ label: STATE_LABEL[record.state], tone: STATE_TONE[record.state] }], state: { label: record.command, tone: "dim" }, active: active, widthHint: widthHint }));
42
- }
43
- //# sourceMappingURL=process-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-list.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/process-list.tsx"],"names":[],"mappings":"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"}