@sudocode-ai/local-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +19 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +105 -0
  5. package/dist/cli.js.map +7 -0
  6. package/dist/execution/engine/engine.d.ts +103 -0
  7. package/dist/execution/engine/engine.d.ts.map +1 -0
  8. package/dist/execution/engine/simple-engine.d.ts +190 -0
  9. package/dist/execution/engine/simple-engine.d.ts.map +1 -0
  10. package/dist/execution/engine/types.d.ts +116 -0
  11. package/dist/execution/engine/types.d.ts.map +1 -0
  12. package/dist/execution/output/ag-ui-adapter.d.ts +176 -0
  13. package/dist/execution/output/ag-ui-adapter.d.ts.map +1 -0
  14. package/dist/execution/output/ag-ui-integration.d.ts +96 -0
  15. package/dist/execution/output/ag-ui-integration.d.ts.map +1 -0
  16. package/dist/execution/output/claude-code-output-processor.d.ts +321 -0
  17. package/dist/execution/output/claude-code-output-processor.d.ts.map +1 -0
  18. package/dist/execution/output/index.d.ts +18 -0
  19. package/dist/execution/output/index.d.ts.map +1 -0
  20. package/dist/execution/output/types.d.ts +421 -0
  21. package/dist/execution/output/types.d.ts.map +1 -0
  22. package/dist/execution/process/builders/claude.d.ts +86 -0
  23. package/dist/execution/process/builders/claude.d.ts.map +1 -0
  24. package/dist/execution/process/index.d.ts +15 -0
  25. package/dist/execution/process/index.d.ts.map +1 -0
  26. package/dist/execution/process/manager.d.ts +133 -0
  27. package/dist/execution/process/manager.d.ts.map +1 -0
  28. package/dist/execution/process/simple-manager.d.ts +102 -0
  29. package/dist/execution/process/simple-manager.d.ts.map +1 -0
  30. package/dist/execution/process/types.d.ts +105 -0
  31. package/dist/execution/process/types.d.ts.map +1 -0
  32. package/dist/execution/process/utils.d.ts +53 -0
  33. package/dist/execution/process/utils.d.ts.map +1 -0
  34. package/dist/execution/resilience/circuit-breaker.d.ts +170 -0
  35. package/dist/execution/resilience/circuit-breaker.d.ts.map +1 -0
  36. package/dist/execution/resilience/executor.d.ts +109 -0
  37. package/dist/execution/resilience/executor.d.ts.map +1 -0
  38. package/dist/execution/resilience/index.d.ts +14 -0
  39. package/dist/execution/resilience/index.d.ts.map +1 -0
  40. package/dist/execution/resilience/resilient-executor.d.ts +86 -0
  41. package/dist/execution/resilience/resilient-executor.d.ts.map +1 -0
  42. package/dist/execution/resilience/retry.d.ts +161 -0
  43. package/dist/execution/resilience/retry.d.ts.map +1 -0
  44. package/dist/execution/resilience/types.d.ts +226 -0
  45. package/dist/execution/resilience/types.d.ts.map +1 -0
  46. package/dist/execution/transport/event-buffer.d.ts +119 -0
  47. package/dist/execution/transport/event-buffer.d.ts.map +1 -0
  48. package/dist/execution/transport/index.d.ts +10 -0
  49. package/dist/execution/transport/index.d.ts.map +1 -0
  50. package/dist/execution/transport/sse-transport.d.ts +146 -0
  51. package/dist/execution/transport/sse-transport.d.ts.map +1 -0
  52. package/dist/execution/transport/transport-manager.d.ts +176 -0
  53. package/dist/execution/transport/transport-manager.d.ts.map +1 -0
  54. package/dist/execution/workflow/index.d.ts +13 -0
  55. package/dist/execution/workflow/index.d.ts.map +1 -0
  56. package/dist/execution/workflow/linear-orchestrator.d.ts +216 -0
  57. package/dist/execution/workflow/linear-orchestrator.d.ts.map +1 -0
  58. package/dist/execution/workflow/memory-storage.d.ts +54 -0
  59. package/dist/execution/workflow/memory-storage.d.ts.map +1 -0
  60. package/dist/execution/workflow/orchestrator.d.ts +158 -0
  61. package/dist/execution/workflow/orchestrator.d.ts.map +1 -0
  62. package/dist/execution/workflow/types.d.ts +172 -0
  63. package/dist/execution/workflow/types.d.ts.map +1 -0
  64. package/dist/execution/workflow/utils.d.ts +89 -0
  65. package/dist/execution/workflow/utils.d.ts.map +1 -0
  66. package/dist/execution/worktree/config.d.ts +74 -0
  67. package/dist/execution/worktree/config.d.ts.map +1 -0
  68. package/dist/execution/worktree/git-cli.d.ts +151 -0
  69. package/dist/execution/worktree/git-cli.d.ts.map +1 -0
  70. package/dist/execution/worktree/index.d.ts +16 -0
  71. package/dist/execution/worktree/index.d.ts.map +1 -0
  72. package/dist/execution/worktree/manager.d.ts +184 -0
  73. package/dist/execution/worktree/manager.d.ts.map +1 -0
  74. package/dist/execution/worktree/types.d.ts +90 -0
  75. package/dist/execution/worktree/types.d.ts.map +1 -0
  76. package/dist/index.d.ts +8 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +104 -0
  79. package/dist/index.js.map +7 -0
  80. package/dist/public/assets/index-C4SmlXoo.js +568 -0
  81. package/dist/public/assets/index-C4SmlXoo.js.map +1 -0
  82. package/dist/public/assets/index-DE59j7ti.css +1 -0
  83. package/dist/public/assets/react-vendor-LX0UoTxg.js +60 -0
  84. package/dist/public/assets/react-vendor-LX0UoTxg.js.map +1 -0
  85. package/dist/public/assets/ui-vendor-_cxVHaqZ.js +54 -0
  86. package/dist/public/assets/ui-vendor-_cxVHaqZ.js.map +1 -0
  87. package/dist/public/favicon.ico +0 -0
  88. package/dist/public/index.html +16 -0
  89. package/dist/public/logo.png +0 -0
  90. package/dist/routes/executions-stream.d.ts +24 -0
  91. package/dist/routes/executions-stream.d.ts.map +1 -0
  92. package/dist/routes/executions.d.ts +19 -0
  93. package/dist/routes/executions.d.ts.map +1 -0
  94. package/dist/routes/feedback.d.ts +7 -0
  95. package/dist/routes/feedback.d.ts.map +1 -0
  96. package/dist/routes/issues.d.ts +7 -0
  97. package/dist/routes/issues.d.ts.map +1 -0
  98. package/dist/routes/relationships.d.ts +7 -0
  99. package/dist/routes/relationships.d.ts.map +1 -0
  100. package/dist/routes/specs.d.ts +7 -0
  101. package/dist/routes/specs.d.ts.map +1 -0
  102. package/dist/services/db.d.ts +33 -0
  103. package/dist/services/db.d.ts.map +1 -0
  104. package/dist/services/execution-lifecycle.d.ts +108 -0
  105. package/dist/services/execution-lifecycle.d.ts.map +1 -0
  106. package/dist/services/execution-service.d.ts +185 -0
  107. package/dist/services/execution-service.d.ts.map +1 -0
  108. package/dist/services/executions.d.ts +59 -0
  109. package/dist/services/executions.d.ts.map +1 -0
  110. package/dist/services/export.d.ts +24 -0
  111. package/dist/services/export.d.ts.map +1 -0
  112. package/dist/services/feedback.d.ts +40 -0
  113. package/dist/services/feedback.d.ts.map +1 -0
  114. package/dist/services/issues.d.ts +27 -0
  115. package/dist/services/issues.d.ts.map +1 -0
  116. package/dist/services/prompt-template-engine.d.ts +108 -0
  117. package/dist/services/prompt-template-engine.d.ts.map +1 -0
  118. package/dist/services/prompt-templates.d.ts +97 -0
  119. package/dist/services/prompt-templates.d.ts.map +1 -0
  120. package/dist/services/relationships.d.ts +35 -0
  121. package/dist/services/relationships.d.ts.map +1 -0
  122. package/dist/services/specs.d.ts +27 -0
  123. package/dist/services/specs.d.ts.map +1 -0
  124. package/dist/services/watcher.d.ts +50 -0
  125. package/dist/services/watcher.d.ts.map +1 -0
  126. package/dist/services/websocket.d.ts +127 -0
  127. package/dist/services/websocket.d.ts.map +1 -0
  128. package/dist/utils/sudocode-dir.d.ts +6 -0
  129. package/dist/utils/sudocode-dir.d.ts.map +1 -0
  130. package/package.json +74 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Workflow Layer Types
