@tacuchi/agent-workflow-cli 21.10.1 → 21.11.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/dist/application/dev-bootstrap-dsn-service.js +45 -35
- package/dist/application/dev-bootstrap-dsn-service.js.map +1 -1
- package/dist/application/docs-canon-service.js +68 -0
- package/dist/application/docs-canon-service.js.map +1 -0
- package/dist/application/dsn-reader-service.js +53 -2
- package/dist/application/dsn-reader-service.js.map +1 -1
- package/dist/application/mcp-dbhub-launcher.js +193 -34
- package/dist/application/mcp-dbhub-launcher.js.map +1 -1
- package/dist/application/mcp-doctor-service.js +13 -4
- package/dist/application/mcp-doctor-service.js.map +1 -1
- package/dist/application/mcp-test-connection-service.js +5 -11
- package/dist/application/mcp-test-connection-service.js.map +1 -1
- package/dist/application/visibility-doctor-service.js +89 -49
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/workspace-migrate/apply.js +57 -0
- package/dist/application/workspace-migrate/apply.js.map +1 -0
- package/dist/application/workspace-migrate/markers.js +177 -0
- package/dist/application/workspace-migrate/markers.js.map +1 -0
- package/dist/application/workspace-migrate/plan.js +171 -0
- package/dist/application/workspace-migrate/plan.js.map +1 -0
- package/dist/application/workspace-migrate/preview.js +111 -0
- package/dist/application/workspace-migrate/preview.js.map +1 -0
- package/dist/cli/commands/unknown-flags.js +51 -0
- package/dist/cli/commands/unknown-flags.js.map +1 -0
- package/dist/cli/commands/visibility.js +105 -16
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +70 -0
- package/dist/cli/commands/workspace-migrate.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-doctor-service.js","sourceRoot":"","sources":["../../src/application/mcp-doctor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAIL,aAAa,EACb,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-doctor-service.js","sourceRoot":"","sources":["../../src/application/mcp-doctor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// fatal errors (it sits waiting for MCP input on stdio), the connection is
|
|
4
4
|
// considered valid. If dbhub fails quickly with stderr, the test fails with the detail.
|
|
5
5
|
import { spawn } from "node:child_process";
|
|
6
|
-
import {
|
|
6
|
+
import { resolveDsnFromCandidates } from "./dsn-reader-service.js";
|
|
7
7
|
export async function testMcpConnection(input) {
|
|
8
8
|
const resolved = resolveDsnString(input);
|
|
9
9
|
if (!resolved) {
|
|
@@ -16,16 +16,10 @@ export async function testMcpConnection(input) {
|
|
|
16
16
|
return spawnDbhub(resolved.dsn, resolved.source, input);
|
|
17
17
|
}
|
|
18
18
|
function resolveDsnString(input) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const bootstrap = readBootstrapDsn(input.paths);
|
|
24
|
-
const fromFile = bootstrap.values[input.dsnVar];
|
|
25
|
-
if (fromFile && fromFile.length > 0) {
|
|
26
|
-
return { dsn: fromFile, source: "dsn.env" };
|
|
27
|
-
}
|
|
28
|
-
return null;
|
|
19
|
+
// The tester is given the exact variable name to probe (the caller already
|
|
20
|
+
// picked it), so it hands the shared resolver a single candidate — unlike the
|
|
21
|
+
// launcher, which derives the organisation-prefix alternatives.
|
|
22
|
+
return resolveDsnFromCandidates([input.dsnVar], input.env, input.paths);
|
|
29
23
|
}
|
|
30
24
|
function spawnDbhub(dsn, source, input) {
|
|
31
25
|
const timeoutMs = input.timeoutMs ?? 5000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-connection-service.js","sourceRoot":"","sources":["../../src/application/mcp-test-connection-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,2EAA2E;AAC3E,wFAAwF;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-test-connection-service.js","sourceRoot":"","sources":["../../src/application/mcp-test-connection-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,2EAA2E;AAC3E,wFAAwF;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAsB,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAqBvF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA6B;IAE7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,wCAAwC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE;SAC1F,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA6B;IACrD,2EAA2E;IAC3E,8EAA8E;IAC9E,gEAAgE;IAChE,OAAO,wBAAwB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,UAAU,CACjB,GAAW,EACX,MAAyB,EACzB,KAA6B;IAE7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE;YAClD,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,MAA+B,EAAQ,EAAE;YACvD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM;oBACN,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,0BAA0B,IAAI,EAAE;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,oEAAoE;QACpE,+EAA+E;QAC/E,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
2
|
import { join, resolve } from "node:path";
|
|
4
3
|
import { readWorkspaceBlock } from "./parsers/project-block.js";
|
|
4
|
+
/** A host whose registered paths live in exactly one file. */
|
|
5
|
+
function oneTarget(file) {
|
|
6
|
+
return { primary: file, all: [file] };
|
|
7
|
+
}
|
|
5
8
|
export async function runVisibilityDoctor(fs, env, paths, input) {
|
|
6
9
|
const workspace = input.workspace ? resolve(input.workspace) : resolve(env.cwd());
|
|
7
10
|
const declared = await readDeclaredFuentes(fs, paths, workspace);
|
|
@@ -12,7 +15,10 @@ export async function runVisibilityDoctor(fs, env, paths, input) {
|
|
|
12
15
|
];
|
|
13
16
|
const globalReports = [];
|
|
14
17
|
if (input.global) {
|
|
15
|
-
|
|
18
|
+
// Home comes from the injected EnvPort, like the workspace does: reading
|
|
19
|
+
// node:os directly made the global scope unobservable from a test, which is
|
|
20
|
+
// the half of the doctor that touches files outside the workspace.
|
|
21
|
+
const home = env.homeDir();
|
|
16
22
|
globalReports.push(inspectClaudeGlobal(home, declared), inspectCodexGlobal(home, declared));
|
|
17
23
|
}
|
|
18
24
|
return {
|
|
@@ -28,61 +34,58 @@ async function readDeclaredFuentes(fs, paths, workspace) {
|
|
|
28
34
|
}
|
|
29
35
|
function inspectClaude(scopeDir, declared, scope) {
|
|
30
36
|
const claudeDir = join(scopeDir, ".claude");
|
|
31
|
-
|
|
32
|
-
const
|
|
37
|
+
// The file a fix has to create when neither settings file exists yet.
|
|
38
|
+
const canonical = join(claudeDir, "settings.json");
|
|
33
39
|
if (declared === null) {
|
|
34
|
-
return baseNoBlock("claude", scope,
|
|
40
|
+
return baseNoBlock("claude", scope, oneTarget(canonical));
|
|
35
41
|
}
|
|
36
42
|
// Claude Code reads settings.json and settings.local.json (local takes precedence);
|
|
37
43
|
// the doctor merges additionalDirectories from both to avoid false negatives
|
|
38
44
|
// when the paths live in the .local file (the per-machine, gitignored convention).
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
scope,
|
|
43
|
-
target,
|
|
44
|
-
declared_paths: declared,
|
|
45
|
-
registered_paths: [],
|
|
46
|
-
missing: [...declared],
|
|
47
|
-
extra: [],
|
|
48
|
-
status: declared.length === 0 ? "ok" : "no-settings",
|
|
49
|
-
...(declared.length > 0 ? { detail: `Falta ${target} o settings.local.json` } : {}),
|
|
50
|
-
};
|
|
45
|
+
const read = readClaudeAdditionalDirsMerged(claudeDir);
|
|
46
|
+
if (!read.found) {
|
|
47
|
+
return noSettingsReport("claude", scope, oneTarget(canonical), declared, `Falta ${canonical} o settings.local.json`);
|
|
51
48
|
}
|
|
52
|
-
|
|
53
|
-
return diffReport("claude", scope, target, declared, registered);
|
|
49
|
+
return diffReport("claude", scope, read.targets, declared, read.paths);
|
|
54
50
|
}
|
|
55
51
|
function inspectCodex(scopeDir, declared, scope) {
|
|
56
52
|
const target = join(scopeDir, ".codex", "config.toml");
|
|
53
|
+
const targets = oneTarget(target);
|
|
57
54
|
if (declared === null) {
|
|
58
|
-
return baseNoBlock("codex", scope,
|
|
55
|
+
return baseNoBlock("codex", scope, targets);
|
|
59
56
|
}
|
|
60
57
|
if (!existsSync(target)) {
|
|
61
|
-
return {
|
|
62
|
-
host: "codex",
|
|
63
|
-
scope,
|
|
64
|
-
target,
|
|
65
|
-
declared_paths: declared,
|
|
66
|
-
registered_paths: [],
|
|
67
|
-
missing: [...declared],
|
|
68
|
-
extra: [],
|
|
69
|
-
status: declared.length === 0 ? "ok" : "no-settings",
|
|
70
|
-
...(declared.length > 0 ? { detail: `Falta ${target}` } : {}),
|
|
71
|
-
};
|
|
58
|
+
return noSettingsReport("codex", scope, targets, declared, `Falta ${target}`);
|
|
72
59
|
}
|
|
73
60
|
const registered = readCodexWritableRoots(target);
|
|
74
|
-
return diffReport("codex", scope,
|
|
61
|
+
return diffReport("codex", scope, targets, declared, registered);
|
|
75
62
|
}
|
|
76
63
|
function inspectClaudeGlobal(home, declared) {
|
|
77
64
|
const claudeDir = join(home, ".claude");
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
|
|
65
|
+
const read = readClaudeAdditionalDirsMerged(claudeDir);
|
|
66
|
+
const targets = read.found ? read.targets : oneTarget(join(claudeDir, "settings.json"));
|
|
67
|
+
const registered = read.found ? read.paths : [];
|
|
68
|
+
return globalPollutionReport("claude", targets, declared ?? [], registered);
|
|
81
69
|
}
|
|
82
70
|
function inspectCodexGlobal(home, declared) {
|
|
83
71
|
const target = join(home, ".codex", "config.toml");
|
|
84
72
|
const registered = existsSync(target) ? readCodexWritableRoots(target) : [];
|
|
85
|
-
return globalPollutionReport("codex", target, declared ?? [], registered);
|
|
73
|
+
return globalPollutionReport("codex", oneTarget(target), declared ?? [], registered);
|
|
74
|
+
}
|
|
75
|
+
/** Declared sources with no host config file to compare them against. */
|
|
76
|
+
function noSettingsReport(host, scope, targets, declared, detail) {
|
|
77
|
+
return {
|
|
78
|
+
host,
|
|
79
|
+
scope,
|
|
80
|
+
target: targets.primary,
|
|
81
|
+
targets: targets.all,
|
|
82
|
+
declared_paths: declared,
|
|
83
|
+
registered_paths: [],
|
|
84
|
+
missing: [...declared],
|
|
85
|
+
extra: [],
|
|
86
|
+
status: declared.length === 0 ? "ok" : "no-settings",
|
|
87
|
+
...(declared.length > 0 ? { detail } : {}),
|
|
88
|
+
};
|
|
86
89
|
}
|
|
87
90
|
function inspectWarp(_scopeDir, _declared, scope) {
|
|
88
91
|
// Warp Terminal does not have a workspace additionalDirectories concept.
|
|
@@ -92,6 +95,7 @@ function inspectWarp(_scopeDir, _declared, scope) {
|
|
|
92
95
|
host: "warp",
|
|
93
96
|
scope,
|
|
94
97
|
target,
|
|
98
|
+
targets: [target],
|
|
95
99
|
declared_paths: [],
|
|
96
100
|
registered_paths: [],
|
|
97
101
|
missing: [],
|
|
@@ -100,7 +104,9 @@ function inspectWarp(_scopeDir, _declared, scope) {
|
|
|
100
104
|
detail: "Warp Terminal does not require workspace path registration (noop)",
|
|
101
105
|
};
|
|
102
106
|
}
|
|
103
|
-
function diffReport(host, scope,
|
|
107
|
+
function diffReport(host, scope, targets, declared, rawRegistered) {
|
|
108
|
+
const registered = dedupeRegistered(rawRegistered);
|
|
109
|
+
const where = describeTargets(targets);
|
|
104
110
|
const declaredSet = new Set(declared.map(normalize));
|
|
105
111
|
const registeredSet = new Set(registered.map(normalize));
|
|
106
112
|
const missing = declared.filter((p) => !registeredSet.has(normalize(p)));
|
|
@@ -113,7 +119,8 @@ function diffReport(host, scope, target, declared, registered) {
|
|
|
113
119
|
return {
|
|
114
120
|
host,
|
|
115
121
|
scope,
|
|
116
|
-
target,
|
|
122
|
+
target: targets.primary,
|
|
123
|
+
targets: targets.all,
|
|
117
124
|
declared_paths: declared,
|
|
118
125
|
registered_paths: registered,
|
|
119
126
|
missing,
|
|
@@ -122,20 +129,22 @@ function diffReport(host, scope, target, declared, registered) {
|
|
|
122
129
|
...(status !== "ok"
|
|
123
130
|
? {
|
|
124
131
|
detail: status === "missing-paths"
|
|
125
|
-
? `${missing.length} path(s) declarado(s) no registrado(s) en ${
|
|
132
|
+
? `${missing.length} path(s) declarado(s) no registrado(s) en ${where}`
|
|
126
133
|
: `${extra.length} path(s) registrado(s) que no son fuentes declaradas`,
|
|
127
134
|
}
|
|
128
135
|
: {}),
|
|
129
136
|
};
|
|
130
137
|
}
|
|
131
|
-
function globalPollutionReport(host,
|
|
138
|
+
function globalPollutionReport(host, targets, declared, rawRegistered) {
|
|
139
|
+
const registered = dedupeRegistered(rawRegistered);
|
|
132
140
|
const declaredSet = new Set(declared.map(normalize));
|
|
133
141
|
const polluted = registered.filter((p) => declaredSet.has(normalize(p)));
|
|
134
142
|
const status = polluted.length > 0 ? "global-pollution" : "ok";
|
|
135
143
|
return {
|
|
136
144
|
host,
|
|
137
145
|
scope: "global",
|
|
138
|
-
target,
|
|
146
|
+
target: targets.primary,
|
|
147
|
+
targets: targets.all,
|
|
139
148
|
declared_paths: declared,
|
|
140
149
|
registered_paths: registered,
|
|
141
150
|
missing: [],
|
|
@@ -143,16 +152,35 @@ function globalPollutionReport(host, target, declared, registered) {
|
|
|
143
152
|
status,
|
|
144
153
|
...(polluted.length > 0
|
|
145
154
|
? {
|
|
146
|
-
detail: `${polluted.length} path(s) del hub también en ${
|
|
155
|
+
detail: `${polluted.length} path(s) del hub también en ${describeTargets(targets)}. Sugerencia: 'agent-workflow detach-multiroot --global --from-sources'`,
|
|
147
156
|
}
|
|
148
157
|
: {}),
|
|
149
158
|
};
|
|
150
159
|
}
|
|
151
|
-
|
|
160
|
+
/**
|
|
161
|
+
* One registration per path, first occurrence wins.
|
|
162
|
+
*
|
|
163
|
+
* The same directory declared in settings.json AND in settings.local.json is ONE
|
|
164
|
+
* registration, not two. Dedup is by the RAW string and not by `normalize`:
|
|
165
|
+
* `registered_paths` is a literal inventory of what the config files contain —
|
|
166
|
+
* the strings a person has to delete by hand — so two spellings of the same
|
|
167
|
+
* directory stay two entries. `normalize` governs only the comparison against
|
|
168
|
+
* the declared sources, which is where the two spellings already collapse; that
|
|
169
|
+
* is also why this cannot change `missing`/`extra` beyond dropping exact repeats.
|
|
170
|
+
*/
|
|
171
|
+
function dedupeRegistered(registered) {
|
|
172
|
+
return [...new Set(registered)];
|
|
173
|
+
}
|
|
174
|
+
/** Every file the report was actually read from, for the user-facing message. */
|
|
175
|
+
function describeTargets(targets) {
|
|
176
|
+
return targets.all.join(" + ");
|
|
177
|
+
}
|
|
178
|
+
function baseNoBlock(host, scope, targets) {
|
|
152
179
|
return {
|
|
153
180
|
host,
|
|
154
181
|
scope,
|
|
155
|
-
target,
|
|
182
|
+
target: targets.primary,
|
|
183
|
+
targets: targets.all,
|
|
156
184
|
declared_paths: [],
|
|
157
185
|
registered_paths: [],
|
|
158
186
|
missing: [],
|
|
@@ -161,15 +189,27 @@ function baseNoBlock(host, scope, target) {
|
|
|
161
189
|
detail: "<NS>-PROJECT no encontrado o sin fuentes en CLAUDE.md/AGENTS.md",
|
|
162
190
|
};
|
|
163
191
|
}
|
|
164
|
-
/**
|
|
192
|
+
/**
|
|
193
|
+
* Merges additionalDirectories from settings.json + settings.local.json (Claude
|
|
194
|
+
* Code reads both) and says WHICH of the two it actually read.
|
|
195
|
+
*
|
|
196
|
+
* Reporting the merge without its provenance is what let the doctor answer `ok`
|
|
197
|
+
* while pointing at a settings.json that does not exist.
|
|
198
|
+
*/
|
|
165
199
|
function readClaudeAdditionalDirsMerged(claudeDir) {
|
|
166
|
-
const
|
|
200
|
+
const files = [];
|
|
201
|
+
const paths = [];
|
|
167
202
|
for (const fname of ["settings.json", "settings.local.json"]) {
|
|
168
203
|
const file = join(claudeDir, fname);
|
|
169
|
-
if (existsSync(file))
|
|
170
|
-
|
|
204
|
+
if (!existsSync(file))
|
|
205
|
+
continue;
|
|
206
|
+
files.push(file);
|
|
207
|
+
paths.push(...readClaudeAdditionalDirs(file));
|
|
171
208
|
}
|
|
172
|
-
|
|
209
|
+
const [primary, ...rest] = files;
|
|
210
|
+
if (primary === undefined)
|
|
211
|
+
return { found: false };
|
|
212
|
+
return { found: true, targets: { primary, all: [primary, ...rest] }, paths };
|
|
173
213
|
}
|
|
174
214
|
function readClaudeAdditionalDirs(file) {
|
|
175
215
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visibility-doctor-service.js","sourceRoot":"","sources":["../../src/application/visibility-doctor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"visibility-doctor-service.js","sourceRoot":"","sources":["../../src/application/visibility-doctor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applying the migration: the plan is RE-derived inside the workspace lock and
|
|
3
|
+
* the writes come from that derivation, never from the one a person read.
|
|
4
|
+
*
|
|
5
|
+
* The preview is read-only and can be minutes old; the workspace it described
|
|
6
|
+
* may have gained a session, a row or an edited hub file since. Re-deriving
|
|
7
|
+
* under the lock is what makes "what you approved" and "what happens" the same
|
|
8
|
+
* decision instead of two — the same reason the retirement commands recompute
|
|
9
|
+
* theirs before converging.
|
|
10
|
+
*/
|
|
11
|
+
import { upsertHistoryRow } from "../history-update-service.js";
|
|
12
|
+
import { withCwdLock } from "../lock-service.js";
|
|
13
|
+
import { planWorkspaceMigration, sentinelPath, } from "./plan.js";
|
|
14
|
+
export async function applyWorkspaceMigration(fs, paths) {
|
|
15
|
+
return withCwdLock(fs, paths, async () => {
|
|
16
|
+
const plan = await planWorkspaceMigration(fs, paths);
|
|
17
|
+
await writePlan(fs, paths, plan);
|
|
18
|
+
return summarize(plan);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function writePlan(fs, paths, plan) {
|
|
22
|
+
for (const hub of plan.markers) {
|
|
23
|
+
await fs.writeText(hub.path, hub.text);
|
|
24
|
+
}
|
|
25
|
+
for (const seed of plan.sentinels) {
|
|
26
|
+
// Empty, byte for byte what `session-close` writes: the sentinel says
|
|
27
|
+
// "closed" by EXISTING, and giving it content here would be redesigning it.
|
|
28
|
+
// The date the record holds is what the preview reports; nothing reads — or
|
|
29
|
+
// writes — a modification time to decide a session's state.
|
|
30
|
+
await fs.writeText(sentinelPath(seed), "");
|
|
31
|
+
}
|
|
32
|
+
for (const seed of plan.rows) {
|
|
33
|
+
// The lock-free primitive: this function already holds the workspace lock,
|
|
34
|
+
// and the public command would take it again.
|
|
35
|
+
await upsertHistoryRow(fs, paths, {
|
|
36
|
+
code: seed.code,
|
|
37
|
+
sesionName: seed.name,
|
|
38
|
+
// Unsaid when the session never declared one, so the newborn row takes
|
|
39
|
+
// the record's own default instead of a date invented here.
|
|
40
|
+
...(seed.date !== null ? { date: seed.date } : {}),
|
|
41
|
+
state: seed.state,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function summarize(plan) {
|
|
46
|
+
return {
|
|
47
|
+
workspace: plan.workspace,
|
|
48
|
+
markers_renamed: plan.markers.map((hub) => hub.path),
|
|
49
|
+
duplicates_dropped: plan.markers.filter((h) => h.drops_duplicate).map((hub) => hub.path),
|
|
50
|
+
sentinels_seeded: plan.sentinels.map((seed) => seed.folder),
|
|
51
|
+
rows_seeded: plan.rows.map((seed) => seed.folder),
|
|
52
|
+
rows_dated_today: plan.rows.filter((s) => s.date === null).map((seed) => seed.folder),
|
|
53
|
+
conflicts: plan.conflicts,
|
|
54
|
+
next_correlative: plan.next_correlative,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/application/workspace-migrate/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAGL,sBAAsB,EACtB,YAAY,GACb,MAAM,WAAW,CAAC;AA6BnB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAkB,EAClB,KAAmB;IAEnB,OAAO,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,EAAkB,EAClB,KAAmB,EACnB,IAA4B;IAE5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,sEAAsE;QACtE,4EAA4E;QAC5E,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,2EAA2E;QAC3E,8CAA8C;QAC9C,MAAM,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,uEAAuE;YACvE,4DAA4D;YAC5D,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAA4B;IAC7C,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QACpD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QACxF,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3D,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QACjD,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QACrF,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project block of a hub whose markers were stamped by an older namespace.
|
|
3
|
+
*
|
|
4
|
+
* The markers are DERIVED from the namespace (`<NS>-PROJECT-START`), so a hub
|
|
5
|
+
* created while this tool was called `agent-workflow` wears
|
|
6
|
+
* `AGENT-WORKFLOW-PROJECT-*` and the CLI running as `workflow` does not
|
|
7
|
+
* recognize it. Nothing fails loudly: the writer finds no current markers and
|
|
8
|
+
* APPENDS a second block, and from then on the CLI reads the block it just
|
|
9
|
+
* created — sources it never learned, branches nobody declared — while every
|
|
10
|
+
* declaration the workspace ever made sits untouched a few lines above.
|
|
11
|
+
* Renaming the markers is what makes the rich block the one that answers.
|
|
12
|
+
*/
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { parseProjectBlock, } from "../parsers/project-block.js";
|
|
15
|
+
/** The hub files, in the order `readWorkspaceBlock` consults them. */
|
|
16
|
+
const HUB_FILES = ["CLAUDE.md", "AGENTS.md"];
|
|
17
|
+
/**
|
|
18
|
+
* Any project block, whatever namespace stamped it.
|
|
19
|
+
*
|
|
20
|
+
* Deliberately not a list of known-legacy prefixes: the marker is a function of
|
|
21
|
+
* the namespace, so the set of "old" ones is open and a hardcoded list would go
|
|
22
|
+
* stale the next time the tool is renamed. What the block wears is read off the
|
|
23
|
+
* file; what it should wear comes from the running namespace.
|
|
24
|
+
*/
|
|
25
|
+
const BLOCK_START = /<!--\s*([A-Z0-9_-]+)-PROJECT-START\s*-->/;
|
|
26
|
+
const EVERY_BLOCK_START = new RegExp(BLOCK_START.source, "g");
|
|
27
|
+
function markersFor(prefix) {
|
|
28
|
+
return {
|
|
29
|
+
start: `<!-- ${prefix}-PROJECT-START -->`,
|
|
30
|
+
end: `<!-- ${prefix}-PROJECT-END -->`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Every hub file that exists under `root`, with its bytes. */
|
|
34
|
+
export async function readHubFiles(fs, root) {
|
|
35
|
+
const hubs = [];
|
|
36
|
+
for (const name of HUB_FILES) {
|
|
37
|
+
const path = join(root, name);
|
|
38
|
+
if (!(await fs.exists(path)))
|
|
39
|
+
continue;
|
|
40
|
+
hubs.push({ path, text: await fs.readText(path) });
|
|
41
|
+
}
|
|
42
|
+
return hubs;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* What this file needs, if anything: rename its block, or refuse to touch it.
|
|
46
|
+
*
|
|
47
|
+
* Pure on purpose — the decision is a function of the bytes and of the running
|
|
48
|
+
* namespace, and nothing else. Reading the file is the caller's I/O.
|
|
49
|
+
*/
|
|
50
|
+
export function planHubMarkers(path, text, current) {
|
|
51
|
+
const currentPrefix = prefixOf(current.start);
|
|
52
|
+
const prefixes = blockPrefixes(text);
|
|
53
|
+
const foreign = prefixes.filter((prefix) => prefix !== currentPrefix);
|
|
54
|
+
const outdated = foreign[0];
|
|
55
|
+
if (outdated === undefined)
|
|
56
|
+
return { kind: "nothing" };
|
|
57
|
+
if (foreign.length > 1) {
|
|
58
|
+
return refuse("marcadores_ambiguos", `${path} lleva ${foreign.length} bloques de namespaces distintos (${foreign.join(", ")}): cuál es el vigente lo decide una persona`);
|
|
59
|
+
}
|
|
60
|
+
const from = markersFor(outdated);
|
|
61
|
+
const adopted = parseProjectBlock(text, from);
|
|
62
|
+
if (adopted === null) {
|
|
63
|
+
return refuse("bloque_ilegible", `el bloque ${outdated} de ${path} no se pudo parsear`);
|
|
64
|
+
}
|
|
65
|
+
if (!prefixes.includes(currentPrefix)) {
|
|
66
|
+
return rewriteOf(path, outdated, currentPrefix, false, renameMarkers(text, from, current));
|
|
67
|
+
}
|
|
68
|
+
// The block the CLI appended when it could not find the current markers. It is
|
|
69
|
+
// usually the empty shell of a workspace that had already declared everything
|
|
70
|
+
// above it — but "usually" is not a licence to delete, so what it declares is
|
|
71
|
+
// compared before it goes.
|
|
72
|
+
const duplicate = parseProjectBlock(text, current);
|
|
73
|
+
const extra = duplicate === null ? [] : extraDeclarations(duplicate, adopted);
|
|
74
|
+
if (extra.length > 0) {
|
|
75
|
+
return refuse("duplicado_con_contenido", `el bloque ${currentPrefix} de ${path} declara lo que el bloque ${outdated} no tiene (${extra.join("; ")}): fusionalos a mano y reintentá`);
|
|
76
|
+
}
|
|
77
|
+
const dropped = dropBlock(text, current);
|
|
78
|
+
return rewriteOf(path, outdated, currentPrefix, true, renameMarkers(dropped, from, current));
|
|
79
|
+
}
|
|
80
|
+
function rewriteOf(path, from, to, dropsDuplicate, text) {
|
|
81
|
+
return { kind: "rewrite", rewrite: { path, from, to, drops_duplicate: dropsDuplicate, text } };
|
|
82
|
+
}
|
|
83
|
+
function refuse(reason, detail) {
|
|
84
|
+
return { kind: "refused", refusal: { reason, detail } };
|
|
85
|
+
}
|
|
86
|
+
/** `<!-- WORKFLOW-PROJECT-START -->` → `WORKFLOW`. */
|
|
87
|
+
function prefixOf(startMarker) {
|
|
88
|
+
return BLOCK_START.exec(startMarker)?.[1] ?? "";
|
|
89
|
+
}
|
|
90
|
+
/** Namespace prefixes of every COMPLETE block the text carries, in order, deduped. */
|
|
91
|
+
function blockPrefixes(text) {
|
|
92
|
+
const found = [];
|
|
93
|
+
for (const match of text.matchAll(EVERY_BLOCK_START)) {
|
|
94
|
+
const prefix = match[1];
|
|
95
|
+
if (prefix === undefined || found.includes(prefix))
|
|
96
|
+
continue;
|
|
97
|
+
// A start without its end is not a block: cutting or renaming half of one
|
|
98
|
+
// would leave the file worse than it was found.
|
|
99
|
+
if (!text.includes(markersFor(prefix).end))
|
|
100
|
+
continue;
|
|
101
|
+
found.push(prefix);
|
|
102
|
+
}
|
|
103
|
+
return found;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Rename in place: the content between the markers is not re-rendered.
|
|
107
|
+
*
|
|
108
|
+
* Re-rendering through `renderProjectBlock` would round-trip the block through
|
|
109
|
+
* the parser and hand back only what the parser understands — every line it
|
|
110
|
+
* does not model (a note, a section this version never learned) would be gone.
|
|
111
|
+
* A rename touches two lines and nothing else.
|
|
112
|
+
*/
|
|
113
|
+
function renameMarkers(text, from, to) {
|
|
114
|
+
return text.replaceAll(from.start, to.start).replaceAll(from.end, to.end);
|
|
115
|
+
}
|
|
116
|
+
/** Cut a whole block out, leaving one blank line where it used to separate two. */
|
|
117
|
+
function dropBlock(text, markers) {
|
|
118
|
+
const start = text.indexOf(markers.start);
|
|
119
|
+
const end = text.indexOf(markers.end, start);
|
|
120
|
+
if (start < 0 || end < 0)
|
|
121
|
+
return text;
|
|
122
|
+
const head = text.slice(0, start).replace(/\n+$/, "");
|
|
123
|
+
const tail = text.slice(end + markers.end.length).replace(/^\n+/, "");
|
|
124
|
+
if (head === "")
|
|
125
|
+
return tail;
|
|
126
|
+
if (tail === "")
|
|
127
|
+
return `${head}\n`;
|
|
128
|
+
return `${head}\n\n${tail}`;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* What the appended block declares that the adopted one does not.
|
|
132
|
+
*
|
|
133
|
+
* Empty means dropping it loses nothing, which is the only condition under
|
|
134
|
+
* which it gets dropped. `last_activity` is deliberately not compared: it is a
|
|
135
|
+
* timestamp the writer stamps on every write, not something a workspace
|
|
136
|
+
* declared, and the appended block always carries the fresher one.
|
|
137
|
+
*/
|
|
138
|
+
function extraDeclarations(candidate, adopted) {
|
|
139
|
+
const extra = [];
|
|
140
|
+
if (isDeclared(candidate.proyecto) && candidate.proyecto !== adopted.proyecto) {
|
|
141
|
+
extra.push(`Proyecto: ${firstLine(candidate.proyecto)}`);
|
|
142
|
+
}
|
|
143
|
+
for (const fuente of candidate.fuentes) {
|
|
144
|
+
const same = adopted.fuentes.some((f) => f.alias === fuente.alias && f.path === fuente.path);
|
|
145
|
+
if (!same)
|
|
146
|
+
extra.push(`Fuente: ${fuente.alias} → ${fuente.path}`);
|
|
147
|
+
}
|
|
148
|
+
extra.push(...extraEntries("Stack", candidate.stack, adopted.stack));
|
|
149
|
+
extra.push(...extraEntries("Rama por defecto", candidate.default_branches, adopted.default_branches));
|
|
150
|
+
extra.push(...extraEntries("Rama de trabajo", candidate.working_branches, adopted.working_branches));
|
|
151
|
+
extra.push(...extraEntries("Rama QA", candidate.qa_branches, adopted.qa_branches));
|
|
152
|
+
return extra;
|
|
153
|
+
}
|
|
154
|
+
function extraEntries(label, candidate, adopted) {
|
|
155
|
+
const known = new Map(Object.entries(adopted));
|
|
156
|
+
const extra = [];
|
|
157
|
+
for (const [key, value] of Object.entries(candidate)) {
|
|
158
|
+
if (typeof value !== "string" || value.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
if (known.get(key) === value)
|
|
161
|
+
continue;
|
|
162
|
+
extra.push(`${label} ${key}: ${value}`);
|
|
163
|
+
}
|
|
164
|
+
return extra;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* A `## Proyecto` somebody wrote, as opposed to the placeholder the renderer
|
|
168
|
+
* emits when nobody has (`_Describe el proyecto aquí…_`).
|
|
169
|
+
*/
|
|
170
|
+
function isDeclared(proyecto) {
|
|
171
|
+
const text = proyecto.trim();
|
|
172
|
+
return text.length > 0 && !(text.startsWith("_") && text.endsWith("_"));
|
|
173
|
+
}
|
|
174
|
+
function firstLine(text) {
|
|
175
|
+
return text.trim().split("\n")[0] ?? text;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=markers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markers.js","sourceRoot":"","sources":["../../../src/application/workspace-migrate/markers.ts"],"names":[],"mappings":"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"}
|