@cluesmith/codev 1.4.1 → 1.4.3

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 (49) hide show
  1. package/dist/agent-farm/servers/dashboard-server.js +487 -9
  2. package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
  3. package/dist/agent-farm/servers/tower-server.js +141 -40
  4. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  5. package/dist/agent-farm/utils/port-registry.d.ts.map +1 -1
  6. package/dist/agent-farm/utils/port-registry.js +19 -5
  7. package/dist/agent-farm/utils/port-registry.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +2 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/adopt.d.ts.map +1 -1
  12. package/dist/commands/adopt.js +10 -0
  13. package/dist/commands/adopt.js.map +1 -1
  14. package/dist/commands/consult/index.d.ts +1 -0
  15. package/dist/commands/consult/index.d.ts.map +1 -1
  16. package/dist/commands/consult/index.js +56 -8
  17. package/dist/commands/consult/index.js.map +1 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +8 -0
  20. package/dist/commands/init.js.map +1 -1
  21. package/package.json +1 -1
  22. package/skeleton/resources/commands/consult.md +50 -0
  23. package/skeleton/templates/projectlist-archive.md +21 -0
  24. package/skeleton/templates/projectlist.md +17 -0
  25. package/templates/dashboard/css/activity.css +151 -0
  26. package/templates/dashboard/css/dialogs.css +149 -0
  27. package/templates/dashboard/css/files.css +530 -0
  28. package/templates/dashboard/css/layout.css +124 -0
  29. package/templates/dashboard/css/projects.css +501 -0
  30. package/templates/dashboard/css/statusbar.css +23 -0
  31. package/templates/dashboard/css/tabs.css +314 -0
  32. package/templates/dashboard/css/utilities.css +50 -0
  33. package/templates/dashboard/css/variables.css +45 -0
  34. package/templates/dashboard/index.html +158 -0
  35. package/templates/dashboard/js/activity.js +238 -0
  36. package/templates/dashboard/js/dialogs.js +328 -0
  37. package/templates/dashboard/js/files.js +436 -0
  38. package/templates/dashboard/js/main.js +487 -0
  39. package/templates/dashboard/js/projects.js +544 -0
  40. package/templates/dashboard/js/state.js +91 -0
  41. package/templates/dashboard/js/tabs.js +500 -0
  42. package/templates/dashboard/js/utils.js +57 -0
  43. package/templates/tower.html +172 -4
  44. package/dist/commands/eject.d.ts +0 -18
  45. package/dist/commands/eject.d.ts.map +0 -1
  46. package/dist/commands/eject.js +0 -149
  47. package/dist/commands/eject.js.map +0 -1
  48. package/templates/dashboard-split.html +0 -3721
  49. package/templates/dashboard.html +0 -149
@@ -409,6 +409,13 @@
409
409
  background: var(--bg-secondary);
410
410
  border: 1px solid var(--border);
411
411
  border-radius: 8px;
412
+ cursor: pointer;
413
+ transition: background 0.15s ease, border-color 0.15s ease;
414
+ }
415
+
416
+ .recent-item:hover {
417
+ background: var(--bg-tertiary);
418
+ border-color: #444;
412
419
  }
413
420
 
414
421
  .recent-info {
@@ -603,6 +610,67 @@
603
610
  animation: none;
604
611
  }
605
612
  }
613
+
614
+ /* Dialog styles */
615
+ .dialog-overlay {
616
+ position: fixed;
617
+ top: 0;
618
+ left: 0;
619
+ right: 0;
620
+ bottom: 0;
621
+ background: rgba(0, 0, 0, 0.7);
622
+ display: flex;
623
+ align-items: center;
624
+ justify-content: center;
625
+ z-index: 1000;
626
+ }
627
+
628
+ .dialog-box {
629
+ background: var(--bg-secondary);
630
+ border: 1px solid var(--border);
631
+ border-radius: 8px;
632
+ padding: 24px;
633
+ min-width: 400px;
634
+ max-width: 500px;
635
+ }
636
+
637
+ .dialog-box h3 {
638
+ margin-bottom: 20px;
639
+ font-size: 18px;
640
+ }
641
+
642
+ .dialog-field {
643
+ margin-bottom: 16px;
644
+ }
645
+
646
+ .dialog-field label {
647
+ display: block;
648
+ margin-bottom: 6px;
649
+ font-size: 14px;
650
+ color: var(--text-secondary);
651
+ }
652
+
653
+ .dialog-field input {
654
+ width: 100%;
655
+ padding: 10px 14px;
656
+ border-radius: 6px;
657
+ border: 1px solid var(--border);
658
+ background: var(--bg-tertiary);
659
+ color: var(--text-primary);
660
+ font-size: 15px;
661
+ }
662
+
663
+ .dialog-field input:focus {
664
+ outline: none;
665
+ border-color: var(--accent);
666
+ }
667
+
668
+ .dialog-actions {
669
+ display: flex;
670
+ justify-content: flex-end;
671
+ gap: 12px;
672
+ margin-top: 24px;
673
+ }
606
674
  </style>
