@tacuchi/agent-workflow-cli 21.3.1 → 21.4.1
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/capability/wrapper.js +8 -7
- package/dist/application/capability/wrapper.js.map +1 -1
- package/dist/application/dev-only-services.js +63 -15
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/self/host-states.js +11 -0
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-skill.js +15 -3
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/source-launch-service.js +38 -3
- package/dist/application/source-launch-service.js.map +1 -1
- package/dist/cli/commands/capability.js +8 -4
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/dev-only.js +7 -3
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/flow.js +5 -0
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/skills.js +14 -3
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +92 -68
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.js +57 -19
- package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
- package/dist/domain/design/maturity.js +8 -6
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/visual-evidence.js +11 -27
- package/dist/domain/design/visual-evidence.js.map +1 -1
- package/dist/domain/harnesses.js +9 -1
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/resource-policy.js +111 -0
- package/dist/domain/resource-policy.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/harness/HARNESS.md +25 -2
- package/skills/w/loops/CHASSIS.md +2 -2
- package/skills/w/loops/plan-new-loop/LOOP.md +4 -3
- package/skills/w/loops/spec-refine-loop/LOOP.md +2 -2
- package/skills/w/modules/DESIGN-REFERENCES.md +14 -12
- package/skills/w/roles/design/ROLE.md +9 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,iFAAiF;AACjF,oFAAoF;AACpF,OAAO,gDAAgD,CAAC;AACxD,OAAO,EACL,cAAc,EAEd,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,iFAAiF;AACjF,oFAAoF;AACpF,OAAO,gDAAgD,CAAC;AACxD,OAAO,EACL,cAAc,EAEd,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGlD;;;;;;;;;;;GAWG;AAEH,MAAM,KAAK,GAA8B,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,iBAAiB,GAAkC;IAC9D,IAAI,EAAE,YAAY;IAClB,QAAQ,EACN,2FAA2F;QAC3F,wFAAwF;QACxF,gGAAgG;IAElG,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CACT,cAAc,EACd,uBAAuB,aAAa,0CAA0C,CAC3C,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAA+B,CAAC;QACxD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CACT,cAAc,EACd,sBAAsB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAC7C,CAAC;QACxC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CACT,cAAc,EACd,oCAAoC,sBAAsB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CACrD,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAqC,CAAC;QAE5F,6EAA6E;QAC7E,6EAA6E;QAC7E,YAAY;QACZ,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAqC,CAAC;QAE9F,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChF,6EAA6E;QAC7E,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CACT,cAAc,EACd,uBAAuB,IAAI,qBAAqB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxC,CAAC;QACxC,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,MAAM,GACV,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,eAAe,CAAC;YAClD,CAAC,CAAC,MAAM,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAoB,EAAE,EAAE,eAAe,CAAC,CAAC;QAEzF,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,WAAW,CAAC,MAAwC;QAClD,6EAA6E;QAC7E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACzC,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACxD,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAS,iBAAiB,CACxB,IAAgB,EAChB,IAAoB,EACpB,UAAkB,EAClB,MAA8B,EAC9B,OAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO;QACL,IAAI;QACJ,UAAU;QACV,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAChD,IAAI,EAAE,IAAI,IAAI,IAAI;QAClB,MAAM;QACN,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;QACzC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;QACrC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI;QAC3C,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACvD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,CAAC,QAAQ,KAAK,SAAS;YACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,EAAE;YACpF,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,IAAI,CACjB,GAAe,EACf,SAAyD;IAEzD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;QACxD,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,UAAU;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAOD;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAgB;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,yCAAyC,KAAK,GAAG,EAAE,CAAC;QAC1F,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE;SAClF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAWD;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,GAAW,EAAE,IAAoB;IACrD,MAAM,KAAK,GAAY;QACrB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;KACb,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,gDAAgD,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,mDAAmD,EAAE,CAAC;IACjF,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAA6B;QAC3D,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAA6B;QAC7D,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAA6B;QACvD,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAwB;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;KAC3E,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { runHarness, runLogs, runNextNumber, runProfiles, } from "../../application/dev-only-services.js";
|
|
1
|
+
import { isHarnessId, runHarness, runLogs, runNextNumber, runProfiles, } from "../../application/dev-only-services.js";
|
|
2
2
|
import { HARNESSES } from "../../domain/harnesses.js";
|
|
3
3
|
import { fail } from "../render.js";
|
|
4
4
|
// Derived from the catalog: the describe used to name two hosts out of seven.
|
|
@@ -6,8 +6,12 @@ const HARNESS_IDS = HARNESSES.map((h) => h.id).join(" | ");
|
|
|
6
6
|
export const harnessCommand = {
|
|
7
7
|
name: "harness",
|
|
8
8
|
describe: `Identify the host harness from its env markers (${HARNESS_IDS} | unknown). 'unknown' is a legitimate answer — some hosts export no marker to their subprocesses; use 'self detect-hosts' for what is actually installed on the machine.`,
|
|
9
|
-
async execute(
|
|
10
|
-
const
|
|
9
|
+
async execute(args, ctx) {
|
|
10
|
+
const requested = args.values.get("host");
|
|
11
|
+
if (requested !== undefined && !isHarnessId(requested)) {
|
|
12
|
+
return fail("INVALID_INPUT", `--host inválido: '${requested}'. Valores válidos: ${HARNESS_IDS}`);
|
|
13
|
+
}
|
|
14
|
+
const data = runHarness((k) => ctx.env.get(k), requested);
|
|
11
15
|
return { ok: true, data, exitCode: 0 };
|
|
12
16
|
},
|
|
13
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-only.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-only.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,OAAO,EACP,aAAa,EACb,WAAW,GACZ,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAItD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,8EAA8E;AAC9E,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,mDAAmD,WAAW,2KAA2K;IACnP,KAAK,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"dev-only.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-only.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WORKLINE_FLOWS } from "../../application/capability/compose.js";
|
|
2
|
+
import { isHarnessId } from "../../application/dev-only-services.js";
|
|
2
3
|
import { advanceFlow } from "../../application/flow/flow-service.js";
|
|
3
4
|
import { submitFlow } from "../../application/flow/submit.js";
|
|
4
5
|
import { renderDirectiveHuman } from "../../domain/flow/directive.js";
|
|
@@ -23,6 +24,10 @@ export const flowCommand = {
|
|
|
23
24
|
name: "flow",
|
|
24
25
|
describe: `Avanza un recorrido de Workline hasta su primera frontera no determinista y devuelve su directiva. Verbos: ${VERBS.join(" | ")}. La respuesta de submit entra por stdin como JSON y la aprobación de efecto viaja aparte en --approval. Usage: aw flow advance --session <código> [--flow <flow> --adopt].`,
|
|
25
26
|
async execute(args, ctx) {
|
|
27
|
+
const requestedHost = args.values.get("host");
|
|
28
|
+
if (requestedHost !== undefined && !isHarnessId(requestedHost)) {
|
|
29
|
+
return fail("ARGS_INVALID", `--host no reconoce '${requestedHost}'; elegí un host del catálogo instalado.`);
|
|
30
|
+
}
|
|
26
31
|
const verb = args.rest[0];
|
|
27
32
|
if (verb === undefined || !VERBS.includes(verb)) {
|
|
28
33
|
return fail("ARGS_INVALID", `uso: aw flow ${VERBS.join(" | ")} --session <código> [--flow <flow> --adopt] [--approval <digest>]`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/commands/flow.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/commands/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
import "../../application/capability/design-handler.js";
|
|
2
2
|
import { capabilityReadiness, } from "../../application/capability/readiness.js";
|
|
3
|
-
import { runHarness } from "../../application/dev-only-services.js";
|
|
3
|
+
import { isHarnessId, runHarness } from "../../application/dev-only-services.js";
|
|
4
4
|
import { checkInstalledBindings, resolveSkills, } from "../../application/skills-resolver-service.js";
|
|
5
5
|
export const skillsCommand = {
|
|
6
6
|
name: "skills",
|
|
7
7
|
describe: "Show resolved capability→skill bindings (skills.toml cascade). Usage: aw skills [--detail] — " +
|
|
8
8
|
"con --detail agrega readiness por capacidad, exposición y operación, la instancia exacta o el " +
|
|
9
9
|
"floor, y la forma de invocación que el host soporta de verdad.",
|
|
10
|
-
async execute(
|
|
10
|
+
async execute(args, ctx) {
|
|
11
|
+
const requested = args.values.get("host");
|
|
12
|
+
if (requested !== undefined && !isHarnessId(requested)) {
|
|
13
|
+
return {
|
|
14
|
+
ok: false,
|
|
15
|
+
error: {
|
|
16
|
+
code: "INVALID_INPUT",
|
|
17
|
+
message: `--host inválido: '${requested}'. Usá un host del catálogo.`,
|
|
18
|
+
},
|
|
19
|
+
exitCode: 1,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
11
22
|
const resolution = await resolveSkills(ctx.fs, ctx.paths);
|
|
12
23
|
const validation = await checkInstalledBindings(ctx.fs, ctx.env, resolution);
|
|
13
24
|
const data = {
|
|
@@ -19,7 +30,7 @@ export const skillsCommand = {
|
|
|
19
30
|
fs: ctx.fs,
|
|
20
31
|
env: ctx.env,
|
|
21
32
|
paths: ctx.paths,
|
|
22
|
-
host: runHarness((k) => ctx.env.get(k)).
|
|
33
|
+
host: runHarness((k) => ctx.env.get(k), requested).agent_host,
|
|
23
34
|
}),
|
|
24
35
|
};
|
|
25
36
|
return { ok: true, data, exitCode: 0 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,gDAAgD,CAAC;AACxD,OAAO,EAEL,mBAAmB,GACpB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,13 @@ import { useCallback, useEffect, useMemo, useState } from "react";
|
|
|
5
5
|
import { runGitFlow, } from "../../../application/git-flow-service.js";
|
|
6
6
|
import { formatTuiEvent } from "../../../application/logging/log-events.js";
|
|
7
7
|
import { buildProjectTabData, } from "../../../application/project-tab-data.js";
|
|
8
|
-
import { ensureDescriptor, findCollision, launchSource, relaunchProcess, stopProcess, tailLog, } from "../../../application/source-launch-service.js";
|
|
8
|
+
import { ensureDescriptor, findCollision, launchSource, relaunchProcess, stopFailed, stopProcess, tailLog, } from "../../../application/source-launch-service.js";
|
|
9
9
|
import { removeSource } from "../../../application/source-remove-service.js";
|
|
10
10
|
import { DetailPanel, } from "../components/detail-panel.js";
|
|
11
11
|
import { FlowResultView } from "../components/git-flow-actions.js";
|
|
12
12
|
import { ListRow } from "../components/list-row.js";
|
|
13
13
|
import { notificationStackRows } from "../components/notification-stack.js";
|
|
14
14
|
import { PageHead } from "../components/page-head.js";
|
|
15
|
-
import { ProcessList } from "../components/process-list.js";
|
|
16
15
|
import { QuickActions } from "../components/quick-actions.js";
|
|
17
16
|
import { SectionHead } from "../components/section-head.js";
|
|
18
17
|
import { SourceLaunchForm } from "../components/source-launch-form.js";
|
|
@@ -164,6 +163,17 @@ const FLOW_ACTIONS = [
|
|
|
164
163
|
];
|
|
165
164
|
/** First per-source detail action: launch the app locally. */
|
|
166
165
|
const LAUNCH_ACTION = { id: "launch", name: "Lanzar en local" };
|
|
166
|
+
/**
|
|
167
|
+
* The three operations offered per `running` process of the selected source —
|
|
168
|
+
* the same ones the removed process region carried on x/r/o. No description:
|
|
169
|
+
* the row spells the profile and the PID, and the panel's remaining width
|
|
170
|
+
* would truncate one to a single cell.
|
|
171
|
+
*/
|
|
172
|
+
const PROCESS_OPS = {
|
|
173
|
+
stop: "Detener",
|
|
174
|
+
relaunch: "Re-lanzar",
|
|
175
|
+
log: "Ver log",
|
|
176
|
+
};
|
|
167
177
|
/**
|
|
168
178
|
* Indentation (marginLeft) of the SOURCES rows container. Passed as `indent`
|
|
169
179
|
* to {@link rowWidth} so the row width subtracts that marginLeft — otherwise
|
|
@@ -182,16 +192,15 @@ const SOURCES_ROWS_INDENT = 2;
|
|
|
182
192
|
// - this tab, fixed: PageHead (1 + 1 margin) + StatTile row (3 + 1 margin)
|
|
183
193
|
// + Sources SectionHead (1) + QuickActions (2 + 1 marginTop) = 10
|
|
184
194
|
// - 1 slack: better one row short than a clipped active row.
|
|
185
|
-
// The data-driven rows (description, warnings
|
|
186
|
-
//
|
|
187
|
-
//
|
|
195
|
+
// The data-driven rows (description, warnings) and the NotificationStack height
|
|
196
|
+
// (0 unless a banner is visible) are added per render — see `reservedRows` in
|
|
197
|
+
// Initialized. Nothing renders below the list anymore (SPEC 019).
|
|
188
198
|
const SOURCES_LIST_RESERVED_ROWS = 27;
|
|
189
199
|
function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
190
200
|
const dirty = data.git?.dirty ?? 0;
|
|
191
201
|
const totalSources = data.sources.length;
|
|
192
202
|
const dirtySources = data.sources.filter((s) => s.dirty).length;
|
|
193
203
|
const workingEntries = Object.entries(data.workingBranches);
|
|
194
|
-
const qaEntries = Object.entries(data.qaBranches);
|
|
195
204
|
const home = ctx.env.homeDir();
|
|
196
205
|
const shortName = deriveShortName(data.workspaceName, basename(data.workspacePath));
|
|
197
206
|
const description = deriveDescription(data.workspaceName);
|
|
@@ -202,30 +211,32 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
202
211
|
const hasSources = totalSources > 0;
|
|
203
212
|
const [cursor, setCursor] = useState(0);
|
|
204
213
|
const [actionCursor, setActionCursor] = useState(0);
|
|
205
|
-
const [processCursor, setProcessCursor] = useState(0);
|
|
206
214
|
const [mode, setMode] = useState({ kind: "list" });
|
|
207
215
|
const processes = data.processes;
|
|
208
|
-
|
|
216
|
+
// Active processes per source alias: the source row's chip and the global
|
|
217
|
+
// tile both read from here, so "active" has one definition. `stopped` and
|
|
218
|
+
// `exited` records are history and never counted (SPEC 019).
|
|
219
|
+
const runningBySource = useMemo(() => {
|
|
220
|
+
const byAlias = new Map();
|
|
221
|
+
for (const p of processes) {
|
|
222
|
+
if (p.state === "running")
|
|
223
|
+
byAlias.set(p.sourceAlias, (byAlias.get(p.sourceAlias) ?? 0) + 1);
|
|
224
|
+
}
|
|
225
|
+
return byAlias;
|
|
226
|
+
}, [processes]);
|
|
227
|
+
const runningCount = useMemo(() => [...runningBySource.values()].reduce((total, n) => total + n, 0), [runningBySource]);
|
|
209
228
|
// Window over the SOURCES list: the shell clips overflow, so only the slice
|
|
210
229
|
// around the cursor renders — the active row can never walk off-screen.
|
|
211
230
|
// `reservedRows` adds the data-driven chrome to the static count: the
|
|
212
|
-
// description and warnings blocks above the list
|
|
213
|
-
// sections below it (head + marginTop + one row per entry, or one
|
|
214
|
-
// empty-hint row when the section renders empty); plus the NotificationStack
|
|
231
|
+
// description and warnings blocks above the list, plus the NotificationStack
|
|
215
232
|
// height while a banner is visible (0 otherwise). rows=0 (non-TTY) → the
|
|
216
233
|
// hook returns the whole list and nothing changes.
|
|
217
234
|
const notifItems = useNotificationItems();
|
|
218
235
|
const warningsRows = data.warnings.length > 0 ? Math.min(data.warnings.length, 3) + 2 : 0;
|
|
219
|
-
const workingRows = 2 + Math.max(workingEntries.length, 1);
|
|
220
|
-
const qaRows = qaEntries.length > 0 ? 2 + qaEntries.length : 0;
|
|
221
|
-
const processRows = 2 + Math.max(processes.length, 1);
|
|
222
236
|
const reservedRows = SOURCES_LIST_RESERVED_ROWS +
|
|
223
237
|
notificationStackRows(notifItems) +
|
|
224
238
|
(description ? 2 : 0) +
|
|
225
|
-
warningsRows
|
|
226
|
-
workingRows +
|
|
227
|
-
qaRows +
|
|
228
|
-
processRows;
|
|
239
|
+
warningsRows;
|
|
229
240
|
const win = useListWindow(targets.length, cursor, reservedRows);
|
|
230
241
|
const winEnd = win.start + win.visible;
|
|
231
242
|
// Overflow indicator for the SectionHead hint slot (no extra terminal row).
|
|
@@ -293,9 +304,25 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
293
304
|
}, [ctx, doLaunch, launchDeps]);
|
|
294
305
|
const doStop = useCallback(async (record) => {
|
|
295
306
|
setMode({ kind: "busy", label: `Deteniendo ${record.sourceAlias}…` });
|
|
296
|
-
await stopProcess(launchDeps, record);
|
|
297
|
-
|
|
298
|
-
|
|
307
|
+
const res = await stopProcess(launchDeps, record);
|
|
308
|
+
const event = `stop ${record.sourceAlias} (PID ${record.pid})`;
|
|
309
|
+
// A stop that did not kill anything is a warning, not an "ok": the daily
|
|
310
|
+
// log is the only trace once the notice is dismissed.
|
|
311
|
+
void ctx.logger?.log(res.stopped ? "info" : "warn", formatTuiEvent(event, res.stopped ? "ok" : "sigue vivo"));
|
|
312
|
+
setMode(res.stopped
|
|
313
|
+
? {
|
|
314
|
+
kind: "notice",
|
|
315
|
+
tone: "ok",
|
|
316
|
+
lines: [`Detenido ${record.sourceAlias} (PID ${record.pid}).`],
|
|
317
|
+
}
|
|
318
|
+
: {
|
|
319
|
+
kind: "notice",
|
|
320
|
+
tone: "err",
|
|
321
|
+
lines: [
|
|
322
|
+
`${record.sourceAlias} (PID ${record.pid}) sigue vivo tras la señal.`,
|
|
323
|
+
"Sigue contando como activo; detenelo desde el sistema y refrescá.",
|
|
324
|
+
],
|
|
325
|
+
});
|
|
299
326
|
await onReload?.();
|
|
300
327
|
}, [launchDeps, onReload, ctx]);
|
|
301
328
|
// Shared tail of doRelaunch/confirmRelaunch: daily-log entry + notice + reload.
|
|
@@ -322,8 +349,7 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
322
349
|
});
|
|
323
350
|
}, [ctx.fs]);
|
|
324
351
|
// Global keys are locked for every mode except the plain list and the detail
|
|
325
|
-
// panel (its ↑↓ ⏎ esc don't collide with the globals)
|
|
326
|
-
// the lock — its r/x/o would hit the global `r` refresh. MCP/Skills policy.
|
|
352
|
+
// panel (its ↑↓ ⏎ esc don't collide with the globals). MCP/Skills policy.
|
|
327
353
|
useLockWhile(mode.kind !== "list" && mode.kind !== "detail");
|
|
328
354
|
const detailOpen = mode.kind === "detail";
|
|
329
355
|
const currentTarget = targets[cursor] ?? ALL_SOURCES;
|
|
@@ -331,14 +357,25 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
331
357
|
const currentSource = isAllTarget
|
|
332
358
|
? null
|
|
333
359
|
: (data.sources.find((s) => s.alias === currentTarget) ?? null);
|
|
360
|
+
// The selected source's own active processes — what its detail panel can
|
|
361
|
+
// operate now that no process list exists.
|
|
362
|
+
const sourceProcesses = useMemo(() => currentSource
|
|
363
|
+
? processes.filter((p) => p.state === "running" && p.sourceAlias === currentSource.alias)
|
|
364
|
+
: [], [processes, currentSource]);
|
|
334
365
|
// Detail-panel actions for the current target: a per-source "Lanzar en local"
|
|
335
|
-
// (only for real sources), the git-flow actions,
|
|
336
|
-
// workspace" last (only for real
|
|
366
|
+
// (only for real sources), the git-flow actions, one triplet per active
|
|
367
|
+
// process, and a destructive "Quitar del workspace" last (only for real
|
|
368
|
+
// sources, never for "all sources").
|
|
337
369
|
const detailItems = useMemo(() => [
|
|
338
370
|
...(currentSource ? [{ kind: "launch" }] : []),
|
|
339
371
|
...FLOW_ACTIONS.map((a) => ({ kind: "flow", action: a.id })),
|
|
372
|
+
...sourceProcesses.flatMap((record) => [
|
|
373
|
+
{ kind: "proc", op: "stop", record },
|
|
374
|
+
{ kind: "proc", op: "relaunch", record },
|
|
375
|
+
{ kind: "proc", op: "log", record },
|
|
376
|
+
]),
|
|
340
377
|
...(currentSource ? [{ kind: "remove" }] : []),
|
|
341
|
-
], [currentSource]);
|
|
378
|
+
], [currentSource, sourceProcesses]);
|
|
342
379
|
const runFlow = useCallback(async (action) => {
|
|
343
380
|
const target = targets[cursor] ?? ALL_SOURCES;
|
|
344
381
|
const isAll = target === ALL_SOURCES;
|
|
@@ -388,14 +425,10 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
388
425
|
});
|
|
389
426
|
await onReload?.();
|
|
390
427
|
}, [ctx, onReload]);
|
|
391
|
-
// Sources list shortcuts (↑↓ navigate · ⏎ open panel ·
|
|
428
|
+
// Sources list shortcuts (↑↓ navigate · ⏎ open panel · g git status).
|
|
392
429
|
const handleListKey = useCallback((input, key) => {
|
|
393
430
|
if (input === "g")
|
|
394
431
|
return void onRunAction?.("git:status");
|
|
395
|
-
if (input === "p" && processes.length > 0) {
|
|
396
|
-
setProcessCursor(0);
|
|
397
|
-
return setMode({ kind: "process" });
|
|
398
|
-
}
|
|
399
432
|
if (!hasSources)
|
|
400
433
|
return;
|
|
401
434
|
if (key.upArrow)
|
|
@@ -406,7 +439,7 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
406
439
|
setActionCursor(0);
|
|
407
440
|
setMode({ kind: "detail" });
|
|
408
441
|
}
|
|
409
|
-
}, [hasSources, onRunAction, targets.length
|
|
442
|
+
}, [hasSources, onRunAction, targets.length]);
|
|
410
443
|
// Side panel actions (↑↓ navigate · ⏎ run · esc close).
|
|
411
444
|
const handleDetailKey = useCallback((key) => {
|
|
412
445
|
if (key.upArrow)
|
|
@@ -427,6 +460,13 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
427
460
|
return void beginLaunch(currentSource.alias);
|
|
428
461
|
return;
|
|
429
462
|
}
|
|
463
|
+
if (item.kind === "proc") {
|
|
464
|
+
if (item.op === "stop")
|
|
465
|
+
return void doStop(item.record);
|
|
466
|
+
if (item.op === "relaunch")
|
|
467
|
+
return void doRelaunch(item.record);
|
|
468
|
+
return void doViewLog(item.record);
|
|
469
|
+
}
|
|
430
470
|
if (item.kind === "remove") {
|
|
431
471
|
if (currentSource)
|
|
432
472
|
return setMode({ kind: "confirm-remove", alias: currentSource.alias });
|
|
@@ -434,30 +474,13 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
434
474
|
}
|
|
435
475
|
void runFlow(item.action);
|
|
436
476
|
}
|
|
437
|
-
}, [actionCursor, detailItems, currentSource, runFlow, beginLaunch]);
|
|
438
|
-
// "process" mode: navigates the launched-processes section (x stop · r relaunch · o log).
|
|
439
|
-
const handleProcessKey = useCallback((input, key) => {
|
|
440
|
-
if (key.escape)
|
|
441
|
-
return setMode({ kind: "list" });
|
|
442
|
-
if (key.upArrow)
|
|
443
|
-
return setProcessCursor((c) => Math.max(0, c - 1));
|
|
444
|
-
if (key.downArrow)
|
|
445
|
-
return setProcessCursor((c) => Math.min(processes.length - 1, c + 1));
|
|
446
|
-
const record = processes[processCursor];
|
|
447
|
-
if (!record)
|
|
448
|
-
return;
|
|
449
|
-
if (input === "x")
|
|
450
|
-
return void doStop(record);
|
|
451
|
-
if (input === "r")
|
|
452
|
-
return void doRelaunch(record);
|
|
453
|
-
if (input === "o")
|
|
454
|
-
return void doViewLog(record);
|
|
455
|
-
}, [processes, processCursor, doStop, doRelaunch, doViewLog]);
|
|
477
|
+
}, [actionCursor, detailItems, currentSource, runFlow, beginLaunch, doStop, doRelaunch, doViewLog]);
|
|
456
478
|
// Collision: stops the existing process and launches the requested one (with its values).
|
|
457
479
|
const confirmRelaunch = useCallback(async (req, existing) => {
|
|
458
480
|
setMode({ kind: "busy", label: `Re-lanzando ${req.alias}…` });
|
|
459
|
-
await stopProcess(launchDeps, existing);
|
|
460
|
-
|
|
481
|
+
const stop = await stopProcess(launchDeps, existing);
|
|
482
|
+
// Same rule as relaunchProcess: never launch over a survivor.
|
|
483
|
+
const res = stop.stopped ? await launchSource(launchDeps, req) : stopFailed(existing.pid);
|
|
461
484
|
await finishRelaunch(req.alias, res);
|
|
462
485
|
}, [launchDeps, finishRelaunch]);
|
|
463
486
|
// input — delegates to the handler of the active mode.
|
|
@@ -468,8 +491,6 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
468
491
|
return handleListKey(input, key);
|
|
469
492
|
if (mode.kind === "detail")
|
|
470
493
|
return handleDetailKey(key);
|
|
471
|
-
if (mode.kind === "process")
|
|
472
|
-
return handleProcessKey(input, key);
|
|
473
494
|
if (mode.kind === "collision") {
|
|
474
495
|
if (key.escape)
|
|
475
496
|
setMode({ kind: "list" });
|
|
@@ -531,6 +552,11 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
531
552
|
? { name: LAUNCH_ACTION.name, description: "abre una terminal" }
|
|
532
553
|
: { name: LAUNCH_ACTION.name, description: "no lanzable — sin comando detectado" };
|
|
533
554
|
}
|
|
555
|
+
if (it.kind === "proc") {
|
|
556
|
+
return {
|
|
557
|
+
name: `${PROCESS_OPS[it.op]} · ${it.record.profile ?? "default"} (PID ${it.record.pid})`,
|
|
558
|
+
};
|
|
559
|
+
}
|
|
534
560
|
if (it.kind === "remove") {
|
|
535
561
|
return { name: "Quitar del workspace", description: "detach + poda bloque + scripts" };
|
|
536
562
|
}
|
|
@@ -539,18 +565,17 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
|
|
|
539
565
|
});
|
|
540
566
|
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(PageHead, { title: `Workspace · ${shortName}`, action: _jsx(Text, { color: colors.faint, children: wsPath }) }), description ? (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.dim, wrap: "truncate-end", children: description }) })) : null, data.warnings.length > 0 ? (_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { color: colors.warn, wrap: "truncate-end", children: [icons.alertDot, " ", data.warnings.length, " advertencia", data.warnings.length > 1 ? "s" : "", " al cargar el workspace (datos parciales)"] }), data.warnings.slice(0, 3).map((w, i) => (_jsxs(Text, { color: colors.faint, wrap: "truncate-end", children: [" ", w] }, `${i}-${w.slice(0, 16)}`)))] })) : null, _jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsx(StatTile, { label: "git", value: data.git?.branch ?? "—", sub: statGitSub(data), accent: true }), _jsx(StatTile, { label: "working tree", value: `${dirty} dirty`, sub: `${data.git?.staged ?? 0} staged · ${data.git?.untracked ?? 0} untracked`, tone: dirty > 0 ? "warn" : "dim" }), _jsx(StatTile, { label: "sources", value: `${totalSources}`, sub: `${dirtySources} dirty`, tone: totalSources > 0 ? "accent" : "dim" }), _jsx(StatTile, { label: "working branches", value: `${workingEntries.length}`, sub: workingEntries.length > 0 ? "declared" : "none", tone: workingEntries.length > 0 ? "accent" : "dim" }), _jsx(StatTile, { label: "procesos", value: `${runningCount}`, sub: processes.length > runningCount
|
|
541
567
|
? `${processes.length - runningCount} inactivos`
|
|
542
|
-
: "running", tone: runningCount > 0 ? "accent" : "dim" })] }), _jsxs(Box, { flexDirection: "row", children: [
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
568
|
+
: "running", tone: runningCount > 0 ? "accent" : "dim" })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, paddingRight: 2, children: hasSources ? (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: "Sources", count: totalSources, marginTop: 0, ...(rangeHint ? { hint: rangeHint } : {}), rightAction: detailOpen ? "esc to close detail" : "↑↓ select · ⏎ actions" }), _jsx(Box, { marginLeft: SOURCES_ROWS_INDENT, flexDirection: "column", children: targets.slice(win.start, winEnd).map((target, offset) => {
|
|
569
|
+
const i = win.start + offset;
|
|
570
|
+
// The last target is the "all sources" sentinel, not a source.
|
|
571
|
+
const source = target === ALL_SOURCES ? undefined : data.sources[i];
|
|
572
|
+
return source ? (_jsx(SourceRow, { source: source, running: runningBySource.get(source.alias) ?? 0, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, source.alias)) : (_jsx(ListRow, { icon: icons.diamond, title: "all sources", subtitle: `aplica a las ${totalSources} fuentes`, chevron: true, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, ALL_SOURCES));
|
|
573
|
+
}) })] })) : null }), detailOpen ? (_jsx(SourceActionsPanel, { isAll: isAllTarget, name: isAllTarget ? "all sources" : currentTarget, source: currentSource, totalSources: totalSources, actions: detailActions, focusedAction: actionCursor })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(QuickActions, { actions: [
|
|
548
574
|
{ key: "⏎", label: "source actions" },
|
|
549
|
-
...(processes.length > 0 ? [{ key: "p", label: "manage processes" }] : []),
|
|
550
575
|
{ key: "g", label: "git status" },
|
|
551
576
|
] }) })] }));
|
|
552
577
|
}
|
|
553
|
-
function SourceRow({ source, active, widthHint, }) {
|
|
578
|
+
function SourceRow({ source, running, active, widthHint, }) {
|
|
554
579
|
const status = source.dirty ? `${source.changedFiles} dirty` : "in sync";
|
|
555
580
|
const branch = source.branch ?? source.mainBranch;
|
|
556
581
|
// Commits carried by the branch itself; "—" when it cannot be measured (on
|
|
@@ -559,11 +584,10 @@ function SourceRow({ source, active, widthHint, }) {
|
|
|
559
584
|
const commits = source.commitCount === null
|
|
560
585
|
? { label: "—", tone: "dim" }
|
|
561
586
|
: { label: `+${source.commitCount}`, tone: "accent" };
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
return (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: label, count: entries.length, marginTop: 1 }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: entries.length > 0 ? (entries.map(([alias, branch]) => (_jsxs(Box, { children: [_jsxs(Text, { color: colors.accent, children: [icons.diamond, " "] }), _jsx(Text, { color: colors.bright, bold: true, children: alias }), _jsx(Box, { flexGrow: 1 }), _jsxs(Text, { color: colors.dim, children: [icons.branch, " ", branch] })] }, alias)))) : emptyHint ? (_jsx(Text, { color: colors.faint, children: emptyHint })) : null })] }));
|
|
587
|
+
// Live activity, after the git chips: the dot is textual (never color alone)
|
|
588
|
+
// and the count is the source's own `running` total (SPEC 019).
|
|
589
|
+
const activity = running > 0 ? [{ label: `● ${running} running`, tone: "ok" }] : [];
|
|
590
|
+
return (_jsx(ListRow, { icon: icons.diamond, iconActive: true, title: source.alias, subtitle: `main ${source.mainBranch}`, meta: [commits, { label: status, tone: source.dirty ? "warn" : "ok" }, ...activity], state: { label: `${icons.branch} ${branch}`, tone: "dim" }, chevron: true, active: active, widthHint: widthHint }));
|
|
567
591
|
}
|
|
568
592
|
/** Side panel of git-flow actions for the selected source (or "all sources"). */
|
|
569
593
|
function SourceActionsPanel({ isAll, name, source, totalSources, actions, focusedAction, }) {
|