3
+ *
4
+ * Layer 4: Task Execution Layer - Workflow Orchestration & State Management
5
+ *
6
+ * @module execution/workflow/types
7
+ */
8
+ import type { RetryPolicy, ResilientExecutionResult } from '../resilience/types.js';
9
+ import type { ExecutionResult } from '../engine/types.js';
10
+ /**
11
+ * WorkflowDefinition - Configuration for a multi-step workflow
12
+ */
13
+ export interface WorkflowDefinition {
14
+ /** Unique identifier for this workflow type */
15
+ id: string;
16
+ /** Steps to execute in sequence */
17
+ steps: WorkflowStep[];
18
+ /** Initial context variables */
19
+ initialContext?: Record<string, any>;
20
+ /** Workflow configuration */
21
+ config?: {
22
+ /** Number of steps between checkpoints (0 = no checkpoints) */
23
+ checkpointInterval?: number;
24
+ /** If true, continue executing remaining steps after a step fails */
25
+ continueOnStepFailure?: boolean;
26
+ /** Overall workflow timeout in milliseconds */
27
+ timeout?: number;
28
+ };
29
+ /** Additional metadata */
30
+ metadata?: Record<string, any>;
31
+ }
32
+ /**
33
+ * WorkflowStep - Individual step within a workflow
34
+ */
35
+ export interface WorkflowStep {
36
+ /** Unique step identifier */
37
+ id: string;
38
+ /** Task type to execute */
39
+ taskType: 'issue' | 'spec' | 'custom';
40
+ /** Prompt template with {{variable}} placeholders */
41
+ prompt: string;
42
+ /** Step IDs that must complete before this step */
43
+ dependencies?: string[];
44
+ /** Retry policy for this step (overrides default) */
45
+ retryPolicy?: RetryPolicy;
46
+ /** Step-specific timeout in milliseconds */
47
+ timeout?: number;
48
+ /** Condition to evaluate before executing step */
49
+ condition?: string;
50
+ /** Map step outputs to context variables */
51
+ outputMapping?: Record<string, string>;
52
+ /** Task configuration passed to engine */
53
+ taskConfig?: Record<string, any>;
54
+ /** Additional metadata */
55
+ metadata?: Record<string, any>;
56
+ }
57
+ /**
58
+ * WorkflowExecution - Runtime state of a workflow execution
59
+ */
60
+ export interface WorkflowExecution {
61
+ /** Unique execution identifier (UUID from database or externally provided) */
62
+ executionId: string;
63
+ /** Workflow definition ID */
64
+ workflowId: string;
65
+ /** Workflow definition */
66
+ definition: WorkflowDefinition;
67
+ /** Current execution status */
68
+ status: WorkflowStatus;
69
+ /** Index of current step being executed */
70
+ currentStepIndex: number;
71
+ /** Shared context across steps */
72
+ context: Record<string, any>;
73
+ /** Results from completed steps */
74
+ stepResults: ResilientExecutionResult[];
75
+ /** When execution started */
76
+ startedAt: Date;
77
+ /** When execution completed */
78
+ completedAt?: Date;
79
+ /** When execution was paused */
80
+ pausedAt?: Date;
81
+ /** When execution was resumed */
82
+ resumedAt?: Date;
83
+ /** Error message if failed */
84
+ error?: string;
85
+ /** Additional metadata */
86
+ metadata?: Record<string, any>;
87
+ }
88
+ /**
89
+ * WorkflowStatus - Possible workflow execution states
90
+ */
91
+ export type WorkflowStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';
92
+ /**
93
+ * WorkflowCheckpoint - Saved workflow state for resumption
94
+ */
95
+ export interface WorkflowCheckpoint {
96
+ /** Workflow definition ID */
97
+ workflowId: string;
98
+ /** Execution ID */
99
+ executionId: string;
100
+ /** Workflow definition at checkpoint time */
101
+ definition: WorkflowDefinition;
102
+ /** Execution state at checkpoint */
103
+ state: {
104
+ status: WorkflowStatus;
105
+ currentStepIndex: number;
106
+ context: Record<string, any>;
107
+ stepResults: ResilientExecutionResult[];
108
+ error?: string;
109
+ startedAt: Date;
110
+ completedAt?: Date;
111
+ };
112
+ /** When checkpoint was created */
113
+ createdAt: Date;
114
+ }
115
+ /**
116
+ * WorkflowResult - Final result of workflow execution
117
+ */
118
+ export interface WorkflowResult {
119
+ /** Execution ID */
120
+ executionId: string;
121
+ /** Whether workflow completed successfully */
122
+ success: boolean;
123
+ /** Number of steps completed */
124
+ completedSteps: number;
125
+ /** Number of steps failed */
126
+ failedSteps: number;
127
+ /** Number of steps skipped */
128
+ skippedSteps: number;
129
+ /** Final context outputs */
130
+ outputs: Record<string, any>;
131
+ /** Total execution duration in milliseconds */
132
+ duration: number;
133
+ /** Error message if failed */
134
+ error?: string;
135
+ }
136
+ /**
137
+ * StepStatus - Status information for a specific step
138
+ */
139
+ export interface StepStatus {
140
+ /** Step ID */
141
+ stepId: string;
142
+ /** Current status */
143
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
144
+ /** Execution result if completed/failed */
145
+ result?: ExecutionResult;
146
+ /** Number of attempts */
147
+ attempts: number;
148
+ }
149
+ /**
150
+ * Event Handlers
151
+ */
152
+ /** Called when workflow execution starts */
153
+ export type WorkflowStartHandler = (executionId: string, workflowId: string) => void;
154
+ /** Called when workflow execution completes */
155
+ export type WorkflowCompleteHandler = (executionId: string, result: WorkflowResult) => void;
156
+ /** Called when workflow execution fails */
157
+ export type WorkflowFailedHandler = (executionId: string, error: Error) => void;
158
+ /** Called when a step starts executing */
159
+ export type StepStartHandler = (executionId: string, stepId: string, stepIndex: number) => void;
160
+ /** Called when a step completes */
161
+ export type StepCompleteHandler = (executionId: string, stepId: string, result: ExecutionResult) => void;
162
+ /** Called when a step fails */
163
+ export type StepFailedHandler = (executionId: string, stepId: string, error: Error) => void;
164
+ /** Called when a checkpoint is created */
165
+ export type WorkflowCheckpointHandler = (checkpoint: WorkflowCheckpoint) => void;
166
+ /** Called when a workflow is resumed from checkpoint */
167
+ export type WorkflowResumeHandler = (executionId: string, checkpoint: WorkflowCheckpoint) => void;
168
+ /** Called when a workflow is paused */
169
+ export type WorkflowPauseHandler = (executionId: string) => void;
170
+ /** Called when a workflow is cancelled */
171
+ export type WorkflowCancelHandler = (executionId: string) => void;
172
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/execution/workflow/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Workflow Utility Functions
3
+ *
4
+ * Helper functions for template rendering, path extraction, and ID generation.
5
+ *
6
+ * @module execution/workflow/utils
7
+ */
8
+ /**
9
+ * Generate a unique ID with a given prefix
10
+ *
11
+ * @param prefix - Prefix for the ID (e.g., 'execution', 'checkpoint')
12
+ * @returns Unique ID string
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const id = generateId('execution');
17
+ * // Returns: 'execution-1234567890-abc123'
18
+ * ```
19
+ */
20
+ export declare function generateId(prefix?: string): string;
21
+ /**
22
+ * Render a template string by replacing {{variable}} placeholders with context values
23
+ *
24
+ * @param template - Template string with {{variable}} placeholders
25
+ * @param context - Context object containing variable values
26
+ * @returns Rendered string with variables replaced
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const context = { name: 'World', greeting: 'Hello' };
31
+ * const result = renderTemplate('{{greeting}} {{name}}!', context);
32
+ * // Returns: 'Hello World!'
33
+ * ```
34
+ */
35
+ export declare function renderTemplate(template: string, context: Record<string, any>): string;
36
+ /**
37
+ * Extract a value from an object using a dot-notation path
38
+ *
39
+ * @param obj - Object to extract value from
40
+ * @param path - Dot-notation path (e.g., 'user.profile.name')
41
+ * @returns Extracted value or undefined if path doesn't exist
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const obj = { user: { profile: { name: 'Alice' } } };
46
+ * const name = extractValue(obj, 'user.profile.name');
47
+ * // Returns: 'Alice'
48
+ * ```
49
+ */
50
+ export declare function extractValue(obj: any, path: string): any;
51
+ /**
52
+ * Merge two context objects, with the second overriding the first
53
+ *
54
+ * @param base - Base context object
55
+ * @param updates - Updates to merge into base
56
+ * @returns New merged context object
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const base = { a: 1, b: 2 };
61
+ * const updates = { b: 3, c: 4 };
62
+ * const merged = mergeContext(base, updates);
63
+ * // Returns: { a: 1, b: 3, c: 4 }
64
+ * ```
65
+ */
66
+ export declare function mergeContext(base: Record<string, any>, updates: Record<string, any>): Record<string, any>;
67
+ /**
68
+ * Evaluate a condition string in the context
69
+ *
70
+ * @param condition - Condition string to evaluate (e.g., '{{isEnabled}}')
71
+ * @param context - Context object
72
+ * @returns Boolean result of condition
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const context = { isEnabled: true };
77
+ * const result = evaluateCondition('{{isEnabled}}', context);
78
+ * // Returns: true
79
+ * ```
80
+ */
81
+ export declare function evaluateCondition(condition: string, context: Record<string, any>): boolean;
82
+ /**
83
+ * Create initial workflow context
84
+ *
85
+ * @param initialValues - Initial context values
86
+ * @returns New context object
87
+ */
88
+ export declare function createContext(initialValues?: Record<string, any>): Record<string, any>;
89
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/execution/workflow/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAO,GAAG,MAAM,CAIhD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,CAmBR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAsBxD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAKrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAqBT;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACtC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAIrB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Worktree Configuration
3
+ *
4
+ * Loads and validates worktree configuration from .sudocode/config.json
5
+ *
6
+ * @module execution/worktree/config
7
+ */
8
+ import type { WorktreeConfig } from './types.js';
9
+ /**
10
+ * Validation result
11
+ */
12
+ interface ValidationResult {
13
+ config: WorktreeConfig;
14
+ warnings: string[];
15
+ }
16
+ /**
17
+ * Default worktree configuration
18
+ */
19
+ export declare const DEFAULT_WORKTREE_CONFIG: WorktreeConfig;
20
+ /**
21
+ * Validate and normalize worktree configuration
22
+ *
23
+ * @param rawConfig - Raw configuration object from config.json
24
+ * @returns Validated configuration with warnings
25
+ */
26
+ export declare function validateWorktreeConfig(rawConfig: Partial<WorktreeConfig>): ValidationResult;
27
+ /**
28
+ * Load worktree configuration from .sudocode/config.json
29
+ *
30
+ * @param projectRoot - Path to project root (default: current working directory)
31
+ * @returns Validated configuration with warnings
32
+ */
33
+ export declare function loadWorktreeConfig(projectRoot?: string): ValidationResult;
34
+ /**
35
+ * Get worktree configuration (singleton pattern)
36
+ * Caches the configuration per project root
37
+ *
38
+ * @param projectRoot - Path to project root (default: current working directory)
39
+ * @param forceReload - Force reload from disk
40
+ * @returns Worktree configuration
41
+ */
42
+ export declare function getWorktreeConfig(projectRoot?: string, forceReload?: boolean): WorktreeConfig;
43
+ /**
44
+ * Clear the cached configuration (useful for testing)
45
+ */
46
+ export declare function clearWorktreeConfigCache(): void;
47
+ /**
48
+ * Update worktree configuration in .sudocode/config.json
49
+ * Preserves other configuration sections
50
+ *
51
+ * @param updates - Partial configuration to update
52
+ * @param projectRoot - Path to project root (default: current working directory)
53
+ * @returns Validation result with updated config
54
+ * @throws Error if unable to write config file
55
+ */
56
+ export declare function updateWorktreeConfig(updates: Partial<WorktreeConfig>, projectRoot?: string): ValidationResult;
57
+ /**
58
+ * Set a single worktree configuration property
59
+ *
60
+ * @param key - Configuration key to set
61
+ * @param value - Value to set
62
+ * @param projectRoot - Path to project root (default: current working directory)
63
+ * @returns Validation result with updated config
64
+ */
65
+ export declare function setWorktreeConfigProperty<K extends keyof WorktreeConfig>(key: K, value: WorktreeConfig[K], projectRoot?: string): ValidationResult;
66
+ /**
67
+ * Reset worktree configuration to defaults
68
+ *
69
+ * @param projectRoot - Path to project root (default: current working directory)
70
+ * @returns Validation result with default config
71
+ */
72
+ export declare function resetWorktreeConfig(projectRoot?: string): ValidationResult;
73
+ export {};
74
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/execution/worktree/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUjD;;GAEG;AACH,UAAU,gBAAgB;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAQrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,GACjC,gBAAgB,CA8FlB;AAkCD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,GAAE,MAAsB,GAClC,gBAAgB,CAgClB;AAQD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,GAAE,MAAsB,EACnC,WAAW,UAAQ,GAClB,cAAc,CAoBhB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,EAChC,WAAW,GAAE,MAAsB,GAClC,gBAAgB,CAoDlB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,cAAc,EACtE,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,WAAW,GAAE,MAAsB,GAClC,gBAAgB,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,GAAE,MAAsB,GAClC,gBAAgB,CAElB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Git CLI Wrapper
3
+ *
4
+ * Provides a wrapper around git CLI commands for worktree operations.
5
+ * Uses git CLI directly for reliability (recommended over libgit2/nodegit).
6
+ *
7
+ * @module execution/worktree/git-cli
8
+ */
9
+ import type { WorktreeInfo } from './types.js';
10
+ /**
11
+ * IGitCli - Interface for git CLI operations
12
+ */
13
+ export interface IGitCli {
14
+ /**
15
+ * Add a new worktree
16
+ * Equivalent to: git worktree add <path> <branch>
17
+ *
18
+ * @param repoPath - Path to the main git repository
19
+ * @param worktreePath - Path where worktree will be created
20
+ * @param branch - Branch name for the worktree
21
+ * @param force - Force creation even if path exists
22
+ */
23
+ worktreeAdd(repoPath: string, worktreePath: string, branch: string, force?: boolean): Promise<void>;
24
+ /**
25
+ * Remove a worktree
26
+ * Equivalent to: git worktree remove <path> --force
27
+ *
28
+ * @param repoPath - Path to the main git repository
29
+ * @param worktreePath - Path to worktree to remove
30
+ * @param force - Force removal even if worktree is dirty
31
+ */
32
+ worktreeRemove(repoPath: string, worktreePath: string, force?: boolean): Promise<void>;
33
+ /**
34
+ * Prune worktree metadata
35
+ * Equivalent to: git worktree prune
36
+ *
37
+ * @param repoPath - Path to the main git repository
38
+ */
39
+ worktreePrune(repoPath: string): Promise<void>;
40
+ /**
41
+ * List all worktrees
42
+ * Equivalent to: git worktree list --porcelain
43
+ *
44
+ * @param repoPath - Path to the main git repository
45
+ * @returns Array of worktree information
46
+ */
47
+ worktreeList(repoPath: string): Promise<WorktreeInfo[]>;
48
+ /**
49
+ * Create a branch
50
+ * Equivalent to: git branch <name> <base>
51
+ *
52
+ * @param repoPath - Path to the git repository
53
+ * @param branchName - Name of the new branch
54
+ * @param baseBranchOrCommit - Base branch or commit SHA to branch from
55
+ */
56
+ createBranch(repoPath: string, branchName: string, baseBranchOrCommit: string): Promise<void>;
57
+ /**
58
+ * Delete a branch
59
+ * Equivalent to: git branch -d <name>
60
+ *
61
+ * @param repoPath - Path to the git repository
62
+ * @param branchName - Name of the branch to delete
63
+ * @param force - Force deletion (use -D instead of -d)
64
+ */
65
+ deleteBranch(repoPath: string, branchName: string, force?: boolean): Promise<void>;
66
+ /**
67
+ * Configure sparse-checkout for a worktree
68
+ * Equivalent to: git sparse-checkout set <patterns>
69
+ *
70
+ * @param worktreePath - Path to the worktree
71
+ * @param patterns - Sparse checkout patterns
72
+ */
73
+ configureSparseCheckout(worktreePath: string, patterns: string[]): Promise<void>;
74
+ /**
75
+ * Check if a path is a valid git repository
76
+ * Equivalent to: git rev-parse --git-dir
77
+ *
78
+ * @param repoPath - Path to check
79
+ * @returns Promise resolving to true if valid repo, false otherwise
80
+ */
81
+ isValidRepo(repoPath: string): Promise<boolean>;
82
+ /**
83
+ * List all branches in a repository
84
+ * Equivalent to: git branch --list --all --format='%(refname:short)'
85
+ *
86
+ * @param repoPath - Path to the git repository
87
+ * @returns Promise resolving to array of branch names
88
+ */
89
+ listBranches(repoPath: string): Promise<string[]>;
90
+ /**
91
+ * Get current HEAD commit SHA
92
+ * Equivalent to: git rev-parse HEAD
93
+ *
94
+ * @param repoPath - Path to the git repository
95
+ * @returns Promise resolving to the current HEAD commit SHA
96
+ */
97
+ getCurrentCommit(repoPath: string): Promise<string>;
98
+ }
99
+ /**
100
+ * GitCli - Implementation of IGitCli using child_process
101
+ */
102
+ export declare class GitCli implements IGitCli {
103
+ /**
104
+ * Execute a git command
105
+ *
106
+ * @param command - Git command to execute
107
+ * @param cwd - Working directory
108
+ * @returns Command output
109
+ * @throws WorktreeError on failure
110
+ */
111
+ protected execGit(command: string, cwd: string): string;
112
+ /**
113
+ * Escape shell argument
114
+ *
115
+ * @param arg - Argument to escape
116
+ * @returns Escaped argument
117
+ */
118
+ private escapeShellArg;
119
+ worktreeAdd(repoPath: string, worktreePath: string, branch: string, force?: boolean): Promise<void>;
120
+ worktreeRemove(repoPath: string, worktreePath: string, force?: boolean): Promise<void>;
121
+ worktreePrune(repoPath: string): Promise<void>;
122
+ worktreeList(repoPath: string): Promise<WorktreeInfo[]>;
123
+ /**
124
+ * Parse output from git worktree list --porcelain
125
+ *
126
+ * Format:
127
+ * worktree /path/to/worktree
128
+ * HEAD abc123...
129
+ * branch refs/heads/branch-name
130
+ * locked reason (optional)
131
+ * prunable reason (optional)
132
+ *
133
+ * @param output - Output from git worktree list --porcelain
134
+ * @returns Array of WorktreeInfo
135
+ */
136
+ private parseWorktreeList;
137
+ /**
138
+ * Finalize worktree info with defaults
139
+ *
140
+ * @param partial - Partial worktree info
141
+ * @returns Complete WorktreeInfo
142
+ */
143
+ private finalizeWorktreeInfo;
144
+ createBranch(repoPath: string, branchName: string, baseBranchOrCommit: string): Promise<void>;
145
+ deleteBranch(repoPath: string, branchName: string, force?: boolean): Promise<void>;
146
+ configureSparseCheckout(worktreePath: string, patterns: string[]): Promise<void>;
147
+ isValidRepo(repoPath: string): Promise<boolean>;
148
+ listBranches(repoPath: string): Promise<string[]>;
149
+ getCurrentCommit(repoPath: string): Promise<string>;
150
+ }
151
+ //# sourceMappingURL=git-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-cli.d.ts","sourceRoot":"","sources":["../../../src/execution/worktree/git-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Worktree Layer - Public API
3
+ *
4
+ * Barrel export for the Worktree Layer of the execution system.
5
+ * Exports all public types, interfaces, and implementations.
6
+ *
7
+ * @module execution/worktree
8
+ */
9
+ export type { WorktreeCreateParams, WorktreeInfo, WorktreeConfig, } from './types.js';
10
+ export { WorktreeError, WorktreeErrorCode } from './types.js';
11
+ export type { IWorktreeManager } from './manager.js';
12
+ export { WorktreeManager } from './manager.js';
13
+ export type { IGitCli } from './git-cli.js';
14
+ export { GitCli } from './git-cli.js';
15
+ export { DEFAULT_WORKTREE_CONFIG, getWorktreeConfig, loadWorktreeConfig, validateWorktreeConfig, updateWorktreeConfig, setWorktreeConfigProperty, resetWorktreeConfig, clearWorktreeConfigCache, } from './config.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/execution/worktree/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,aAAa,CAAC"}