@proletariat/cli 0.1.2 → 0.1.4

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.
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.migrateToWorkspace = migrateToWorkspace;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const child_process_1 = require("child_process");
43
+ const inquirer_1 = __importDefault(require("inquirer"));
44
+ const chalk_1 = __importDefault(require("chalk"));
45
+ const index_js_1 = require("../config/index.js");
46
+ const logger_js_1 = require("../utils/logger.js");
47
+ async function migrateToWorkspace() {
48
+ if (!(0, index_js_1.isInitialized)()) {
49
+ logger_js_1.log.error('Proletariat not initialized! Run `prlt init` first.');
50
+ return;
51
+ }
52
+ const config = (0, index_js_1.loadConfig)();
53
+ const projectRoot = (0, index_js_1.getProjectRoot)();
54
+ const projectName = (0, index_js_1.getProjectName)();
55
+ // Check if already in workspace
56
+ if (config.layout?.mode === 'workspace') {
57
+ const expectedPath = path.join(config.layout.baseDir, projectName);
58
+ if (path.resolve(projectRoot) === path.resolve(expectedPath)) {
59
+ logger_js_1.log.success('Repository is already in the workspace directory!');
60
+ return;
61
+ }
62
+ }
63
+ logger_js_1.log.info('This will move your repository into the workspace directory alongside your worktrees.');
64
+ // Determine target path
65
+ let targetPath;
66
+ if (config.layout?.mode === 'workspace' && config.layout.baseDir) {
67
+ targetPath = path.join(config.layout.baseDir, projectName);
68
+ }
69
+ else {
70
+ // If not workspace mode, create a workspace structure
71
+ const parentDir = path.dirname(projectRoot);
72
+ const workspaceName = `${projectName}-workspace`;
73
+ const workspaceDir = path.join(parentDir, workspaceName);
74
+ targetPath = path.join(workspaceDir, projectName);
75
+ logger_js_1.log.info(`Will create workspace: ${workspaceDir}`);
76
+ }
77
+ // Check if target exists
78
+ if (fs.existsSync(targetPath)) {
79
+ logger_js_1.log.error(`Target path already exists: ${targetPath}`);
80
+ logger_js_1.log.info('Please remove or rename the existing directory first.');
81
+ return;
82
+ }
83
+ // Check for uncommitted changes in main repo
84
+ try {
85
+ const status = (0, child_process_1.execSync)('git status --porcelain', { cwd: projectRoot, encoding: 'utf8' }).trim();
86
+ if (status.length > 0) {
87
+ logger_js_1.log.warning('Main repository has uncommitted changes.');
88
+ const { continueWithChanges } = await inquirer_1.default.prompt([
89
+ {
90
+ type: 'confirm',
91
+ name: 'continueWithChanges',
92
+ message: 'Continue with uncommitted changes?',
93
+ default: false
94
+ }
95
+ ]);
96
+ if (!continueWithChanges) {
97
+ logger_js_1.log.info('Migration cancelled. Please commit or stash your changes first.');
98
+ return;
99
+ }
100
+ }
101
+ }
102
+ catch (error) {
103
+ logger_js_1.log.error('Failed to check git status');
104
+ return;
105
+ }
106
+ // Get list of current worktrees
107
+ let worktreeInfo = [];
108
+ try {
109
+ const worktreeList = (0, child_process_1.execSync)('git worktree list --porcelain', { encoding: 'utf8' });
110
+ const worktrees = worktreeList.split('\n\n').filter(Boolean);
111
+ for (const wtInfo of worktrees) {
112
+ const lines = wtInfo.split('\n');
113
+ const wtPath = lines[0].replace('worktree ', '');
114
+ // Skip the main worktree
115
+ if (wtPath === projectRoot)
116
+ continue;
117
+ worktreeInfo.push({
118
+ name: path.basename(wtPath),
119
+ path: wtPath
120
+ });
121
+ }
122
+ }
123
+ catch (error) {
124
+ logger_js_1.log.error('Failed to get worktree list');
125
+ return;
126
+ }
127
+ console.log('\n' + chalk_1.default.yellow('📋 Migration Plan:'));
128
+ console.log(` • Move repository from: ${chalk_1.default.dim(projectRoot)}`);
129
+ console.log(` • Move repository to: ${chalk_1.default.green(targetPath)}`);
130
+ console.log(` • Worktrees to update: ${chalk_1.default.cyan(worktreeInfo.length)}`);
131
+ console.log(chalk_1.default.dim(' Note: All worktrees and their work will be preserved'));
132
+ const { confirmMigrate } = await inquirer_1.default.prompt([
133
+ {
134
+ type: 'confirm',
135
+ name: 'confirmMigrate',
136
+ message: 'Proceed with migration?',
137
+ default: true
138
+ }
139
+ ]);
140
+ if (!confirmMigrate) {
141
+ logger_js_1.log.info('Migration cancelled.');
142
+ return;
143
+ }
144
+ logger_js_1.log.info('Starting migration...');
145
+ // Step 1: Create target directory if needed
146
+ logger_js_1.log.info('Step 1/3: Preparing target directory...');
147
+ const targetParent = path.dirname(targetPath);
148
+ if (!fs.existsSync(targetParent)) {
149
+ fs.mkdirSync(targetParent, { recursive: true });
150
+ logger_js_1.log.success(`Created directory: ${targetParent}`);
151
+ }
152
+ // Step 2: Move the repository
153
+ logger_js_1.log.info('Step 2/3: Moving repository...');
154
+ try {
155
+ fs.renameSync(projectRoot, targetPath);
156
+ logger_js_1.log.success(`Moved repository to: ${targetPath}`);
157
+ }
158
+ catch (error) {
159
+ logger_js_1.log.error(`Failed to move repository: ${error}`);
160
+ return;
161
+ }
162
+ // Step 3: Update worktree references
163
+ logger_js_1.log.info('Step 3/3: Updating worktree references...');
164
+ // Update the .git files in each worktree to point to the new location
165
+ for (const wt of worktreeInfo) {
166
+ const gitFile = path.join(wt.path, '.git');
167
+ if (fs.existsSync(gitFile)) {
168
+ const newGitdir = `gitdir: ${targetPath}/.git/worktrees/${wt.name}`;
169
+ fs.writeFileSync(gitFile, newGitdir);
170
+ logger_js_1.log.success(`Updated reference: ${wt.name}`);
171
+ }
172
+ }
173
+ // Update the gitdir files in .git/worktrees/* to point back to worktrees
174
+ const worktreesDir = path.join(targetPath, '.git', 'worktrees');
175
+ if (fs.existsSync(worktreesDir)) {
176
+ const worktreeDirs = fs.readdirSync(worktreesDir);
177
+ for (const wtName of worktreeDirs) {
178
+ const gitdirFile = path.join(worktreesDir, wtName, 'gitdir');
179
+ if (fs.existsSync(gitdirFile)) {
180
+ // Find the corresponding worktree path
181
+ const wt = worktreeInfo.find(w => w.name === wtName);
182
+ if (wt) {
183
+ fs.writeFileSync(gitdirFile, `${wt.path}/.git`);
184
+ logger_js_1.log.success(`Updated internal reference: ${wtName}`);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ // Update config if needed
190
+ if (config.layout?.mode !== 'workspace') {
191
+ const workspaceName = path.basename(targetParent);
192
+ config.layout = {
193
+ mode: 'workspace',
194
+ baseDir: targetParent,
195
+ workspaceName: workspaceName
196
+ };
197
+ // Save config to new location
198
+ const configPath = path.join(targetPath, '.proletariat', 'config.json');
199
+ const configDir = path.dirname(configPath);
200
+ if (!fs.existsSync(configDir)) {
201
+ fs.mkdirSync(configDir, { recursive: true });
202
+ }
203
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
204
+ logger_js_1.log.success('Updated configuration for workspace layout');
205
+ }
206
+ logger_js_1.log.success('✨ Migration complete!');
207
+ console.log('\n' + chalk_1.default.yellow('⚠️ Important: You need to change to the new directory:'));
208
+ console.log(chalk_1.default.cyan(` cd ${targetPath}`));
209
+ console.log('\nThen you can continue using prlt commands from there.');
210
+ console.log('All your worktrees and uncommitted work have been preserved.');
211
+ }
212
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/lib/worktree/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function repairWorktrees(): void;
2
+ export declare function checkWorktreeHealth(): void;
3
+ //# sourceMappingURL=repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../../src/lib/worktree/repair.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,IAAI,CA8DtC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAgD1C"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.repairWorktrees = repairWorktrees;
37
+ exports.checkWorktreeHealth = checkWorktreeHealth;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const child_process_1 = require("child_process");
41
+ const index_js_1 = require("../config/index.js");
42
+ const logger_js_1 = require("../utils/logger.js");
43
+ function repairWorktrees() {
44
+ if (!(0, index_js_1.isInitialized)()) {
45
+ logger_js_1.log.error('Proletariat not initialized! Run `prlt init` first.');
46
+ return;
47
+ }
48
+ const config = (0, index_js_1.loadConfig)();
49
+ const projectRoot = (0, index_js_1.getProjectRoot)();
50
+ const repoGitDir = path.join(projectRoot, '.git');
51
+ logger_js_1.log.info('Repairing worktree references...');
52
+ let repairedCount = 0;
53
+ let failedCount = 0;
54
+ // Get list of worktrees from git
55
+ try {
56
+ const worktreeList = (0, child_process_1.execSync)('git worktree list --porcelain', { encoding: 'utf8' });
57
+ const worktrees = worktreeList.split('\n\n').filter(Boolean);
58
+ for (const worktreeInfo of worktrees) {
59
+ const lines = worktreeInfo.split('\n');
60
+ const worktreePath = lines[0].replace('worktree ', '');
61
+ // Skip the main worktree
62
+ if (worktreePath === projectRoot)
63
+ continue;
64
+ const agentName = path.basename(worktreePath);
65
+ const gitFile = path.join(worktreePath, '.git');
66
+ if (fs.existsSync(gitFile)) {
67
+ const currentContent = fs.readFileSync(gitFile, 'utf8').trim();
68
+ const expectedContent = `gitdir: ${repoGitDir}/worktrees/${agentName}`;
69
+ if (currentContent !== expectedContent) {
70
+ // Fix the reference
71
+ fs.writeFileSync(gitFile, expectedContent);
72
+ logger_js_1.log.success(`Repaired: ${agentName}`);
73
+ repairedCount++;
74
+ }
75
+ else {
76
+ logger_js_1.log.info(`Already correct: ${agentName}`);
77
+ }
78
+ }
79
+ else {
80
+ logger_js_1.log.warning(`Missing .git file: ${agentName}`);
81
+ failedCount++;
82
+ }
83
+ }
84
+ if (repairedCount > 0) {
85
+ logger_js_1.log.success(`✅ Repaired ${repairedCount} worktree reference(s)`);
86
+ }
87
+ if (failedCount > 0) {
88
+ logger_js_1.log.warning(`⚠️ ${failedCount} worktree(s) could not be repaired`);
89
+ }
90
+ if (repairedCount === 0 && failedCount === 0) {
91
+ logger_js_1.log.success('All worktrees are already correctly configured!');
92
+ }
93
+ }
94
+ catch (error) {
95
+ const message = error instanceof Error ? error.message : String(error);
96
+ logger_js_1.log.error(`Failed to repair worktrees: ${message}`);
97
+ }
98
+ }
99
+ function checkWorktreeHealth() {
100
+ if (!(0, index_js_1.isInitialized)()) {
101
+ logger_js_1.log.error('Proletariat not initialized! Run `prlt init` first.');
102
+ return;
103
+ }
104
+ const config = (0, index_js_1.loadConfig)();
105
+ const projectRoot = (0, index_js_1.getProjectRoot)();
106
+ logger_js_1.log.info('Checking worktree health...');
107
+ let healthyCount = 0;
108
+ let brokenCount = 0;
109
+ try {
110
+ const worktreeList = (0, child_process_1.execSync)('git worktree list --porcelain', { encoding: 'utf8' });
111
+ const worktrees = worktreeList.split('\n\n').filter(Boolean);
112
+ for (const worktreeInfo of worktrees) {
113
+ const lines = worktreeInfo.split('\n');
114
+ const worktreePath = lines[0].replace('worktree ', '');
115
+ // Skip the main worktree
116
+ if (worktreePath === projectRoot)
117
+ continue;
118
+ const agentName = path.basename(worktreePath);
119
+ // Test if we can run git commands in the worktree
120
+ try {
121
+ (0, child_process_1.execSync)(`git -C "${worktreePath}" status`, { encoding: 'utf8', stdio: 'ignore' });
122
+ logger_js_1.log.agent(agentName, '✅ Healthy', config.theme);
123
+ healthyCount++;
124
+ }
125
+ catch {
126
+ logger_js_1.log.agent(agentName, '❌ Broken - needs repair', config.theme);
127
+ brokenCount++;
128
+ }
129
+ }
130
+ logger_js_1.log.info(`Summary: ${healthyCount} healthy, ${brokenCount} broken`);
131
+ if (brokenCount > 0) {
132
+ logger_js_1.log.warning('Run `prlt repair` to fix broken worktrees');
133
+ }
134
+ }
135
+ catch (error) {
136
+ const message = error instanceof Error ? error.message : String(error);
137
+ logger_js_1.log.error(`Failed to check worktree health: ${message}`);
138
+ }
139
+ }
140
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../../src/lib/worktree/repair.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ export interface WorkspaceLayout {
29
29
  }
30
30
  export interface ProjectConfig {
31
31
  version: string;
32
+ configVersion?: number;
32
33
  projectName: string;
33
34
  themeName: string;
34
35
  workspaceDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proletariat/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Multi-agent development CLI - Orchestrate parallel coding agents via git worktrees with memorable themes for distributed development workflows",
5
5
  "main": "dist/bin/prlt.js",
6
6
  "bin": {
@@ -28,7 +28,11 @@
28
28
  "workflow",
29
29
  "automation"
30
30
  ],
31
- "author": "Chris McDermut <chris@mcdermut.com>",
31
+ "author": {
32
+ "name": "Chris McDermut",
33
+ "email": "chris@mcdermut.com",
34
+ "url": "https://github.com/chrismcdermut"
35
+ },
32
36
  "license": "MIT",
33
37
  "repository": {
34
38
  "type": "git",