@cdoing/cli 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.
- package/.cdoing/permissions.json +8 -0
- package/dist/callbacks.d.ts +17 -0
- package/dist/callbacks.d.ts.map +1 -0
- package/dist/callbacks.js +265 -0
- package/dist/callbacks.js.map +1 -0
- package/dist/chat.d.ts +27 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +57 -0
- package/dist/chat.js.map +1 -0
- package/dist/commands.d.ts +22 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +452 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +84 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +427 -0
- package/dist/config.js.map +1 -0
- package/dist/help.d.ts +9 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +167 -0
- package/dist/help.js.map +1 -0
- package/dist/history.d.ts +51 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +207 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +220 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +182 -0
- package/dist/oauth.js.map +1 -0
- package/dist/review.d.ts +26 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +198 -0
- package/dist/review.js.map +1 -0
- package/dist/serve.d.ts +23 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +293 -0
- package/dist/serve.js.map +1 -0
- package/dist/tools.d.ts +14 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +57 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui/App.d.ts +24 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +321 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/MessageList.d.ts +14 -0
- package/dist/ui/MessageList.d.ts.map +1 -0
- package/dist/ui/MessageList.js +147 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/SessionBrowser.d.ts +18 -0
- package/dist/ui/SessionBrowser.d.ts.map +1 -0
- package/dist/ui/SessionBrowser.js +149 -0
- package/dist/ui/SessionBrowser.js.map +1 -0
- package/dist/ui/SetupWizard.d.ts +23 -0
- package/dist/ui/SetupWizard.d.ts.map +1 -0
- package/dist/ui/SetupWizard.js +402 -0
- package/dist/ui/SetupWizard.js.map +1 -0
- package/dist/ui/Spinner.d.ts +15 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +111 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/StatusBar.d.ts +16 -0
- package/dist/ui/StatusBar.d.ts.map +1 -0
- package/dist/ui/StatusBar.js +56 -0
- package/dist/ui/StatusBar.js.map +1 -0
- package/dist/ui/UserInput.d.ts +13 -0
- package/dist/ui/UserInput.d.ts.map +1 -0
- package/dist/ui/UserInput.js +872 -0
- package/dist/ui/UserInput.js.map +1 -0
- package/dist/ui/hooks/helpers.d.ts +55 -0
- package/dist/ui/hooks/helpers.d.ts.map +1 -0
- package/dist/ui/hooks/helpers.js +304 -0
- package/dist/ui/hooks/helpers.js.map +1 -0
- package/dist/ui/hooks/useAgent.d.ts +60 -0
- package/dist/ui/hooks/useAgent.d.ts.map +1 -0
- package/dist/ui/hooks/useAgent.js +213 -0
- package/dist/ui/hooks/useAgent.js.map +1 -0
- package/dist/ui/hooks/useChat.d.ts +74 -0
- package/dist/ui/hooks/useChat.d.ts.map +1 -0
- package/dist/ui/hooks/useChat.js +819 -0
- package/dist/ui/hooks/useChat.js.map +1 -0
- package/dist/ui/theme.d.ts +73 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +214 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/types.d.ts +37 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +3 -0
- package/dist/ui/types.js.map +1 -0
- package/package.json +33 -0
- package/src/callbacks.ts +294 -0
- package/src/chat.ts +72 -0
- package/src/commands.ts +425 -0
- package/src/config.ts +462 -0
- package/src/help.ts +182 -0
- package/src/history.ts +205 -0
- package/src/index.ts +248 -0
- package/src/oauth.ts +164 -0
- package/src/review.ts +233 -0
- package/src/serve.ts +290 -0
- package/src/tools.ts +104 -0
- package/src/ui/App.tsx +426 -0
- package/src/ui/MessageList.tsx +222 -0
- package/src/ui/SessionBrowser.tsx +161 -0
- package/src/ui/SetupWizard.tsx +412 -0
- package/src/ui/Spinner.tsx +103 -0
- package/src/ui/StatusBar.tsx +106 -0
- package/src/ui/UserInput.tsx +954 -0
- package/src/ui/hooks/helpers.ts +271 -0
- package/src/ui/hooks/useAgent.ts +270 -0
- package/src/ui/hooks/useChat.ts +943 -0
- package/src/ui/theme.ts +326 -0
- package/src/ui/types.ts +41 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation History Manager
|
|
3
|
+
*
|
|
4
|
+
* Saves conversations to ~/.cdoing/conversations/ as JSON files.
|
|
5
|
+
* Each conversation has an ID, title (from first message), timestamps,
|
|
6
|
+
* and the full message log.
|
|
7
|
+
*/
|
|
8
|
+
/** A single message in the conversation log */
|
|
9
|
+
export interface ChatMessage {
|
|
10
|
+
role: "user" | "assistant" | "tool";
|
|
11
|
+
content: string;
|
|
12
|
+
toolName?: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
}
|
|
15
|
+
/** Metadata + messages for a saved conversation */
|
|
16
|
+
export interface Conversation {
|
|
17
|
+
id: string;
|
|
18
|
+
title: string;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
provider: string;
|
|
22
|
+
model: string;
|
|
23
|
+
messages: ChatMessage[];
|
|
24
|
+
}
|
|
25
|
+
/** Create a new conversation and return it */
|
|
26
|
+
export declare function createConversation(provider: string, model: string): Conversation;
|
|
27
|
+
/** Add a message to the conversation and save */
|
|
28
|
+
export declare function addMessage(conv: Conversation, role: "user" | "assistant" | "tool", content: string, toolName?: string): void;
|
|
29
|
+
/** Save conversation to disk */
|
|
30
|
+
export declare function saveConversation(conv: Conversation): void;
|
|
31
|
+
/** Load a conversation by ID */
|
|
32
|
+
export declare function loadConversation(id: string): Conversation | null;
|
|
33
|
+
/** List all saved conversations, newest first */
|
|
34
|
+
export declare function listConversations(): Conversation[];
|
|
35
|
+
/** Load the most recent conversation (for --continue flag) */
|
|
36
|
+
export declare function loadLastConversation(): Conversation | null;
|
|
37
|
+
/** Delete a conversation by ID */
|
|
38
|
+
export declare function deleteConversation(id: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Fork a conversation — create an identical copy with a new ID.
|
|
41
|
+
* Returns the forked conversation (already saved to disk).
|
|
42
|
+
*/
|
|
43
|
+
export declare function forkConversation(idOrConv: string | Conversation): Conversation | null;
|
|
44
|
+
/**
|
|
45
|
+
* Update the title of a conversation in-place.
|
|
46
|
+
* Useful for AI-generated titles after the first response.
|
|
47
|
+
*/
|
|
48
|
+
export declare function updateConversationTitle(id: string, title: string): void;
|
|
49
|
+
/** Print conversation list to console */
|
|
50
|
+
export declare function printConversationList(): void;
|
|
51
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAsBD,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAWhF;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAUN;AAED,gCAAgC;AAChC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAIzD;AAED,gCAAgC;AAChC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQhE;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,IAAI,YAAY,EAAE,CAalD;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAG1D;AAED,kCAAkC;AAClC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,IAAI,CAgBrF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMvE;AAED,yCAAyC;AACzC,wBAAgB,qBAAqB,IAAI,IAAI,CAiC5C"}
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Conversation History Manager
|
|
4
|
+
*
|
|
5
|
+
* Saves conversations to ~/.cdoing/conversations/ as JSON files.
|
|
6
|
+
* Each conversation has an ID, title (from first message), timestamps,
|
|
7
|
+
* and the full message log.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
43
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.createConversation = createConversation;
|
|
47
|
+
exports.addMessage = addMessage;
|
|
48
|
+
exports.saveConversation = saveConversation;
|
|
49
|
+
exports.loadConversation = loadConversation;
|
|
50
|
+
exports.listConversations = listConversations;
|
|
51
|
+
exports.loadLastConversation = loadLastConversation;
|
|
52
|
+
exports.deleteConversation = deleteConversation;
|
|
53
|
+
exports.forkConversation = forkConversation;
|
|
54
|
+
exports.updateConversationTitle = updateConversationTitle;
|
|
55
|
+
exports.printConversationList = printConversationList;
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const os = __importStar(require("os"));
|
|
59
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
60
|
+
const CONV_DIR = path.join(os.homedir(), ".cdoing", "conversations");
|
|
61
|
+
/** Make sure the conversations directory exists */
|
|
62
|
+
function ensureDir() {
|
|
63
|
+
if (!fs.existsSync(CONV_DIR))
|
|
64
|
+
fs.mkdirSync(CONV_DIR, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
/** Generate a short unique ID */
|
|
67
|
+
function generateId() {
|
|
68
|
+
const now = Date.now().toString(36);
|
|
69
|
+
const rand = Math.random().toString(36).slice(2, 6);
|
|
70
|
+
return `${now}-${rand}`;
|
|
71
|
+
}
|
|
72
|
+
/** Derive a title from the first user message */
|
|
73
|
+
function deriveTitle(message) {
|
|
74
|
+
const clean = message.replace(/\n/g, " ").trim();
|
|
75
|
+
return clean.length > 60 ? clean.substring(0, 57) + "..." : clean;
|
|
76
|
+
}
|
|
77
|
+
// ── Public API ──────────────────────────────────────────────
|
|
78
|
+
/** Create a new conversation and return it */
|
|
79
|
+
function createConversation(provider, model) {
|
|
80
|
+
ensureDir();
|
|
81
|
+
return {
|
|
82
|
+
id: generateId(),
|
|
83
|
+
title: "New conversation",
|
|
84
|
+
createdAt: Date.now(),
|
|
85
|
+
updatedAt: Date.now(),
|
|
86
|
+
provider,
|
|
87
|
+
model,
|
|
88
|
+
messages: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** Add a message to the conversation and save */
|
|
92
|
+
function addMessage(conv, role, content, toolName) {
|
|
93
|
+
conv.messages.push({ role, content, timestamp: Date.now(), toolName });
|
|
94
|
+
conv.updatedAt = Date.now();
|
|
95
|
+
// Set title from first user message
|
|
96
|
+
if (role === "user" && conv.title === "New conversation") {
|
|
97
|
+
conv.title = deriveTitle(content);
|
|
98
|
+
}
|
|
99
|
+
saveConversation(conv);
|
|
100
|
+
}
|
|
101
|
+
/** Save conversation to disk */
|
|
102
|
+
function saveConversation(conv) {
|
|
103
|
+
ensureDir();
|
|
104
|
+
const filePath = path.join(CONV_DIR, `${conv.id}.json`);
|
|
105
|
+
fs.writeFileSync(filePath, JSON.stringify(conv, null, 2), "utf-8");
|
|
106
|
+
}
|
|
107
|
+
/** Load a conversation by ID */
|
|
108
|
+
function loadConversation(id) {
|
|
109
|
+
const filePath = path.join(CONV_DIR, `${id}.json`);
|
|
110
|
+
if (!fs.existsSync(filePath))
|
|
111
|
+
return null;
|
|
112
|
+
try {
|
|
113
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** List all saved conversations, newest first */
|
|
120
|
+
function listConversations() {
|
|
121
|
+
ensureDir();
|
|
122
|
+
const files = fs.readdirSync(CONV_DIR).filter((f) => f.endsWith(".json"));
|
|
123
|
+
const convs = [];
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
try {
|
|
126
|
+
const data = JSON.parse(fs.readFileSync(path.join(CONV_DIR, file), "utf-8"));
|
|
127
|
+
convs.push(data);
|
|
128
|
+
}
|
|
129
|
+
catch { }
|
|
130
|
+
}
|
|
131
|
+
return convs.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
132
|
+
}
|
|
133
|
+
/** Load the most recent conversation (for --continue flag) */
|
|
134
|
+
function loadLastConversation() {
|
|
135
|
+
const all = listConversations();
|
|
136
|
+
return all.length > 0 ? all[0] : null;
|
|
137
|
+
}
|
|
138
|
+
/** Delete a conversation by ID */
|
|
139
|
+
function deleteConversation(id) {
|
|
140
|
+
const filePath = path.join(CONV_DIR, `${id}.json`);
|
|
141
|
+
if (fs.existsSync(filePath)) {
|
|
142
|
+
fs.unlinkSync(filePath);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Fork a conversation — create an identical copy with a new ID.
|
|
149
|
+
* Returns the forked conversation (already saved to disk).
|
|
150
|
+
*/
|
|
151
|
+
function forkConversation(idOrConv) {
|
|
152
|
+
const original = typeof idOrConv === "string" ? loadConversation(idOrConv) : idOrConv;
|
|
153
|
+
if (!original)
|
|
154
|
+
return null;
|
|
155
|
+
ensureDir();
|
|
156
|
+
const forked = {
|
|
157
|
+
...original,
|
|
158
|
+
id: generateId(),
|
|
159
|
+
title: `Fork of: ${original.title}`,
|
|
160
|
+
createdAt: Date.now(),
|
|
161
|
+
updatedAt: Date.now(),
|
|
162
|
+
messages: original.messages.map((m) => ({ ...m })),
|
|
163
|
+
};
|
|
164
|
+
saveConversation(forked);
|
|
165
|
+
return forked;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Update the title of a conversation in-place.
|
|
169
|
+
* Useful for AI-generated titles after the first response.
|
|
170
|
+
*/
|
|
171
|
+
function updateConversationTitle(id, title) {
|
|
172
|
+
const conv = loadConversation(id);
|
|
173
|
+
if (!conv)
|
|
174
|
+
return;
|
|
175
|
+
conv.title = title.length > 80 ? title.substring(0, 77) + "..." : title;
|
|
176
|
+
conv.updatedAt = Date.now();
|
|
177
|
+
saveConversation(conv);
|
|
178
|
+
}
|
|
179
|
+
/** Print conversation list to console */
|
|
180
|
+
function printConversationList() {
|
|
181
|
+
const convs = listConversations();
|
|
182
|
+
if (convs.length === 0) {
|
|
183
|
+
console.log(chalk_1.default.dim("\n No saved conversations.\n"));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
console.log();
|
|
187
|
+
console.log(chalk_1.default.bold(" Conversations:"));
|
|
188
|
+
console.log();
|
|
189
|
+
const limit = Math.min(convs.length, 20);
|
|
190
|
+
for (let i = 0; i < limit; i++) {
|
|
191
|
+
const c = convs[i];
|
|
192
|
+
const date = new Date(c.updatedAt).toLocaleDateString("en-US", {
|
|
193
|
+
month: "short", day: "numeric", hour: "2-digit", minute: "2-digit",
|
|
194
|
+
});
|
|
195
|
+
const msgCount = c.messages.filter((m) => m.role === "user").length;
|
|
196
|
+
console.log(chalk_1.default.cyan(` ${c.id}`) +
|
|
197
|
+
chalk_1.default.dim(` ${date} (${msgCount} msgs)`) +
|
|
198
|
+
` ${c.title}`);
|
|
199
|
+
}
|
|
200
|
+
if (convs.length > 20) {
|
|
201
|
+
console.log(chalk_1.default.dim(`\n ... and ${convs.length - 20} more`));
|
|
202
|
+
}
|
|
203
|
+
console.log();
|
|
204
|
+
console.log(chalk_1.default.dim(" Use /resume <id> to continue a conversation."));
|
|
205
|
+
console.log(chalk_1.default.dim(" Use /delete <id> to remove one.\n"));
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Cdoing CLI — Entry point.
|
|
5
|
+
* Parses args, resolves API key, launches interactive or one-shot mode.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const ai_1 = require("@cdoing/ai");
|
|
13
|
+
const core_1 = require("@cdoing/core");
|
|
14
|
+
const chat_1 = require("./chat");
|
|
15
|
+
const config_1 = require("./config");
|
|
16
|
+
const tools_1 = require("./tools");
|
|
17
|
+
const callbacks_1 = require("./callbacks");
|
|
18
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
19
|
+
const oauth_1 = require("./oauth");
|
|
20
|
+
const commands_1 = require("./commands");
|
|
21
|
+
const history_1 = require("./history");
|
|
22
|
+
const program = new commander_1.Command();
|
|
23
|
+
program
|
|
24
|
+
.name("cdoing")
|
|
25
|
+
.description("AI-powered coding assistant CLI")
|
|
26
|
+
.version("0.1.0")
|
|
27
|
+
.option("-m, --model <model>", "Model to use (e.g., claude-sonnet-4-20250514, gpt-4o)")
|
|
28
|
+
.option("-p, --provider <provider>", "AI provider: anthropic, openai, google, custom", "anthropic")
|
|
29
|
+
.option("--base-url <url>", "Base URL for custom providers")
|
|
30
|
+
.option("--api-key <key>", "API key (overrides env var)")
|
|
31
|
+
.option("--mode <mode>", "Permission mode: ask, auto-edit, auto", "ask")
|
|
32
|
+
.option("-d, --dir <directory>", "Working directory", process.cwd())
|
|
33
|
+
.option("--login", "Login with Claude via OAuth (opens browser)")
|
|
34
|
+
.option("--logout", "Clear stored OAuth tokens")
|
|
35
|
+
// New flags
|
|
36
|
+
.option("--print", "Print output only (non-interactive)")
|
|
37
|
+
.option("-r, --resume <id>", "Resume conversation by ID")
|
|
38
|
+
.option("-c, --continue", "Continue most recent conversation")
|
|
39
|
+
.option("--max-turns <n>", "Maximum agent turns")
|
|
40
|
+
.option("--output-format <format>", "Output format: text, json, stream-json", "text")
|
|
41
|
+
.option("--verbose", "Enable verbose logging")
|
|
42
|
+
.option("--system-prompt <prompt>", "Custom system prompt")
|
|
43
|
+
.option("--allowed-tools <tools>", "Comma-separated list of allowed tools")
|
|
44
|
+
.option("--disallowed-tools <tools>", "Comma-separated list of disallowed tools")
|
|
45
|
+
.argument("[prompt]", "One-shot prompt (skips interactive mode)")
|
|
46
|
+
.action(run);
|
|
47
|
+
// Subcommands
|
|
48
|
+
program
|
|
49
|
+
.command("config")
|
|
50
|
+
.description("Manage configuration")
|
|
51
|
+
.argument("<action>", "Action: get, set, or list")
|
|
52
|
+
.argument("[key]", "Config key")
|
|
53
|
+
.argument("[value]", "Config value (for set)")
|
|
54
|
+
.action(commands_1.handleConfigCommand);
|
|
55
|
+
program
|
|
56
|
+
.command("init")
|
|
57
|
+
.description("Initialize project with .cdoing/config.md")
|
|
58
|
+
.action(commands_1.handleInit);
|
|
59
|
+
program
|
|
60
|
+
.command("doctor")
|
|
61
|
+
.description("Diagnose setup and configuration issues")
|
|
62
|
+
.action(commands_1.handleDoctor);
|
|
63
|
+
program
|
|
64
|
+
.command("completions")
|
|
65
|
+
.description("Generate shell completion script (zsh, bash)")
|
|
66
|
+
.argument("[shell]", "Shell type: zsh or bash")
|
|
67
|
+
.action(commands_1.handleCompletions);
|
|
68
|
+
/** Create a sub-agent factory: spawns a child agent without sub_agent tool */
|
|
69
|
+
function createSubAgentFactory(modelConfig, workingDir, permissionManager, hookManager, options) {
|
|
70
|
+
return async (prompt, signal) => {
|
|
71
|
+
// Child registry has no sub_agent tool (no recursion)
|
|
72
|
+
const childRegistry = (0, tools_1.createToolRegistry)(workingDir);
|
|
73
|
+
const childAgent = new ai_1.AgentRunner(modelConfig, childRegistry, permissionManager, hookManager, options);
|
|
74
|
+
// If an abort signal is provided, cancel the agent when it fires
|
|
75
|
+
if (signal) {
|
|
76
|
+
signal.addEventListener("abort", () => childAgent.cancel(), { once: true });
|
|
77
|
+
}
|
|
78
|
+
// Silent callbacks — collect result only
|
|
79
|
+
let result = "";
|
|
80
|
+
await childAgent.run(prompt, {
|
|
81
|
+
onToken: (t) => { result += t; },
|
|
82
|
+
onToolCall: () => { },
|
|
83
|
+
onToolResult: () => { },
|
|
84
|
+
onComplete: () => { },
|
|
85
|
+
onError: (e) => { result += `\nError: ${e.message}`; },
|
|
86
|
+
});
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function run(prompt, options) {
|
|
91
|
+
// Handle --logout first
|
|
92
|
+
if (options.logout) {
|
|
93
|
+
console.log(chalk_1.default.green(`\n ${(0, oauth_1.oauthLogout)()}\n`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Handle --login: start OAuth flow
|
|
97
|
+
if (options.login) {
|
|
98
|
+
try {
|
|
99
|
+
await (0, oauth_1.oauthLogin)();
|
|
100
|
+
console.log(chalk_1.default.green("\n Login successful! You can now run cdoing.\n"));
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.log(chalk_1.default.red(`\n Login failed: ${err.message}\n`));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Enable verbose logging if requested
|
|
109
|
+
if (options.verbose) {
|
|
110
|
+
process.env.DEBUG = "cdoing:*";
|
|
111
|
+
console.log(chalk_1.default.dim("[verbose] Verbose logging enabled"));
|
|
112
|
+
}
|
|
113
|
+
await (0, config_1.resolveApiKey)(options);
|
|
114
|
+
const modelConfig = (0, config_1.buildModelConfig)(options);
|
|
115
|
+
const permissionManager = (0, config_1.createPermissionManager)(options);
|
|
116
|
+
const hookManager = new core_1.HookManager(options.dir);
|
|
117
|
+
const memoryStore = new core_1.MemoryStore();
|
|
118
|
+
const todoStore = new core_1.TodoStore();
|
|
119
|
+
const projectConfig = (0, core_1.loadProjectConfig)(options.dir);
|
|
120
|
+
const agentOptions = {
|
|
121
|
+
projectConfig: projectConfig || undefined,
|
|
122
|
+
memory: memoryStore.formatForPrompt() || undefined,
|
|
123
|
+
};
|
|
124
|
+
// Handle custom system prompt
|
|
125
|
+
if (options.systemPrompt) {
|
|
126
|
+
agentOptions.systemPrompt = options.systemPrompt;
|
|
127
|
+
}
|
|
128
|
+
// Handle max turns
|
|
129
|
+
if (options.maxTurns) {
|
|
130
|
+
agentOptions.maxTurns = parseInt(options.maxTurns, 10);
|
|
131
|
+
}
|
|
132
|
+
const subAgentFactory = createSubAgentFactory(modelConfig, options.dir, permissionManager, hookManager, agentOptions);
|
|
133
|
+
let toolRegistry = (0, tools_1.createToolRegistry)(options.dir, { subAgentFactory, todoStore });
|
|
134
|
+
// Handle tool filtering
|
|
135
|
+
if (options.allowedTools) {
|
|
136
|
+
const allowed = options.allowedTools.split(",").map(t => t.trim());
|
|
137
|
+
toolRegistry = filterTools(toolRegistry, allowed, "allow");
|
|
138
|
+
if (options.verbose) {
|
|
139
|
+
console.log(chalk_1.default.dim(`[verbose] Allowed tools: ${allowed.join(", ")}`));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (options.disallowedTools) {
|
|
143
|
+
const disallowed = options.disallowedTools.split(",").map(t => t.trim());
|
|
144
|
+
toolRegistry = filterTools(toolRegistry, disallowed, "disallow");
|
|
145
|
+
if (options.verbose) {
|
|
146
|
+
console.log(chalk_1.default.dim(`[verbose] Disallowed tools: ${disallowed.join(", ")}`));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Handle --resume or --continue
|
|
150
|
+
let resumedConversation = null;
|
|
151
|
+
if (options.resume) {
|
|
152
|
+
resumedConversation = (0, history_1.loadConversation)(options.resume);
|
|
153
|
+
if (!resumedConversation) {
|
|
154
|
+
console.log(chalk_1.default.red(`\n Conversation not found: ${options.resume}\n`));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
if (options.verbose) {
|
|
158
|
+
console.log(chalk_1.default.dim(`[verbose] Resuming conversation: ${options.resume}`));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (options.continue) {
|
|
162
|
+
resumedConversation = (0, history_1.loadLastConversation)();
|
|
163
|
+
if (!resumedConversation) {
|
|
164
|
+
console.log(chalk_1.default.yellow("\n No previous conversation to continue.\n"));
|
|
165
|
+
}
|
|
166
|
+
else if (options.verbose) {
|
|
167
|
+
console.log(chalk_1.default.dim(`[verbose] Continuing conversation: ${resumedConversation.id}`));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (prompt) {
|
|
171
|
+
const agent = new ai_1.AgentRunner(modelConfig, toolRegistry, permissionManager, hookManager, agentOptions);
|
|
172
|
+
// Restore history from resumed conversation
|
|
173
|
+
if (resumedConversation) {
|
|
174
|
+
for (const msg of resumedConversation.messages) {
|
|
175
|
+
if (msg.role === "user") {
|
|
176
|
+
agent.addToHistory("user", msg.content);
|
|
177
|
+
}
|
|
178
|
+
else if (msg.role === "assistant") {
|
|
179
|
+
agent.addToHistory("assistant", msg.content);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Select callbacks based on output format and print mode
|
|
184
|
+
let callbacks;
|
|
185
|
+
if (options.print) {
|
|
186
|
+
callbacks = (0, callbacks_1.createPrintCallbacks)();
|
|
187
|
+
}
|
|
188
|
+
else if (options.outputFormat === "json") {
|
|
189
|
+
callbacks = (0, callbacks_1.createJsonCallbacks)();
|
|
190
|
+
}
|
|
191
|
+
else if (options.outputFormat === "stream-json") {
|
|
192
|
+
callbacks = (0, callbacks_1.createStreamJsonCallbacks)();
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
callbacks = (0, callbacks_1.createOneShotCallbacks)();
|
|
196
|
+
}
|
|
197
|
+
await agent.run(prompt, callbacks);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const chat = new chat_1.ChatInterface(modelConfig, toolRegistry, permissionManager, hookManager, memoryStore, todoStore);
|
|
201
|
+
await chat.start();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Filter tools based on allow/disallow list */
|
|
205
|
+
function filterTools(registry, toolNames, mode) {
|
|
206
|
+
const allTools = registry.getAll();
|
|
207
|
+
const filtered = allTools.filter(tool => {
|
|
208
|
+
const isInList = toolNames.includes(tool.definition.name);
|
|
209
|
+
return mode === "allow" ? isInList : !isInList;
|
|
210
|
+
});
|
|
211
|
+
// Create a new registry with filtered tools
|
|
212
|
+
const { ToolRegistry } = require("@cdoing/core");
|
|
213
|
+
const newRegistry = new ToolRegistry();
|
|
214
|
+
for (const tool of filtered) {
|
|
215
|
+
newRegistry.register(tool);
|
|
216
|
+
}
|
|
217
|
+
return newRegistry;
|
|
218
|
+
}
|
|
219
|
+
program.parse();
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI OAuth — thin wrapper around @cdoing/core OAuth
|
|
3
|
+
*
|
|
4
|
+
* Only contains CLI-specific UI code (readline prompts, chalk output, browser opener).
|
|
5
|
+
* All credential storage, PKCE, token management lives in @cdoing/core.
|
|
6
|
+
*/
|
|
7
|
+
export { saveOAuthTokens, loadOAuthTokens, clearOAuthTokens, isOAuthExpired, refreshAccessToken, resolveOAuthToken, generateOAuthUrl, exchangeOAuthCode, getOAuthStatus, } from "@cdoing/core";
|
|
8
|
+
export type { OAuthTokens } from "@cdoing/core";
|
|
9
|
+
import type { OAuthTokens } from "@cdoing/core";
|
|
10
|
+
export declare function oauthLogin(): Promise<OAuthTokens>;
|
|
11
|
+
export declare function oauthLogout(): string;
|
|
12
|
+
export declare function oauthStatus(): string;
|
|
13
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAShD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,CAsBvD;AA2BD,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAID,wBAAgB,WAAW,IAAI,MAAM,CAsEpC"}
|