@luckydraw/cumulus 0.26.0 → 0.26.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luckydraw/cumulus",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,67 +0,0 @@
1
- /**
2
- * Gateway-native project management — CRUD for projects that bundle
3
- * a work folder on thundercat with one or more cumulus threads.
4
- *
5
- * Projects are stored as individual JSON files in ~/.cumulus/projects/.
6
- */
7
- export interface ProjectMetadata {
8
- name: string;
9
- path: string;
10
- template: string;
11
- threads: string[];
12
- primaryThread: string;
13
- gitRemote?: string;
14
- createdAt: string;
15
- lastActivity: string;
16
- }
17
- export interface ProjectSummary {
18
- name: string;
19
- path: string;
20
- template: string;
21
- threadCount: number;
22
- primaryThread: string;
23
- lastActivity: string;
24
- createdAt: string;
25
- }
26
- export interface CreateProjectOptions {
27
- name: string;
28
- template: string;
29
- projectRoot?: string;
30
- gitCloneUrl?: string;
31
- /** Override the default projects dir for testing */
32
- projectsDir?: string;
33
- /** Override the default threads dir for testing */
34
- threadsDir?: string;
35
- /** Scaffold function — injected by caller (uses templates module) */
36
- scaffold?: (projectPath: string, template: string) => Promise<void>;
37
- }
38
- /**
39
- * Create a new project: folder on disk, git init, primary thread, metadata.
40
- */
41
- export declare function createProject(options: CreateProjectOptions): Promise<ProjectMetadata>;
42
- /**
43
- * List all projects with summary info.
44
- */
45
- export declare function listProjects(projectsDir?: string): Promise<ProjectSummary[]>;
46
- /**
47
- * Get a single project's full metadata.
48
- */
49
- export declare function getProject(name: string, projectsDir?: string): Promise<ProjectMetadata | null>;
50
- /**
51
- * Update project metadata (add/remove threads, change settings).
52
- */
53
- export declare function updateProject(name: string, changes: Partial<Pick<ProjectMetadata, 'threads' | 'primaryThread' | 'gitRemote'>>, projectsDir?: string, threadsDir?: string): Promise<ProjectMetadata>;
54
- /**
55
- * Delete a project. Optionally delete the project folder on disk.
56
- */
57
- export declare function deleteProject(name: string, deleteFolder?: boolean, projectsDir?: string): Promise<void>;
58
- /**
59
- * Add a thread to a project.
60
- */
61
- export declare function addThreadToProject(projectName: string, threadName: string, projectsDir?: string, threadsDir?: string): Promise<ProjectMetadata>;
62
- /**
63
- * Resolve a thread's project directory (cwd for Claude subprocess).
64
- * Returns null if the thread isn't bound to a project.
65
- */
66
- export declare function resolveThreadProjectDir(threadName: string, threadsDir?: string, projectsDir?: string): Promise<string | null>;
67
- //# sourceMappingURL=projects.d.ts.map
@@ -1,233 +0,0 @@
1
- /**
2
- * Gateway-native project management — CRUD for projects that bundle
3
- * a work folder on thundercat with one or more cumulus threads.
4
- *
5
- * Projects are stored as individual JSON files in ~/.cumulus/projects/.
6
- */
7
- import * as fs from 'fs';
8
- import * as path from 'path';
9
- import * as os from 'os';
10
- import { execSync, execFileSync } from 'child_process';
11
- const CUMULUS_DIR = path.join(os.homedir(), '.cumulus');
12
- const PROJECTS_DIR = path.join(CUMULUS_DIR, 'projects');
13
- const THREADS_DIR = path.join(CUMULUS_DIR, 'threads');
14
- // ─── Helpers ─────────────────────────────────────────────────────────────────
15
- function getProjectsDir(overrideDir) {
16
- return overrideDir ?? PROJECTS_DIR;
17
- }
18
- function getThreadsDir(overrideDir) {
19
- return overrideDir ?? THREADS_DIR;
20
- }
21
- function getProjectFilePath(name, projectsDir) {
22
- return path.join(getProjectsDir(projectsDir), `${name}.json`);
23
- }
24
- function sanitizeName(name) {
25
- return name.replace(/[^a-zA-Z0-9_-]/g, '');
26
- }
27
- function ensureDir(dir) {
28
- if (!fs.existsSync(dir)) {
29
- fs.mkdirSync(dir, { recursive: true });
30
- }
31
- }
32
- // ─── CRUD ────────────────────────────────────────────────────────────────────
33
- /**
34
- * Create a new project: folder on disk, git init, primary thread, metadata.
35
- */
36
- export async function createProject(options) {
37
- const { template, gitCloneUrl, scaffold } = options;
38
- const name = sanitizeName(options.name);
39
- if (!name)
40
- throw new Error('Invalid project name');
41
- const pDir = getProjectsDir(options.projectsDir);
42
- const tDir = getThreadsDir(options.threadsDir);
43
- ensureDir(pDir);
44
- ensureDir(tDir);
45
- // Check if project already exists
46
- const metaPath = getProjectFilePath(name, options.projectsDir);
47
- if (fs.existsSync(metaPath)) {
48
- throw new Error(`Project "${name}" already exists`);
49
- }
50
- // Determine project root
51
- const root = options.projectRoot ?? path.join(os.homedir(), 'projects');
52
- const projectPath = path.join(root, name);
53
- if (gitCloneUrl) {
54
- // Validate URL format (prevent command injection)
55
- if (!/^(https?:\/\/|git@|ssh:\/\/|git:\/\/)[\w.@:/?#[\]!$&'()*+,;=%-]+$/i.test(gitCloneUrl)) {
56
- throw new Error('Invalid git clone URL');
57
- }
58
- // Clone the repo — use execFileSync to prevent shell injection
59
- execFileSync('git', ['clone', gitCloneUrl, projectPath], { stdio: 'pipe' });
60
- }
61
- else {
62
- // Create the directory
63
- ensureDir(projectPath);
64
- // Scaffold from template
65
- if (scaffold) {
66
- await scaffold(projectPath, template);
67
- }
68
- // Init git
69
- if (!fs.existsSync(path.join(projectPath, '.git'))) {
70
- try {
71
- execSync('git init', { cwd: projectPath, stdio: 'pipe' });
72
- }
73
- catch {
74
- // Non-fatal — git may not be available
75
- }
76
- }
77
- }
78
- // Create primary thread config with project binding
79
- const threadConfigPath = path.join(tDir, `${name}.config.json`);
80
- const threadConfig = { project: name };
81
- fs.writeFileSync(threadConfigPath, JSON.stringify(threadConfig, null, 2));
82
- // Save project metadata
83
- const now = new Date().toISOString();
84
- const metadata = {
85
- name,
86
- path: projectPath,
87
- template,
88
- threads: [name],
89
- primaryThread: name,
90
- gitRemote: gitCloneUrl,
91
- createdAt: now,
92
- lastActivity: now,
93
- };
94
- fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2));
95
- return metadata;
96
- }
97
- /**
98
- * List all projects with summary info.
99
- */
100
- export async function listProjects(projectsDir) {
101
- const pDir = getProjectsDir(projectsDir);
102
- if (!fs.existsSync(pDir))
103
- return [];
104
- const files = fs.readdirSync(pDir).filter(f => f.endsWith('.json'));
105
- const projects = [];
106
- for (const file of files) {
107
- try {
108
- const raw = fs.readFileSync(path.join(pDir, file), 'utf-8');
109
- const meta = JSON.parse(raw);
110
- projects.push({
111
- name: meta.name,
112
- path: meta.path,
113
- template: meta.template,
114
- threadCount: meta.threads.length,
115
- primaryThread: meta.primaryThread,
116
- lastActivity: meta.lastActivity,
117
- createdAt: meta.createdAt,
118
- });
119
- }
120
- catch {
121
- // Skip corrupt files
122
- }
123
- }
124
- // Sort by last activity descending
125
- projects.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
126
- return projects;
127
- }
128
- /**
129
- * Get a single project's full metadata.
130
- */
131
- export async function getProject(name, projectsDir) {
132
- const metaPath = getProjectFilePath(name, projectsDir);
133
- if (!fs.existsSync(metaPath))
134
- return null;
135
- try {
136
- const raw = fs.readFileSync(metaPath, 'utf-8');
137
- return JSON.parse(raw);
138
- }
139
- catch {
140
- return null;
141
- }
142
- }
143
- /**
144
- * Update project metadata (add/remove threads, change settings).
145
- */
146
- export async function updateProject(name, changes, projectsDir, threadsDir) {
147
- const metaPath = getProjectFilePath(name, projectsDir);
148
- if (!fs.existsSync(metaPath)) {
149
- throw new Error(`Project "${name}" not found`);
150
- }
151
- const raw = fs.readFileSync(metaPath, 'utf-8');
152
- const meta = JSON.parse(raw);
153
- if (changes.threads)
154
- meta.threads = changes.threads;
155
- if (changes.primaryThread)
156
- meta.primaryThread = changes.primaryThread;
157
- if (changes.gitRemote !== undefined)
158
- meta.gitRemote = changes.gitRemote;
159
- meta.lastActivity = new Date().toISOString();
160
- // Update thread configs for any new threads
161
- const tDir = getThreadsDir(threadsDir);
162
- for (const threadName of meta.threads) {
163
- const threadConfigPath = path.join(tDir, `${threadName}.config.json`);
164
- if (!fs.existsSync(threadConfigPath)) {
165
- fs.writeFileSync(threadConfigPath, JSON.stringify({ project: name }, null, 2));
166
- }
167
- else {
168
- // Ensure project binding exists
169
- try {
170
- const tc = JSON.parse(fs.readFileSync(threadConfigPath, 'utf-8'));
171
- if (tc.project !== name) {
172
- tc.project = name;
173
- fs.writeFileSync(threadConfigPath, JSON.stringify(tc, null, 2));
174
- }
175
- }
176
- catch {
177
- // Skip
178
- }
179
- }
180
- }
181
- fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2));
182
- return meta;
183
- }
184
- /**
185
- * Delete a project. Optionally delete the project folder on disk.
186
- */
187
- export async function deleteProject(name, deleteFolder = false, projectsDir) {
188
- const metaPath = getProjectFilePath(name, projectsDir);
189
- if (!fs.existsSync(metaPath)) {
190
- throw new Error(`Project "${name}" not found`);
191
- }
192
- const raw = fs.readFileSync(metaPath, 'utf-8');
193
- const meta = JSON.parse(raw);
194
- // Remove project metadata file
195
- fs.unlinkSync(metaPath);
196
- // Optionally delete the project folder
197
- if (deleteFolder && meta.path && fs.existsSync(meta.path)) {
198
- fs.rmSync(meta.path, { recursive: true });
199
- }
200
- }
201
- /**
202
- * Add a thread to a project.
203
- */
204
- export async function addThreadToProject(projectName, threadName, projectsDir, threadsDir) {
205
- const meta = await getProject(projectName, projectsDir);
206
- if (!meta)
207
- throw new Error(`Project "${projectName}" not found`);
208
- if (!meta.threads.includes(threadName)) {
209
- meta.threads.push(threadName);
210
- }
211
- return updateProject(projectName, { threads: meta.threads }, projectsDir, threadsDir);
212
- }
213
- /**
214
- * Resolve a thread's project directory (cwd for Claude subprocess).
215
- * Returns null if the thread isn't bound to a project.
216
- */
217
- export async function resolveThreadProjectDir(threadName, threadsDir, projectsDir) {
218
- const tDir = getThreadsDir(threadsDir);
219
- const threadConfigPath = path.join(tDir, `${threadName}.config.json`);
220
- if (!fs.existsSync(threadConfigPath))
221
- return null;
222
- try {
223
- const tc = JSON.parse(fs.readFileSync(threadConfigPath, 'utf-8'));
224
- if (!tc.project)
225
- return null;
226
- const meta = await getProject(tc.project, projectsDir);
227
- return meta?.path ?? null;
228
- }
229
- catch {
230
- return null;
231
- }
232
- }
233
- //# sourceMappingURL=projects.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/lib/projects.ts"],"names":[],"mappings":"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"}