607
675
  </head>
608
676
  <body>
@@ -640,7 +708,30 @@
640
708
  </div>
641
709
  <p class="launch-hint">
642
710
  Type a path to see suggestions. Directories with <code>codev/</code> are highlighted as valid projects.
711
+ Non-codev directories will be initialized with <code>codev adopt</code> on first launch.
643
712
  </p>
713
+ <div style="margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border);">
714
+ <button class="btn" onclick="showCreateProjectDialog()">Create New Project...</button>
715
+ </div>
716
+ </div>
717
+
718
+ <!-- Create Project Dialog -->
719
+ <div class="dialog-overlay" id="create-dialog" style="display: none;">
720
+ <div class="dialog-box">
721
+ <h3>Create New Project</h3>
722
+ <div class="dialog-field">
723
+ <label for="new-project-path">Parent Directory</label>
724
+ <input type="text" id="new-project-parent" placeholder="~/Development" value="" />
725
+ </div>
726
+ <div class="dialog-field">
727
+ <label for="new-project-name">Project Name</label>
728
+ <input type="text" id="new-project-name" placeholder="my-project" />
729
+ </div>
730
+ <div class="dialog-actions">
731
+ <button class="btn" onclick="hideCreateProjectDialog()">Cancel</button>
732
+ <button class="btn btn-primary" onclick="createNewProject()">Create & Launch</button>
733
+ </div>
734
+ </div>
644
735
  </div>
645
736
  </main>
646
737
 
@@ -782,14 +873,14 @@
782
873
  const lastUsed = instance.lastUsed ? formatDate(instance.lastUsed) : 'Never';
783
874
 
784
875
  return `
785
- <div class="recent-item">
876
+ <div class="recent-item" onclick="launchPath('${escapeHtml(instance.projectPath)}')" title="Click to start ${escapeHtml(instance.projectName)}">
786
877
  <div class="recent-info">
787
878
  <span class="recent-name">${escapeHtml(instance.projectName)}</span>
788
879
  <span class="recent-path">${escapeHtml(instance.projectPath)}</span>
789
880
  </div>
790
881
  <div style="display: flex; align-items: center; gap: 16px;">
791
882
  <span class="recent-time">${lastUsed}</span>
792
- <button class="btn btn-primary" onclick="launchPath('${escapeHtml(instance.projectPath)}')">Start</button>
883
+ <button class="btn btn-primary" onclick="event.stopPropagation(); launchPath('${escapeHtml(instance.projectPath)}')">Start</button>
793
884
  </div>
794
885
  </div>
795
886
  `;
@@ -928,7 +1019,11 @@
928
1019
  throw new Error(result.error || 'Launch failed');
929
1020
  }
930
1021
 
931
- showToast('Instance launching...', 'success');
1022
+ if (result.adopted) {
1023
+ showToast('Codev adopted! Instance launching...', 'success');
1024
+ } else {
1025
+ showToast('Instance launching...', 'success');
1026
+ }
932
1027
  setTimeout(refresh, 2000);
933
1028
  } catch (err) {
934
1029
  showToast('Failed to launch: ' + err.message, 'error');
@@ -1014,7 +1109,11 @@
1014
1109
  }
1015
1110
 
1016
1111
  input.value = '';
1017
- showToast('Instance launching... Please wait a moment.', 'success');
1112
+ if (result.adopted) {
1113
+ showToast('Codev adopted! Instance launching...', 'success');
1114
+ } else {
1115
+ showToast('Instance launching... Please wait a moment.', 'success');
1116
+ }
1018
1117
 
1019
1118
  // Refresh after a delay to allow instance to start
1020
1119
  setTimeout(refresh, 2000);
@@ -1084,6 +1183,75 @@
1084
1183
  }, 4000);
1085
1184
  }
1086
1185
 
