dev3000 0.0.186 → 0.0.188
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/README.md +101 -13
- package/bin/dev3000 +1 -2
- package/dist/cdp-monitor.d.ts +7 -12
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +86 -170
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -1369
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/portless.d.ts +3 -0
- package/dist/portless.d.ts.map +1 -1
- package/dist/portless.js +10 -0
- package/dist/portless.js.map +1 -1
- package/dist/runtime/bridge.d.ts +26 -0
- package/dist/runtime/bridge.d.ts.map +1 -0
- package/dist/runtime/bridge.js +340 -0
- package/dist/runtime/bridge.js.map +1 -0
- package/dist/runtime/chrome-isolation.d.ts +16 -0
- package/dist/runtime/chrome-isolation.d.ts.map +1 -0
- package/dist/runtime/chrome-isolation.js +119 -0
- package/dist/runtime/chrome-isolation.js.map +1 -0
- package/dist/runtime/cli.js +116 -26
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/event-views.d.ts +21 -0
- package/dist/runtime/event-views.d.ts.map +1 -0
- package/dist/runtime/event-views.js +53 -0
- package/dist/runtime/event-views.js.map +1 -0
- package/dist/runtime/harness.d.ts +16 -0
- package/dist/runtime/harness.d.ts.map +1 -0
- package/dist/runtime/harness.js +68 -0
- package/dist/runtime/harness.js.map +1 -0
- package/dist/runtime/local-proxy.d.ts +12 -0
- package/dist/runtime/local-proxy.d.ts.map +1 -0
- package/dist/runtime/local-proxy.js +114 -0
- package/dist/runtime/local-proxy.js.map +1 -0
- package/dist/runtime/runtime.d.ts +14 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +80 -19
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/sandbox-agent.d.ts +6 -0
- package/dist/runtime/sandbox-agent.d.ts.map +1 -0
- package/dist/runtime/sandbox-agent.js +35 -0
- package/dist/runtime/sandbox-agent.js.map +1 -0
- package/dist/runtime/sandbox-command.d.ts +9 -0
- package/dist/runtime/sandbox-command.d.ts.map +1 -0
- package/dist/runtime/sandbox-command.js +101 -0
- package/dist/runtime/sandbox-command.js.map +1 -0
- package/dist/runtime/sandbox-proxy.d.ts +11 -0
- package/dist/runtime/sandbox-proxy.d.ts.map +1 -0
- package/dist/runtime/sandbox-proxy.js +123 -0
- package/dist/runtime/sandbox-proxy.js.map +1 -0
- package/dist/runtime/sandbox-sessions.d.ts +31 -0
- package/dist/runtime/sandbox-sessions.d.ts.map +1 -0
- package/dist/runtime/sandbox-sessions.js +102 -0
- package/dist/runtime/sandbox-sessions.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +21 -0
- package/dist/runtime/sandbox.d.ts.map +1 -0
- package/dist/runtime/sandbox.js +481 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/utils/agent-browser.d.ts +2 -120
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +13 -376
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/project-name.d.ts +2 -2
- package/dist/utils/project-name.js +2 -2
- package/package.json +13 -22
- package/skills/d3k/SKILL.md +23 -1
- package/dist/commands/crawl.d.ts +0 -12
- package/dist/commands/crawl.d.ts.map +0 -1
- package/dist/commands/crawl.js +0 -101
- package/dist/commands/crawl.js.map +0 -1
- package/dist/commands/errors.d.ts +0 -14
- package/dist/commands/errors.d.ts.map +0 -1
- package/dist/commands/errors.js +0 -246
- package/dist/commands/errors.js.map +0 -1
- package/dist/commands/fix.d.ts +0 -13
- package/dist/commands/fix.d.ts.map +0 -1
- package/dist/commands/fix.js +0 -219
- package/dist/commands/fix.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -13
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -146
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/resume.d.ts +0 -11
- package/dist/commands/resume.d.ts.map +0 -1
- package/dist/commands/resume.js +0 -75
- package/dist/commands/resume.js.map +0 -1
- package/dist/commands/status.d.ts +0 -21
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -44
- package/dist/commands/status.js.map +0 -1
- package/dist/components/AgentSelector.d.ts +0 -12
- package/dist/components/AgentSelector.d.ts.map +0 -1
- package/dist/components/AgentSelector.js +0 -99
- package/dist/components/AgentSelector.js.map +0 -1
- package/dist/components/PackageSelector.d.ts +0 -13
- package/dist/components/PackageSelector.d.ts.map +0 -1
- package/dist/components/PackageSelector.js +0 -79
- package/dist/components/PackageSelector.js.map +0 -1
- package/dist/constants/log-colors.d.ts +0 -43
- package/dist/constants/log-colors.d.ts.map +0 -1
- package/dist/constants/log-colors.js +0 -59
- package/dist/constants/log-colors.js.map +0 -1
- package/dist/dev-environment.d.ts +0 -187
- package/dist/dev-environment.d.ts.map +0 -1
- package/dist/dev-environment.js +0 -2248
- package/dist/dev-environment.js.map +0 -1
- package/dist/screencast-manager.d.ts +0 -78
- package/dist/screencast-manager.d.ts.map +0 -1
- package/dist/screencast-manager.js +0 -529
- package/dist/screencast-manager.js.map +0 -1
- package/dist/services/parsers/error-detectors/base.d.ts +0 -24
- package/dist/services/parsers/error-detectors/base.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/base.js +0 -44
- package/dist/services/parsers/error-detectors/base.js.map +0 -1
- package/dist/services/parsers/error-detectors/index.d.ts +0 -6
- package/dist/services/parsers/error-detectors/index.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/index.js +0 -6
- package/dist/services/parsers/error-detectors/index.js.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.d.ts +0 -9
- package/dist/services/parsers/error-detectors/nextjs.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.js +0 -52
- package/dist/services/parsers/error-detectors/nextjs.js.map +0 -1
- package/dist/services/parsers/index.d.ts +0 -9
- package/dist/services/parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/index.js +0 -10
- package/dist/services/parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/base.d.ts +0 -26
- package/dist/services/parsers/log-parsers/base.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/base.js +0 -6
- package/dist/services/parsers/log-parsers/base.js.map +0 -1
- package/dist/services/parsers/log-parsers/index.d.ts +0 -6
- package/dist/services/parsers/log-parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/index.js +0 -5
- package/dist/services/parsers/log-parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/standard.d.ts +0 -9
- package/dist/services/parsers/log-parsers/standard.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/standard.js +0 -17
- package/dist/services/parsers/log-parsers/standard.js.map +0 -1
- package/dist/services/parsers/output-processor.d.ts +0 -39
- package/dist/services/parsers/output-processor.d.ts.map +0 -1
- package/dist/services/parsers/output-processor.js +0 -54
- package/dist/services/parsers/output-processor.js.map +0 -1
- package/dist/skills/d3k/internal-skill.md +0 -32
- package/dist/skills/index.d.ts +0 -54
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -214
- package/dist/skills/index.js.map +0 -1
- package/dist/src/tui-interface-impl.tsx +0 -644
- package/dist/tui-interface-impl.d.ts +0 -30
- package/dist/tui-interface-impl.d.ts.map +0 -1
- package/dist/tui-interface-impl.js +0 -403
- package/dist/tui-interface-impl.js.map +0 -1
- package/dist/tui-interface-opentui.d.ts +0 -33
- package/dist/tui-interface-opentui.d.ts.map +0 -1
- package/dist/tui-interface-opentui.js +0 -1128
- package/dist/tui-interface-opentui.js.map +0 -1
- package/dist/tui-interface.d.ts +0 -38
- package/dist/tui-interface.d.ts.map +0 -1
- package/dist/tui-interface.js +0 -84
- package/dist/tui-interface.js.map +0 -1
- package/dist/utils/agent-detection.d.ts +0 -17
- package/dist/utils/agent-detection.d.ts.map +0 -1
- package/dist/utils/agent-detection.js +0 -81
- package/dist/utils/agent-detection.js.map +0 -1
- package/dist/utils/agent-selection.d.ts +0 -25
- package/dist/utils/agent-selection.d.ts.map +0 -1
- package/dist/utils/agent-selection.js +0 -73
- package/dist/utils/agent-selection.js.map +0 -1
- package/dist/utils/browser-command-argv.d.ts +0 -19
- package/dist/utils/browser-command-argv.d.ts.map +0 -1
- package/dist/utils/browser-command-argv.js +0 -149
- package/dist/utils/browser-command-argv.js.map +0 -1
- package/dist/utils/build-version.d.ts +0 -2
- package/dist/utils/build-version.d.ts.map +0 -1
- package/dist/utils/build-version.js +0 -8
- package/dist/utils/build-version.js.map +0 -1
- package/dist/utils/cli-options.d.ts +0 -5
- package/dist/utils/cli-options.d.ts.map +0 -1
- package/dist/utils/cli-options.js +0 -36
- package/dist/utils/cli-options.js.map +0 -1
- package/dist/utils/d3k-dir.d.ts +0 -3
- package/dist/utils/d3k-dir.d.ts.map +0 -1
- package/dist/utils/d3k-dir.js +0 -12
- package/dist/utils/d3k-dir.js.map +0 -1
- package/dist/utils/d3k-skill-installer.d.ts +0 -4
- package/dist/utils/d3k-skill-installer.d.ts.map +0 -1
- package/dist/utils/d3k-skill-installer.js +0 -30
- package/dist/utils/d3k-skill-installer.js.map +0 -1
- package/dist/utils/log-filename.d.ts +0 -30
- package/dist/utils/log-filename.d.ts.map +0 -1
- package/dist/utils/log-filename.js +0 -60
- package/dist/utils/log-filename.js.map +0 -1
- package/dist/utils/project-detector.d.ts +0 -25
- package/dist/utils/project-detector.d.ts.map +0 -1
- package/dist/utils/project-detector.js +0 -153
- package/dist/utils/project-detector.js.map +0 -1
- package/dist/utils/project-metadata.d.ts +0 -4
- package/dist/utils/project-metadata.d.ts.map +0 -1
- package/dist/utils/project-metadata.js +0 -48
- package/dist/utils/project-metadata.js.map +0 -1
- package/dist/utils/repo-validate.d.ts +0 -2
- package/dist/utils/repo-validate.d.ts.map +0 -1
- package/dist/utils/repo-validate.js +0 -10
- package/dist/utils/repo-validate.js.map +0 -1
- package/dist/utils/session.d.ts +0 -19
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -65
- package/dist/utils/session.js.map +0 -1
- package/dist/utils/skill-installer.d.ts +0 -65
- package/dist/utils/skill-installer.d.ts.map +0 -1
- package/dist/utils/skill-installer.js +0 -265
- package/dist/utils/skill-installer.js.map +0 -1
- package/dist/utils/timestamp.d.ts +0 -20
- package/dist/utils/timestamp.d.ts.map +0 -1
- package/dist/utils/timestamp.js +0 -57
- package/dist/utils/timestamp.js.map +0 -1
- package/dist/utils/tmux-helpers.d.ts +0 -36
- package/dist/utils/tmux-helpers.d.ts.map +0 -1
- package/dist/utils/tmux-helpers.js +0 -118
- package/dist/utils/tmux-helpers.js.map +0 -1
- package/dist/utils/user-config.d.ts +0 -12
- package/dist/utils/user-config.d.ts.map +0 -1
- package/dist/utils/user-config.js +0 -46
- package/dist/utils/user-config.js.map +0 -1
- package/dist/utils/version-check.d.ts +0 -52
- package/dist/utils/version-check.d.ts.map +0 -1
- package/dist/utils/version-check.js +0 -304
- package/dist/utils/version-check.js.map +0 -1
- package/src/tui-interface-impl.tsx +0 -644
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
export type InstallLocation = "project" | "global";
|
|
2
|
-
export type ProjectType = "nextjs" | "react" | "other";
|
|
3
|
-
export interface SkillPackage {
|
|
4
|
-
repo: string;
|
|
5
|
-
displayName: string;
|
|
6
|
-
description: string;
|
|
7
|
-
projectTypes: ProjectType[];
|
|
8
|
-
/** Skill folder names to check for installation */
|
|
9
|
-
skillFolders: string[];
|
|
10
|
-
}
|
|
11
|
-
export type SkillsAgentId = string;
|
|
12
|
-
/**
|
|
13
|
-
* Skill packages offered based on project type.
|
|
14
|
-
* These are installed via `npx skills add <repo> --all`
|
|
15
|
-
*/
|
|
16
|
-
export declare const SKILL_PACKAGES: SkillPackage[];
|
|
17
|
-
/**
|
|
18
|
-
* Detect the project type based on config files and package.json dependencies.
|
|
19
|
-
*/
|
|
20
|
-
export declare function detectProjectType(): ProjectType;
|
|
21
|
-
/**
|
|
22
|
-
* Get skill packages applicable to the current project type.
|
|
23
|
-
*/
|
|
24
|
-
export declare function getApplicablePackages(): SkillPackage[];
|
|
25
|
-
/**
|
|
26
|
-
* Check if a skill package is already installed by checking for its skill folders.
|
|
27
|
-
* A package is considered installed if ANY of its skill folders exist.
|
|
28
|
-
* Only checks .agents/skills since that's where `npx skills` installs to.
|
|
29
|
-
*/
|
|
30
|
-
export declare function isPackageInstalled(pkg: SkillPackage, agentId: SkillsAgentId): boolean;
|
|
31
|
-
export declare function getSkillsPathForLocation(agentId: SkillsAgentId, location: InstallLocation): {
|
|
32
|
-
path: string;
|
|
33
|
-
isGlobal: boolean;
|
|
34
|
-
} | null;
|
|
35
|
-
/**
|
|
36
|
-
* Install a skill package using the skills CLI.
|
|
37
|
-
* Installs all skills from the package to the specified location.
|
|
38
|
-
*/
|
|
39
|
-
export declare function installSkillPackage(pkg: SkillPackage, location?: InstallLocation, agentId?: SkillsAgentId): Promise<{
|
|
40
|
-
success: boolean;
|
|
41
|
-
error?: string;
|
|
42
|
-
}>;
|
|
43
|
-
/**
|
|
44
|
-
* Check for skill updates using the skills CLI.
|
|
45
|
-
*/
|
|
46
|
-
export declare function checkForSkillUpdates(): Promise<{
|
|
47
|
-
hasUpdates: boolean;
|
|
48
|
-
output: string;
|
|
49
|
-
}>;
|
|
50
|
-
/**
|
|
51
|
-
* Update all skills using the skills CLI.
|
|
52
|
-
*/
|
|
53
|
-
export declare function updateSkills(): Promise<{
|
|
54
|
-
success: boolean;
|
|
55
|
-
output: string;
|
|
56
|
-
}>;
|
|
57
|
-
/**
|
|
58
|
-
* Get packages that are applicable but not yet installed.
|
|
59
|
-
*/
|
|
60
|
-
export declare function getUninstalledPackages(): SkillPackage[];
|
|
61
|
-
/**
|
|
62
|
-
* Get packages that are applicable and installed (for showing update info).
|
|
63
|
-
*/
|
|
64
|
-
export declare function getInstalledPackages(): SkillPackage[];
|
|
65
|
-
//# sourceMappingURL=skill-installer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../../src/utils/skill-installer.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAA;AAClD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mDAAmD;IACnD,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAmClC;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,YAAY,EAiBxC,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CA6B/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAerF;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,eAAe,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAS5C;AA4DD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,YAAY,EACjB,QAAQ,GAAE,eAA2B,EACrC,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+C/C;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB7F;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAUlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,YAAY,EAAE,CAErD"}
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "child_process";
|
|
2
|
-
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import path from "path";
|
|
5
|
-
const AGENT_SKILLS_PATHS = {
|
|
6
|
-
"claude-code": {
|
|
7
|
-
project: [".claude", "skills"],
|
|
8
|
-
global: [".claude", "skills"]
|
|
9
|
-
},
|
|
10
|
-
codex: {
|
|
11
|
-
project: [".agents", "skills"],
|
|
12
|
-
global: [".agents", "skills"]
|
|
13
|
-
},
|
|
14
|
-
cursor: {
|
|
15
|
-
project: [".cursor", "skills"],
|
|
16
|
-
global: [".cursor", "skills"]
|
|
17
|
-
},
|
|
18
|
-
cline: {
|
|
19
|
-
project: [".cline", "skills"],
|
|
20
|
-
global: [".cline", "skills"]
|
|
21
|
-
},
|
|
22
|
-
"gemini-cli": {
|
|
23
|
-
project: [".gemini", "skills"],
|
|
24
|
-
global: [".gemini", "skills"]
|
|
25
|
-
},
|
|
26
|
-
opencode: {
|
|
27
|
-
project: [".opencode", "skills"],
|
|
28
|
-
global: [".config", "opencode", "skills"]
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Skill packages offered based on project type.
|
|
33
|
-
* These are installed via `npx skills add <repo> --all`
|
|
34
|
-
*/
|
|
35
|
-
export const SKILL_PACKAGES = [
|
|
36
|
-
{
|
|
37
|
-
repo: "vercel-labs/next-skills",
|
|
38
|
-
displayName: "Next.js Skills",
|
|
39
|
-
description: "Best practices, debugging, hydration fixes, metadata, and upgrade guides",
|
|
40
|
-
projectTypes: ["nextjs"],
|
|
41
|
-
// Folder names as installed by `npx skills add vercel-labs/next-skills`
|
|
42
|
-
skillFolders: ["next-best-practices", "next-cache-components", "next-upgrade"]
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
repo: "vercel-labs/agent-skills",
|
|
46
|
-
displayName: "React & Web Skills",
|
|
47
|
-
description: "React performance, design guidelines, and web development best practices",
|
|
48
|
-
projectTypes: ["nextjs", "react"],
|
|
49
|
-
// Folder names as installed by `npx skills add vercel-labs/agent-skills`
|
|
50
|
-
skillFolders: ["vercel-react-best-practices", "vercel-composition-patterns", "web-design-guidelines"]
|
|
51
|
-
}
|
|
52
|
-
];
|
|
53
|
-
/**
|
|
54
|
-
* Detect the project type based on config files and package.json dependencies.
|
|
55
|
-
*/
|
|
56
|
-
export function detectProjectType() {
|
|
57
|
-
// Check for Next.js config files first (most specific indicator)
|
|
58
|
-
const nextConfigFiles = ["next.config.js", "next.config.ts", "next.config.mjs", "next.config.cjs"];
|
|
59
|
-
if (nextConfigFiles.some((file) => existsSync(path.join(process.cwd(), file)))) {
|
|
60
|
-
return "nextjs";
|
|
61
|
-
}
|
|
62
|
-
// Check package.json dependencies
|
|
63
|
-
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
64
|
-
if (existsSync(packageJsonPath)) {
|
|
65
|
-
try {
|
|
66
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
67
|
-
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
68
|
-
// Check for Next.js in dependencies
|
|
69
|
-
if (deps.next) {
|
|
70
|
-
return "nextjs";
|
|
71
|
-
}
|
|
72
|
-
// Check for React in dependencies
|
|
73
|
-
if (deps.react || deps["react-dom"]) {
|
|
74
|
-
return "react";
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
// Ignore parse errors
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return "other";
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Get skill packages applicable to the current project type.
|
|
85
|
-
*/
|
|
86
|
-
export function getApplicablePackages() {
|
|
87
|
-
const projectType = detectProjectType();
|
|
88
|
-
return SKILL_PACKAGES.filter((pkg) => pkg.projectTypes.includes(projectType));
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Check if a skill package is already installed by checking for its skill folders.
|
|
92
|
-
* A package is considered installed if ANY of its skill folders exist.
|
|
93
|
-
* Only checks .agents/skills since that's where `npx skills` installs to.
|
|
94
|
-
*/
|
|
95
|
-
export function isPackageInstalled(pkg, agentId) {
|
|
96
|
-
const searchDirs = getSkillsDirs(agentId);
|
|
97
|
-
if (searchDirs.length === 0) {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
for (const skillsDir of searchDirs) {
|
|
101
|
-
for (const folder of pkg.skillFolders) {
|
|
102
|
-
if (existsSync(path.join(skillsDir, folder))) {
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
export function getSkillsPathForLocation(agentId, location) {
|
|
110
|
-
const paths = AGENT_SKILLS_PATHS[agentId];
|
|
111
|
-
if (!paths) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
const pathParts = location === "global" ? paths.global : paths.project;
|
|
115
|
-
const base = location === "global" ? homedir() : process.cwd();
|
|
116
|
-
return { path: path.join(base, ...pathParts), isGlobal: location === "global" };
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Get skills directories to check based on agent ID.
|
|
120
|
-
*/
|
|
121
|
-
function getSkillsDirs(agentId) {
|
|
122
|
-
const paths = AGENT_SKILLS_PATHS[agentId];
|
|
123
|
-
if (!paths) {
|
|
124
|
-
return [];
|
|
125
|
-
}
|
|
126
|
-
const dirs = [path.join(process.cwd(), ...paths.project), path.join(homedir(), ...paths.global)];
|
|
127
|
-
const legacyDirs = [
|
|
128
|
-
path.join(process.cwd(), ".agents", "skills"),
|
|
129
|
-
path.join(homedir(), ".agents", "skills"),
|
|
130
|
-
path.join(process.cwd(), ".claude", "skills"),
|
|
131
|
-
path.join(homedir(), ".claude", "skills")
|
|
132
|
-
];
|
|
133
|
-
for (const dir of legacyDirs) {
|
|
134
|
-
if (!dirs.includes(dir)) {
|
|
135
|
-
dirs.push(dir);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return dirs;
|
|
139
|
-
}
|
|
140
|
-
function copySkillFolders(sourceDir, targetDir, folders) {
|
|
141
|
-
let copied = false;
|
|
142
|
-
for (const folder of folders) {
|
|
143
|
-
const sourcePath = path.join(sourceDir, folder);
|
|
144
|
-
if (!existsSync(sourcePath)) {
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
mkdirSync(targetDir, { recursive: true });
|
|
148
|
-
const targetPath = path.join(targetDir, folder);
|
|
149
|
-
cpSync(sourcePath, targetPath, { recursive: true, force: true });
|
|
150
|
-
copied = true;
|
|
151
|
-
}
|
|
152
|
-
return copied;
|
|
153
|
-
}
|
|
154
|
-
function hasAllSkillFolders(targetDir, folders) {
|
|
155
|
-
return folders.every((folder) => existsSync(path.join(targetDir, folder)));
|
|
156
|
-
}
|
|
157
|
-
function getProjectSkillsRoot(agentId) {
|
|
158
|
-
const paths = AGENT_SKILLS_PATHS[agentId];
|
|
159
|
-
if (!paths || paths.project.length === 0) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
return path.join(process.cwd(), paths.project[0]);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Install a skill package using the skills CLI.
|
|
166
|
-
* Installs all skills from the package to the specified location.
|
|
167
|
-
*/
|
|
168
|
-
export async function installSkillPackage(pkg, location = "project", agentId) {
|
|
169
|
-
if (!agentId) {
|
|
170
|
-
return { success: false, error: "No agent specified" };
|
|
171
|
-
}
|
|
172
|
-
const projectSkillsRoot = location === "project" ? getProjectSkillsRoot(agentId) : null;
|
|
173
|
-
const hadProjectSkillsRoot = projectSkillsRoot ? existsSync(projectSkillsRoot) : false;
|
|
174
|
-
// --skill '*' installs all skills for the specified agent only.
|
|
175
|
-
const args = ["add", pkg.repo, "--agent", agentId, "-y", "--skill", "*"];
|
|
176
|
-
if (location === "global") {
|
|
177
|
-
args.push("-g");
|
|
178
|
-
}
|
|
179
|
-
const result = spawnSync("npx", ["--yes", "skills@latest", ...args], {
|
|
180
|
-
stdio: "inherit",
|
|
181
|
-
timeout: 120000, // 2 minute timeout for full package
|
|
182
|
-
cwd: process.cwd()
|
|
183
|
-
});
|
|
184
|
-
if (result.status !== 0) {
|
|
185
|
-
return { success: false, error: "Installation failed" };
|
|
186
|
-
}
|
|
187
|
-
const targetPath = getSkillsPathForLocation(agentId, location);
|
|
188
|
-
if (targetPath && !hasAllSkillFolders(targetPath.path, pkg.skillFolders)) {
|
|
189
|
-
const sourceCandidates = location === "global"
|
|
190
|
-
? [path.join(homedir(), ".agents", "skills"), path.join(homedir(), ".claude", "skills")]
|
|
191
|
-
: [path.join(process.cwd(), ".agents", "skills"), path.join(process.cwd(), ".claude", "skills")];
|
|
192
|
-
for (const sourceDir of sourceCandidates) {
|
|
193
|
-
if (!existsSync(sourceDir)) {
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (copySkillFolders(sourceDir, targetPath.path, pkg.skillFolders)) {
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (location === "project" && projectSkillsRoot && !hadProjectSkillsRoot && existsSync(projectSkillsRoot)) {
|
|
202
|
-
ensureAgentDirGitignored(projectSkillsRoot);
|
|
203
|
-
}
|
|
204
|
-
return { success: true };
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Check for skill updates using the skills CLI.
|
|
208
|
-
*/
|
|
209
|
-
export async function checkForSkillUpdates() {
|
|
210
|
-
const result = spawnSync("npx", ["--yes", "skills@latest", "check"], {
|
|
211
|
-
stdio: "pipe",
|
|
212
|
-
timeout: 30000
|
|
213
|
-
});
|
|
214
|
-
const output = result.stdout?.toString() || "";
|
|
215
|
-
const lowerOutput = output.toLowerCase();
|
|
216
|
-
// Check for specific phrases that indicate updates are available
|
|
217
|
-
// Avoid false positives from "Checking for skill updates..." message
|
|
218
|
-
const hasUpdates = (lowerOutput.includes("update available") || lowerOutput.includes("updates available")) &&
|
|
219
|
-
!lowerOutput.includes("no skills tracked") &&
|
|
220
|
-
!lowerOutput.includes("no skills to check");
|
|
221
|
-
return { hasUpdates, output };
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Update all skills using the skills CLI.
|
|
225
|
-
*/
|
|
226
|
-
export async function updateSkills() {
|
|
227
|
-
const result = spawnSync("npx", ["--yes", "skills@latest", "update", "-y"], {
|
|
228
|
-
stdio: "pipe",
|
|
229
|
-
timeout: 120000
|
|
230
|
-
});
|
|
231
|
-
return {
|
|
232
|
-
success: result.status === 0,
|
|
233
|
-
output: result.stdout?.toString() || result.stderr?.toString() || ""
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Get packages that are applicable but not yet installed.
|
|
238
|
-
*/
|
|
239
|
-
export function getUninstalledPackages() {
|
|
240
|
-
return getApplicablePackages();
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Get packages that are applicable and installed (for showing update info).
|
|
244
|
-
*/
|
|
245
|
-
export function getInstalledPackages() {
|
|
246
|
-
return getApplicablePackages();
|
|
247
|
-
}
|
|
248
|
-
function ensureAgentDirGitignored(projectSkillsRoot) {
|
|
249
|
-
const entryBase = path.basename(projectSkillsRoot);
|
|
250
|
-
if (!entryBase.startsWith(".")) {
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
const entry = `${entryBase}/`;
|
|
254
|
-
const gitignorePath = path.join(process.cwd(), ".gitignore");
|
|
255
|
-
let contents = "";
|
|
256
|
-
if (existsSync(gitignorePath)) {
|
|
257
|
-
contents = readFileSync(gitignorePath, "utf-8");
|
|
258
|
-
if (contents.split(/\r?\n/).some((line) => line.trim() === entry)) {
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
const suffix = contents.endsWith("\n") || contents.length === 0 ? "" : "\n";
|
|
263
|
-
writeFileSync(gitignorePath, `${contents}${suffix}${entry}\n`, "utf-8");
|
|
264
|
-
}
|
|
265
|
-
//# sourceMappingURL=skill-installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/utils/skill-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format timestamp based on user preference
|
|
3
|
-
* @param date Date object to format
|
|
4
|
-
* @param format "local" for local time (default) or "utc" for ISO string
|
|
5
|
-
* @returns Formatted timestamp string
|
|
6
|
-
*/
|
|
7
|
-
export declare function formatTimestamp(date: Date, format?: "local" | "utc"): string;
|
|
8
|
-
/**
|
|
9
|
-
* Parse a timestamp string like "12:34:56.789" into milliseconds from midnight
|
|
10
|
-
* @param timestamp Timestamp string in HH:mm:ss.SSS or HH:mm:ss format
|
|
11
|
-
* @returns Milliseconds from midnight, or null if parsing fails
|
|
12
|
-
*/
|
|
13
|
-
export declare function parseTimestampToMs(timestamp: string): number | null;
|
|
14
|
-
/**
|
|
15
|
-
* Format a time delta in milliseconds to a human-readable string
|
|
16
|
-
* @param deltaMs Delta in milliseconds (can be negative)
|
|
17
|
-
* @returns Formatted string like "+0.011s", "-1.049s", "+5.2s", "+1m23.4s"
|
|
18
|
-
*/
|
|
19
|
-
export declare function formatTimeDelta(deltaMs: number): string;
|
|
20
|
-
//# sourceMappingURL=timestamp.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.d.ts","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAE,OAAO,GAAG,KAAe,GAAG,MAAM,CAYrF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBvD"}
|
package/dist/utils/timestamp.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format timestamp based on user preference
|
|
3
|
-
* @param date Date object to format
|
|
4
|
-
* @param format "local" for local time (default) or "utc" for ISO string
|
|
5
|
-
* @returns Formatted timestamp string
|
|
6
|
-
*/
|
|
7
|
-
export function formatTimestamp(date, format = "local") {
|
|
8
|
-
if (format === "utc") {
|
|
9
|
-
return date.toISOString();
|
|
10
|
-
}
|
|
11
|
-
// Local format: HH:mm:ss.SSS
|
|
12
|
-
const hours = date.getHours().toString().padStart(2, "0");
|
|
13
|
-
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
14
|
-
const seconds = date.getSeconds().toString().padStart(2, "0");
|
|
15
|
-
const milliseconds = date.getMilliseconds().toString().padStart(3, "0");
|
|
16
|
-
return `${hours}:${minutes}:${seconds}.${milliseconds}`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Parse a timestamp string like "12:34:56.789" into milliseconds from midnight
|
|
20
|
-
* @param timestamp Timestamp string in HH:mm:ss.SSS or HH:mm:ss format
|
|
21
|
-
* @returns Milliseconds from midnight, or null if parsing fails
|
|
22
|
-
*/
|
|
23
|
-
export function parseTimestampToMs(timestamp) {
|
|
24
|
-
// Match formats like "12:34:56.789" or "12:34:56"
|
|
25
|
-
const match = timestamp.match(/^(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?/);
|
|
26
|
-
if (!match)
|
|
27
|
-
return null;
|
|
28
|
-
const hours = parseInt(match[1], 10);
|
|
29
|
-
const minutes = parseInt(match[2], 10);
|
|
30
|
-
const seconds = parseInt(match[3], 10);
|
|
31
|
-
const milliseconds = match[4] ? parseInt(match[4].padEnd(3, "0"), 10) : 0;
|
|
32
|
-
return hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Format a time delta in milliseconds to a human-readable string
|
|
36
|
-
* @param deltaMs Delta in milliseconds (can be negative)
|
|
37
|
-
* @returns Formatted string like "+0.011s", "-1.049s", "+5.2s", "+1m23.4s"
|
|
38
|
-
*/
|
|
39
|
-
export function formatTimeDelta(deltaMs) {
|
|
40
|
-
const sign = deltaMs >= 0 ? "+" : "-";
|
|
41
|
-
const absMs = Math.abs(deltaMs);
|
|
42
|
-
if (absMs < 10000) {
|
|
43
|
-
// Under 10 seconds: show 3 decimal places (e.g., "+0.011s")
|
|
44
|
-
return `${sign}${(absMs / 1000).toFixed(3)}s`;
|
|
45
|
-
}
|
|
46
|
-
else if (absMs < 60000) {
|
|
47
|
-
// Under 1 minute: show 1 decimal place (e.g., "+15.2s")
|
|
48
|
-
return `${sign}${(absMs / 1000).toFixed(1)}s`;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
// 1 minute or more: show minutes and seconds (e.g., "+1m23.4s")
|
|
52
|
-
const minutes = Math.floor(absMs / 60000);
|
|
53
|
-
const seconds = (absMs % 60000) / 1000;
|
|
54
|
-
return `${sign}${minutes}m${seconds.toFixed(1)}s`;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=timestamp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,MAAM,GAAoB,OAAO;IAC3E,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAEvE,OAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,YAAY,EAAE,CAAA;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,kDAAkD;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC3E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEzE,OAAO,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,YAAY,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAE/B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QAClB,4DAA4D;QAC5D,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/C,CAAC;SAAM,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QACzB,wDAAwD;QACxD,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAA;QACtC,OAAO,GAAG,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper functions for tmux split-screen mode with --with-agent flag.
|
|
3
|
-
* Extracted for testability.
|
|
4
|
-
*/
|
|
5
|
-
export interface TmuxSessionConfig {
|
|
6
|
-
sessionName: string;
|
|
7
|
-
d3kCommand: string;
|
|
8
|
-
agentCommand: string;
|
|
9
|
-
paneWidthPercent: number;
|
|
10
|
-
d3kLogPath?: string;
|
|
11
|
-
agentLogPath?: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Generate tmux commands for setting up split-screen mode.
|
|
15
|
-
*/
|
|
16
|
-
export declare function generateTmuxCommands(config: TmuxSessionConfig): string[];
|
|
17
|
-
/**
|
|
18
|
-
* Generate a unique session name for tmux.
|
|
19
|
-
*/
|
|
20
|
-
export declare function generateSessionName(): string;
|
|
21
|
-
/**
|
|
22
|
-
* Check if tmux is installed by looking for the binary.
|
|
23
|
-
* Uses file existence checks instead of execSync to avoid SIGINT interruption issues.
|
|
24
|
-
*/
|
|
25
|
-
export declare function isTmuxInstalled(): Promise<boolean>;
|
|
26
|
-
/**
|
|
27
|
-
* Get installation instructions for tmux based on platform.
|
|
28
|
-
*/
|
|
29
|
-
export declare function getTmuxInstallInstructions(): string[];
|
|
30
|
-
/**
|
|
31
|
-
* Default configuration for tmux split-screen.
|
|
32
|
-
*/
|
|
33
|
-
export declare const DEFAULT_TMUX_CONFIG: {
|
|
34
|
-
paneWidthPercent: number;
|
|
35
|
-
};
|
|
36
|
-
//# sourceMappingURL=tmux-helpers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/tmux-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAqBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA8DxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAyBxD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,gBAAgB;CACjB,CAAA"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper functions for tmux split-screen mode with --with-agent flag.
|
|
3
|
-
* Extracted for testability.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Safely quote a value as a single shell argument using POSIX single-quote escaping.
|
|
7
|
-
*/
|
|
8
|
-
function shellQuote(value) {
|
|
9
|
-
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Wrap a command to show error and wait for user input on failure.
|
|
13
|
-
* This prevents the pane from immediately closing on crash, letting users see the error.
|
|
14
|
-
*/
|
|
15
|
-
function wrapCommandWithErrorHandling(cmd, name, pauseOnAnyExit = false) {
|
|
16
|
-
// Use bash -c to run the command and capture its exit code.
|
|
17
|
-
// Quote the script safely so user commands with spaces/quotes don't break tmux startup.
|
|
18
|
-
const shouldPauseCondition = pauseOnAnyExit ? "true" : "[ $EXIT_CODE -ne 0 ]";
|
|
19
|
-
const script = `${cmd}; EXIT_CODE=$?; if ${shouldPauseCondition}; then echo; if [ $EXIT_CODE -ne 0 ]; then echo ❌ ${name} exited with code $EXIT_CODE; else echo ℹ️ ${name} exited with code $EXIT_CODE; fi; echo Press Enter to close...; read; fi; exit $EXIT_CODE`;
|
|
20
|
-
return `bash -c ${shellQuote(script)}`;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Generate tmux commands for setting up split-screen mode.
|
|
24
|
-
*/
|
|
25
|
-
export function generateTmuxCommands(config) {
|
|
26
|
-
const { sessionName, d3kCommand, agentCommand, paneWidthPercent, d3kLogPath, agentLogPath } = config;
|
|
27
|
-
// Wrap commands with error handling so users can see crash output
|
|
28
|
-
const d3kWithErrorHandling = wrapCommandWithErrorHandling(d3kCommand, "d3k", false);
|
|
29
|
-
// Always pause when the agent pane exits so users can see why split-screen closed.
|
|
30
|
-
// This catches both failures and fast-exit cases (e.g. missing auth/session).
|
|
31
|
-
const agentWithErrorHandling = wrapCommandWithErrorHandling(agentCommand, "agent", true);
|
|
32
|
-
const commands = [
|
|
33
|
-
// Create new session with d3k in the first pane (will be right side)
|
|
34
|
-
`tmux new-session -d -s "${sessionName}" ${shellQuote(d3kWithErrorHandling)}`,
|
|
35
|
-
// Increase scrollback buffer for more history
|
|
36
|
-
`tmux set-option -t "${sessionName}" history-limit 10000`,
|
|
37
|
-
// Hide the tmux status bar for a cleaner look
|
|
38
|
-
`tmux set-option -t "${sessionName}" status off`,
|
|
39
|
-
// Enable mouse support for scrolling, clicking to switch panes, and resizing
|
|
40
|
-
`tmux set-option -t "${sessionName}" mouse on`,
|
|
41
|
-
// Enable focus events (required for pane-focus-in hook to work)
|
|
42
|
-
`tmux set-option -g focus-events on`,
|
|
43
|
-
// When terminal is resized, maintain the pane width ratio
|
|
44
|
-
`tmux set-hook -t "${sessionName}" client-resized "resize-pane -t :.0 -x ${paneWidthPercent}%"`,
|
|
45
|
-
// Make inactive pane borders subtle gray, active pane border purple to show focus
|
|
46
|
-
`tmux set-option -t "${sessionName}" pane-border-style "fg=#333333"`,
|
|
47
|
-
`tmux set-option -t "${sessionName}" pane-active-border-style "fg=#A18CE5"`,
|
|
48
|
-
// Split horizontally and run agent in the new pane (left side)
|
|
49
|
-
// -b puts the new pane before (left of) the current one
|
|
50
|
-
// -l sets the size of the NEW pane (agent)
|
|
51
|
-
`tmux split-window -h -b -l ${paneWidthPercent}% -t "${sessionName}" ${shellQuote(agentWithErrorHandling)}`,
|
|
52
|
-
// Mirror pane output to log files without breaking TTY semantics for interactive CLIs.
|
|
53
|
-
// Pane 0 is agent (left), pane 1 is d3k (right) after split-window -b.
|
|
54
|
-
...(agentLogPath ? [`tmux pipe-pane -o -t "${sessionName}:0.0" "cat >> ${shellQuote(agentLogPath)}"`] : []),
|
|
55
|
-
...(d3kLogPath ? [`tmux pipe-pane -o -t "${sessionName}:0.1" "cat >> ${shellQuote(d3kLogPath)}"`] : []),
|
|
56
|
-
// When focus changes (via mouse click or keyboard), resize focused pane to 75%
|
|
57
|
-
// Note: pane-focus-in is a window-level hook, requires -w flag
|
|
58
|
-
`tmux set-hook -w -t "${sessionName}" pane-focus-in 'resize-pane -x ${paneWidthPercent}%'`,
|
|
59
|
-
// Bind Ctrl+B Left to focus agent pane (left/pane 0) AND resize it
|
|
60
|
-
// Use single quotes to prevent shell from interpreting the semicolon
|
|
61
|
-
`tmux bind-key -T prefix Left 'select-pane -t :.0 ; resize-pane -t :.0 -x ${paneWidthPercent}%'`,
|
|
62
|
-
// Bind Ctrl+B Right to focus d3k pane (right/pane 1) AND resize it
|
|
63
|
-
`tmux bind-key -T prefix Right 'select-pane -t :.1 ; resize-pane -t :.1 -x ${paneWidthPercent}%'`,
|
|
64
|
-
// When any pane exits, kill the entire session (so Ctrl-C in either pane exits both).
|
|
65
|
-
// Important: install this after split/bind setup to avoid a race if the agent exits quickly.
|
|
66
|
-
`tmux set-hook -t "${sessionName}" pane-exited "kill-session -t ${sessionName}"`,
|
|
67
|
-
// Focus on the agent pane (left side, pane 0 after split with -b)
|
|
68
|
-
`tmux select-pane -t "${sessionName}:0.0"`
|
|
69
|
-
];
|
|
70
|
-
return commands;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Generate a unique session name for tmux.
|
|
74
|
-
*/
|
|
75
|
-
export function generateSessionName() {
|
|
76
|
-
return `d3k-${Date.now()}`;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Check if tmux is installed by looking for the binary.
|
|
80
|
-
* Uses file existence checks instead of execSync to avoid SIGINT interruption issues.
|
|
81
|
-
*/
|
|
82
|
-
export async function isTmuxInstalled() {
|
|
83
|
-
const { existsSync } = await import("fs");
|
|
84
|
-
// Check common tmux binary paths (avoids execSync which can be interrupted by SIGINT)
|
|
85
|
-
const commonPaths = [
|
|
86
|
-
"/opt/homebrew/bin/tmux", // macOS Homebrew (Apple Silicon)
|
|
87
|
-
"/usr/local/bin/tmux", // macOS Homebrew (Intel) or manual install
|
|
88
|
-
"/usr/bin/tmux", // Linux (apt, dnf, etc.)
|
|
89
|
-
"/bin/tmux" // Some Linux distros
|
|
90
|
-
];
|
|
91
|
-
for (const path of commonPaths) {
|
|
92
|
-
if (existsSync(path)) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Fallback to which command if not found in common paths
|
|
97
|
-
const { execSync } = await import("child_process");
|
|
98
|
-
try {
|
|
99
|
-
execSync("which tmux", { stdio: "ignore" });
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Get installation instructions for tmux based on platform.
|
|
108
|
-
*/
|
|
109
|
-
export function getTmuxInstallInstructions() {
|
|
110
|
-
return ["macOS: brew install tmux", "Ubuntu: sudo apt install tmux", "Fedora: sudo dnf install tmux"];
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Default configuration for tmux split-screen.
|
|
114
|
-
*/
|
|
115
|
-
export const DEFAULT_TMUX_CONFIG = {
|
|
116
|
-
paneWidthPercent: 75 // Agent gets 75% of width
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=tmux-helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-helpers.js","sourceRoot":"","sources":["../../src/utils/tmux-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface AgentConfig {
|
|
2
|
-
name: string;
|
|
3
|
-
command: string;
|
|
4
|
-
}
|
|
5
|
-
export interface UserConfig {
|
|
6
|
-
defaultAgent?: AgentConfig;
|
|
7
|
-
browser?: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function getUserConfigPath(): string;
|
|
10
|
-
export declare function loadUserConfig(): UserConfig;
|
|
11
|
-
export declare function saveUserConfig(updates: Partial<UserConfig>): void;
|
|
12
|
-
//# sourceMappingURL=user-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-config.d.ts","sourceRoot":"","sources":["../../src/utils/user-config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,WAAW,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,cAAc,IAAI,UAAU,CAwB3C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAkBjE"}
|