agentrix 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +235 -0
- package/bin/agentrix.js +5 -0
- package/dist/api/auth.d.ts +10 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +30 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/automation.d.ts +52 -0
- package/dist/api/automation.d.ts.map +1 -0
- package/dist/api/automation.js +181 -0
- package/dist/api/automation.js.map +1 -0
- package/dist/api/base-handler.d.ts +62 -0
- package/dist/api/base-handler.d.ts.map +1 -0
- package/dist/api/base-handler.js +55 -0
- package/dist/api/base-handler.js.map +1 -0
- package/dist/api/config.d.ts +5 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +14 -0
- package/dist/api/config.js.map +1 -0
- package/dist/api/create-plan.d.ts +8 -0
- package/dist/api/create-plan.d.ts.map +1 -0
- package/dist/api/create-plan.js +77 -0
- package/dist/api/create-plan.js.map +1 -0
- package/dist/api/git-status.d.ts +6 -0
- package/dist/api/git-status.d.ts.map +1 -0
- package/dist/api/git-status.js +57 -0
- package/dist/api/git-status.js.map +1 -0
- package/dist/api/plans.d.ts +6 -0
- package/dist/api/plans.d.ts.map +1 -0
- package/dist/api/plans.js +75 -0
- package/dist/api/plans.js.map +1 -0
- package/dist/api/repo-dashboard.d.ts +13 -0
- package/dist/api/repo-dashboard.d.ts.map +1 -0
- package/dist/api/repo-dashboard.js +47 -0
- package/dist/api/repo-dashboard.js.map +1 -0
- package/dist/api/repo-issue.d.ts +12 -0
- package/dist/api/repo-issue.d.ts.map +1 -0
- package/dist/api/repo-issue.js +47 -0
- package/dist/api/repo-issue.js.map +1 -0
- package/dist/api/repos.d.ts +9 -0
- package/dist/api/repos.d.ts.map +1 -0
- package/dist/api/repos.js +46 -0
- package/dist/api/repos.js.map +1 -0
- package/dist/api/sessions.d.ts +5 -0
- package/dist/api/sessions.d.ts.map +1 -0
- package/dist/api/sessions.js +19 -0
- package/dist/api/sessions.js.map +1 -0
- package/dist/api/tasks.d.ts +6 -0
- package/dist/api/tasks.d.ts.map +1 -0
- package/dist/api/tasks.js +22 -0
- package/dist/api/tasks.js.map +1 -0
- package/dist/api/terminal.d.ts +7 -0
- package/dist/api/terminal.d.ts.map +1 -0
- package/dist/api/terminal.js +16 -0
- package/dist/api/terminal.js.map +1 -0
- package/dist/api/worktrees.d.ts +7 -0
- package/dist/api/worktrees.d.ts.map +1 -0
- package/dist/api/worktrees.js +26 -0
- package/dist/api/worktrees.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +3 -0
- package/dist/cli/arg-parser.d.ts.map +1 -0
- package/dist/cli/arg-parser.js +243 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/config-resolver.d.ts +29 -0
- package/dist/cli/config-resolver.d.ts.map +1 -0
- package/dist/cli/config-resolver.js +139 -0
- package/dist/cli/config-resolver.js.map +1 -0
- package/dist/cli/config.d.ts +5 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +224 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/constants.d.ts +7 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +15 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +35 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +23 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +23 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plans-command.d.ts +3 -0
- package/dist/cli/plans-command.d.ts.map +1 -0
- package/dist/cli/plans-command.js +151 -0
- package/dist/cli/plans-command.js.map +1 -0
- package/dist/cli/server-starter.d.ts +26 -0
- package/dist/cli/server-starter.d.ts.map +1 -0
- package/dist/cli/server-starter.js +72 -0
- package/dist/cli/server-starter.js.map +1 -0
- package/dist/cli/types.d.ts +46 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/validation.d.ts +14 -0
- package/dist/cli/validation.d.ts.map +1 -0
- package/dist/cli/validation.js +99 -0
- package/dist/cli/validation.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +73 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/agent-commands.d.ts +27 -0
- package/dist/config/agent-commands.d.ts.map +1 -0
- package/dist/config/agent-commands.js +56 -0
- package/dist/config/agent-commands.js.map +1 -0
- package/dist/config/constants.d.ts +35 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +35 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/developer-messages.d.ts +2 -0
- package/dist/config/developer-messages.d.ts.map +1 -0
- package/dist/config/developer-messages.js +43 -0
- package/dist/config/developer-messages.js.map +1 -0
- package/dist/core/agents.d.ts +23 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +91 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/auth.d.ts +3 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +69 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/automation/branch.d.ts +18 -0
- package/dist/core/automation/branch.d.ts.map +1 -0
- package/dist/core/automation/branch.js +29 -0
- package/dist/core/automation/branch.js.map +1 -0
- package/dist/core/automation/git-orchestration.d.ts +51 -0
- package/dist/core/automation/git-orchestration.d.ts.map +1 -0
- package/dist/core/automation/git-orchestration.js +25 -0
- package/dist/core/automation/git-orchestration.js.map +1 -0
- package/dist/core/automation/plan.d.ts +15 -0
- package/dist/core/automation/plan.d.ts.map +1 -0
- package/dist/core/automation/plan.js +25 -0
- package/dist/core/automation/plan.js.map +1 -0
- package/dist/core/automation/request-validation.d.ts +45 -0
- package/dist/core/automation/request-validation.d.ts.map +1 -0
- package/dist/core/automation/request-validation.js +144 -0
- package/dist/core/automation/request-validation.js.map +1 -0
- package/dist/core/automation/task-runner.d.ts +42 -0
- package/dist/core/automation/task-runner.d.ts.map +1 -0
- package/dist/core/automation/task-runner.js +215 -0
- package/dist/core/automation/task-runner.js.map +1 -0
- package/dist/core/branch-name.d.ts +13 -0
- package/dist/core/branch-name.d.ts.map +1 -0
- package/dist/core/branch-name.js +429 -0
- package/dist/core/branch-name.js.map +1 -0
- package/dist/core/default-branch.d.ts +12 -0
- package/dist/core/default-branch.d.ts.map +1 -0
- package/dist/core/default-branch.js +78 -0
- package/dist/core/default-branch.js.map +1 -0
- package/dist/core/event-bus.d.ts +73 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +127 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/git.d.ts +13 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +15 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/github.d.ts +10 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +245 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/plan-storage.d.ts +46 -0
- package/dist/core/plan-storage.d.ts.map +1 -0
- package/dist/core/plan-storage.js +237 -0
- package/dist/core/plan-storage.js.map +1 -0
- package/dist/core/plan.d.ts +23 -0
- package/dist/core/plan.d.ts.map +1 -0
- package/dist/core/plan.js +445 -0
- package/dist/core/plan.js.map +1 -0
- package/dist/core/repositories.d.ts +2 -0
- package/dist/core/repositories.d.ts.map +1 -0
- package/dist/core/repositories.js +58 -0
- package/dist/core/repositories.js.map +1 -0
- package/dist/core/repository-config.d.ts +9 -0
- package/dist/core/repository-config.d.ts.map +1 -0
- package/dist/core/repository-config.js +65 -0
- package/dist/core/repository-config.js.map +1 -0
- package/dist/core/task-store.d.ts +14 -0
- package/dist/core/task-store.d.ts.map +1 -0
- package/dist/core/task-store.js +105 -0
- package/dist/core/task-store.js.map +1 -0
- package/dist/core/tasks.d.ts +62 -0
- package/dist/core/tasks.d.ts.map +1 -0
- package/dist/core/tasks.js +582 -0
- package/dist/core/tasks.js.map +1 -0
- package/dist/core/terminal-sessions.d.ts +18 -0
- package/dist/core/terminal-sessions.d.ts.map +1 -0
- package/dist/core/terminal-sessions.js +539 -0
- package/dist/core/terminal-sessions.js.map +1 -0
- package/dist/core/tmux.d.ts +29 -0
- package/dist/core/tmux.d.ts.map +1 -0
- package/dist/core/tmux.js +151 -0
- package/dist/core/tmux.js.map +1 -0
- package/dist/core/workdir.d.ts +8 -0
- package/dist/core/workdir.d.ts.map +1 -0
- package/dist/core/workdir.js +26 -0
- package/dist/core/workdir.js.map +1 -0
- package/dist/domain/branch-validator.d.ts +51 -0
- package/dist/domain/branch-validator.d.ts.map +1 -0
- package/dist/domain/branch-validator.js +88 -0
- package/dist/domain/branch-validator.js.map +1 -0
- package/dist/domain/git-url-parser.d.ts +27 -0
- package/dist/domain/git-url-parser.d.ts.map +1 -0
- package/dist/domain/git-url-parser.js +84 -0
- package/dist/domain/git-url-parser.js.map +1 -0
- package/dist/domain/index.d.ts +8 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/repository.d.ts +55 -0
- package/dist/domain/repository.d.ts.map +1 -0
- package/dist/domain/repository.js +73 -0
- package/dist/domain/repository.js.map +1 -0
- package/dist/domain/worktree.d.ts +43 -0
- package/dist/domain/worktree.d.ts.map +1 -0
- package/dist/domain/worktree.js +57 -0
- package/dist/domain/worktree.js.map +1 -0
- package/dist/infrastructure/cookies/cookie-manager.d.ts +18 -0
- package/dist/infrastructure/cookies/cookie-manager.d.ts.map +1 -0
- package/dist/infrastructure/cookies/cookie-manager.js +20 -0
- package/dist/infrastructure/cookies/cookie-manager.js.map +1 -0
- package/dist/infrastructure/cookies/cookie-parser.d.ts +43 -0
- package/dist/infrastructure/cookies/cookie-parser.d.ts.map +1 -0
- package/dist/infrastructure/cookies/cookie-parser.js +88 -0
- package/dist/infrastructure/cookies/cookie-parser.js.map +1 -0
- package/dist/infrastructure/cookies/cookie-security.d.ts +15 -0
- package/dist/infrastructure/cookies/cookie-security.d.ts.map +1 -0
- package/dist/infrastructure/cookies/cookie-security.js +35 -0
- package/dist/infrastructure/cookies/cookie-security.js.map +1 -0
- package/dist/infrastructure/cookies/index.d.ts +7 -0
- package/dist/infrastructure/cookies/index.d.ts.map +1 -0
- package/dist/infrastructure/cookies/index.js +4 -0
- package/dist/infrastructure/cookies/index.js.map +1 -0
- package/dist/infrastructure/errors/error-handler.d.ts +22 -0
- package/dist/infrastructure/errors/error-handler.d.ts.map +1 -0
- package/dist/infrastructure/errors/error-handler.js +89 -0
- package/dist/infrastructure/errors/error-handler.js.map +1 -0
- package/dist/infrastructure/errors/http-error.d.ts +30 -0
- package/dist/infrastructure/errors/http-error.d.ts.map +1 -0
- package/dist/infrastructure/errors/http-error.js +46 -0
- package/dist/infrastructure/errors/http-error.js.map +1 -0
- package/dist/infrastructure/errors/index.d.ts +5 -0
- package/dist/infrastructure/errors/index.d.ts.map +1 -0
- package/dist/infrastructure/errors/index.js +5 -0
- package/dist/infrastructure/errors/index.js.map +1 -0
- package/dist/infrastructure/errors/not-found-error.d.ts +8 -0
- package/dist/infrastructure/errors/not-found-error.d.ts.map +1 -0
- package/dist/infrastructure/errors/not-found-error.js +13 -0
- package/dist/infrastructure/errors/not-found-error.js.map +1 -0
- package/dist/infrastructure/errors/validation-error.d.ts +21 -0
- package/dist/infrastructure/errors/validation-error.d.ts.map +1 -0
- package/dist/infrastructure/errors/validation-error.js +31 -0
- package/dist/infrastructure/errors/validation-error.js.map +1 -0
- package/dist/infrastructure/logging/index.d.ts +3 -0
- package/dist/infrastructure/logging/index.d.ts.map +1 -0
- package/dist/infrastructure/logging/index.js +2 -0
- package/dist/infrastructure/logging/index.js.map +1 -0
- package/dist/infrastructure/logging/logger.d.ts +21 -0
- package/dist/infrastructure/logging/logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/logger.js +49 -0
- package/dist/infrastructure/logging/logger.js.map +1 -0
- package/dist/repositories/git-repository.d.ts +67 -0
- package/dist/repositories/git-repository.d.ts.map +1 -0
- package/dist/repositories/git-repository.js +111 -0
- package/dist/repositories/git-repository.js.map +1 -0
- package/dist/repositories/git-status-repository.d.ts +22 -0
- package/dist/repositories/git-status-repository.d.ts.map +1 -0
- package/dist/repositories/git-status-repository.js +620 -0
- package/dist/repositories/git-status-repository.js.map +1 -0
- package/dist/repositories/repository-repository.d.ts +44 -0
- package/dist/repositories/repository-repository.d.ts.map +1 -0
- package/dist/repositories/repository-repository.js +155 -0
- package/dist/repositories/repository-repository.js.map +1 -0
- package/dist/repositories/worktree-repository.d.ts +66 -0
- package/dist/repositories/worktree-repository.d.ts.map +1 -0
- package/dist/repositories/worktree-repository.js +330 -0
- package/dist/repositories/worktree-repository.js.map +1 -0
- package/dist/server/cookies.d.ts +6 -0
- package/dist/server/cookies.d.ts.map +1 -0
- package/dist/server/cookies.js +6 -0
- package/dist/server/cookies.js.map +1 -0
- package/dist/server/events.d.ts +8 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +128 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +173 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/router.d.ts +16 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +256 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/ui.d.ts +8 -0
- package/dist/server/ui.d.ts.map +1 -0
- package/dist/server/ui.js +211 -0
- package/dist/server/ui.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +116 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/services/auth-service.d.ts +49 -0
- package/dist/services/auth-service.d.ts.map +1 -0
- package/dist/services/auth-service.js +53 -0
- package/dist/services/auth-service.js.map +1 -0
- package/dist/services/index.d.ts +11 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/repository-service.d.ts +57 -0
- package/dist/services/repository-service.d.ts.map +1 -0
- package/dist/services/repository-service.js +62 -0
- package/dist/services/repository-service.js.map +1 -0
- package/dist/services/session-service.d.ts +31 -0
- package/dist/services/session-service.d.ts.map +1 -0
- package/dist/services/session-service.js +134 -0
- package/dist/services/session-service.js.map +1 -0
- package/dist/services/terminal-service.d.ts +43 -0
- package/dist/services/terminal-service.d.ts.map +1 -0
- package/dist/services/terminal-service.js +85 -0
- package/dist/services/terminal-service.js.map +1 -0
- package/dist/services/worktree-service.d.ts +39 -0
- package/dist/services/worktree-service.d.ts.map +1 -0
- package/dist/services/worktree-service.js +208 -0
- package/dist/services/worktree-service.js.map +1 -0
- package/dist/types/auth.d.ts +35 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/config.d.ts +46 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/git.d.ts +190 -0
- package/dist/types/git.d.ts.map +1 -0
- package/dist/types/git.js +5 -0
- package/dist/types/git.js.map +1 -0
- package/dist/types/http.d.ts +46 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +2 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/plan.d.ts +31 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +5 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/services.d.ts +99 -0
- package/dist/types/services.d.ts.map +1 -0
- package/dist/types/services.js +2 -0
- package/dist/types/services.js.map +1 -0
- package/dist/types/tasks.d.ts +68 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +5 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/terminal.d.ts +60 -0
- package/dist/types/terminal.d.ts.map +1 -0
- package/dist/types/terminal.js +2 -0
- package/dist/types/terminal.js.map +1 -0
- package/dist/utils/cookies.d.ts +7 -0
- package/dist/utils/cookies.d.ts.map +1 -0
- package/dist/utils/cookies.js +6 -0
- package/dist/utils/cookies.js.map +1 -0
- package/dist/utils/http.d.ts +23 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +58 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/random.d.ts +12 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/random.js +25 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/repository-cache.d.ts +8 -0
- package/dist/utils/repository-cache.d.ts.map +1 -0
- package/dist/utils/repository-cache.js +13 -0
- package/dist/utils/repository-cache.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +6 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/request-validator.d.ts +99 -0
- package/dist/validation/request-validator.d.ts.map +1 -0
- package/dist/validation/request-validator.js +189 -0
- package/dist/validation/request-validator.js.map +1 -0
- package/dist/validation/schemas/repository-schema.d.ts +26 -0
- package/dist/validation/schemas/repository-schema.d.ts.map +1 -0
- package/dist/validation/schemas/repository-schema.js +31 -0
- package/dist/validation/schemas/repository-schema.js.map +1 -0
- package/dist/validation/schemas/terminal-schema.d.ts +21 -0
- package/dist/validation/schemas/terminal-schema.d.ts.map +1 -0
- package/dist/validation/schemas/terminal-schema.js +38 -0
- package/dist/validation/schemas/terminal-schema.js.map +1 -0
- package/dist/validation/schemas/worktree-schema.d.ts +21 -0
- package/dist/validation/schemas/worktree-schema.d.ts.map +1 -0
- package/dist/validation/schemas/worktree-schema.js +29 -0
- package/dist/validation/schemas/worktree-schema.js.map +1 -0
- package/package.json +79 -0
- package/ui/dist/assets/index-BDDrbP3l.js +354 -0
- package/ui/dist/assets/index-CwB7gOl4.css +41 -0
- package/ui/dist/index.html +13 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { promisify } from 'node:util';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { TMUX_BIN, TMUX_SESSION_PREFIX } from '../config/constants.js';
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
let tmuxAvailable = false;
|
|
6
|
+
let tmuxVersion = null;
|
|
7
|
+
let tmuxDetection;
|
|
8
|
+
export async function detectTmux() {
|
|
9
|
+
if (!tmuxDetection) {
|
|
10
|
+
tmuxDetection = (async () => {
|
|
11
|
+
try {
|
|
12
|
+
const { stdout } = await execFileAsync(TMUX_BIN, ['-V'], { maxBuffer: 1024 * 1024 });
|
|
13
|
+
tmuxAvailable = true;
|
|
14
|
+
tmuxVersion = stdout ? stdout.trim() : null;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
tmuxAvailable = false;
|
|
18
|
+
tmuxVersion = null;
|
|
19
|
+
}
|
|
20
|
+
return { available: tmuxAvailable, version: tmuxVersion };
|
|
21
|
+
})();
|
|
22
|
+
}
|
|
23
|
+
return tmuxDetection;
|
|
24
|
+
}
|
|
25
|
+
export function isTmuxAvailable() {
|
|
26
|
+
return tmuxAvailable;
|
|
27
|
+
}
|
|
28
|
+
export async function runTmux(args, options = {}) {
|
|
29
|
+
return execFileAsync(TMUX_BIN, args, { maxBuffer: 1024 * 1024, ...options });
|
|
30
|
+
}
|
|
31
|
+
export function sanitiseTmuxComponent(value, fallback) {
|
|
32
|
+
if (typeof value !== 'string') {
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
const trimmed = value.trim();
|
|
36
|
+
if (!trimmed) {
|
|
37
|
+
return fallback;
|
|
38
|
+
}
|
|
39
|
+
const cleaned = trimmed
|
|
40
|
+
.replace(/\s+/g, '-')
|
|
41
|
+
.replace(/[^A-Za-z0-9._-]/g, '-')
|
|
42
|
+
.replace(/-+/g, '-')
|
|
43
|
+
.replace(/^-|-$/g, '');
|
|
44
|
+
return cleaned || fallback;
|
|
45
|
+
}
|
|
46
|
+
export function makeTmuxSessionName(org, repo, branch) {
|
|
47
|
+
const orgPart = sanitiseTmuxComponent(org, 'org');
|
|
48
|
+
const repoPart = sanitiseTmuxComponent(repo, 'repo');
|
|
49
|
+
const branchPart = sanitiseTmuxComponent(branch, 'branch');
|
|
50
|
+
return `${TMUX_SESSION_PREFIX}${orgPart}--${repoPart}--${branchPart}`;
|
|
51
|
+
}
|
|
52
|
+
export function parseTmuxSessionName(sessionName) {
|
|
53
|
+
if (typeof sessionName !== 'string' || !sessionName.startsWith(TMUX_SESSION_PREFIX)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const remainder = sessionName.slice(TMUX_SESSION_PREFIX.length);
|
|
57
|
+
const parts = remainder.split('--');
|
|
58
|
+
if (parts.length !== 3) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const [org, repo, branch] = parts;
|
|
62
|
+
if (!org || !repo || !branch) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return { org, repo, branch };
|
|
66
|
+
}
|
|
67
|
+
export function makeSanitisedSessionKey(org, repo, branch) {
|
|
68
|
+
const orgPart = sanitiseTmuxComponent(org, 'org');
|
|
69
|
+
const repoPart = sanitiseTmuxComponent(repo, 'repo');
|
|
70
|
+
const branchPart = sanitiseTmuxComponent(branch, 'branch');
|
|
71
|
+
return `${orgPart}--${repoPart}--${branchPart}`;
|
|
72
|
+
}
|
|
73
|
+
export function buildSanitisedWorktreeLookup(structure) {
|
|
74
|
+
const map = new Map();
|
|
75
|
+
const struct = structure;
|
|
76
|
+
Object.entries(struct || {}).forEach(([org, repos]) => {
|
|
77
|
+
const repoEntries = repos && typeof repos === 'object' ? repos : {};
|
|
78
|
+
Object.entries(repoEntries).forEach(([repo, info]) => {
|
|
79
|
+
const infoObj = info;
|
|
80
|
+
const branchList = Array.isArray(infoObj?.branches)
|
|
81
|
+
? infoObj.branches
|
|
82
|
+
: Array.isArray(info)
|
|
83
|
+
? info
|
|
84
|
+
: [];
|
|
85
|
+
branchList.forEach((branch) => {
|
|
86
|
+
if (!branch) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const key = makeSanitisedSessionKey(org, repo, branch);
|
|
90
|
+
if (!map.has(key)) {
|
|
91
|
+
map.set(key, { org, repo, branch });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
return map;
|
|
97
|
+
}
|
|
98
|
+
function tmuxTarget(sessionName) {
|
|
99
|
+
return `=${sessionName}`;
|
|
100
|
+
}
|
|
101
|
+
export async function tmuxHasSession(sessionName) {
|
|
102
|
+
try {
|
|
103
|
+
await runTmux(['has-session', '-t', tmuxTarget(sessionName)]);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const err = error;
|
|
108
|
+
if (typeof err.code === 'number') {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function tmuxKillSession(sessionName) {
|
|
115
|
+
try {
|
|
116
|
+
await runTmux(['kill-session', '-t', tmuxTarget(sessionName)]);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const err = error;
|
|
120
|
+
if (typeof err.code === 'number') {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function tmuxKillSessionsForRepository(org, repo, branches) {
|
|
127
|
+
if (!org || !repo || !Array.isArray(branches) || branches.length === 0) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
await detectTmux();
|
|
131
|
+
if (!isTmuxAvailable()) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const tasks = branches
|
|
135
|
+
.filter((branch) => typeof branch === 'string' && branch.length > 0)
|
|
136
|
+
.map(async (branch) => {
|
|
137
|
+
const tmuxSessionName = makeTmuxSessionName(org, repo, branch);
|
|
138
|
+
try {
|
|
139
|
+
await tmuxKillSession(tmuxSessionName);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const err = error;
|
|
143
|
+
console.warn(`[agentrix] Failed to kill tmux session ${tmuxSessionName}:`, err?.message || error);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
if (tasks.length === 0) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await Promise.allSettled(tasks);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=tmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/core/tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves and validates the work directory path
|
|
3
|
+
* @param workdir - Work directory path
|
|
4
|
+
* @returns Absolute path to work directory
|
|
5
|
+
* @throws {Error} If directory doesn't exist or isn't accessible
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveWorkdir(workdir: string): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=workdir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workdir.d.ts","sourceRoot":"","sources":["../../src/core/workdir.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBrE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves and validates the work directory path
|
|
5
|
+
* @param workdir - Work directory path
|
|
6
|
+
* @returns Absolute path to work directory
|
|
7
|
+
* @throws {Error} If directory doesn't exist or isn't accessible
|
|
8
|
+
*/
|
|
9
|
+
export async function resolveWorkdir(workdir) {
|
|
10
|
+
const absolute = path.resolve(workdir);
|
|
11
|
+
try {
|
|
12
|
+
const stats = await fs.stat(absolute);
|
|
13
|
+
if (!stats.isDirectory()) {
|
|
14
|
+
throw new Error(`Workdir path is not a directory: ${absolute}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const err = error;
|
|
19
|
+
if (err.code === 'ENOENT') {
|
|
20
|
+
throw new Error(`Workdir does not exist: ${absolute}`);
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Unable to access workdir ${absolute}: ${err.message}`);
|
|
23
|
+
}
|
|
24
|
+
return absolute;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=workdir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workdir.js","sourceRoot":"","sources":["../../src/core/workdir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAA4C,CAAC;QACzD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch name validation and normalization
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes a branch name by trimming whitespace
|
|
6
|
+
* @param branch - Branch name to normalize
|
|
7
|
+
* @returns Normalized branch name
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeBranchName(branch: unknown): string;
|
|
10
|
+
/**
|
|
11
|
+
* Sanitizes a branch name (alias for normalizeBranchName for clarity)
|
|
12
|
+
* @param branch - Branch name to sanitize
|
|
13
|
+
* @returns Sanitized branch name
|
|
14
|
+
*/
|
|
15
|
+
export declare function sanitizeBranchName(branch: unknown): string;
|
|
16
|
+
/**
|
|
17
|
+
* Derives a worktree folder name from a branch name
|
|
18
|
+
* Takes the last segment after splitting by '/'
|
|
19
|
+
* @param branch - Branch name
|
|
20
|
+
* @returns Folder name for the worktree
|
|
21
|
+
* @throws {Error} If branch name is invalid or empty
|
|
22
|
+
*/
|
|
23
|
+
export declare function deriveWorktreeFolderName(branch: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Validates that a branch name is not empty
|
|
26
|
+
* @param branch - Branch name to validate
|
|
27
|
+
* @returns Validated branch name
|
|
28
|
+
* @throws {Error} If branch name is invalid
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateBranchName(branch: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Value object representing a branch name
|
|
33
|
+
*/
|
|
34
|
+
export declare class BranchName {
|
|
35
|
+
readonly value: string;
|
|
36
|
+
constructor(name: string);
|
|
37
|
+
toString(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the worktree folder name for this branch
|
|
40
|
+
* @returns Folder name
|
|
41
|
+
*/
|
|
42
|
+
toFolderName(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if this is the main/default branch
|
|
45
|
+
* @param defaultBranch - The default branch name (default: 'main')
|
|
46
|
+
* @returns True if this is the default branch
|
|
47
|
+
*/
|
|
48
|
+
isDefault(defaultBranch?: string): boolean;
|
|
49
|
+
equals(other: BranchName | string): boolean;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=branch-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-validator.d.ts","sourceRoot":"","sources":["../../src/domain/branch-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,SAAgB,KAAK,EAAE,MAAM,CAAC;gBAElB,IAAI,EAAE,MAAM;IAIxB,QAAQ,IAAI,MAAM;IAIlB;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;;OAIG;IACH,SAAS,CAAC,aAAa,GAAE,MAAe,GAAG,OAAO;IAIlD,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO;CAM5C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch name validation and normalization
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes a branch name by trimming whitespace
|
|
6
|
+
* @param branch - Branch name to normalize
|
|
7
|
+
* @returns Normalized branch name
|
|
8
|
+
*/
|
|
9
|
+
export function normalizeBranchName(branch) {
|
|
10
|
+
if (typeof branch !== 'string') {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
return branch.trim();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Sanitizes a branch name (alias for normalizeBranchName for clarity)
|
|
17
|
+
* @param branch - Branch name to sanitize
|
|
18
|
+
* @returns Sanitized branch name
|
|
19
|
+
*/
|
|
20
|
+
export function sanitizeBranchName(branch) {
|
|
21
|
+
return normalizeBranchName(branch);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Derives a worktree folder name from a branch name
|
|
25
|
+
* Takes the last segment after splitting by '/'
|
|
26
|
+
* @param branch - Branch name
|
|
27
|
+
* @returns Folder name for the worktree
|
|
28
|
+
* @throws {Error} If branch name is invalid or empty
|
|
29
|
+
*/
|
|
30
|
+
export function deriveWorktreeFolderName(branch) {
|
|
31
|
+
const trimmed = normalizeBranchName(branch);
|
|
32
|
+
if (!trimmed) {
|
|
33
|
+
throw new Error('Branch name cannot be empty');
|
|
34
|
+
}
|
|
35
|
+
const parts = trimmed.split('/').filter(Boolean);
|
|
36
|
+
const folder = parts[parts.length - 1];
|
|
37
|
+
if (!folder) {
|
|
38
|
+
throw new Error('Unable to derive worktree folder from branch name');
|
|
39
|
+
}
|
|
40
|
+
return folder;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validates that a branch name is not empty
|
|
44
|
+
* @param branch - Branch name to validate
|
|
45
|
+
* @returns Validated branch name
|
|
46
|
+
* @throws {Error} If branch name is invalid
|
|
47
|
+
*/
|
|
48
|
+
export function validateBranchName(branch) {
|
|
49
|
+
const normalized = normalizeBranchName(branch);
|
|
50
|
+
if (!normalized) {
|
|
51
|
+
throw new Error('Branch name cannot be empty');
|
|
52
|
+
}
|
|
53
|
+
return normalized;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Value object representing a branch name
|
|
57
|
+
*/
|
|
58
|
+
export class BranchName {
|
|
59
|
+
value;
|
|
60
|
+
constructor(name) {
|
|
61
|
+
this.value = validateBranchName(name);
|
|
62
|
+
}
|
|
63
|
+
toString() {
|
|
64
|
+
return this.value;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gets the worktree folder name for this branch
|
|
68
|
+
* @returns Folder name
|
|
69
|
+
*/
|
|
70
|
+
toFolderName() {
|
|
71
|
+
return deriveWorktreeFolderName(this.value);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Checks if this is the main/default branch
|
|
75
|
+
* @param defaultBranch - The default branch name (default: 'main')
|
|
76
|
+
* @returns True if this is the default branch
|
|
77
|
+
*/
|
|
78
|
+
isDefault(defaultBranch = 'main') {
|
|
79
|
+
return this.value.toLowerCase() === defaultBranch.toLowerCase();
|
|
80
|
+
}
|
|
81
|
+
equals(other) {
|
|
82
|
+
if (other instanceof BranchName) {
|
|
83
|
+
return this.value === other.value;
|
|
84
|
+
}
|
|
85
|
+
return this.value === other;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=branch-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-validator.js","sourceRoot":"","sources":["../../src/domain/branch-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACL,KAAK,CAAS;IAE9B,YAAY,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,gBAAwB,MAAM;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,KAA0B;QAC/B,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git URL parsing utilities
|
|
3
|
+
*/
|
|
4
|
+
export interface GitUrlParts {
|
|
5
|
+
org: string;
|
|
6
|
+
repo: string;
|
|
7
|
+
url: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parses a Git repository URL into org and repo components
|
|
11
|
+
* @param input - Repository URL (SSH, HTTPS, or path format)
|
|
12
|
+
* @returns Object with {org, repo, url} properties
|
|
13
|
+
* @throws {Error} If URL cannot be parsed
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseRepositoryUrl(input: string): GitUrlParts;
|
|
16
|
+
/**
|
|
17
|
+
* Value object representing a parsed Git URL
|
|
18
|
+
*/
|
|
19
|
+
export declare class GitUrl {
|
|
20
|
+
readonly org: string;
|
|
21
|
+
readonly repo: string;
|
|
22
|
+
readonly url: string;
|
|
23
|
+
constructor(url: string);
|
|
24
|
+
toString(): string;
|
|
25
|
+
toIdentifier(): string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=git-url-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-url-parser.d.ts","sourceRoot":"","sources":["../../src/domain/git-url-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA0D7D;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,GAAG,EAAE,MAAM,CAAC;gBAEhB,GAAG,EAAE,MAAM;IAOvB,QAAQ,IAAI,MAAM;IAIlB,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git URL parsing utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parses a Git repository URL into org and repo components
|
|
6
|
+
* @param input - Repository URL (SSH, HTTPS, or path format)
|
|
7
|
+
* @returns Object with {org, repo, url} properties
|
|
8
|
+
* @throws {Error} If URL cannot be parsed
|
|
9
|
+
*/
|
|
10
|
+
export function parseRepositoryUrl(input) {
|
|
11
|
+
if (typeof input !== 'string' || !input.trim()) {
|
|
12
|
+
throw new Error('Repository URL is required');
|
|
13
|
+
}
|
|
14
|
+
const trimmed = input.trim();
|
|
15
|
+
let org = '';
|
|
16
|
+
let repo = '';
|
|
17
|
+
// Try SSH format: git@github.com:org/repo.git
|
|
18
|
+
const sshMatch = trimmed.match(/^git@[^:]+:([^/]+)\/(.+)$/);
|
|
19
|
+
if (sshMatch) {
|
|
20
|
+
org = sshMatch[1];
|
|
21
|
+
repo = sshMatch[2];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Try HTTPS/HTTP URL format
|
|
25
|
+
try {
|
|
26
|
+
if (/^[a-z]+:\/\//i.test(trimmed)) {
|
|
27
|
+
const url = new URL(trimmed);
|
|
28
|
+
const parts = url.pathname.replace(/^\//, '').split('/').filter(Boolean);
|
|
29
|
+
if (parts.length >= 2) {
|
|
30
|
+
org = parts[parts.length - 2];
|
|
31
|
+
repo = parts[parts.length - 1];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// ignore URL parsing errors and fall back to manual parsing
|
|
37
|
+
}
|
|
38
|
+
// If not parsed yet, try path-like format
|
|
39
|
+
if (!org || !repo) {
|
|
40
|
+
const cleaned = trimmed.replace(/\.git$/, '');
|
|
41
|
+
const segments = cleaned.split(/[\\/]+/).filter(Boolean);
|
|
42
|
+
if (segments.length >= 2) {
|
|
43
|
+
org = segments[segments.length - 2];
|
|
44
|
+
repo = segments[segments.length - 1];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Try colon-separated format (alternate SSH style)
|
|
48
|
+
if ((!org || !repo) && trimmed.includes(':')) {
|
|
49
|
+
const tail = trimmed.split(':').pop() || '';
|
|
50
|
+
const segments = tail.replace(/\.git$/, '').split('/').filter(Boolean);
|
|
51
|
+
if (segments.length >= 2) {
|
|
52
|
+
org = segments[segments.length - 2];
|
|
53
|
+
repo = segments[segments.length - 1];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Remove .git extension from repo name
|
|
58
|
+
repo = repo ? repo.replace(/\.git$/, '') : repo;
|
|
59
|
+
if (!org || !repo) {
|
|
60
|
+
throw new Error('Unable to determine repository organisation and name from URL');
|
|
61
|
+
}
|
|
62
|
+
return { org, repo, url: trimmed };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Value object representing a parsed Git URL
|
|
66
|
+
*/
|
|
67
|
+
export class GitUrl {
|
|
68
|
+
org;
|
|
69
|
+
repo;
|
|
70
|
+
url;
|
|
71
|
+
constructor(url) {
|
|
72
|
+
const parsed = parseRepositoryUrl(url);
|
|
73
|
+
this.org = parsed.org;
|
|
74
|
+
this.repo = parsed.repo;
|
|
75
|
+
this.url = parsed.url;
|
|
76
|
+
}
|
|
77
|
+
toString() {
|
|
78
|
+
return this.url;
|
|
79
|
+
}
|
|
80
|
+
toIdentifier() {
|
|
81
|
+
return `${this.org}/${this.repo}`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=git-url-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-url-parser.js","sourceRoot":"","sources":["../../src/domain/git-url-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { parseRepositoryUrl, GitUrl } from './git-url-parser.js';
|
|
2
|
+
export type { GitUrlParts } from './git-url-parser.js';
|
|
3
|
+
export { normalizeBranchName, sanitizeBranchName, deriveWorktreeFolderName, validateBranchName, BranchName, } from './branch-validator.js';
|
|
4
|
+
export { Worktree, createWorktree } from './worktree.js';
|
|
5
|
+
export type { WorktreeData } from './worktree.js';
|
|
6
|
+
export { Repository, createRepository } from './repository.js';
|
|
7
|
+
export type { RepositoryData } from './repository.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { parseRepositoryUrl, GitUrl } from './git-url-parser.js';
|
|
2
|
+
export { normalizeBranchName, sanitizeBranchName, deriveWorktreeFolderName, validateBranchName, BranchName, } from './branch-validator.js';
|
|
3
|
+
export { Worktree, createWorktree } from './worktree.js';
|
|
4
|
+
export { Repository, createRepository } from './repository.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository domain entity
|
|
3
|
+
*/
|
|
4
|
+
export interface RepositoryData {
|
|
5
|
+
org: string;
|
|
6
|
+
repo: string;
|
|
7
|
+
branches?: string[];
|
|
8
|
+
initCommand?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Represents a Git repository
|
|
12
|
+
*/
|
|
13
|
+
export declare class Repository {
|
|
14
|
+
readonly org: string;
|
|
15
|
+
readonly repo: string;
|
|
16
|
+
readonly branches: string[];
|
|
17
|
+
readonly initCommand: string;
|
|
18
|
+
constructor({ org, repo, branches, initCommand }: RepositoryData);
|
|
19
|
+
/**
|
|
20
|
+
* Gets the unique identifier for this repository
|
|
21
|
+
* @returns Format: org/repo
|
|
22
|
+
*/
|
|
23
|
+
getId(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Gets the repository path within the workdir
|
|
26
|
+
* @param workdir - The work directory root
|
|
27
|
+
* @returns Path to the repository
|
|
28
|
+
*/
|
|
29
|
+
getPath(workdir: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Gets the main repository path (not a worktree)
|
|
32
|
+
* @param workdir - The work directory root
|
|
33
|
+
* @returns Path to the repository directory
|
|
34
|
+
*/
|
|
35
|
+
getRepositoryPath(workdir: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Checks if the repository has any branches
|
|
38
|
+
* @returns True if there are branches
|
|
39
|
+
*/
|
|
40
|
+
hasBranches(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Checks if a specific branch exists
|
|
43
|
+
* @param branchName - Branch name to check
|
|
44
|
+
* @returns True if the branch exists
|
|
45
|
+
*/
|
|
46
|
+
hasBranch(branchName: string): boolean;
|
|
47
|
+
toJSON(): RepositoryData;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Creates a repository instance from raw data
|
|
51
|
+
* @param data - Raw repository data
|
|
52
|
+
* @returns Repository instance
|
|
53
|
+
*/
|
|
54
|
+
export declare function createRepository(data: RepositoryData): Repository;
|
|
55
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnC,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,EAAE,GAAG,EAAE,IAAI,EAAE,QAAa,EAAE,WAAgB,EAAE,EAAE,cAAc;IAO1E;;;OAGG;IACH,KAAK,IAAI,MAAM;IAIf;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIhC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI1C;;;OAGG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC,MAAM,IAAI,cAAc;CAQzB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAEjE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository domain entity
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Represents a Git repository
|
|
6
|
+
*/
|
|
7
|
+
export class Repository {
|
|
8
|
+
org;
|
|
9
|
+
repo;
|
|
10
|
+
branches;
|
|
11
|
+
initCommand;
|
|
12
|
+
constructor({ org, repo, branches = [], initCommand = '' }) {
|
|
13
|
+
this.org = org;
|
|
14
|
+
this.repo = repo;
|
|
15
|
+
this.branches = branches;
|
|
16
|
+
this.initCommand = initCommand;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets the unique identifier for this repository
|
|
20
|
+
* @returns Format: org/repo
|
|
21
|
+
*/
|
|
22
|
+
getId() {
|
|
23
|
+
return `${this.org}/${this.repo}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Gets the repository path within the workdir
|
|
27
|
+
* @param workdir - The work directory root
|
|
28
|
+
* @returns Path to the repository
|
|
29
|
+
*/
|
|
30
|
+
getPath(workdir) {
|
|
31
|
+
return `${workdir}/${this.org}/${this.repo}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets the main repository path (not a worktree)
|
|
35
|
+
* @param workdir - The work directory root
|
|
36
|
+
* @returns Path to the repository directory
|
|
37
|
+
*/
|
|
38
|
+
getRepositoryPath(workdir) {
|
|
39
|
+
return `${this.getPath(workdir)}/repository`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Checks if the repository has any branches
|
|
43
|
+
* @returns True if there are branches
|
|
44
|
+
*/
|
|
45
|
+
hasBranches() {
|
|
46
|
+
return this.branches.length > 0;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Checks if a specific branch exists
|
|
50
|
+
* @param branchName - Branch name to check
|
|
51
|
+
* @returns True if the branch exists
|
|
52
|
+
*/
|
|
53
|
+
hasBranch(branchName) {
|
|
54
|
+
return this.branches.includes(branchName);
|
|
55
|
+
}
|
|
56
|
+
toJSON() {
|
|
57
|
+
return {
|
|
58
|
+
org: this.org,
|
|
59
|
+
repo: this.repo,
|
|
60
|
+
branches: this.branches,
|
|
61
|
+
initCommand: this.initCommand,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a repository instance from raw data
|
|
67
|
+
* @param data - Raw repository data
|
|
68
|
+
* @returns Repository instance
|
|
69
|
+
*/
|
|
70
|
+
export function createRepository(data) {
|
|
71
|
+
return new Repository(data);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,MAAM,OAAO,UAAU;IACL,GAAG,CAAS;IACZ,IAAI,CAAS;IACb,QAAQ,CAAW;IACnB,WAAW,CAAS;IAEpC,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAkB;QACxE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAAe;QACrB,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,OAAe;QAC/B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|