loadouts 0.1.11
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/LICENSE +201 -0
- package/README.md +108 -0
- package/bundled/loadouts/loadouts.yaml +5 -0
- package/bundled/skills/loadout-usage/SKILL.md +110 -0
- package/dist/builtins/index.d.ts +14 -0
- package/dist/builtins/index.d.ts.map +1 -0
- package/dist/builtins/index.js +58 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/kinds/extension.d.ts +3 -0
- package/dist/builtins/kinds/extension.d.ts.map +1 -0
- package/dist/builtins/kinds/extension.js +9 -0
- package/dist/builtins/kinds/extension.js.map +1 -0
- package/dist/builtins/kinds/instruction.d.ts +3 -0
- package/dist/builtins/kinds/instruction.d.ts.map +1 -0
- package/dist/builtins/kinds/instruction.js +8 -0
- package/dist/builtins/kinds/instruction.js.map +1 -0
- package/dist/builtins/kinds/prompt.d.ts +3 -0
- package/dist/builtins/kinds/prompt.d.ts.map +1 -0
- package/dist/builtins/kinds/prompt.js +8 -0
- package/dist/builtins/kinds/prompt.js.map +1 -0
- package/dist/builtins/kinds/rule.d.ts +3 -0
- package/dist/builtins/kinds/rule.d.ts.map +1 -0
- package/dist/builtins/kinds/rule.js +10 -0
- package/dist/builtins/kinds/rule.js.map +1 -0
- package/dist/builtins/kinds/skill.d.ts +3 -0
- package/dist/builtins/kinds/skill.d.ts.map +1 -0
- package/dist/builtins/kinds/skill.js +8 -0
- package/dist/builtins/kinds/skill.js.map +1 -0
- package/dist/builtins/kinds/theme.d.ts +3 -0
- package/dist/builtins/kinds/theme.d.ts.map +1 -0
- package/dist/builtins/kinds/theme.js +8 -0
- package/dist/builtins/kinds/theme.js.map +1 -0
- package/dist/builtins/tools/claude-code.d.ts +3 -0
- package/dist/builtins/tools/claude-code.d.ts.map +1 -0
- package/dist/builtins/tools/claude-code.js +30 -0
- package/dist/builtins/tools/claude-code.js.map +1 -0
- package/dist/builtins/tools/codex.d.ts +3 -0
- package/dist/builtins/tools/codex.d.ts.map +1 -0
- package/dist/builtins/tools/codex.js +17 -0
- package/dist/builtins/tools/codex.js.map +1 -0
- package/dist/builtins/tools/cursor.d.ts +3 -0
- package/dist/builtins/tools/cursor.d.ts.map +1 -0
- package/dist/builtins/tools/cursor.js +22 -0
- package/dist/builtins/tools/cursor.js.map +1 -0
- package/dist/builtins/tools/opencode.d.ts +3 -0
- package/dist/builtins/tools/opencode.d.ts.map +1 -0
- package/dist/builtins/tools/opencode.js +45 -0
- package/dist/builtins/tools/opencode.js.map +1 -0
- package/dist/builtins/tools/pi.d.ts +3 -0
- package/dist/builtins/tools/pi.d.ts.map +1 -0
- package/dist/builtins/tools/pi.js +22 -0
- package/dist/builtins/tools/pi.js.map +1 -0
- package/dist/cli/commands/activate.d.ts +12 -0
- package/dist/cli/commands/activate.d.ts.map +1 -0
- package/dist/cli/commands/activate.js +70 -0
- package/dist/cli/commands/activate.js.map +1 -0
- package/dist/cli/commands/check.d.ts +12 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +152 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +12 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +25 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/create.d.ts +11 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +113 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/deactivate.d.ts +12 -0
- package/dist/cli/commands/deactivate.d.ts.map +1 -0
- package/dist/cli/commands/deactivate.js +67 -0
- package/dist/cli/commands/deactivate.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +16 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +144 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +12 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +115 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +11 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +71 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/fallback.d.ts +9 -0
- package/dist/cli/commands/fallback.d.ts.map +1 -0
- package/dist/cli/commands/fallback.js +35 -0
- package/dist/cli/commands/fallback.js.map +1 -0
- package/dist/cli/commands/info.d.ts +23 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +314 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/init.d.ts +18 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +255 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +27 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +586 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/instructions.d.ts +8 -0
- package/dist/cli/commands/instructions.d.ts.map +1 -0
- package/dist/cli/commands/instructions.js +218 -0
- package/dist/cli/commands/instructions.js.map +1 -0
- package/dist/cli/commands/kinds.d.ts +6 -0
- package/dist/cli/commands/kinds.d.ts.map +1 -0
- package/dist/cli/commands/kinds.js +59 -0
- package/dist/cli/commands/kinds.js.map +1 -0
- package/dist/cli/commands/list.d.ts +12 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +182 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +28 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +50 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +24 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +64 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/render-engine.d.ts +36 -0
- package/dist/cli/commands/render-engine.d.ts.map +1 -0
- package/dist/cli/commands/render-engine.js +177 -0
- package/dist/cli/commands/render-engine.js.map +1 -0
- package/dist/cli/commands/rule.d.ts +11 -0
- package/dist/cli/commands/rule.d.ts.map +1 -0
- package/dist/cli/commands/rule.js +302 -0
- package/dist/cli/commands/rule.js.map +1 -0
- package/dist/cli/commands/sanitize.d.ts +14 -0
- package/dist/cli/commands/sanitize.d.ts.map +1 -0
- package/dist/cli/commands/sanitize.js +62 -0
- package/dist/cli/commands/sanitize.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +11 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +380 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/status.d.ts +26 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +454 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +53 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +48 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +134 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +64 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +166 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/discovery.d.ts +50 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +249 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/fallback.d.ts +23 -0
- package/dist/core/fallback.d.ts.map +1 -0
- package/dist/core/fallback.js +119 -0
- package/dist/core/fallback.js.map +1 -0
- package/dist/core/import-discovery.d.ts +56 -0
- package/dist/core/import-discovery.d.ts.map +1 -0
- package/dist/core/import-discovery.js +304 -0
- package/dist/core/import-discovery.js.map +1 -0
- package/dist/core/kindLoader.d.ts +119 -0
- package/dist/core/kindLoader.d.ts.map +1 -0
- package/dist/core/kindLoader.js +141 -0
- package/dist/core/kindLoader.js.map +1 -0
- package/dist/core/manifest.d.ts +39 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +167 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/plugin.d.ts +22 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +20 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/registry.d.ts +115 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +105 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/render.d.ts +64 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +457 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/resolve.d.ts +39 -0
- package/dist/core/resolve.d.ts.map +1 -0
- package/dist/core/resolve.js +128 -0
- package/dist/core/resolve.js.map +1 -0
- package/dist/core/schema.d.ts +308 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +81 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/scope.d.ts +74 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +176 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/core/template.d.ts +32 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +32 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/tokens.d.ts +33 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/core/tokens.js +97 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core/types.d.ts +103 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/artifact-paths.d.ts +39 -0
- package/dist/lib/artifact-paths.d.ts.map +1 -0
- package/dist/lib/artifact-paths.js +83 -0
- package/dist/lib/artifact-paths.js.map +1 -0
- package/dist/lib/artifact-table.d.ts +126 -0
- package/dist/lib/artifact-table.d.ts.map +1 -0
- package/dist/lib/artifact-table.js +263 -0
- package/dist/lib/artifact-table.js.map +1 -0
- package/dist/lib/editor.d.ts +17 -0
- package/dist/lib/editor.d.ts.map +1 -0
- package/dist/lib/editor.js +33 -0
- package/dist/lib/editor.js.map +1 -0
- package/dist/lib/fs.d.ts +87 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +229 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +13 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +28 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +97 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/loadout-column.d.ts +66 -0
- package/dist/lib/loadout-column.d.ts.map +1 -0
- package/dist/lib/loadout-column.js +66 -0
- package/dist/lib/loadout-column.js.map +1 -0
- package/dist/lib/output.d.ts +15 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +32 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scope-indicators.d.ts +60 -0
- package/dist/lib/scope-indicators.d.ts.map +1 -0
- package/dist/lib/scope-indicators.js +110 -0
- package/dist/lib/scope-indicators.js.map +1 -0
- package/docs/authoring.md +182 -0
- package/docs/commands.md +192 -0
- package/docs/concepts.md +114 -0
- package/docs/index.md +60 -0
- package/docs/quickstart.md +100 -0
- package/docs/troubleshooting.md +147 -0
- package/docs/visual-language.md +251 -0
- package/docs/workflows.md +184 -0
- package/package.json +54 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Find the git root directory from the given path.
|
|
6
|
+
* Returns null if not in a git repository.
|
|
7
|
+
*/
|
|
8
|
+
export declare function findGitRoot(cwd: string): Promise<string | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a path is inside a git repository.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isInGitRepo(cwd: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASrE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D"}
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations
|
|
3
|
+
*/
|
|
4
|
+
import { exec } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
/**
|
|
8
|
+
* Find the git root directory from the given path.
|
|
9
|
+
* Returns null if not in a git repository.
|
|
10
|
+
*/
|
|
11
|
+
export async function findGitRoot(cwd) {
|
|
12
|
+
try {
|
|
13
|
+
const { stdout } = await execAsync("git rev-parse --show-toplevel", {
|
|
14
|
+
cwd,
|
|
15
|
+
});
|
|
16
|
+
return stdout.trim();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if a path is inside a git repository.
|
|
24
|
+
*/
|
|
25
|
+
export async function isInGitRepo(cwd) {
|
|
26
|
+
return (await findGitRoot(cwd)) !== null;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,+BAA+B,EAAE;YAClE,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,OAAO,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gitignore management — update .gitignore with loadout-managed paths.
|
|
3
|
+
*
|
|
4
|
+
* Uses markers to identify the managed section:
|
|
5
|
+
* # <loadout>
|
|
6
|
+
* ...managed paths...
|
|
7
|
+
* # </loadout>
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Update .gitignore with loadout-managed paths.
|
|
11
|
+
*
|
|
12
|
+
* - Creates .gitignore if it doesn't exist
|
|
13
|
+
* - Adds or updates the managed section between markers
|
|
14
|
+
* - Preserves all user content outside the markers
|
|
15
|
+
* - Removes the section entirely if managedPaths is empty
|
|
16
|
+
*/
|
|
17
|
+
export declare function updateGitignore(projectRoot: string, managedPaths: string[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Remove the loadout-managed section from .gitignore.
|
|
20
|
+
*/
|
|
21
|
+
export declare function removeGitignoreSection(projectRoot: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get the current managed paths from .gitignore (for testing/inspection).
|
|
24
|
+
*/
|
|
25
|
+
export declare function getManagedPaths(projectRoot: string): string[];
|
|
26
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,IAAI,CA0DN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB7D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gitignore management — update .gitignore with loadout-managed paths.
|
|
3
|
+
*
|
|
4
|
+
* Uses markers to identify the managed section:
|
|
5
|
+
* # <loadout>
|
|
6
|
+
* ...managed paths...
|
|
7
|
+
* # </loadout>
|
|
8
|
+
*/
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { fileExists, readFile, writeFile } from "./fs.js";
|
|
11
|
+
const START_MARKER = "# <loadouts>";
|
|
12
|
+
const END_MARKER = "# </loadouts>";
|
|
13
|
+
const HEADER_COMMENT = "# Auto-generated by loadouts. Do not edit this section.";
|
|
14
|
+
/**
|
|
15
|
+
* Update .gitignore with loadout-managed paths.
|
|
16
|
+
*
|
|
17
|
+
* - Creates .gitignore if it doesn't exist
|
|
18
|
+
* - Adds or updates the managed section between markers
|
|
19
|
+
* - Preserves all user content outside the markers
|
|
20
|
+
* - Removes the section entirely if managedPaths is empty
|
|
21
|
+
*/
|
|
22
|
+
export function updateGitignore(projectRoot, managedPaths) {
|
|
23
|
+
const gitignorePath = path.join(projectRoot, ".gitignore");
|
|
24
|
+
// Always include the state file
|
|
25
|
+
const allPaths = [".loadouts/.state.json", ...managedPaths];
|
|
26
|
+
// Sort and deduplicate
|
|
27
|
+
const uniquePaths = [...new Set(allPaths)].sort();
|
|
28
|
+
// Build the managed section content
|
|
29
|
+
const managedSection = uniquePaths.length > 0
|
|
30
|
+
? `${START_MARKER}\n${HEADER_COMMENT}\n${uniquePaths.join("\n")}\n${END_MARKER}`
|
|
31
|
+
: "";
|
|
32
|
+
if (!fileExists(gitignorePath)) {
|
|
33
|
+
// Create new .gitignore with just the managed section
|
|
34
|
+
if (managedSection) {
|
|
35
|
+
writeFile(gitignorePath, managedSection + "\n");
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Read existing content
|
|
40
|
+
const content = readFile(gitignorePath);
|
|
41
|
+
// Find existing managed section
|
|
42
|
+
const startIdx = content.indexOf(START_MARKER);
|
|
43
|
+
const endIdx = content.indexOf(END_MARKER);
|
|
44
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
45
|
+
// Replace existing section
|
|
46
|
+
const before = content.slice(0, startIdx).trimEnd();
|
|
47
|
+
const after = content.slice(endIdx + END_MARKER.length).trimStart();
|
|
48
|
+
const parts = [before];
|
|
49
|
+
if (managedSection) {
|
|
50
|
+
parts.push(managedSection);
|
|
51
|
+
}
|
|
52
|
+
if (after) {
|
|
53
|
+
parts.push(after);
|
|
54
|
+
}
|
|
55
|
+
// Join with appropriate newlines
|
|
56
|
+
let newContent = parts.filter(Boolean).join("\n\n");
|
|
57
|
+
if (!newContent.endsWith("\n")) {
|
|
58
|
+
newContent += "\n";
|
|
59
|
+
}
|
|
60
|
+
writeFile(gitignorePath, newContent);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// No existing section — append the managed section
|
|
64
|
+
if (!managedSection)
|
|
65
|
+
return;
|
|
66
|
+
let newContent = content.trimEnd();
|
|
67
|
+
newContent += "\n\n" + managedSection + "\n";
|
|
68
|
+
writeFile(gitignorePath, newContent);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Remove the loadout-managed section from .gitignore.
|
|
73
|
+
*/
|
|
74
|
+
export function removeGitignoreSection(projectRoot) {
|
|
75
|
+
updateGitignore(projectRoot, []);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the current managed paths from .gitignore (for testing/inspection).
|
|
79
|
+
*/
|
|
80
|
+
export function getManagedPaths(projectRoot) {
|
|
81
|
+
const gitignorePath = path.join(projectRoot, ".gitignore");
|
|
82
|
+
if (!fileExists(gitignorePath)) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const content = readFile(gitignorePath);
|
|
86
|
+
const startIdx = content.indexOf(START_MARKER);
|
|
87
|
+
const endIdx = content.indexOf(END_MARKER);
|
|
88
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
const section = content.slice(startIdx + START_MARKER.length, endIdx);
|
|
92
|
+
return section
|
|
93
|
+
.split("\n")
|
|
94
|
+
.map((line) => line.trim())
|
|
95
|
+
.filter((line) => line && !line.startsWith("#"));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared loadout column rendering for unified tables.
|
|
3
|
+
*
|
|
4
|
+
* Used by `list`, `info`, and `status` commands to consistently render
|
|
5
|
+
* the loadout column with scope indicators and optional default markers.
|
|
6
|
+
*/
|
|
7
|
+
import { type ScopeIndicator } from "./scope-indicators.js";
|
|
8
|
+
/**
|
|
9
|
+
* Base interface for items that have a loadout name and scope.
|
|
10
|
+
*/
|
|
11
|
+
export interface LoadoutColumnItem {
|
|
12
|
+
loadoutName: string;
|
|
13
|
+
scope: ScopeIndicator;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extended interface for items that also have a default marker (used by list).
|
|
17
|
+
*/
|
|
18
|
+
export interface LoadoutColumnItemWithDefault extends LoadoutColumnItem {
|
|
19
|
+
isDefault: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calculate column widths for the loadout column.
|
|
23
|
+
*/
|
|
24
|
+
export declare function calculateLoadoutColumnWidths<T extends LoadoutColumnItem>(items: T[], options?: {
|
|
25
|
+
hasDefaultMarker?: boolean;
|
|
26
|
+
}): {
|
|
27
|
+
nameWidth: number;
|
|
28
|
+
scopeWidth: number;
|
|
29
|
+
totalWidth: number;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Render the loadout column header.
|
|
33
|
+
*/
|
|
34
|
+
export declare function renderLoadoutHeader(totalWidth: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* Render the loadout column separator.
|
|
37
|
+
*/
|
|
38
|
+
export declare function renderLoadoutSeparator(totalWidth: number): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extended interface for items that track active state.
|
|
41
|
+
*/
|
|
42
|
+
export interface LoadoutColumnItemWithActive extends LoadoutColumnItem {
|
|
43
|
+
isActive: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render a loadout cell for info/status style (no default marker).
|
|
47
|
+
*
|
|
48
|
+
* @param item - The loadout item (or null for continuation rows)
|
|
49
|
+
* @param nameWidth - Width for the name portion
|
|
50
|
+
* @param scopeWidth - Width for the scope indicator
|
|
51
|
+
* @param totalWidth - Total column width (for empty rows)
|
|
52
|
+
*/
|
|
53
|
+
export declare function renderLoadoutCell(item: (LoadoutColumnItem & {
|
|
54
|
+
isActive?: boolean;
|
|
55
|
+
}) | null, nameWidth: number, scopeWidth: number, totalWidth: number): string;
|
|
56
|
+
/**
|
|
57
|
+
* Render a loadout cell for list style (with default marker).
|
|
58
|
+
*
|
|
59
|
+
* @param item - The loadout item
|
|
60
|
+
* @param isActive - Whether this loadout is active
|
|
61
|
+
* @param nameWidth - Width for the name portion
|
|
62
|
+
* @param scopeWidth - Width for the scope indicator
|
|
63
|
+
* @param totalWidth - Total column width
|
|
64
|
+
*/
|
|
65
|
+
export declare function renderLoadoutCellWithDefault(item: LoadoutColumnItemWithDefault, isActive: boolean, nameWidth: number, scopeWidth: number, totalWidth: number): string;
|
|
66
|
+
//# sourceMappingURL=loadout-column.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-column.d.ts","sourceRoot":"","sources":["../../src/lib/loadout-column.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,iBAAiB;IACrE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,iBAAiB,EACtE,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAYA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,CAAC,iBAAiB,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EACzD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CASR;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,4BAA4B,EAClC,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CAOR"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared loadout column rendering for unified tables.
|
|
3
|
+
*
|
|
4
|
+
* Used by `list`, `info`, and `status` commands to consistently render
|
|
5
|
+
* the loadout column with scope indicators and optional default markers.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { formatScopeIndicatorPadded, maxScopeWidth, } from "./scope-indicators.js";
|
|
9
|
+
/**
|
|
10
|
+
* Calculate column widths for the loadout column.
|
|
11
|
+
*/
|
|
12
|
+
export function calculateLoadoutColumnWidths(items, options = {}) {
|
|
13
|
+
const nameWidth = Math.max("loadout".length - 2, // Account for "▸ " prefix in data rows
|
|
14
|
+
...items.map((i) => i.loadoutName.length));
|
|
15
|
+
const scopeWidth = maxScopeWidth(items);
|
|
16
|
+
// Total: "▸ " (2) + name (padded) + ["* " (2) if hasDefaultMarker] + scope (padded)
|
|
17
|
+
const defaultMarkerWidth = options.hasDefaultMarker ? 2 : 0;
|
|
18
|
+
const totalWidth = 2 + nameWidth + defaultMarkerWidth + scopeWidth;
|
|
19
|
+
return { nameWidth, scopeWidth, totalWidth };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Render the loadout column header.
|
|
23
|
+
*/
|
|
24
|
+
export function renderLoadoutHeader(totalWidth) {
|
|
25
|
+
return chalk.dim("loadout".padEnd(totalWidth));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Render the loadout column separator.
|
|
29
|
+
*/
|
|
30
|
+
export function renderLoadoutSeparator(totalWidth) {
|
|
31
|
+
return "─".repeat(totalWidth);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Render a loadout cell for info/status style (no default marker).
|
|
35
|
+
*
|
|
36
|
+
* @param item - The loadout item (or null for continuation rows)
|
|
37
|
+
* @param nameWidth - Width for the name portion
|
|
38
|
+
* @param scopeWidth - Width for the scope indicator
|
|
39
|
+
* @param totalWidth - Total column width (for empty rows)
|
|
40
|
+
*/
|
|
41
|
+
export function renderLoadoutCell(item, nameWidth, scopeWidth, totalWidth) {
|
|
42
|
+
if (!item) {
|
|
43
|
+
return " ".repeat(totalWidth);
|
|
44
|
+
}
|
|
45
|
+
const activeMarker = item.isActive !== false ? chalk.green("▸") : " ";
|
|
46
|
+
const nameStr = item.loadoutName.padEnd(nameWidth);
|
|
47
|
+
const scopeStr = formatScopeIndicatorPadded(item.scope, scopeWidth);
|
|
48
|
+
return activeMarker + " " + nameStr + scopeStr;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Render a loadout cell for list style (with default marker).
|
|
52
|
+
*
|
|
53
|
+
* @param item - The loadout item
|
|
54
|
+
* @param isActive - Whether this loadout is active
|
|
55
|
+
* @param nameWidth - Width for the name portion
|
|
56
|
+
* @param scopeWidth - Width for the scope indicator
|
|
57
|
+
* @param totalWidth - Total column width
|
|
58
|
+
*/
|
|
59
|
+
export function renderLoadoutCellWithDefault(item, isActive, nameWidth, scopeWidth, totalWidth) {
|
|
60
|
+
const activeMarker = isActive ? chalk.green("▸") : " ";
|
|
61
|
+
const defaultMarker = item.isDefault ? chalk.cyan("*") : " ";
|
|
62
|
+
const nameStr = item.loadoutName.padEnd(nameWidth);
|
|
63
|
+
const scopeStr = formatScopeIndicatorPadded(item.scope, scopeWidth);
|
|
64
|
+
return `${activeMarker} ${nameStr}${defaultMarker} ${scopeStr}`.padEnd(totalWidth);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=loadout-column.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-column.js","sourceRoot":"","sources":["../../src/lib/loadout-column.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,0BAA0B,EAC1B,aAAa,GACd,MAAM,uBAAuB,CAAC;AAiB/B;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAU,EACV,UAA0C,EAAE;IAM5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,uCAAuC;IAC7D,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAC1C,CAAC;IACF,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAExC,oFAAoF;IACpF,MAAM,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,GAAG,kBAAkB,GAAG,UAAU,CAAC;IAEnE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAyD,EACzD,SAAiB,EACjB,UAAkB,EAClB,UAAkB;IAElB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACpE,OAAO,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAkC,EAClC,QAAiB,EACjB,SAAiB,EACjB,UAAkB,EAClB,UAAkB;IAElB,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpE,OAAO,GAAG,YAAY,IAAI,OAAO,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal output helpers
|
|
3
|
+
*/
|
|
4
|
+
export declare const log: {
|
|
5
|
+
info: (msg: string) => void;
|
|
6
|
+
success: (msg: string) => void;
|
|
7
|
+
warn: (msg: string) => void;
|
|
8
|
+
error: (msg: string) => void;
|
|
9
|
+
dim: (msg: string) => void;
|
|
10
|
+
plain: (msg: string) => void;
|
|
11
|
+
};
|
|
12
|
+
export declare function heading(title: string): void;
|
|
13
|
+
export declare function list(items: string[], indent?: number): void;
|
|
14
|
+
export declare function keyValue(pairs: Record<string, string | undefined>, indent?: number): void;
|
|
15
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,GAAG;gBACF,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;eACR,MAAM;iBACJ,MAAM;CACpB,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI,CAK9D;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,MAAM,GAAE,MAAU,GACjB,IAAI,CAON"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal output helpers
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
export const log = {
|
|
6
|
+
info: (msg) => console.log(chalk.blue("ℹ"), msg),
|
|
7
|
+
success: (msg) => console.log(chalk.green("✓"), msg),
|
|
8
|
+
warn: (msg) => console.log(chalk.yellow("⚠"), msg),
|
|
9
|
+
error: (msg) => console.log(chalk.red("✗"), msg),
|
|
10
|
+
dim: (msg) => console.log(chalk.dim(msg)),
|
|
11
|
+
plain: (msg) => console.log(msg),
|
|
12
|
+
};
|
|
13
|
+
export function heading(title) {
|
|
14
|
+
console.log();
|
|
15
|
+
console.log(chalk.bold(title));
|
|
16
|
+
console.log(chalk.dim("─".repeat(title.length)));
|
|
17
|
+
}
|
|
18
|
+
export function list(items, indent = 2) {
|
|
19
|
+
const pad = " ".repeat(indent);
|
|
20
|
+
for (const item of items) {
|
|
21
|
+
console.log(`${pad}${chalk.dim("•")} ${item}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function keyValue(pairs, indent = 2) {
|
|
25
|
+
const pad = " ".repeat(indent);
|
|
26
|
+
for (const [key, value] of Object.entries(pairs)) {
|
|
27
|
+
if (value !== undefined) {
|
|
28
|
+
console.log(`${pad}${chalk.dim(key + ":")} ${value}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACxD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC1D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACxD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;CACzC,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAe,EAAE,SAAiB,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,KAAyC,EACzC,SAAiB,CAAC;IAElB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified scope indicators for CLI output.
|
|
3
|
+
*
|
|
4
|
+
* Used by `list`, `info`, and other commands to consistently display
|
|
5
|
+
* the scope/source of loadouts and artifacts.
|
|
6
|
+
*
|
|
7
|
+
* Symbols:
|
|
8
|
+
* • (dim) — global scope
|
|
9
|
+
* ◦ (cyan) — local/project scope
|
|
10
|
+
* →name (yellow) — external source
|
|
11
|
+
*/
|
|
12
|
+
import type { LoadoutRoot, Scope } from "../core/types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Scope indicator for a loadout or artifact.
|
|
15
|
+
*/
|
|
16
|
+
export type ScopeIndicator = {
|
|
17
|
+
type: "global";
|
|
18
|
+
} | {
|
|
19
|
+
type: "local";
|
|
20
|
+
} | {
|
|
21
|
+
type: "source";
|
|
22
|
+
name: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Get the raw (uncolored) text for a scope indicator.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scopeIndicatorText(scope: ScopeIndicator): string;
|
|
28
|
+
/**
|
|
29
|
+
* Format a scope indicator with appropriate color.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatScopeIndicator(scope: ScopeIndicator): string;
|
|
32
|
+
/**
|
|
33
|
+
* Format a scope indicator padded to a specific width.
|
|
34
|
+
* Padding is applied BEFORE coloring to avoid ANSI code length issues.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatScopeIndicatorPadded(scope: ScopeIndicator, width: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Calculate the display width needed for a scope indicator.
|
|
39
|
+
*/
|
|
40
|
+
export declare function scopeIndicatorWidth(scope: ScopeIndicator): number;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate the maximum width needed for scope indicators in a list.
|
|
43
|
+
*/
|
|
44
|
+
export declare function maxScopeWidth<T extends {
|
|
45
|
+
scope: ScopeIndicator;
|
|
46
|
+
}>(items: T[]): number;
|
|
47
|
+
export declare function rootToScope(root: LoadoutRoot): ScopeIndicator;
|
|
48
|
+
/**
|
|
49
|
+
* Determine scope indicator by matching a path against collected roots.
|
|
50
|
+
* Falls back to context scope if no matching root is found.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getScopeFromRoots(targetPath: string, roots: LoadoutRoot[], fallbackScope: Scope): ScopeIndicator;
|
|
53
|
+
/**
|
|
54
|
+
* Render the scope legend footer.
|
|
55
|
+
* Only includes indicators that are actually present in the items.
|
|
56
|
+
*/
|
|
57
|
+
export declare function renderScopeLegend<T extends {
|
|
58
|
+
scope: ScopeIndicator;
|
|
59
|
+
}>(items: T[]): void;
|
|
60
|
+
//# sourceMappingURL=scope-indicators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-indicators.d.ts","sourceRoot":"","sources":["../../src/lib/scope-indicators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAShE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CASlE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,CAMrF;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAS7D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAAE,EACpB,aAAa,EAAE,KAAK,GACnB,cAAc,CAMhB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAavF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified scope indicators for CLI output.
|
|
3
|
+
*
|
|
4
|
+
* Used by `list`, `info`, and other commands to consistently display
|
|
5
|
+
* the scope/source of loadouts and artifacts.
|
|
6
|
+
*
|
|
7
|
+
* Symbols:
|
|
8
|
+
* • (dim) — global scope
|
|
9
|
+
* ◦ (cyan) — local/project scope
|
|
10
|
+
* →name (yellow) — external source
|
|
11
|
+
*/
|
|
12
|
+
import chalk from "chalk";
|
|
13
|
+
/**
|
|
14
|
+
* Get the raw (uncolored) text for a scope indicator.
|
|
15
|
+
*/
|
|
16
|
+
export function scopeIndicatorText(scope) {
|
|
17
|
+
switch (scope.type) {
|
|
18
|
+
case "global":
|
|
19
|
+
return "•";
|
|
20
|
+
case "local":
|
|
21
|
+
return "◦";
|
|
22
|
+
case "source":
|
|
23
|
+
return `→${scope.name}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format a scope indicator with appropriate color.
|
|
28
|
+
*/
|
|
29
|
+
export function formatScopeIndicator(scope) {
|
|
30
|
+
switch (scope.type) {
|
|
31
|
+
case "global":
|
|
32
|
+
return chalk.dim("•");
|
|
33
|
+
case "local":
|
|
34
|
+
return chalk.cyan("◦");
|
|
35
|
+
case "source":
|
|
36
|
+
return chalk.yellow(`→${scope.name}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format a scope indicator padded to a specific width.
|
|
41
|
+
* Padding is applied BEFORE coloring to avoid ANSI code length issues.
|
|
42
|
+
*/
|
|
43
|
+
export function formatScopeIndicatorPadded(scope, width) {
|
|
44
|
+
const text = scopeIndicatorText(scope);
|
|
45
|
+
const padded = text.padEnd(width);
|
|
46
|
+
// Apply color only to the actual indicator, not the padding
|
|
47
|
+
const padding = padded.slice(text.length);
|
|
48
|
+
return formatScopeIndicator(scope) + padding;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate the display width needed for a scope indicator.
|
|
52
|
+
*/
|
|
53
|
+
export function scopeIndicatorWidth(scope) {
|
|
54
|
+
return scopeIndicatorText(scope).length;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Calculate the maximum width needed for scope indicators in a list.
|
|
58
|
+
*/
|
|
59
|
+
export function maxScopeWidth(items) {
|
|
60
|
+
let maxWidth = 1; // minimum for • or ◦
|
|
61
|
+
for (const item of items) {
|
|
62
|
+
maxWidth = Math.max(maxWidth, scopeIndicatorWidth(item.scope));
|
|
63
|
+
}
|
|
64
|
+
return maxWidth;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Convert a LoadoutRoot to a ScopeIndicator.
|
|
68
|
+
*/
|
|
69
|
+
import { isGlobalScope } from "./artifact-paths.js";
|
|
70
|
+
export function rootToScope(root) {
|
|
71
|
+
if (root.level === "source" && root.sourceRef) {
|
|
72
|
+
const shortName = root.sourceRef.split("/").pop() || root.sourceRef;
|
|
73
|
+
return { type: "source", name: shortName };
|
|
74
|
+
}
|
|
75
|
+
if (isGlobalScope(root.level)) {
|
|
76
|
+
return { type: "global" };
|
|
77
|
+
}
|
|
78
|
+
return { type: "local" };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Determine scope indicator by matching a path against collected roots.
|
|
82
|
+
* Falls back to context scope if no matching root is found.
|
|
83
|
+
*/
|
|
84
|
+
export function getScopeFromRoots(targetPath, roots, fallbackScope) {
|
|
85
|
+
const matchingRoot = roots.find((r) => r.path === targetPath);
|
|
86
|
+
if (matchingRoot) {
|
|
87
|
+
return rootToScope(matchingRoot);
|
|
88
|
+
}
|
|
89
|
+
return fallbackScope === "global" ? { type: "global" } : { type: "local" };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Render the scope legend footer.
|
|
93
|
+
* Only includes indicators that are actually present in the items.
|
|
94
|
+
*/
|
|
95
|
+
export function renderScopeLegend(items) {
|
|
96
|
+
const hasGlobal = items.some((i) => i.scope.type === "global");
|
|
97
|
+
const hasLocal = items.some((i) => i.scope.type === "local");
|
|
98
|
+
const hasSource = items.some((i) => i.scope.type === "source");
|
|
99
|
+
const parts = [];
|
|
100
|
+
if (hasGlobal)
|
|
101
|
+
parts.push(chalk.dim("• global"));
|
|
102
|
+
if (hasLocal)
|
|
103
|
+
parts.push(chalk.cyan("◦") + chalk.dim(" local"));
|
|
104
|
+
if (hasSource)
|
|
105
|
+
parts.push(chalk.yellow("→") + chalk.dim("name source"));
|
|
106
|
+
if (parts.length > 0) {
|
|
107
|
+
console.log(` ${parts.join(" ")}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=scope-indicators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-indicators.js","sourceRoot":"","sources":["../../src/lib/scope-indicators.ts"],"names":[],"mappings":"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"}
|