1186
+ // Create project dialog functions
1187
+ function showCreateProjectDialog() {
1188
+ const dialog = document.getElementById('create-dialog');
1189
+ dialog.style.display = 'flex';
1190
+ // Default to ~/Development
1191
+ document.getElementById('new-project-parent').value = '~/Development';
1192
+ document.getElementById('new-project-name').value = '';
1193
+ document.getElementById('new-project-name').focus();
1194
+ }
1195
+
1196
+ function hideCreateProjectDialog() {
1197
+ document.getElementById('create-dialog').style.display = 'none';
1198
+ }
1199
+
1200
+ async function createNewProject() {
1201
+ const parent = document.getElementById('new-project-parent').value.trim();
1202
+ const name = document.getElementById('new-project-name').value.trim();
1203
+
1204
+ if (!parent) {
1205
+ showToast('Please enter a parent directory', 'error');
1206
+ return;
1207
+ }
1208
+ if (!name) {
1209
+ showToast('Please enter a project name', 'error');
1210
+ return;
1211
+ }
1212
+
1213
+ // Validate name (no spaces, special chars)
1214
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
1215
+ showToast('Project name can only contain letters, numbers, hyphens, and underscores', 'error');
1216
+ return;
1217
+ }
1218
+
1219
+ hideCreateProjectDialog();
1220
+
1221
+ try {
1222
+ const response = await fetch('/api/create', {
1223
+ method: 'POST',
1224
+ headers: { 'Content-Type': 'application/json' },
1225
+ body: JSON.stringify({ parent, name })
1226
+ });
1227
+
1228
+ const result = await response.json();
1229
+
1230
+ if (!result.success) {
1231
+ throw new Error(result.error || 'Create failed');
1232
+ }
1233
+
1234
+ showToast(`Project "${name}" created! Launching...`, 'success');
1235
+ setTimeout(refresh, 2000);
1236
+ } catch (err) {
1237
+ showToast('Failed to create project: ' + err.message, 'error');
1238
+ }
1239
+ }
1240
+
1241
+ // Close dialog on escape
1242
+ document.addEventListener('keydown', (e) => {
1243
+ if (e.key === 'Escape') {
1244
+ hideCreateProjectDialog();
1245
+ }
1246
+ });
1247
+
1248
+ // Close dialog on backdrop click
1249
+ document.getElementById('create-dialog').addEventListener('click', (e) => {
1250
+ if (e.target.id === 'create-dialog') {
1251
+ hideCreateProjectDialog();
1252
+ }
1253
+ });
1254
+
1087
1255
  // Initialize
1088
1256
  init();
1089
1257
  </script>
