agents-inc 0.164.0 → 0.166.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 +63 -0
- package/README.md +8 -9
- package/dist/{chunk-X4SSJZLY.js → chunk-25MPBIK3.js} +12 -261
- package/dist/chunk-25MPBIK3.js.map +1 -0
- package/dist/{chunk-LT5GXEB2.js → chunk-2VUYFTUB.js} +8 -7
- package/dist/chunk-2VUYFTUB.js.map +1 -0
- package/dist/chunk-4AAOOAIN.js +49 -0
- package/dist/chunk-4AAOOAIN.js.map +1 -0
- package/dist/{chunk-ARYNOWKF.js → chunk-4NDBUJHK.js} +8 -8
- package/dist/{chunk-S63LXWMC.js → chunk-6L75SQZU.js} +2 -2
- package/dist/{chunk-7REKOTKG.js → chunk-6LF4CQBY.js} +3 -3
- package/dist/{chunk-K5ITEA3I.js → chunk-7JNJ52CD.js} +34 -17
- package/dist/chunk-7JNJ52CD.js.map +1 -0
- package/dist/{chunk-XPDVAJDH.js → chunk-A4KDXNOT.js} +3519 -1568
- package/dist/chunk-A4KDXNOT.js.map +1 -0
- package/dist/{chunk-XHPWTL4I.js → chunk-DAIEQJIF.js} +3 -3
- package/dist/{chunk-UITEKY2R.js → chunk-ENGYJCTF.js} +28 -4
- package/dist/chunk-ENGYJCTF.js.map +1 -0
- package/dist/{chunk-G2JJ5BO5.js → chunk-G4JK7WVO.js} +336 -140
- package/dist/chunk-G4JK7WVO.js.map +1 -0
- package/dist/{chunk-X37UYIE3.js → chunk-G6UREQ4V.js} +436 -739
- package/dist/chunk-G6UREQ4V.js.map +1 -0
- package/dist/chunk-GE3WKJ6Q.js +375 -0
- package/dist/chunk-GE3WKJ6Q.js.map +1 -0
- package/dist/{chunk-RGYDFBCT.js → chunk-HHIYT3PI.js} +5 -5
- package/dist/{chunk-2CQNPLVF.js → chunk-HWEKHVLE.js} +63 -42
- package/dist/chunk-HWEKHVLE.js.map +1 -0
- package/dist/{chunk-XVAQG2CV.js → chunk-JOEA52NR.js} +10 -8
- package/dist/chunk-JOEA52NR.js.map +1 -0
- package/dist/{chunk-3WVH2CTK.js → chunk-JQRJQ4SS.js} +15 -8
- package/dist/chunk-JQRJQ4SS.js.map +1 -0
- package/dist/{chunk-DSL66I4N.js → chunk-LFWLEDUG.js} +6 -6
- package/dist/{chunk-B3Y3QMWI.js → chunk-MAWNVT2C.js} +4 -4
- package/dist/{chunk-Q4IRRVXK.js → chunk-MPTNC32T.js} +3 -3
- package/dist/chunk-NBXXFIIW.js +73 -0
- package/dist/chunk-NBXXFIIW.js.map +1 -0
- package/dist/{chunk-B6FSLXYN.js → chunk-PMJWD27C.js} +3 -3
- package/dist/{chunk-XATLUKXK.js → chunk-PNB3524H.js} +6 -6
- package/dist/chunk-PXWG7KFO.js +39 -0
- package/dist/chunk-PXWG7KFO.js.map +1 -0
- package/dist/{chunk-4VL3CEOS.js → chunk-QHDPLLK6.js} +3 -3
- package/dist/{chunk-AOTCIUGX.js → chunk-RAHSOJQ2.js} +2 -2
- package/dist/{chunk-PHCPUQVR.js → chunk-RZDXDMT6.js} +2 -2
- package/dist/{chunk-6MV4JOCL.js → chunk-SAYZWCH6.js} +2 -2
- package/dist/{chunk-URXIQE7I.js → chunk-SCOQ34YM.js} +2 -2
- package/dist/{chunk-NQXO4LR3.js → chunk-SXVHSOTH.js} +16 -11
- package/dist/chunk-SXVHSOTH.js.map +1 -0
- package/dist/{chunk-QZX7SYKU.js → chunk-T6UWJAB3.js} +2 -2
- package/dist/{chunk-ZVXGW2IC.js → chunk-TODCQFRB.js} +4 -6
- package/dist/chunk-TODCQFRB.js.map +1 -0
- package/dist/{chunk-YRS3QZP2.js → chunk-TTY6DPJN.js} +3 -3
- package/dist/{chunk-QGUP3QJF.js → chunk-TZ2YJJKK.js} +22 -18
- package/dist/{chunk-QGUP3QJF.js.map → chunk-TZ2YJJKK.js.map} +1 -1
- package/dist/chunk-V3I7VQ7N.js +356 -0
- package/dist/chunk-V3I7VQ7N.js.map +1 -0
- package/dist/{chunk-AVK2HEKB.js → chunk-V5WXIM2F.js} +2 -6
- package/dist/{chunk-AVK2HEKB.js.map → chunk-V5WXIM2F.js.map} +1 -1
- package/dist/{chunk-NKGYKOB7.js → chunk-VAPTVR3J.js} +7 -8
- package/dist/chunk-VAPTVR3J.js.map +1 -0
- package/dist/chunk-VRXX4D6K.js +31 -0
- package/dist/chunk-VRXX4D6K.js.map +1 -0
- package/dist/{chunk-ABAZMMG4.js → chunk-WVUDLKIO.js} +2 -2
- package/dist/{chunk-ECURHW3T.js → chunk-WWIFNPJG.js} +13 -12
- package/dist/chunk-WWIFNPJG.js.map +1 -0
- package/dist/{chunk-J27W6TXS.js → chunk-XQHZPINL.js} +8 -4
- package/dist/chunk-XQHZPINL.js.map +1 -0
- package/dist/{chunk-V5GLL2JB.js → chunk-XZEVWPX6.js} +7 -7
- package/dist/chunk-Y3VIRVVE.js +932 -0
- package/dist/chunk-Y3VIRVVE.js.map +1 -0
- package/dist/{chunk-NTF4UXGK.js → chunk-Y47EV74W.js} +73 -30
- package/dist/chunk-Y47EV74W.js.map +1 -0
- package/dist/chunk-ZR4YPKXQ.js +159 -0
- package/dist/chunk-ZR4YPKXQ.js.map +1 -0
- package/dist/chunk-ZXKBERQU.js +250 -0
- package/dist/chunk-ZXKBERQU.js.map +1 -0
- package/dist/commands/build/marketplace.js +17 -17
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +11 -9
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +105 -27
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +309 -171
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +503 -314
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +40 -23
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +44 -40
- package/dist/commands/list.js +44 -10
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +13 -10
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +12 -10
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +102 -15
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +231 -103
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +49 -20
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/prompt-confirm.js +1 -1
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/select-list.js +3 -3
- package/dist/components/common/spinner.js +6 -3
- package/dist/components/wizard/category-grid.js +5 -5
- package/dist/components/wizard/checkbox-grid.js +4 -4
- package/dist/components/wizard/domain-selection.js +9 -9
- package/dist/components/wizard/run-wizard-session.js +29 -29
- package/dist/components/wizard/scroll-affordance.js +2 -2
- package/dist/components/wizard/skill-agent-summary.js +5 -5
- package/dist/components/wizard/source-grid.js +6 -6
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-agents.js +8 -8
- package/dist/components/wizard/step-build.js +8 -8
- package/dist/components/wizard/step-confirm.js +9 -9
- package/dist/components/wizard/step-sources.js +9 -9
- package/dist/components/wizard/step-stack.js +9 -9
- package/dist/components/wizard/summary-panel.js +8 -8
- package/dist/components/wizard/toast.js +2 -2
- package/dist/components/wizard/wizard-layout.js +12 -12
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard.js +27 -27
- package/dist/hooks/init.js +69 -43
- package/dist/hooks/init.js.map +1 -1
- package/dist/load-agent-defs-3C27ENC7.js +14 -0
- package/dist/recompile-project-agents-DGNBCU3N.js +18 -0
- package/dist/{source-loader-GRBVNRAW.js → source-loader-7KZ3MD5O.js} +6 -4
- package/dist/src/agents/_templates/agent-body.liquid +55 -0
- package/dist/src/agents/_templates/agent.liquid +1 -55
- package/dist/src/agents/meta/agent-summoner/output.md +1 -1
- package/dist/src/agents/meta/agent-summoner/playbook.md +15 -7
- package/dist/stores/wizard-store.js +4 -4
- package/package.json +10 -9
- package/src/agents/_templates/agent-body.liquid +55 -0
- package/src/agents/_templates/agent.liquid +1 -55
- package/src/agents/meta/agent-summoner/output.md +1 -1
- package/src/agents/meta/agent-summoner/playbook.md +15 -7
- package/src/schemas/project-config.schema.json +1 -1
- package/src/schemas/project-source-config.schema.json +1 -1
- package/dist/chunk-2CQNPLVF.js.map +0 -1
- package/dist/chunk-3WVH2CTK.js.map +0 -1
- package/dist/chunk-7ANJQLPJ.js +0 -35
- package/dist/chunk-7ANJQLPJ.js.map +0 -1
- package/dist/chunk-ECURHW3T.js.map +0 -1
- package/dist/chunk-FLW25ORT.js +0 -130
- package/dist/chunk-FLW25ORT.js.map +0 -1
- package/dist/chunk-G2JJ5BO5.js.map +0 -1
- package/dist/chunk-J27W6TXS.js.map +0 -1
- package/dist/chunk-JCPANDNR.js +0 -35
- package/dist/chunk-JCPANDNR.js.map +0 -1
- package/dist/chunk-JIERYE6B.js +0 -480
- package/dist/chunk-JIERYE6B.js.map +0 -1
- package/dist/chunk-JU4ZGJ7A.js +0 -668
- package/dist/chunk-JU4ZGJ7A.js.map +0 -1
- package/dist/chunk-K5ITEA3I.js.map +0 -1
- package/dist/chunk-LT5GXEB2.js.map +0 -1
- package/dist/chunk-NKGYKOB7.js.map +0 -1
- package/dist/chunk-NQXO4LR3.js.map +0 -1
- package/dist/chunk-NTF4UXGK.js.map +0 -1
- package/dist/chunk-UITEKY2R.js.map +0 -1
- package/dist/chunk-X37UYIE3.js.map +0 -1
- package/dist/chunk-X4SSJZLY.js.map +0 -1
- package/dist/chunk-XPDVAJDH.js.map +0 -1
- package/dist/chunk-XVAQG2CV.js.map +0 -1
- package/dist/chunk-ZBPEFQ4G.js +0 -12
- package/dist/chunk-ZBPEFQ4G.js.map +0 -1
- package/dist/chunk-ZVXGW2IC.js.map +0 -1
- package/dist/load-agent-defs-7IM3GBEQ.js +0 -13
- package/dist/recompile-project-agents-VR4NLGOU.js +0 -17
- /package/dist/{chunk-ARYNOWKF.js.map → chunk-4NDBUJHK.js.map} +0 -0
- /package/dist/{chunk-S63LXWMC.js.map → chunk-6L75SQZU.js.map} +0 -0
- /package/dist/{chunk-7REKOTKG.js.map → chunk-6LF4CQBY.js.map} +0 -0
- /package/dist/{chunk-XHPWTL4I.js.map → chunk-DAIEQJIF.js.map} +0 -0
- /package/dist/{chunk-RGYDFBCT.js.map → chunk-HHIYT3PI.js.map} +0 -0
- /package/dist/{chunk-DSL66I4N.js.map → chunk-LFWLEDUG.js.map} +0 -0
- /package/dist/{chunk-B3Y3QMWI.js.map → chunk-MAWNVT2C.js.map} +0 -0
- /package/dist/{chunk-Q4IRRVXK.js.map → chunk-MPTNC32T.js.map} +0 -0
- /package/dist/{chunk-B6FSLXYN.js.map → chunk-PMJWD27C.js.map} +0 -0
- /package/dist/{chunk-XATLUKXK.js.map → chunk-PNB3524H.js.map} +0 -0
- /package/dist/{chunk-4VL3CEOS.js.map → chunk-QHDPLLK6.js.map} +0 -0
- /package/dist/{chunk-AOTCIUGX.js.map → chunk-RAHSOJQ2.js.map} +0 -0
- /package/dist/{chunk-PHCPUQVR.js.map → chunk-RZDXDMT6.js.map} +0 -0
- /package/dist/{chunk-6MV4JOCL.js.map → chunk-SAYZWCH6.js.map} +0 -0
- /package/dist/{chunk-URXIQE7I.js.map → chunk-SCOQ34YM.js.map} +0 -0
- /package/dist/{chunk-QZX7SYKU.js.map → chunk-T6UWJAB3.js.map} +0 -0
- /package/dist/{chunk-YRS3QZP2.js.map → chunk-TTY6DPJN.js.map} +0 -0
- /package/dist/{chunk-ABAZMMG4.js.map → chunk-WVUDLKIO.js.map} +0 -0
- /package/dist/{chunk-V5GLL2JB.js.map → chunk-XZEVWPX6.js.map} +0 -0
- /package/dist/{load-agent-defs-7IM3GBEQ.js.map → load-agent-defs-3C27ENC7.js.map} +0 -0
- /package/dist/{recompile-project-agents-VR4NLGOU.js.map → recompile-project-agents-DGNBCU3N.js.map} +0 -0
- /package/dist/{source-loader-GRBVNRAW.js.map → source-loader-7KZ3MD5O.js.map} +0 -0
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
buildMarketplacePluginRef,
|
|
4
|
-
claudePluginInstall,
|
|
5
4
|
getErrorMessage,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from "./chunk-
|
|
5
|
+
hostAt,
|
|
6
|
+
isLocalOnlySkill
|
|
7
|
+
} from "./chunk-A4KDXNOT.js";
|
|
9
8
|
import {
|
|
10
9
|
CLI_INVOKE_COMMAND,
|
|
11
10
|
EJECT_SOURCE
|
|
12
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ENGYJCTF.js";
|
|
13
12
|
|
|
14
13
|
// src/cli/lib/operations/skills/install-plugin-skills.ts
|
|
15
14
|
function pluginInstallFailureError(failedCount) {
|
|
@@ -22,14 +21,14 @@ function unbackedPluginInstallError(ids) {
|
|
|
22
21
|
return `Cannot install ${ids.length} skill(s) as plugins \u2014 no marketplace carries them: ${ids.join(", ")}. A skill that exists only in this project can only be installed as a local copy. Set it to Local on the Sources step, or publish it to a marketplace first.`;
|
|
23
22
|
}
|
|
24
23
|
async function installPluginSkills(skills, marketplace, projectDir) {
|
|
24
|
+
const host = hostAt(projectDir);
|
|
25
25
|
const pluginSkills = skills.filter((s) => s.origin !== EJECT_SOURCE);
|
|
26
26
|
const installed = [];
|
|
27
27
|
const failed = [];
|
|
28
28
|
for (const skill of pluginSkills) {
|
|
29
29
|
const pluginRef = buildMarketplacePluginRef(skill.id, marketplace);
|
|
30
|
-
const pluginScope = toClaudePluginScope(skill.scope);
|
|
31
30
|
try {
|
|
32
|
-
await
|
|
31
|
+
await host.installPlugin(pluginRef, skill.scope, projectDir);
|
|
33
32
|
installed.push({ id: skill.id, ref: pluginRef });
|
|
34
33
|
} catch (error) {
|
|
35
34
|
failed.push({ id: skill.id, error: getErrorMessage(error) });
|
|
@@ -44,4 +43,4 @@ export {
|
|
|
44
43
|
unbackedPluginInstallError,
|
|
45
44
|
installPluginSkills
|
|
46
45
|
};
|
|
47
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
//# sourceMappingURL=chunk-VAPTVR3J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/operations/skills/install-plugin-skills.ts"],"sourcesContent":["import { hostAt } from \"../../hosts/host-for.js\";\nimport { isLocalOnlySkill } from \"../../loading/multi-source-loader.js\";\nimport { buildMarketplacePluginRef } from \"../../plugins/index.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { CLI_INVOKE_COMMAND, EJECT_SOURCE } from \"../../../consts.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../../../types/index.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\n\nexport type PluginInstallResult = {\n installed: Array<{ id: SkillId; ref: string }>;\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/**\n * Hard-error message for failed plugin installs. Plugin install intent is\n * inviolable (never fall back to eject) — callers MUST error with this BEFORE\n * config is written, or config.ts gains orphan entries claiming the skill\n * is installed.\n */\nexport function pluginInstallFailureError(failedCount: number): string {\n return `Failed to install ${failedCount} plugin skill(s). Plugin install intent could not be honored. Verify the skill id matches the marketplace, run '${CLI_INVOKE_COMMAND} update' to refresh the marketplace, or switch affected skills to eject mode.`;\n}\n\n/**\n * Skills asking to be installed as plugins that no marketplace carries.\n *\n * A skill that exists only in this project cannot be pulled from anywhere, so the ask is\n * refusable BEFORE anything is attempted — which is what separates it from an install\n * that was tried and failed. The Sources grid reads {@link isLocalOnlySkill} to decide\n * whether to offer the plugin cell at all, so this guard shares it: a caller reaching\n * past that surface must meet the same rule it did.\n */\nexport function unbackedPluginSkillIds(\n skills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n return skills\n .filter((skill) => skill.origin !== EJECT_SOURCE)\n .filter((skill) => isLocalOnlySkill(matrix.skills[skill.id]))\n .map((skill) => skill.id);\n}\n\n/**\n * The refusal text for {@link unbackedPluginSkillIds}. Deliberately NOT\n * {@link pluginInstallFailureError}: refreshing a marketplace and checking an id against\n * it are impossible instructions for a skill the user wrote themselves, so the two\n * failures owe different advice.\n */\nexport function unbackedPluginInstallError(ids: SkillId[]): string {\n return `Cannot install ${ids.length} skill(s) as plugins — no marketplace carries them: ${ids.join(\", \")}. A skill that exists only in this project can only be installed as a local copy. Set it to Local on the Sources step, or publish it to a marketplace first.`;\n}\n\n/**\n * Installs skill plugins through the host this installation belongs to, routing by scope.\n *\n * For each skill, constructs the plugin ref as `{skillId}@{marketplace}` and asks the host to\n * install it at the skill's own scope. The host is read off the folder under `projectDir`,\n * because the folder is the only record of a provider — which is also the limit of it: a run\n * creating a folder that is not there yet must hand the provider down instead (C4).\n */\nexport async function installPluginSkills(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginInstallResult> {\n const host = hostAt(projectDir);\n const pluginSkills = skills.filter((s) => s.origin !== EJECT_SOURCE);\n const installed: PluginInstallResult[\"installed\"] = [];\n const failed: PluginInstallResult[\"failed\"] = [];\n\n for (const skill of pluginSkills) {\n const pluginRef = buildMarketplacePluginRef(skill.id, marketplace);\n try {\n await host.installPlugin(pluginRef, skill.scope, projectDir);\n installed.push({ id: skill.id, ref: pluginRef });\n } catch (error) {\n failed.push({ id: skill.id, error: getErrorMessage(error) });\n }\n }\n\n return { installed, failed };\n}\n"],"mappings":";;;;;;;;;;;;;AAmBO,SAAS,0BAA0B,aAA6B;AACrE,SAAO,qBAAqB,WAAW,mHAAmH,kBAAkB;AAC9K;AAWO,SAAS,uBACd,QACA,QACW;AACX,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,WAAW,YAAY,EAC/C,OAAO,CAAC,UAAU,iBAAiB,OAAO,OAAO,MAAM,EAAE,CAAC,CAAC,EAC3D,IAAI,CAAC,UAAU,MAAM,EAAE;AAC5B;AAQO,SAAS,2BAA2B,KAAwB;AACjE,SAAO,kBAAkB,IAAI,MAAM,4DAAuD,IAAI,KAAK,IAAI,CAAC;AAC1G;AAUA,eAAsB,oBACpB,QACA,aACA,YAC8B;AAC9B,QAAM,OAAO,OAAO,UAAU;AAC9B,QAAM,eAAe,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AACnE,QAAM,YAA8C,CAAC;AACrD,QAAM,SAAwC,CAAC;AAE/C,aAAW,SAAS,cAAc;AAChC,UAAM,YAAY,0BAA0B,MAAM,IAAI,WAAW;AACjE,QAAI;AACF,YAAM,KAAK,cAAc,WAAW,MAAM,OAAO,UAAU;AAC3D,gBAAU,KAAK,EAAE,IAAI,MAAM,IAAI,KAAK,UAAU,CAAC;AAAA,IACjD,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,gBAAgB,KAAK,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,OAAO;AAC7B;","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
render
|
|
4
|
+
} from "./chunk-JFLVEFFP.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/components/common/spinner.tsx
|
|
7
|
+
import "react";
|
|
8
|
+
import { Text } from "ink";
|
|
9
|
+
import { Spinner as InkSpinner } from "@inkjs/ui";
|
|
10
|
+
import { jsx } from "react/jsx-runtime";
|
|
11
|
+
var Spinner = ({ label }) => /* @__PURE__ */ jsx(InkSpinner, { label });
|
|
12
|
+
async function awaitUnderSpinner(label, load) {
|
|
13
|
+
const spinner = render(/* @__PURE__ */ jsx(Spinner, { label }));
|
|
14
|
+
try {
|
|
15
|
+
return await load();
|
|
16
|
+
} finally {
|
|
17
|
+
await takeDownWithoutTrace(spinner, label);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function takeDownWithoutTrace(spinner, label) {
|
|
21
|
+
spinner.rerender(/* @__PURE__ */ jsx(Text, { children: label }));
|
|
22
|
+
await spinner.waitUntilRenderFlush();
|
|
23
|
+
spinner.clear();
|
|
24
|
+
spinner.unmount();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
Spinner,
|
|
29
|
+
awaitUnderSpinner
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=chunk-VRXX4D6K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Text, type Instance } from \"ink\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\nimport { render } from \"../render.js\";\n\ntype SpinnerProps = {\n label: string;\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => <InkSpinner label={label} />;\n\n/**\n * Awaits `load` behind a spinner and takes the spinner down whichever way the await ends, leaving\n * the terminal as it found it — what `init` and `edit` render next is a wizard sized to the\n * terminal's full height, so one line left above it pushes the wizard's top line off the screen.\n *\n * The cleanup is a `finally` because a load that refuses the run throws from inside this await,\n * and oclif would otherwise paint its error under an Ink tree still repainting over it. Never a\n * `catch`: the throw reaches the caller untouched, or both the error rendering and the exit code\n * change with it.\n */\nexport async function awaitUnderSpinner<T>(label: string, load: () => Promise<T>): Promise<T> {\n const spinner = render(<Spinner label={label} />);\n try {\n return await load();\n } finally {\n await takeDownWithoutTrace(spinner, label);\n }\n}\n\n/**\n * Stop the clock, paint what Ink is holding, and only then erase.\n *\n * Ink paints through a render throttle, and a spinner frame that arrives inside its window is\n * held rather than painted. `unmount()` paints whatever is held — so a spinner cleared with a\n * frame held was drawn again after the clear, where nothing erases it. A starved event loop is\n * what puts one there: a spinner tick that runs late is followed by the next one less than a\n * window later. Hence the order: the still line has no clock, so once it replaces the spinner no\n * new frame can be held; the flush paints anything already held; the clear then erases the last\n * thing painted, and `unmount()` finds nothing left to draw.\n */\nasync function takeDownWithoutTrace(spinner: Instance, label: string): Promise<void> {\n spinner.rerender(<Text>{label}</Text>);\n await spinner.waitUntilRenderFlush();\n spinner.clear();\n spinner.unmount();\n}\n"],"mappings":";;;;;;AAAA,OAAkB;AAClB,SAAS,YAA2B;AACpC,SAAS,WAAW,kBAAkB;AAOwB;AAAvD,IAAM,UAAkC,CAAC,EAAE,MAAM,MAAM,oBAAC,cAAW,OAAc;AAYxF,eAAsB,kBAAqB,OAAe,MAAoC;AAC5F,QAAM,UAAU,OAAO,oBAAC,WAAQ,OAAc,CAAE;AAChD,MAAI;AACF,WAAO,MAAM,KAAK;AAAA,EACpB,UAAE;AACA,UAAM,qBAAqB,SAAS,KAAK;AAAA,EAC3C;AACF;AAaA,eAAe,qBAAqB,SAAmB,OAA8B;AACnF,UAAQ,SAAS,oBAAC,QAAM,iBAAM,CAAO;AACrC,QAAM,QAAQ,qBAAqB;AACnC,UAAQ,MAAM;AACd,UAAQ,QAAQ;AAClB;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SCROLL_VIEWPORT
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ENGYJCTF.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/components/hooks/use-section-scroll.ts
|
|
7
7
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -118,4 +118,4 @@ export {
|
|
|
118
118
|
useSectionScroll,
|
|
119
119
|
computeRowScrollTop
|
|
120
120
|
};
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-WVUDLKIO.js.map
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepConfirm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RAHSOJQ2.js";
|
|
5
5
|
import {
|
|
6
6
|
StepSources
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DAIEQJIF.js";
|
|
8
8
|
import {
|
|
9
9
|
StepStack
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-SCOQ34YM.js";
|
|
11
11
|
import {
|
|
12
12
|
WizardLayout
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4NDBUJHK.js";
|
|
14
14
|
import {
|
|
15
15
|
DomainSelection
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-LFWLEDUG.js";
|
|
17
17
|
import {
|
|
18
18
|
StepAgents
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-XZEVWPX6.js";
|
|
20
20
|
import {
|
|
21
21
|
StepBuild
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-MPTNC32T.js";
|
|
23
23
|
import {
|
|
24
24
|
HOTKEY_ACCEPT_DEFAULTS,
|
|
25
25
|
HOTKEY_INFO,
|
|
@@ -29,20 +29,20 @@ import {
|
|
|
29
29
|
} from "./chunk-WTJ3AY33.js";
|
|
30
30
|
import {
|
|
31
31
|
useWizardStore
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-7JNJ52CD.js";
|
|
33
33
|
import {
|
|
34
34
|
validateSelection
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-A4KDXNOT.js";
|
|
36
36
|
import {
|
|
37
37
|
findStack,
|
|
38
38
|
getSkillById,
|
|
39
39
|
matrix
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-V5WXIM2F.js";
|
|
41
41
|
import {
|
|
42
42
|
CLI_COLORS,
|
|
43
43
|
EJECT_SOURCE,
|
|
44
44
|
FALLBACK_DOMAIN
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-ENGYJCTF.js";
|
|
46
46
|
|
|
47
47
|
// src/cli/components/wizard/wizard.tsx
|
|
48
48
|
import { useCallback as useCallback2, useEffect } from "react";
|
|
@@ -263,6 +263,7 @@ var Wizard = ({
|
|
|
263
263
|
domainSelections: store.domainSelections,
|
|
264
264
|
selectedDomains: store.selectedDomains,
|
|
265
265
|
unresolvableSkillIds: store.unresolvableSkillIds,
|
|
266
|
+
foldedSkillIds: store.foldedSkillIds,
|
|
266
267
|
cancelled: false,
|
|
267
268
|
validation
|
|
268
269
|
};
|
|
@@ -313,4 +314,4 @@ export {
|
|
|
313
314
|
resolveSelectedSkillIds,
|
|
314
315
|
Wizard
|
|
315
316
|
};
|
|
316
|
-
//# sourceMappingURL=chunk-
|
|
317
|
+
//# sourceMappingURL=chunk-WWIFNPJG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/themes/default.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback, useEffect } from \"react\";\nimport { EJECT_SOURCE } from \"../../consts.js\";\nimport { useApp, useInput } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardState } from \"../../stores/wizard-store.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepAgents } from \"./step-agents.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\nimport { validateSelection } from \"../../lib/matrix/index.js\";\nimport { getSkillById } from \"../../lib/matrix/matrix-provider.js\";\nimport { findStack } from \"../../lib/matrix/matrix-provider.js\";\nimport {\n HOTKEY_ACCEPT_DEFAULTS,\n HOTKEY_INFO,\n HOTKEY_SCOPE,\n isHotkey,\n isInfoPanelAvailable,\n} from \"./hotkeys.js\";\nimport type {\n AgentName,\n Domain,\n DomainSelections,\n SelectionValidation,\n SkillId,\n StackAgentConfig,\n} from \"../../types/index.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\n\nconst TOAST_DURATION_MS = 2000;\n\nexport type WizardResultV2 = {\n skills: SkillConfig[];\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n /**\n * What each sub-agent holds and what preloads, when the producer knows per `(skill, sub-agent)`.\n * A shared configuration installed with `init --from` does: it assigns each skill to named\n * sub-agents at a named load state, and that curation is the whole of what was shared.\n *\n * The wizard has no per-agent granularity — a skill is selected for the project, not for one\n * sub-agent — so it leaves this undefined and the install pipeline's ownership rules build the\n * stack as they always have.\n */\n assignedStack?: Partial<Record<AgentName, StackAgentConfig>>;\n selectedStackId: string | null;\n /**\n * What the written config should record about itself, when the producer already knows.\n *\n * A shared configuration installed with `init --from` does: its payload carries the sharer's own\n * description, because it names no stack for the install to resolve one out of. The wizard leaves\n * this undefined and the install pipeline takes the applied stack's description instead — there\n * IS a loaded stack on that path, and it is the authority on its own sentence.\n */\n description?: string;\n domainSelections: DomainSelections;\n selectedDomains: Domain[];\n /**\n * Skill ids from the saved config that could not be resolved against the loaded source matrix\n * this session. The wizard could not represent them, so they are absent from `skills` and the\n * merge removes their config entries. Carried out of the wizard so the command can NAME each\n * removal and say why it happened — a removal the user never asked for must never be silent.\n */\n unresolvableSkillIds: SkillId[];\n /**\n * The `[P][G]` pairs `s` folded into the global install, which the selection key's collapse\n * into the same config entry does not. Absent from a producer with no keys to press: a shared\n * configuration folds nothing.\n */\n foldedSkillIds?: SkillId[];\n cancelled: boolean;\n validation: SelectionValidation;\n};\n\nexport type WizardProps = {\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version: string;\n logo?: string | undefined;\n startupMessages?: StartupMessage[] | undefined;\n initialAgents?: AgentName[] | undefined;\n installedSkillIds?: SkillId[] | undefined;\n};\n\n/** S-key scope toggle: blocked (with a toast) in global context; no-op without a focused row. */\nfunction toggleFocusedScope<Id>(\n isEditingFromGlobalScope: boolean,\n focusedId: Id | null,\n actions: { toggle: (id: Id) => void; setToastMessage: (message: string) => void },\n): void {\n if (isEditingFromGlobalScope) {\n actions.setToastMessage(\"Scope toggle unavailable in global context\");\n return;\n }\n if (focusedId) {\n actions.toggle(focusedId);\n }\n}\n\n/** Selected skill ids: the chosen stack's full list under stack-defaults, else the wizard selections. */\nexport function resolveSelectedSkillIds(store: WizardState): SkillId[] {\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = findStack(store.selectedStackId);\n if (!stack) {\n throw new Error(`Stack not found: ${store.selectedStackId}`);\n }\n return [...stack.allSkillIds];\n }\n return store.getAllSelectedTechnologies().map((tech) => getSkillById(tech).id);\n}\n\nexport const Wizard: React.FC<WizardProps> = ({\n onComplete,\n onCancel,\n version,\n logo,\n startupMessages,\n initialAgents,\n installedSkillIds,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n\n const toastMessage = useWizardStore((s) => s.toastMessage);\n\n useEffect(() => {\n if (!toastMessage) return;\n const timer = setTimeout(() => {\n useWizardStore.getState().setToastMessage(null);\n }, TOAST_DURATION_MS);\n return () => clearTimeout(timer);\n }, [toastMessage]);\n\n const buildStepProps = useBuildStepProps({\n store,\n ...(installedSkillIds !== undefined && { installedSkillIds }),\n });\n\n useInput((input, key) => {\n // Closing is never gated on the step: the panel is only ever open on a step\n // that allows it, and gating the close would strand the overlay.\n if (store.showInfo) {\n if (key.escape || isHotkey(input, HOTKEY_INFO)) {\n store.toggleInfo();\n }\n return;\n }\n\n if (isInfoPanelAvailable(store.step) && isHotkey(input, HOTKEY_INFO)) {\n store.toggleInfo();\n return;\n }\n\n if (key.escape) {\n // Steps with their own ESC handling (via useInput in child components):\n // - \"stack\": StackSelection handles ESC via onCancel prop\n // - \"domains\": DomainSelection handles ESC via CheckboxGrid onBack\n // - \"build\": StepBuild handles ESC via its own useInput\n // - \"sources\": StepSources handles ESC via onBack prop\n // - \"confirm\": StepConfirm handles ESC via onBack prop\n // - \"agents\": StepAgents handles ESC via its own useInput\n // All steps handle their own ESC, so this is a no-op.\n return;\n }\n\n if (\n isHotkey(input, HOTKEY_ACCEPT_DEFAULTS) &&\n store.step === \"build\" &&\n store.selectedStackId\n ) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"build\") {\n toggleFocusedScope(store.isEditingFromGlobalScope, store.focusedSkillId, {\n toggle: store.toggleSkillScope,\n setToastMessage: store.setToastMessage,\n });\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"agents\") {\n toggleFocusedScope(store.isEditingFromGlobalScope, store.focusedAgentId, {\n toggle: store.toggleAgentScope,\n setToastMessage: store.setToastMessage,\n });\n return;\n }\n });\n\n const handleComplete = useCallback(() => {\n const allSkills = resolveSelectedSkillIds(store);\n\n const skillConfigs: SkillConfig[] = allSkills.map((id) => {\n const existing = store.skillConfigs.find((sc) => sc.id === id && !sc.excluded);\n return existing ?? { id, scope: \"global\" as const, origin: EJECT_SOURCE };\n });\n\n // Append excluded entries so they flow through to config generation\n const excludedConfigs = store.skillConfigs.filter((sc) => sc.excluded);\n const allSkillConfigs = [...skillConfigs, ...excludedConfigs];\n\n const validation = validateSelection(allSkills);\n\n const result: WizardResultV2 = {\n skills: allSkillConfigs,\n selectedAgents: store.selectedAgents,\n agentConfigs: store.agentConfigs,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n unresolvableSkillIds: store.unresolvableSkillIds,\n foldedSkillIds: store.foldedSkillIds,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack onCancel={handleCancel} />;\n\n case \"domains\":\n return <DomainSelection />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n return (\n <StepSources\n onContinue={() => {\n if (!initialAgents?.length) {\n store.preselectAgentsFromDomains();\n }\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents />;\n\n case \"confirm\": {\n return <StepConfirm onComplete={handleComplete} onBack={store.goBack} />;\n }\n\n default: {\n const _exhaustive: never = store.step;\n return _exhaustive;\n }\n }\n };\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version} logo={logo} startupMessages={startupMessages}>\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { extendTheme, defaultTheme } from \"@inkjs/ui\";\nimport { CLI_COLORS } from \"../../consts.js\";\n\n/** Variant → color mapping shared by StatusMessage, Alert, and Badge; unknown variants fall back per-site. */\nconst VARIANT_COLORS: Partial<Record<string, string>> = {\n error: CLI_COLORS.ERROR,\n warning: CLI_COLORS.WARNING,\n success: CLI_COLORS.SUCCESS,\n info: CLI_COLORS.INFO,\n};\n\n/**\n * @inkjs/ui types the props it hands a style function as `any`, so reading\n * `variant` off them is an unchecked access at four call sites. Taking it as\n * `unknown` here is the boundary: the value is only ever a lookup key, and a\n * variant the map does not name falls back to what the call site passes.\n */\nconst variantColor = (variant: unknown, fallback: string): string =>\n VARIANT_COLORS[String(variant)] ?? fallback;\n\n/**\n * CLI theme matching existing picocolors styling\n *\n * Color scheme:\n * - Cyan: Focus/primary (headings, prompts, selected items)\n * - Green: Success states\n * - Red: Errors\n * - Yellow: Warnings\n * - Blue: Info messages\n */\nexport const cliTheme = extendTheme(defaultTheme, {\n components: {\n Spinner: {\n styles: {\n frame: () => ({ color: CLI_COLORS.PRIMARY }),\n label: () => ({ color: CLI_COLORS.NEUTRAL }),\n },\n },\n Select: {\n styles: {\n focusIndicator: () => ({ color: CLI_COLORS.FOCUS }),\n label: ({ isFocused }) => ({\n color: isFocused ? CLI_COLORS.FOCUS : undefined,\n }),\n },\n },\n MultiSelect: {\n styles: {\n focusIndicator: () => ({ color: CLI_COLORS.FOCUS }),\n label: ({ isFocused, isSelected }) => ({\n color: isFocused ? CLI_COLORS.FOCUS : isSelected ? CLI_COLORS.SUCCESS : undefined,\n }),\n checkboxChecked: () => ({ color: CLI_COLORS.SUCCESS }),\n },\n },\n StatusMessage: {\n styles: {\n container: ({ variant }) => ({\n borderStyle: \"round\",\n borderColor: variantColor(variant, CLI_COLORS.INFO),\n }),\n },\n },\n Alert: {\n styles: {\n container: ({ variant }) => ({\n borderColor: variantColor(variant, CLI_COLORS.INFO),\n }),\n icon: ({ variant }) => ({\n color: variantColor(variant, CLI_COLORS.INFO),\n }),\n },\n },\n TextInput: {\n styles: {\n container: ({ isFocused }) => ({\n borderColor: isFocused ? CLI_COLORS.FOCUS : CLI_COLORS.NEUTRAL,\n }),\n cursor: () => ({ color: CLI_COLORS.PRIMARY }),\n },\n },\n ConfirmInput: {\n styles: {\n highlightedChoice: () => ({ color: CLI_COLORS.PRIMARY }),\n },\n },\n Badge: {\n styles: {\n container: ({ variant }) => ({\n color: variantColor(variant, CLI_COLORS.PRIMARY),\n }),\n },\n },\n },\n});\n","import { useCallback } from \"react\";\nimport { FALLBACK_DOMAIN } from \"../../consts.js\";\nimport type { Domain, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [FALLBACK_DOMAIN];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || FALLBACK_DOMAIN;\n\n const onToggle = useCallback(\n (categoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || FALLBACK_DOMAIN;\n const cat = matrix.categories[categoryId];\n const exclusive = cat?.exclusive ?? true;\n store.toggleTechnology(domain, categoryId, techId, exclusive);\n },\n [store],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n allSelections,\n showLabels: store.showLabels,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
|
|
@@ -15,17 +15,21 @@ function useFocusedListItem(rowCount, getColCount, options = {}) {
|
|
|
15
15
|
const [focusedRow, setFocusedRow] = useState(initialRow);
|
|
16
16
|
const [focusedCol, setFocusedCol] = useState(initialCol);
|
|
17
17
|
const focusedRowRef = useRef(focusedRow);
|
|
18
|
-
focusedRowRef.current = focusedRow;
|
|
19
18
|
const focusedColRef = useRef(focusedCol);
|
|
20
|
-
focusedColRef.current = focusedCol;
|
|
21
19
|
const onChangeRef = useRef(onChange);
|
|
22
20
|
onChangeRef.current = onChange;
|
|
23
21
|
const applyFocus = useCallback((row, col) => {
|
|
22
|
+
focusedRowRef.current = row;
|
|
23
|
+
focusedColRef.current = col;
|
|
24
24
|
setFocusedRow(row);
|
|
25
25
|
setFocusedCol(col);
|
|
26
26
|
onChangeRef.current?.(row, col);
|
|
27
27
|
}, []);
|
|
28
28
|
const setFocused = applyFocus;
|
|
29
|
+
const currentFocus = useCallback(
|
|
30
|
+
() => ({ row: focusedRowRef.current, col: focusedColRef.current }),
|
|
31
|
+
[]
|
|
32
|
+
);
|
|
29
33
|
const findNextRow = useCallback(
|
|
30
34
|
(fromRow, direction) => {
|
|
31
35
|
if (rowCount === 0) return fromRow;
|
|
@@ -76,10 +80,10 @@ function useFocusedListItem(rowCount, getColCount, options = {}) {
|
|
|
76
80
|
// tracks it — naming it again here just churned this callback's identity.
|
|
77
81
|
[getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus]
|
|
78
82
|
);
|
|
79
|
-
return { focusedRow, focusedCol, setFocused, moveFocus };
|
|
83
|
+
return { focusedRow, focusedCol, currentFocus, setFocused, moveFocus };
|
|
80
84
|
}
|
|
81
85
|
|
|
82
86
|
export {
|
|
83
87
|
useFocusedListItem
|
|
84
88
|
};
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-XQHZPINL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/hooks/use-focused-list-item.ts"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\ntype UseFocusedListItemOptions = {\n /** Wrap around when reaching boundaries (default: true) */\n wrap?: boolean;\n /** Custom column finder for skipping disabled items on horizontal nav.\n * Receives the row, current column, and direction (+1 right, -1 left).\n * Should return the next valid column index. */\n findValidCol?: (row: number, currentCol: number, direction: 1 | -1) => number;\n /** Called after vertical navigation to adjust the clamped column\n * (e.g. to skip disabled items). Returns the adjusted column index. */\n adjustCol?: (row: number, clampedCol: number) => number;\n /** Called whenever focused position changes */\n onChange?: (row: number, col: number) => void;\n /** Initial row index (default: 0) */\n initialRow?: number;\n /** Initial col index (default: 0) */\n initialCol?: number;\n /** Optional predicate: when it returns true for a row index, that row is skipped during vertical navigation. */\n skipRow?: (row: number) => boolean;\n};\n\nexport type FocusedPosition = { row: number; col: number };\n\ntype UseFocusedListItemResult = {\n focusedRow: number;\n focusedCol: number;\n /**\n * The position as it stands now, for a key handler. `focusedRow`/`focusedCol` are what the last\n * render painted, and a key that follows a move in the same chunk is handled before that move\n * has rendered.\n */\n currentFocus: () => FocusedPosition;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: Direction) => void;\n};\n\n/**\n * 2D grid focus management: tracks (row, col) position and handles\n * directional movement with wrapping, column clamping,\n * and optional disabled-column skipping.\n */\nexport function useFocusedListItem(\n rowCount: number,\n getColCount: (row: number) => number,\n options: UseFocusedListItemOptions = {},\n): UseFocusedListItemResult {\n const {\n wrap = true,\n findValidCol,\n adjustCol,\n onChange,\n initialRow = 0,\n initialCol = 0,\n skipRow,\n } = options;\n\n const [focusedRow, setFocusedRow] = useState(initialRow);\n const [focusedCol, setFocusedCol] = useState(initialCol);\n\n // The position every move starts from, written the moment focus moves rather than when the move\n // renders. Keys that arrive in one chunk — a fast typist, a paste — are handled one after another\n // with no render between them, so a copy synced during render still held the position from\n // before the burst, and the second of two moves started where the first one had.\n const focusedRowRef = useRef(focusedRow);\n const focusedColRef = useRef(focusedCol);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const applyFocus = useCallback((row: number, col: number) => {\n focusedRowRef.current = row;\n focusedColRef.current = col;\n setFocusedRow(row);\n setFocusedCol(col);\n onChangeRef.current?.(row, col);\n }, []);\n\n const setFocused = applyFocus;\n\n const currentFocus = useCallback(\n (): FocusedPosition => ({ row: focusedRowRef.current, col: focusedColRef.current }),\n [],\n );\n\n const findNextRow = useCallback(\n (fromRow: number, direction: 1 | -1): number => {\n if (rowCount === 0) return fromRow;\n let next = fromRow;\n for (let i = 0; i < rowCount; i++) {\n if (wrap) {\n next = (next + direction + rowCount) % rowCount;\n } else {\n next = next + direction;\n if (next < 0 || next >= rowCount) return fromRow;\n }\n if (!skipRow || !skipRow(next)) return next;\n }\n return fromRow; // All rows skipped — stay put\n },\n [rowCount, wrap, skipRow],\n );\n\n const moveFocus = useCallback(\n (direction: Direction) => {\n const currentRow = focusedRowRef.current;\n const currentCol = focusedColRef.current;\n\n if (direction === \"left\" || direction === \"right\") {\n const colCount = getColCount(currentRow);\n if (colCount === 0) return;\n\n const step = direction === \"right\" ? 1 : -1;\n\n if (findValidCol) {\n const newCol = findValidCol(currentRow, currentCol, step);\n applyFocus(currentRow, newCol);\n } else if (wrap) {\n const newCol = (currentCol + step + colCount) % colCount;\n applyFocus(currentRow, newCol);\n } else {\n const newCol = Math.max(0, Math.min(colCount - 1, currentCol + step));\n applyFocus(currentRow, newCol);\n }\n } else {\n const step = direction === \"down\" ? 1 : -1;\n const newRow = findNextRow(currentRow, step);\n const newColCount = getColCount(newRow);\n let finalCol = Math.min(currentCol, Math.max(0, newColCount - 1));\n\n if (adjustCol) {\n finalCol = adjustCol(newRow, finalCol);\n }\n\n applyFocus(newRow, finalCol);\n }\n },\n // skipRow is reached only through findNextRow, whose identity already\n // tracks it — naming it again here just churned this callback's identity.\n [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus],\n );\n\n return { focusedRow, focusedCol, currentFocus, setFocused, moveFocus };\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,aAAa,cAAc;AA4CvC,SAAS,mBACd,UACA,aACA,UAAqC,CAAC,GACZ;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AAMvD,QAAM,gBAAgB,OAAO,UAAU;AACvC,QAAM,gBAAgB,OAAO,UAAU;AAEvC,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,aAAa,YAAY,CAAC,KAAa,QAAgB;AAC3D,kBAAc,UAAU;AACxB,kBAAc,UAAU;AACxB,kBAAc,GAAG;AACjB,kBAAc,GAAG;AACjB,gBAAY,UAAU,KAAK,GAAG;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAEnB,QAAM,eAAe;AAAA,IACnB,OAAwB,EAAE,KAAK,cAAc,SAAS,KAAK,cAAc,QAAQ;AAAA,IACjF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,SAAiB,cAA8B;AAC9C,UAAI,aAAa,EAAG,QAAO;AAC3B,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAI,MAAM;AACR,kBAAQ,OAAO,YAAY,YAAY;AAAA,QACzC,OAAO;AACL,iBAAO,OAAO;AACd,cAAI,OAAO,KAAK,QAAQ,SAAU,QAAO;AAAA,QAC3C;AACA,YAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAG,QAAO;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,MAAM,OAAO;AAAA,EAC1B;AAEA,QAAM,YAAY;AAAA,IAChB,CAAC,cAAyB;AACxB,YAAM,aAAa,cAAc;AACjC,YAAM,aAAa,cAAc;AAEjC,UAAI,cAAc,UAAU,cAAc,SAAS;AACjD,cAAM,WAAW,YAAY,UAAU;AACvC,YAAI,aAAa,EAAG;AAEpB,cAAM,OAAO,cAAc,UAAU,IAAI;AAEzC,YAAI,cAAc;AAChB,gBAAM,SAAS,aAAa,YAAY,YAAY,IAAI;AACxD,qBAAW,YAAY,MAAM;AAAA,QAC/B,WAAW,MAAM;AACf,gBAAM,UAAU,aAAa,OAAO,YAAY;AAChD,qBAAW,YAAY,MAAM;AAAA,QAC/B,OAAO;AACL,gBAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,aAAa,IAAI,CAAC;AACpE,qBAAW,YAAY,MAAM;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,cAAM,OAAO,cAAc,SAAS,IAAI;AACxC,cAAM,SAAS,YAAY,YAAY,IAAI;AAC3C,cAAM,cAAc,YAAY,MAAM;AACtC,YAAI,WAAW,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAEhE,YAAI,WAAW;AACb,qBAAW,UAAU,QAAQ,QAAQ;AAAA,QACvC;AAEA,mBAAW,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,CAAC,aAAa,MAAM,cAAc,WAAW,aAAa,UAAU;AAAA,EACtE;AAEA,SAAO,EAAE,YAAY,YAAY,cAAc,YAAY,UAAU;AACvE;","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getDomainDisplayName
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QHDPLLK6.js";
|
|
5
5
|
import {
|
|
6
6
|
useMeasuredHeight
|
|
7
7
|
} from "./chunk-TSIU7DME.js";
|
|
8
8
|
import {
|
|
9
9
|
useRowScroll
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TTY6DPJN.js";
|
|
11
11
|
import {
|
|
12
12
|
KEY_SPACE
|
|
13
13
|
} from "./chunk-WTJ3AY33.js";
|
|
@@ -17,19 +17,19 @@ import {
|
|
|
17
17
|
deriveScopeBadges,
|
|
18
18
|
formatScopeTag,
|
|
19
19
|
useWizardStore
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-7JNJ52CD.js";
|
|
21
21
|
import {
|
|
22
22
|
isAgentName,
|
|
23
23
|
toTitleCase
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-A4KDXNOT.js";
|
|
25
25
|
import {
|
|
26
26
|
matrix,
|
|
27
27
|
typedKeys
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-V5WXIM2F.js";
|
|
29
29
|
import {
|
|
30
30
|
CLI_COLORS,
|
|
31
31
|
UI_SYMBOLS
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-ENGYJCTF.js";
|
|
33
33
|
|
|
34
34
|
// src/cli/components/wizard/step-agents.tsx
|
|
35
35
|
import { groupBy, unique } from "remeda";
|
|
@@ -227,4 +227,4 @@ var StepAgents = () => {
|
|
|
227
227
|
export {
|
|
228
228
|
StepAgents
|
|
229
229
|
};
|
|
230
|
-
//# sourceMappingURL=chunk-
|
|
230
|
+
//# sourceMappingURL=chunk-XZEVWPX6.js.map
|