xibecode 0.1.1 → 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,200 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ const TODO_FILE_NAME = 'todo.md';
4
+ /**
5
+ * Very small, opinionated format:
6
+ *
7
+ * ## Pending
8
+ * - [ ] [id:feature-1] Implement feature X
9
+ *
10
+ * ## In Progress
11
+ * - [ ] [id:bugfix-2] Fix bug Y
12
+ *
13
+ * ## Done
14
+ * - [x] [id:chore-3] Cleanup
15
+ */
16
+ export class TodoManager {
17
+ rootDir;
18
+ constructor(rootDir) {
19
+ this.rootDir = rootDir;
20
+ }
21
+ get filePath() {
22
+ return path.join(this.rootDir, TODO_FILE_NAME);
23
+ }
24
+ async load() {
25
+ try {
26
+ const content = await fs.readFile(this.filePath, 'utf-8');
27
+ return this.parse(content);
28
+ }
29
+ catch {
30
+ // If file does not exist or cannot be parsed, start with an empty doc
31
+ return { pending: [], inProgress: [], done: [] };
32
+ }
33
+ }
34
+ async save(doc) {
35
+ const markdown = this.serialize(doc);
36
+ await fs.writeFile(this.filePath, markdown, 'utf-8');
37
+ }
38
+ /**
39
+ * Merge new tasks into the existing document.
40
+ * - Reuses items with the same id (updates title if changed).
41
+ * - Adds unknown ids into the pending section.
42
+ */
43
+ async mergeNewTasks(newTasks) {
44
+ const current = await this.load();
45
+ const byId = new Map();
46
+ for (const item of [...current.pending, ...current.inProgress, ...current.done]) {
47
+ byId.set(item.id, { ...item });
48
+ }
49
+ for (const t of newTasks) {
50
+ const existing = byId.get(t.id);
51
+ if (existing) {
52
+ existing.title = t.title;
53
+ byId.set(t.id, existing);
54
+ }
55
+ else {
56
+ byId.set(t.id, { id: t.id, title: t.title, status: 'pending' });
57
+ }
58
+ }
59
+ const updated = {
60
+ pending: [],
61
+ inProgress: [],
62
+ done: [],
63
+ };
64
+ for (const item of byId.values()) {
65
+ if (item.status === 'in_progress') {
66
+ updated.inProgress.push(item);
67
+ }
68
+ else if (item.status === 'done') {
69
+ updated.done.push(item);
70
+ }
71
+ else {
72
+ updated.pending.push(item);
73
+ }
74
+ }
75
+ await this.save(updated);
76
+ return updated;
77
+ }
78
+ /**
79
+ * Get the next pending task, if any.
80
+ */
81
+ getNextPending(doc) {
82
+ return doc.pending[0];
83
+ }
84
+ /**
85
+ * Update the status for a specific id and return the updated doc.
86
+ */
87
+ async updateStatus(id, status) {
88
+ const doc = await this.load();
89
+ const all = [...doc.pending, ...doc.inProgress, ...doc.done];
90
+ const updatedAll = all.map(item => (item.id === id ? { ...item, status } : item));
91
+ const updated = {
92
+ pending: [],
93
+ inProgress: [],
94
+ done: [],
95
+ };
96
+ for (const item of updatedAll) {
97
+ if (item.status === 'in_progress') {
98
+ updated.inProgress.push(item);
99
+ }
100
+ else if (item.status === 'done') {
101
+ updated.done.push(item);
102
+ }
103
+ else {
104
+ updated.pending.push(item);
105
+ }
106
+ }
107
+ await this.save(updated);
108
+ return updated;
109
+ }
110
+ /**
111
+ * Parse a markdown todo.md into a TodoDocument.
112
+ */
113
+ parse(markdown) {
114
+ const lines = markdown.split('\n');
115
+ let section = null;
116
+ const doc = {
117
+ pending: [],
118
+ inProgress: [],
119
+ done: [],
120
+ };
121
+ for (const raw of lines) {
122
+ const line = raw.trim();
123
+ if (line.toLowerCase().startsWith('## pending')) {
124
+ section = 'pending';
125
+ continue;
126
+ }
127
+ if (line.toLowerCase().startsWith('## in progress')) {
128
+ section = 'in_progress';
129
+ continue;
130
+ }
131
+ if (line.toLowerCase().startsWith('## done')) {
132
+ section = 'done';
133
+ continue;
134
+ }
135
+ const match = /^-\s*\[([ xX])\]\s*(.*)$/.exec(line);
136
+ if (!match || !section)
137
+ continue;
138
+ const checked = match[1].toLowerCase() === 'x';
139
+ const rest = match[2].trim();
140
+ // Extract id tag: [id:xyz]
141
+ let id = '';
142
+ let title = rest;
143
+ const idMatch = rest.match(/\[id:([^\]]+)\]/);
144
+ if (idMatch) {
145
+ id = idMatch[1].trim();
146
+ title = rest.replace(idMatch[0], '').trim();
147
+ }
148
+ // Fallback id if missing
149
+ if (!id) {
150
+ id = this.generateIdFromTitle(title);
151
+ }
152
+ const item = {
153
+ id,
154
+ title,
155
+ status: checked ? 'done' : section === 'in_progress' ? 'in_progress' : 'pending',
156
+ };
157
+ if (section === 'pending')
158
+ doc.pending.push(item);
159
+ if (section === 'in_progress')
160
+ doc.inProgress.push(item);
161
+ if (section === 'done')
162
+ doc.done.push(item);
163
+ }
164
+ return doc;
165
+ }
166
+ /**
167
+ * Serialize a TodoDocument back into markdown.
168
+ */
169
+ serialize(doc) {
170
+ const lines = [];
171
+ const pushSection = (title, items) => {
172
+ lines.push(`## ${title}`);
173
+ lines.push('');
174
+ if (items.length === 0) {
175
+ lines.push('_(none)_');
176
+ }
177
+ else {
178
+ for (const item of items) {
179
+ const checked = item.status === 'done' ? 'x' : ' ';
180
+ lines.push(`- [${checked}] [id:${item.id}] ${item.title}`);
181
+ }
182
+ }
183
+ lines.push('');
184
+ };
185
+ pushSection('Pending', doc.pending);
186
+ pushSection('In Progress', doc.inProgress);
187
+ pushSection('Done', doc.done);
188
+ return lines.join('\n').trimEnd() + '\n';
189
+ }
190
+ generateIdFromTitle(title) {
191
+ const base = title
192
+ .toLowerCase()
193
+ .replace(/[^a-z0-9]+/g, '-')
194
+ .replace(/^-+|-+$/g, '')
195
+ .slice(0, 32) || 'task';
196
+ const timestamp = Date.now().toString(36);
197
+ return `${base}-${timestamp}`;
198
+ }
199
+ }
200
+ //# sourceMappingURL=todoManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoManager.js","sourceRoot":"","sources":["../../src/utils/todoManager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xibecode",
3
- "version": "0.1.01",
3
+ "version": "0.1.4",
4
4
  "description": "AI-powered autonomous coding assistant with test integration, git awareness, and plugin support",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",