@@ -1,18 +0,0 @@
1
- /**
2
- * codev eject - Copy embedded skeleton files locally for customization
3
- *
4
- * Usage:
5
- * codev eject protocols/spider
6
- * codev eject roles/consultant.md
7
- * codev eject --list
8
- */
9
- interface EjectOptions {
10
- list?: boolean;
11
- force?: boolean;
12
- }
13
- /**
14
- * Eject a file or directory from the embedded skeleton
15
- */
16
- export declare function eject(targetPath?: string, options?: EjectOptions): Promise<void>;
17
- export {};
18
- //# sourceMappingURL=eject.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmCD;;GAEG;AACH,wBAAsB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC1F"}
@@ -1,149 +0,0 @@
1
- /**
2
- * codev eject - Copy embedded skeleton files locally for customization
3
- *
4
- * Usage:
5
- * codev eject protocols/spider
6
- * codev eject roles/consultant.md
7
- * codev eject --list
8
- */
9
- import * as fs from 'node:fs';
10
- import * as path from 'node:path';
11
- import chalk from 'chalk';
12
- import { getSkeletonDir, listSkeletonFiles, findProjectRoot } from '../lib/skeleton.js';
13
- /**
14
- * List available files that can be ejected
15
- */
16
- function listEjectableFiles() {
17
- const skeletonDir = getSkeletonDir();
18
- if (!fs.existsSync(skeletonDir)) {
19
- console.error(chalk.red('Error: Skeleton directory not found.'));
20
- console.error('Package may be corrupted. Try reinstalling @cluesmith/codev.');
21
- return;
22
- }
23
- console.log('');
24
- console.log(chalk.bold('Available files to eject:'));
25
- console.log('');
26
- const categories = ['protocols', 'roles', 'agents', 'templates'];
27
- for (const category of categories) {
28
- const files = listSkeletonFiles(category);
29
- if (files.length > 0) {
30
- console.log(chalk.yellow(` ${category}/`));
31
- for (const file of files) {
32
- console.log(chalk.dim(` ${file}`));
33
- }
34
- console.log('');
35
- }
36
- }
37
- console.log(chalk.dim('Usage: codev eject <path>'));
38
- console.log(chalk.dim('Example: codev eject protocols/spider/protocol.md'));
39
- }
40
- /**
41
- * Eject a file or directory from the embedded skeleton
42
- */
43
- export async function eject(targetPath, options = {}) {
44
- const { list = false, force = false } = options;
45
- // List mode
46
- if (list || !targetPath) {
47
- listEjectableFiles();
48
- return;
49
- }
50
- const projectRoot = findProjectRoot();
51
- const skeletonDir = getSkeletonDir();
52
- // Normalize the path
53
- const normalizedPath = targetPath.replace(/^\//, '').replace(/\/$/, '');
54
- // Check if path exists in skeleton
55
- const sourcePath = path.join(skeletonDir, normalizedPath);
56
- if (!fs.existsSync(sourcePath)) {
57
- console.error(chalk.red(`Error: '${normalizedPath}' not found in embedded skeleton.`));
58
- console.error('');
59
- console.error('Use ' + chalk.cyan('codev eject --list') + ' to see available files.');
60
- process.exit(1);
61
- }
62
- const destPath = path.join(projectRoot, 'codev', normalizedPath);
63
- // Check if source is a file or directory
64
- const stat = fs.statSync(sourcePath);
65
- if (stat.isDirectory()) {
66
- // Eject entire directory
67
- await ejectDirectory(sourcePath, destPath, normalizedPath, force);
68
- }
69
- else {
70
- // Eject single file
71
- await ejectFile(sourcePath, destPath, normalizedPath, force);
72
- }
73
- }
74
- /**
75
- * Eject a single file
76
- */
77
- async function ejectFile(sourcePath, destPath, relativePath, force) {
78
- // Check if already exists locally
79
- if (fs.existsSync(destPath) && !force) {
80
- console.error(chalk.yellow(`Warning: '${relativePath}' already exists locally.`));
81
- console.error('Use ' + chalk.cyan('--force') + ' to overwrite.');
82
- process.exit(1);
83
- }
84
- // Create directory if needed
85
- const destDir = path.dirname(destPath);
86
- if (!fs.existsSync(destDir)) {
87
- fs.mkdirSync(destDir, { recursive: true });
88
- }
89
- // Copy file
90
- fs.copyFileSync(sourcePath, destPath);
91
- console.log('');
92
- console.log(chalk.green('Ejected:'), `codev/${relativePath}`);
93
- console.log('');
94
- console.log(chalk.dim('This file is now a local override.'));
95
- console.log(chalk.dim("Changes you make won't be overwritten by 'codev update'."));
96
- }
97
- /**
98
- * Eject an entire directory
99
- */
100
- async function ejectDirectory(sourcePath, destPath, relativePath, force) {
101
- let ejectedCount = 0;
102
- let skippedCount = 0;
103
- console.log('');
104
- console.log(chalk.bold(`Ejecting: ${relativePath}/`));
105
- console.log('');
106
- function copyRecursive(src, dest, relPath) {
107
- const stat = fs.statSync(src);
108
- if (stat.isDirectory()) {
109
- if (!fs.existsSync(dest)) {
110
- fs.mkdirSync(dest, { recursive: true });
111
- }
112
- const entries = fs.readdirSync(src);
113
- for (const entry of entries) {
114
- copyRecursive(path.join(src, entry), path.join(dest, entry), path.join(relPath, entry));
115
- }
116
- }
117
- else {
118
- // Skip .gitkeep files
119
- if (path.basename(src) === '.gitkeep') {
120
- return;
121
- }
122
- if (fs.existsSync(dest) && !force) {
123
- console.log(chalk.yellow(' skip'), `codev/${relPath}`, chalk.dim('(exists)'));
124
- skippedCount++;
125
- return;
126
- }
127
- const destDir = path.dirname(dest);
128
- if (!fs.existsSync(destDir)) {
129
- fs.mkdirSync(destDir, { recursive: true });
130
- }
131
- fs.copyFileSync(src, dest);
132
- console.log(chalk.green(' +'), `codev/${relPath}`);
133
- ejectedCount++;
134
- }
135
- }
136
- copyRecursive(sourcePath, destPath, relativePath);
137
- console.log('');
138
- console.log(chalk.bold('Summary:'));
139
- console.log(chalk.green(` + ${ejectedCount} files ejected`));
140
- if (skippedCount > 0) {
141
- console.log(chalk.yellow(` - ${skippedCount} files skipped (already exist)`));
142
- console.log('');
143
- console.log(chalk.dim('Use --force to overwrite existing files.'));
144
- }
145
- console.log('');
146
- console.log(chalk.dim('These files are now local overrides.'));
147
- console.log(chalk.dim("Changes you make won't be overwritten by 'codev update'."));
148
- }
149
- //# sourceMappingURL=eject.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eject.js","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"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"}