@tacuchi/agent-workflow-cli 25.6.1 → 25.8.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.
- package/CHANGELOG.md +4398 -0
- package/README.md +1 -1
- package/dist/adapters/git-cli.js +160 -13
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +39 -2
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/branch-resolver.js +34 -1
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/capability/readiness.js +26 -10
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/capability/wrapper.js +10 -3
- package/dist/application/capability/wrapper.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +161 -39
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/dates.js +12 -0
- package/dist/application/dates.js.map +1 -1
- package/dist/application/dev-only-services.js +5 -7
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/doctor/provider-mcps.js +1 -1
- package/dist/application/doctor/provider-mcps.js.map +1 -1
- package/dist/application/fix-git-service.js +83 -13
- package/dist/application/fix-git-service.js.map +1 -1
- package/dist/application/flow/advance.js +64 -9
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/annul-service.js +159 -0
- package/dist/application/flow/annul-service.js.map +1 -0
- package/dist/application/flow/checkout-observation.js +49 -0
- package/dist/application/flow/checkout-observation.js.map +1 -1
- package/dist/application/flow/close-at-boundary.js +144 -0
- package/dist/application/flow/close-at-boundary.js.map +1 -0
- package/dist/application/flow/flow-service.js +213 -49
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +87 -4
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +70 -33
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/reopen-run.js +152 -0
- package/dist/application/flow/reopen-run.js.map +1 -0
- package/dist/application/flow/run-journey.js +11 -8
- package/dist/application/flow/run-journey.js.map +1 -1
- package/dist/application/flow/run-projection.js +37 -10
- package/dist/application/flow/run-projection.js.map +1 -1
- package/dist/application/flow/run-state-service.js +109 -36
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +217 -188
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/git-flow-service.js +325 -72
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/hook-sql-mutation-guard.js +290 -27
- package/dist/application/hook-sql-mutation-guard.js.map +1 -1
- package/dist/application/host-memory/claude-code.js +65 -0
- package/dist/application/host-memory/claude-code.js.map +1 -0
- package/dist/application/host-memory/codex.js +225 -0
- package/dist/application/host-memory/codex.js.map +1 -0
- package/dist/application/host-memory/destination.js +52 -0
- package/dist/application/host-memory/destination.js.map +1 -0
- package/dist/application/host-memory/reader.js +9 -0
- package/dist/application/host-memory/reader.js.map +1 -0
- package/dist/application/host-memory/report.js +136 -0
- package/dist/application/host-memory/report.js.map +1 -0
- package/dist/application/lifecycle-target.js +3 -1
- package/dist/application/lifecycle-target.js.map +1 -1
- package/dist/application/local-proposal.js +13 -3
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/logging/log-events.js +22 -0
- package/dist/application/logging/log-events.js.map +1 -1
- package/dist/application/parsers/spec-relation.js +20 -7
- package/dist/application/parsers/spec-relation.js.map +1 -1
- package/dist/application/persist-service.js +45 -1
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +47 -2
- package/dist/application/plan-exec-batch-service.js.map +1 -1
- package/dist/application/plan-lineage-seal.js +93 -0
- package/dist/application/plan-lineage-seal.js.map +1 -0
- package/dist/application/plan-lint-service.js +153 -0
- package/dist/application/plan-lint-service.js.map +1 -0
- package/dist/application/prod-consent.js +75 -0
- package/dist/application/prod-consent.js.map +1 -0
- package/dist/application/reseal-service.js +9 -3
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/self/install-skill.js +40 -12
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/install-targets.js +73 -2
- package/dist/application/self/install-targets.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -7
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/self/update-self.js +204 -8
- package/dist/application/self/update-self.js.map +1 -1
- package/dist/application/session-create-service.js +49 -0
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-custody-recorder.js +4 -0
- package/dist/application/session-custody-recorder.js.map +1 -1
- package/dist/application/session-narrative.js +36 -0
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/session-resolver.js +28 -9
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +65 -16
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/source-boundary-policy.js +168 -34
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/working-branch-service.js +68 -0
- package/dist/application/working-branch-service.js.map +1 -0
- package/dist/application/workline-graph.js +7 -2
- package/dist/application/workline-graph.js.map +1 -1
- package/dist/cli/ascii.js +84 -0
- package/dist/cli/ascii.js.map +1 -0
- package/dist/cli/commands/amend.js +1 -0
- package/dist/cli/commands/amend.js.map +1 -1
- package/dist/cli/commands/capability.js +15 -0
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/check-branch.js +1 -0
- package/dist/cli/commands/check-branch.js.map +1 -1
- package/dist/cli/commands/checkpoint-read.js +1 -0
- package/dist/cli/commands/checkpoint-read.js.map +1 -1
- package/dist/cli/commands/checkpoint-write.js +22 -9
- package/dist/cli/commands/checkpoint-write.js.map +1 -1
- package/dist/cli/commands/claims.js +1 -0
- package/dist/cli/commands/claims.js.map +1 -1
- package/dist/cli/commands/code-scan.js +1 -0
- package/dist/cli/commands/code-scan.js.map +1 -1
- package/dist/cli/commands/context-budget.js +1 -0
- package/dist/cli/commands/context-budget.js.map +1 -1
- package/dist/cli/commands/context-plan.js +1 -0
- package/dist/cli/commands/context-plan.js.map +1 -1
- package/dist/cli/commands/cut-intent.js +1 -0
- package/dist/cli/commands/cut-intent.js.map +1 -1
- package/dist/cli/commands/designs.js +1 -0
- package/dist/cli/commands/designs.js.map +1 -1
- package/dist/cli/commands/dev-only.js +4 -0
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/doctor.js +5 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.js +13 -0
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/fix-git.js +46 -6
- package/dist/cli/commands/fix-git.js.map +1 -1
- package/dist/cli/commands/flow.js +61 -5
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-launch.js +1 -0
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/git-flow.js +104 -29
- package/dist/cli/commands/git-flow.js.map +1 -1
- package/dist/cli/commands/history-update.js +7 -9
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/hook.js +11 -3
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/host-doctor.js +1 -0
- package/dist/cli/commands/host-doctor.js.map +1 -1
- package/dist/cli/commands/host-memory.js +26 -0
- package/dist/cli/commands/host-memory.js.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/mcp.js +30 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/merge-state.js +1 -0
- package/dist/cli/commands/merge-state.js.map +1 -1
- package/dist/cli/commands/multiroot.js +16 -0
- package/dist/cli/commands/multiroot.js.map +1 -1
- package/dist/cli/commands/persist.js +6 -0
- package/dist/cli/commands/persist.js.map +1 -1
- package/dist/cli/commands/plan.js +51 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/plugin-cache.js +4 -0
- package/dist/cli/commands/plugin-cache.js.map +1 -1
- package/dist/cli/commands/plugin-doctor.js +3 -0
- package/dist/cli/commands/plugin-doctor.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +3 -0
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/release-data.js +12 -0
- package/dist/cli/commands/release-data.js.map +1 -1
- package/dist/cli/commands/release-pass.js +10 -0
- package/dist/cli/commands/release-pass.js.map +1 -1
- package/dist/cli/commands/remove-source.js +1 -0
- package/dist/cli/commands/remove-source.js.map +1 -1
- package/dist/cli/commands/reseal.js +1 -0
- package/dist/cli/commands/reseal.js.map +1 -1
- package/dist/cli/commands/resume-summary.js +9 -2
- package/dist/cli/commands/resume-summary.js.map +1 -1
- package/dist/cli/commands/resume.js +1 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/retirement.js +1 -0
- package/dist/cli/commands/retirement.js.map +1 -1
- package/dist/cli/commands/self.js +33 -0
- package/dist/cli/commands/self.js.map +1 -1
- package/dist/cli/commands/session-artifacts.js +1 -0
- package/dist/cli/commands/session-artifacts.js.map +1 -1
- package/dist/cli/commands/session-close.js +129 -30
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +1 -0
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-resume.js +1 -0
- package/dist/cli/commands/session-resume.js.map +1 -1
- package/dist/cli/commands/sessions.js +1 -0
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/set-branch.js +41 -6
- package/dist/cli/commands/set-branch.js.map +1 -1
- package/dist/cli/commands/settle.js +1 -0
- package/dist/cli/commands/settle.js.map +1 -1
- package/dist/cli/commands/skill-index.js +1 -0
- package/dist/cli/commands/skill-index.js.map +1 -1
- package/dist/cli/commands/skills.js +1 -0
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/sources.js +1 -0
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/stack.js +1 -0
- package/dist/cli/commands/stack.js.map +1 -1
- package/dist/cli/commands/status.js +1 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/tool.js +5 -21
- package/dist/cli/commands/tool.js.map +1 -1
- package/dist/cli/commands/unknown-flags.js +67 -16
- package/dist/cli/commands/unknown-flags.js.map +1 -1
- package/dist/cli/commands/visibility.js +1 -0
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +12 -0
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +2 -13
- package/dist/cli/commands/workspace-migrate.js.map +1 -1
- package/dist/cli/commands/worktree.js +1 -0
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/help-groups.js +41 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +41 -58
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output-mode.js +11 -2
- package/dist/cli/output-mode.js.map +1 -1
- package/dist/cli/parser.js +14 -5
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/render.js +30 -1
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/tui/components/git-flow-actions.js +65 -20
- package/dist/cli/tui/components/git-flow-actions.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +101 -12
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/domain/changelog-contract.js +172 -0
- package/dist/domain/changelog-contract.js.map +1 -0
- package/dist/domain/database-tools.js +1 -189
- package/dist/domain/database-tools.js.map +1 -1
- package/dist/domain/flow/answer.js +11 -0
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +153 -14
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/execution-result.js +78 -7
- package/dist/domain/flow/execution-result.js.map +1 -1
- package/dist/domain/flow/journey-baseline.js +131 -0
- package/dist/domain/flow/journey-baseline.js.map +1 -0
- package/dist/domain/flow/route.js.map +1 -1
- package/dist/domain/flow/rules.js +5 -6
- package/dist/domain/flow/rules.js.map +1 -1
- package/dist/domain/flow/run-state.js +440 -89
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/harnesses.js +8 -1
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/host-memory/model.js +2 -0
- package/dist/domain/host-memory/model.js.map +1 -0
- package/dist/domain/host-memory/provenance.js +43 -0
- package/dist/domain/host-memory/provenance.js.map +1 -0
- package/dist/domain/host-memory/topic.js +26 -0
- package/dist/domain/host-memory/topic.js.map +1 -0
- package/dist/domain/lineage.js +11 -3
- package/dist/domain/lineage.js.map +1 -1
- package/dist/domain/proposal.js +7 -0
- package/dist/domain/proposal.js.map +1 -1
- package/dist/domain/session/custody.js.map +1 -1
- package/dist/domain/sql-lexer.js +240 -0
- package/dist/domain/sql-lexer.js.map +1 -0
- package/package.json +2 -2
- package/skills/w/SKILL.md +9 -9
- package/skills/w/commands/README.md +2 -1
- package/skills/w/commands/recall.md +39 -0
- package/skills/w/context/MANIFEST.json +4 -0
- package/skills/w/harness/HARNESS.md +12 -6
- package/skills/w/hooks/README.md +27 -16
- package/skills/w/loops/CHASSIS.md +16 -12
- package/skills/w/loops/CODE-POLICIES.md +11 -6
- package/skills/w/loops/plan-exec-loop/LOOP.md +9 -9
- package/skills/w/modules/COMPACTION.md +1 -1
- package/skills/w/roles/design/CONTRACT.md +10 -3
|
@@ -1,20 +1,49 @@
|
|
|
1
|
+
// Patterns and display name are read from the runtime config (Phase 3 agnostic CLI).
|
|
2
|
+
import { scanSql, } from "../domain/sql-lexer.js";
|
|
1
3
|
import { parseHookPayload } from "./hook-common.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
4
|
+
import { resolveMcpConnectionSelection } from "./mcp-connections-service.js";
|
|
5
|
+
// The spec's closed list of reads (S051/AC-12): anything else is blocked, even
|
|
6
|
+
// without a mutation keyword, because a mutation list lets through what it omits.
|
|
7
|
+
const READ_STATEMENTS = new Set(["SELECT", "VALUES", "TABLE", "SHOW"]);
|
|
8
|
+
const EXPLAIN_LEGACY_OPTIONS = new Set(["ANALYZE", "ANALYSE", "VERBOSE"]);
|
|
9
|
+
const STATEMENT_DISPLAY_CHARS = 120;
|
|
10
|
+
// Functions that run the SQL text of one of their arguments: the first one, or
|
|
11
|
+
// the last one that is not a fail_on_error flag. dblink's connection is not the
|
|
12
|
+
// caller's transaction, so not even serve-db's READ ONLY covers it.
|
|
13
|
+
const SQL_TEXT_FUNCTIONS = new Map([
|
|
14
|
+
["query_to_xml", "first"],
|
|
15
|
+
["query_to_xmlschema", "first"],
|
|
16
|
+
["query_to_xml_and_xmlschema", "first"],
|
|
17
|
+
["dblink", "last"],
|
|
18
|
+
["dblink_exec", "last"],
|
|
19
|
+
["dblink_send_query", "last"],
|
|
20
|
+
["dblink_open", "last"],
|
|
21
|
+
]);
|
|
22
|
+
const BOOLEAN_LITERALS = new Set(["TRUE", "FALSE"]);
|
|
23
|
+
const REASONS = {
|
|
24
|
+
undelimited: "el SQL no se puede delimitar: hay un literal, un identificador o un comentario sin cerrar",
|
|
25
|
+
into: "lleva INTO: SELECT … INTO crea una tabla, no la lee",
|
|
26
|
+
noRead: "no empieza con una lectura",
|
|
27
|
+
withShape: "el WITH no tiene la forma nombre AS (…)",
|
|
28
|
+
explainShape: "las opciones de EXPLAIN no cierran su paréntesis",
|
|
29
|
+
unclassifiable: "el SQL no se pudo clasificar hasta el final, por ejemplo porque anida más de lo que la guarda puede recorrer",
|
|
30
|
+
sqlTextNotLiteral: (name) => `${name} ejecuta un SQL que no es un único literal, y no se puede juzgar`,
|
|
31
|
+
sqlTextNotRead: (name, reason) => `${name} ejecuta un SQL que no lee: ${reason}`,
|
|
32
|
+
escapedFunctionName: "llama a una función cuyo nombre lleva escapes U&, y no se puede saber cuál es",
|
|
33
|
+
};
|
|
34
|
+
// PostgreSQL reads these differently than MySQL; a server that may be either
|
|
35
|
+
// is read both ways, and the other reading could hide a second statement.
|
|
36
|
+
const MARK_REASONS = {
|
|
37
|
+
hash: "tiene un # fuera de un literal, que otro motor lee como comentario",
|
|
38
|
+
backtick: "tiene un backtick fuera de un literal, que otro motor lee como identificador",
|
|
39
|
+
"backslash-quote": "tiene una \\ antes de una comilla, que otro motor lee como escape y cierra el literal en otro lugar",
|
|
40
|
+
"executable-comment": "tiene un comentario /*! … */, que MySQL ejecuta como SQL",
|
|
41
|
+
"dollar-quote": "tiene un literal entre $…$, que sólo PostgreSQL lee como literal",
|
|
42
|
+
};
|
|
43
|
+
const DIALECT_DISPLAY = {
|
|
44
|
+
postgres: "PostgreSQL, registrado en aw self mcp",
|
|
45
|
+
unknown: "sin declarar: el servidor no está registrado en aw self mcp y se lee también como MySQL",
|
|
46
|
+
};
|
|
18
47
|
export function runSqlMutationGuard(input) {
|
|
19
48
|
const patterns = input.runtime.mcpGuards?.sqlMutation;
|
|
20
49
|
if (!patterns) {
|
|
@@ -41,13 +70,32 @@ export function runSqlMutationGuard(input) {
|
|
|
41
70
|
const sql = extractSql(payload.tool_input);
|
|
42
71
|
if (!sql)
|
|
43
72
|
return { exitCode: 0 };
|
|
44
|
-
const
|
|
45
|
-
|
|
73
|
+
const dialect = dialectOf(toolName, input.paths);
|
|
74
|
+
const blocked = findNonReadOrBlock(sql, dialect);
|
|
75
|
+
if (blocked === null)
|
|
46
76
|
return { exitCode: 0 };
|
|
47
77
|
const display = input.runtime.displayName ?? "agent-workflow";
|
|
48
|
-
const msg = formatBlockMessage(toolName, serverFull,
|
|
78
|
+
const msg = formatBlockMessage(toolName, serverFull, dialect, blocked, display);
|
|
49
79
|
return { exitCode: 2, stderr: msg };
|
|
50
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Every connection in the `aw self mcp` registry is served by `aw mcp serve-db`,
|
|
83
|
+
* which speaks only PostgreSQL, and the host names its tools `mcp__<name>__…`.
|
|
84
|
+
*/
|
|
85
|
+
function dialectOf(toolName, paths) {
|
|
86
|
+
try {
|
|
87
|
+
const registry = resolveMcpConnectionSelection(paths, { allConnections: true });
|
|
88
|
+
if (!registry.ok)
|
|
89
|
+
return "unknown";
|
|
90
|
+
const served = registry.connections.some((connection) => connection.provider === "postgres" && toolName.startsWith(`mcp__${connection.name}__`));
|
|
91
|
+
return served ? "postgres" : "unknown";
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// A throw would exit the hook with a code the host does not block on; an
|
|
95
|
+
// unreadable registry declares nothing, so the server is read both ways.
|
|
96
|
+
return "unknown";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
51
99
|
function compilePatterns(patterns) {
|
|
52
100
|
try {
|
|
53
101
|
return {
|
|
@@ -78,21 +126,236 @@ function extractSql(toolInput) {
|
|
|
78
126
|
}
|
|
79
127
|
return "";
|
|
80
128
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
129
|
+
/**
|
|
130
|
+
* The host blocks only on exit 2, and a throw leaves the hook with another code:
|
|
131
|
+
* a nesting deep enough to exhaust the stack is blocked, never let through.
|
|
132
|
+
*/
|
|
133
|
+
function findNonReadOrBlock(sql, dialect) {
|
|
134
|
+
try {
|
|
135
|
+
return findNonRead(sql, dialect);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return {
|
|
139
|
+
statement: `entrada completa · ${displayStatement(sql)}`,
|
|
140
|
+
reason: REASONS.unclassifiable,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function findNonRead(sql, dialect) {
|
|
145
|
+
const scan = scanSql(sql);
|
|
146
|
+
if (!scan.ok) {
|
|
147
|
+
return {
|
|
148
|
+
statement: `entrada completa · ${displayStatement(sql)}`,
|
|
149
|
+
reason: REASONS.undelimited,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// An empty or comment-only statement runs nothing; it is neither counted nor classified.
|
|
153
|
+
const statements = scan.statements.filter((s) => s.tokens.length > 0 || marksOf(s, dialect).length > 0);
|
|
154
|
+
for (const [position, statement] of statements.entries()) {
|
|
155
|
+
const reason = classifyStatement(statement, dialect);
|
|
156
|
+
if (reason === null)
|
|
157
|
+
continue;
|
|
158
|
+
const text = displayStatement(sql.slice(statement.start, statement.end));
|
|
159
|
+
return { statement: `${position + 1} de ${statements.length} · ${text}`, reason };
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/** Every mark is another engine's reading, so PostgreSQL has none to fear. */
|
|
164
|
+
function marksOf(statement, dialect) {
|
|
165
|
+
return dialect === "postgres" ? [] : statement.marks;
|
|
166
|
+
}
|
|
167
|
+
/** Returns why the statement is not a read, or null when it reads. */
|
|
168
|
+
function classifyStatement(statement, dialect) {
|
|
169
|
+
const mark = marksOf(statement, dialect)[0];
|
|
170
|
+
if (mark !== undefined)
|
|
171
|
+
return MARK_REASONS[mark];
|
|
172
|
+
const { tokens } = statement;
|
|
173
|
+
const shape = classifyRange(tokens, 0, tokens.length);
|
|
174
|
+
if (shape !== null)
|
|
175
|
+
return shape;
|
|
176
|
+
if (tokens.includes("INTO"))
|
|
177
|
+
return REASONS.into;
|
|
178
|
+
return classifySqlTextCalls(statement);
|
|
179
|
+
}
|
|
180
|
+
/** A function that runs SQL text reads only when that text is one literal that reads. */
|
|
181
|
+
function classifySqlTextCalls(statement) {
|
|
182
|
+
const { tokens } = statement;
|
|
183
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
184
|
+
if (tokens[index + 1] !== "(")
|
|
185
|
+
continue;
|
|
186
|
+
if (isEscapedName(tokens, index))
|
|
187
|
+
return REASONS.escapedFunctionName;
|
|
188
|
+
const call = sqlTextFunctionOf(tokens[index] ?? "");
|
|
189
|
+
if (call === undefined)
|
|
190
|
+
continue;
|
|
191
|
+
const text = sqlTextArgument(statement, index + 1, call.position);
|
|
192
|
+
if (text === undefined)
|
|
193
|
+
return REASONS.sqlTextNotLiteral(call.name);
|
|
194
|
+
// Only PostgreSQL has these functions, so the text they run is PostgreSQL.
|
|
195
|
+
const inner = findNonRead(text, "postgres");
|
|
196
|
+
if (inner !== null)
|
|
197
|
+
return REASONS.sqlTextNotRead(call.name, inner.reason);
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
/** `U&"…"`, with or without UESCAPE, spells the name through escapes the guard does not decode. */
|
|
202
|
+
function isEscapedName(tokens, index) {
|
|
203
|
+
const token = tokens[index] ?? "";
|
|
204
|
+
return token === "UESCAPE" || (token.startsWith('"') && tokens[index - 1] === "U");
|
|
205
|
+
}
|
|
206
|
+
/** A bare name folds to lower case, as PostgreSQL resolves it; a quoted one does not. */
|
|
207
|
+
function sqlTextFunctionOf(token) {
|
|
208
|
+
const name = token.startsWith('"') ? token.slice(1, -1) : token.toLowerCase();
|
|
209
|
+
const position = SQL_TEXT_FUNCTIONS.get(name);
|
|
210
|
+
return position === undefined ? undefined : { name, position };
|
|
211
|
+
}
|
|
212
|
+
/** The SQL text the call at `open` runs, or undefined when it is not one literal. */
|
|
213
|
+
function sqlTextArgument(statement, open, position) {
|
|
214
|
+
const { tokens } = statement;
|
|
215
|
+
const close = matchingParen(tokens, open, tokens.length);
|
|
216
|
+
if (close < 0)
|
|
217
|
+
return undefined;
|
|
218
|
+
const args = callArguments(tokens, open, close);
|
|
219
|
+
const sqlArgs = position === "first"
|
|
220
|
+
? args.slice(0, 1)
|
|
221
|
+
: args.filter(([start, end]) => end - start !== 1 || !BOOLEAN_LITERALS.has(tokens[start] ?? ""));
|
|
222
|
+
const arg = sqlArgs.at(-1);
|
|
223
|
+
return arg === undefined ? undefined : soleLiteral(statement.literals, arg);
|
|
224
|
+
}
|
|
225
|
+
/** Token ranges [start, end) of the call's arguments, split at its own commas. */
|
|
226
|
+
function callArguments(tokens, open, close) {
|
|
227
|
+
const args = [];
|
|
228
|
+
let depth = 0;
|
|
229
|
+
let start = open + 1;
|
|
230
|
+
for (let index = open + 1; index < close; index += 1) {
|
|
231
|
+
const token = tokens[index];
|
|
232
|
+
if (token === "(")
|
|
233
|
+
depth += 1;
|
|
234
|
+
else if (token === ")")
|
|
235
|
+
depth -= 1;
|
|
236
|
+
else if (token === "," && depth === 0) {
|
|
237
|
+
args.push([start, index]);
|
|
238
|
+
start = index + 1;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
args.push([start, close]);
|
|
242
|
+
return args;
|
|
243
|
+
}
|
|
244
|
+
/** An argument with no token of its own is its literals; only one is judged. */
|
|
245
|
+
function soleLiteral(literals, [start, end]) {
|
|
246
|
+
if (start !== end)
|
|
247
|
+
return undefined;
|
|
248
|
+
const inside = literals.filter((literal) => literal.at === start);
|
|
249
|
+
return inside.length === 1 ? inside[0]?.text : undefined;
|
|
250
|
+
}
|
|
251
|
+
function classifyRange(tokens, start, end) {
|
|
252
|
+
let index = start;
|
|
253
|
+
while (index < end && tokens[index] === "(")
|
|
254
|
+
index += 1;
|
|
255
|
+
const first = index < end ? tokens[index] : undefined;
|
|
256
|
+
if (first === undefined || first === ")" || first === ",")
|
|
257
|
+
return REASONS.noRead;
|
|
258
|
+
if (READ_STATEMENTS.has(first))
|
|
259
|
+
return null;
|
|
260
|
+
if (first === "WITH")
|
|
261
|
+
return classifyWith(tokens, index + 1, end);
|
|
262
|
+
if (first === "EXPLAIN")
|
|
263
|
+
return classifyExplain(tokens, index + 1, end);
|
|
264
|
+
return `${first} no es una lectura`;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Only a top-level WITH may hold data-modifying parts, so each part's body and
|
|
268
|
+
* the main statement are classified; nested WITHs recurse through classifyRange.
|
|
269
|
+
*/
|
|
270
|
+
function classifyWith(tokens, start, end) {
|
|
271
|
+
let index = tokens[start] === "RECURSIVE" ? start + 1 : start;
|
|
272
|
+
for (;;) {
|
|
273
|
+
const part = classifyWithPart(tokens, index, end);
|
|
274
|
+
if (typeof part === "string")
|
|
275
|
+
return part;
|
|
276
|
+
index = part.next;
|
|
277
|
+
if (tokens[index] !== ",")
|
|
278
|
+
break;
|
|
279
|
+
index += 1;
|
|
280
|
+
}
|
|
281
|
+
const main = classifyRange(tokens, index, end);
|
|
282
|
+
return main === null ? null : `la sentencia principal del WITH: ${main}`;
|
|
283
|
+
}
|
|
284
|
+
/** Reads `name [(columns)] AS [NOT] [MATERIALIZED] (body)`; returns why it fails or where it ends. */
|
|
285
|
+
function classifyWithPart(tokens, start, end) {
|
|
286
|
+
const as = indexAtDepth(tokens, "AS", start, end);
|
|
287
|
+
if (as < 0)
|
|
288
|
+
return REASONS.withShape;
|
|
289
|
+
let open = as + 1;
|
|
290
|
+
if (tokens[open] === "NOT")
|
|
291
|
+
open += 1;
|
|
292
|
+
if (tokens[open] === "MATERIALIZED")
|
|
293
|
+
open += 1;
|
|
294
|
+
const close = tokens[open] === "(" ? matchingParen(tokens, open, end) : -1;
|
|
295
|
+
if (close < 0)
|
|
296
|
+
return REASONS.withShape;
|
|
297
|
+
const body = classifyRange(tokens, open + 1, close);
|
|
298
|
+
return body === null ? { next: close + 1 } : `una parte del WITH: ${body}`;
|
|
299
|
+
}
|
|
300
|
+
/** EXPLAIN is classified by what it explains, with or without ANALYZE. */
|
|
301
|
+
function classifyExplain(tokens, start, end) {
|
|
302
|
+
let index = start;
|
|
303
|
+
if (tokens[index] === "(") {
|
|
304
|
+
const close = matchingParen(tokens, index, end);
|
|
305
|
+
if (close < 0)
|
|
306
|
+
return REASONS.explainShape;
|
|
307
|
+
index = close + 1;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
while (EXPLAIN_LEGACY_OPTIONS.has(tokens[index] ?? ""))
|
|
311
|
+
index += 1;
|
|
312
|
+
}
|
|
313
|
+
const target = classifyRange(tokens, index, end);
|
|
314
|
+
return target === null ? null : `EXPLAIN de otra sentencia: ${target}`;
|
|
315
|
+
}
|
|
316
|
+
function indexAtDepth(tokens, word, start, end) {
|
|
317
|
+
let depth = 0;
|
|
318
|
+
for (let index = start; index < end; index += 1) {
|
|
319
|
+
const token = tokens[index];
|
|
320
|
+
if (token === "(")
|
|
321
|
+
depth += 1;
|
|
322
|
+
else if (token === ")")
|
|
323
|
+
depth -= 1;
|
|
324
|
+
else if (depth === 0 && token === word)
|
|
325
|
+
return index;
|
|
326
|
+
if (depth < 0)
|
|
327
|
+
return -1;
|
|
328
|
+
}
|
|
329
|
+
return -1;
|
|
330
|
+
}
|
|
331
|
+
function matchingParen(tokens, open, end) {
|
|
332
|
+
let depth = 0;
|
|
333
|
+
for (let index = open; index < end; index += 1) {
|
|
334
|
+
if (tokens[index] === "(")
|
|
335
|
+
depth += 1;
|
|
336
|
+
else if (tokens[index] === ")")
|
|
337
|
+
depth -= 1;
|
|
338
|
+
if (depth === 0)
|
|
339
|
+
return index;
|
|
340
|
+
}
|
|
341
|
+
return -1;
|
|
85
342
|
}
|
|
86
|
-
function
|
|
87
|
-
|
|
343
|
+
function displayStatement(text) {
|
|
344
|
+
const compact = text.replace(/\s+/g, " ").trim();
|
|
345
|
+
return compact.length > STATEMENT_DISPLAY_CHARS
|
|
346
|
+
? `${compact.slice(0, STATEMENT_DISPLAY_CHARS)}…`
|
|
347
|
+
: compact;
|
|
88
348
|
}
|
|
89
|
-
function formatBlockMessage(toolName, server,
|
|
349
|
+
function formatBlockMessage(toolName, server, dialect, blocked, display) {
|
|
90
350
|
return `${[
|
|
91
351
|
`[${display} sql-mutation-guard] Bloqueado por shared-contract §30 (política BD universal).`,
|
|
92
352
|
` Tool : ${toolName}`,
|
|
93
353
|
` Servidor : ${server}`,
|
|
94
|
-
`
|
|
354
|
+
` Motor : ${DIALECT_DISPLAY[dialect]}`,
|
|
355
|
+
` Sentencia : ${blocked.statement}`,
|
|
356
|
+
` Motivo : ${blocked.reason}`,
|
|
95
357
|
"",
|
|
358
|
+
"Sólo pasan lecturas: SELECT sin INTO, WITH de lecturas, EXPLAIN de una lectura, SHOW, VALUES y TABLE.",
|
|
96
359
|
"Las mutaciones a BD (DML/DDL) NO se ejecutan desde una sesión.",
|
|
97
360
|
"Materializá el cambio como script SQL en docs/scripts/ del workspace",
|
|
98
361
|
"de la fuente y pedile al usuario que lo aplique manualmente.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-sql-mutation-guard.js","sourceRoot":"","sources":["../../src/application/hook-sql-mutation-guard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hook-sql-mutation-guard.js","sourceRoot":"","sources":["../../src/application/hook-sql-mutation-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { parseSkillFrontmatter } from "../../domain/skill-frontmatter.js";
|
|
3
|
+
import { isoDay, sortedEntries } from "./reader.js";
|
|
4
|
+
/** The index Claude Code loads each session; it points at the notes and is not one. */
|
|
5
|
+
const INDEX_FILE = "MEMORY.md";
|
|
6
|
+
/**
|
|
7
|
+
* Claude Code keeps one note per fact in `~/.claude/projects/<key>/memory/`, with
|
|
8
|
+
* a frontmatter `description` (the brief form) and, on newer notes, a
|
|
9
|
+
* `metadata.modified` date. Every project folder is read: a learning about
|
|
10
|
+
* Workline can live in any of them.
|
|
11
|
+
*/
|
|
12
|
+
export async function readClaudeCodeMemory(fs, home) {
|
|
13
|
+
const projects = join(home, ".claude", "projects");
|
|
14
|
+
if (!(await fs.exists(projects)))
|
|
15
|
+
return { state: "absent", reason: `no existe ${projects}` };
|
|
16
|
+
const items = [];
|
|
17
|
+
const skipped = [];
|
|
18
|
+
let memoryDirs = 0;
|
|
19
|
+
for (const project of await sortedEntries(fs, projects)) {
|
|
20
|
+
const memory = join(project.path, "memory");
|
|
21
|
+
if (project.type !== "dir" || !(await fs.exists(memory)))
|
|
22
|
+
continue;
|
|
23
|
+
memoryDirs++;
|
|
24
|
+
await readMemoryDir(fs, memory, project.name, items, skipped);
|
|
25
|
+
}
|
|
26
|
+
if (memoryDirs === 0) {
|
|
27
|
+
return { state: "absent", reason: `ninguna carpeta memory/ bajo ${projects}` };
|
|
28
|
+
}
|
|
29
|
+
return { state: "read", items, skipped };
|
|
30
|
+
}
|
|
31
|
+
async function readMemoryDir(fs, memory, project, items, skipped) {
|
|
32
|
+
for (const file of await sortedEntries(fs, memory)) {
|
|
33
|
+
if (file.type !== "file" || !file.name.endsWith(".md") || file.name === INDEX_FILE)
|
|
34
|
+
continue;
|
|
35
|
+
const note = await readNote(fs, file.path, `${project}/${file.name}`);
|
|
36
|
+
if ("reason" in note)
|
|
37
|
+
skipped.push(note);
|
|
38
|
+
else
|
|
39
|
+
items.push(note);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function readNote(fs, path, key) {
|
|
43
|
+
let content;
|
|
44
|
+
try {
|
|
45
|
+
content = await fs.readText(path);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { path, reason: `no se pudo leer: ${err.message}` };
|
|
49
|
+
}
|
|
50
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
51
|
+
if (frontmatter === null)
|
|
52
|
+
return { path, reason: "sin frontmatter" };
|
|
53
|
+
const description = frontmatter.fields.description?.trim();
|
|
54
|
+
if (!description)
|
|
55
|
+
return { path, reason: "el frontmatter no trae description" };
|
|
56
|
+
return {
|
|
57
|
+
key,
|
|
58
|
+
date: isoDay(frontmatter.metadata.modified),
|
|
59
|
+
text: description,
|
|
60
|
+
topic: content,
|
|
61
|
+
body: content,
|
|
62
|
+
source: { path, section: null },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/application/host-memory/claude-code.ts"],"names":[],"mappings":"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"}
|