@schnick371/devsteps-shared 0.5.0 → 0.6.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/dist/core/add.d.ts +4 -4
- package/dist/core/add.d.ts.map +1 -1
- package/dist/core/add.js +8 -8
- package/dist/core/add.js.map +1 -1
- package/dist/core/archive.d.ts +2 -2
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +12 -12
- package/dist/core/archive.js.map +1 -1
- package/dist/core/bulk-update.d.ts +6 -6
- package/dist/core/bulk-update.d.ts.map +1 -1
- package/dist/core/bulk-update.js +11 -11
- package/dist/core/bulk-update.js.map +1 -1
- package/dist/core/context.d.ts +4 -4
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +14 -14
- package/dist/core/context.js.map +1 -1
- package/dist/core/get.d.ts +1 -1
- package/dist/core/get.d.ts.map +1 -1
- package/dist/core/get.js +5 -5
- package/dist/core/get.js.map +1 -1
- package/dist/core/list.d.ts +3 -3
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +7 -7
- package/dist/core/list.js.map +1 -1
- package/dist/core/update.d.ts +1 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +7 -7
- package/dist/core/update.js.map +1 -1
- package/dist/schemas/index.d.ts +7 -7
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +5 -5
- package/dist/schemas/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/core/add.js.map +0 -1
- package/src/core/add.ts +0 -145
- package/src/core/archive.js.map +0 -1
- package/src/core/archive.ts +0 -153
- package/src/core/bulk-update.js.map +0 -1
- package/src/core/bulk-update.ts +0 -180
- package/src/core/context.js.map +0 -1
- package/src/core/context.ts +0 -269
- package/src/core/get.js.map +0 -1
- package/src/core/get.ts +0 -39
- package/src/core/index.js.map +0 -1
- package/src/core/index.ts +0 -26
- package/src/core/list.js.map +0 -1
- package/src/core/list.ts +0 -96
- package/src/core/update.js.map +0 -1
- package/src/core/update.ts +0 -154
- package/src/core/validation.ts +0 -252
- package/src/index.js +0 -21
- package/src/index.js.map +0 -1
- package/src/index.ts +0 -4
- package/src/schemas/index.js.map +0 -1
- package/src/schemas/index.ts +0 -226
- package/src/schemas/project.js.map +0 -1
- package/src/schemas/project.ts +0 -73
- package/src/schemas/relationships.ts +0 -48
- package/src/types/commands.js.map +0 -1
- package/src/types/commands.ts +0 -116
- package/src/types/index.js.map +0 -1
- package/src/types/index.ts +0 -13
- package/src/utils/cache.js.map +0 -1
- package/src/utils/cache.ts +0 -200
- package/src/utils/index.js.map +0 -1
- package/src/utils/index.ts +0 -170
package/src/core/bulk-update.ts
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import type { ItemMetadata, ItemStatus } from '../schemas/index.js';
|
|
4
|
-
import { getCurrentTimestamp } from '../utils/index.js';
|
|
5
|
-
import { updateItem } from './update.js';
|
|
6
|
-
|
|
7
|
-
export interface BulkUpdateResult {
|
|
8
|
-
success: string[];
|
|
9
|
-
failed: Array<{ id: string; error: string }>;
|
|
10
|
-
total: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Bulk update multiple items at once
|
|
15
|
-
* @param devcrumbsDir Path to .devcrumbs directory
|
|
16
|
-
* @param itemIds Array of item IDs to update
|
|
17
|
-
* @param updates Partial item metadata to apply to all items
|
|
18
|
-
* @returns Result with success and failure lists
|
|
19
|
-
*/
|
|
20
|
-
export async function bulkUpdateItems(
|
|
21
|
-
devcrumbsDir: string,
|
|
22
|
-
itemIds: string[],
|
|
23
|
-
updates: Partial<ItemMetadata>
|
|
24
|
-
): Promise<BulkUpdateResult> {
|
|
25
|
-
const result: BulkUpdateResult = {
|
|
26
|
-
success: [],
|
|
27
|
-
failed: [],
|
|
28
|
-
total: itemIds.length,
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
for (const id of itemIds) {
|
|
32
|
-
try {
|
|
33
|
-
await updateItem(devcrumbsDir, {
|
|
34
|
-
id,
|
|
35
|
-
...updates,
|
|
36
|
-
});
|
|
37
|
-
result.success.push(id);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
result.failed.push({
|
|
40
|
-
id,
|
|
41
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Bulk add tags to multiple items
|
|
51
|
-
* @param devcrumbsDir Path to .devcrumbs directory
|
|
52
|
-
* @param itemIds Array of item IDs
|
|
53
|
-
* @param tagsToAdd Tags to add
|
|
54
|
-
* @returns Result with success and failure lists
|
|
55
|
-
*/
|
|
56
|
-
export async function bulkAddTags(
|
|
57
|
-
devcrumbsDir: string,
|
|
58
|
-
itemIds: string[],
|
|
59
|
-
tagsToAdd: string[]
|
|
60
|
-
): Promise<BulkUpdateResult> {
|
|
61
|
-
const result: BulkUpdateResult = {
|
|
62
|
-
success: [],
|
|
63
|
-
failed: [],
|
|
64
|
-
total: itemIds.length,
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
for (const id of itemIds) {
|
|
68
|
-
try {
|
|
69
|
-
const { type, folder } = await import('../utils/index.js').then((m) => ({
|
|
70
|
-
type: m.parseItemId(id)?.type,
|
|
71
|
-
folder: m.TYPE_TO_DIRECTORY[m.parseItemId(id)?.type || 'task'],
|
|
72
|
-
}));
|
|
73
|
-
|
|
74
|
-
if (!type) {
|
|
75
|
-
throw new Error(`Invalid item ID: ${id}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const metadataPath = join(devcrumbsDir, folder, `${id}.json`);
|
|
79
|
-
if (!existsSync(metadataPath)) {
|
|
80
|
-
throw new Error(`Item ${id} not found`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const metadata: ItemMetadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
84
|
-
|
|
85
|
-
// Add new tags (avoid duplicates)
|
|
86
|
-
const existingTags = new Set(metadata.tags);
|
|
87
|
-
for (const tag of tagsToAdd) {
|
|
88
|
-
existingTags.add(tag);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
metadata.tags = Array.from(existingTags);
|
|
92
|
-
metadata.updated = getCurrentTimestamp();
|
|
93
|
-
|
|
94
|
-
writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
95
|
-
|
|
96
|
-
// Update index
|
|
97
|
-
const indexPath = join(devcrumbsDir, 'index.json');
|
|
98
|
-
const index = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
99
|
-
const itemIndex = index.items.findIndex((i: { id: string }) => i.id === id);
|
|
100
|
-
if (itemIndex >= 0) {
|
|
101
|
-
index.items[itemIndex].updated = metadata.updated;
|
|
102
|
-
}
|
|
103
|
-
index.last_updated = getCurrentTimestamp();
|
|
104
|
-
writeFileSync(indexPath, JSON.stringify(index, null, 2));
|
|
105
|
-
|
|
106
|
-
result.success.push(id);
|
|
107
|
-
} catch (error) {
|
|
108
|
-
result.failed.push({
|
|
109
|
-
id,
|
|
110
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Bulk remove tags from multiple items
|
|
120
|
-
* @param devcrumbsDir Path to .devcrumbs directory
|
|
121
|
-
* @param itemIds Array of item IDs
|
|
122
|
-
* @param tagsToRemove Tags to remove
|
|
123
|
-
* @returns Result with success and failure lists
|
|
124
|
-
*/
|
|
125
|
-
export async function bulkRemoveTags(
|
|
126
|
-
devcrumbsDir: string,
|
|
127
|
-
itemIds: string[],
|
|
128
|
-
tagsToRemove: string[]
|
|
129
|
-
): Promise<BulkUpdateResult> {
|
|
130
|
-
const result: BulkUpdateResult = {
|
|
131
|
-
success: [],
|
|
132
|
-
failed: [],
|
|
133
|
-
total: itemIds.length,
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
for (const id of itemIds) {
|
|
137
|
-
try {
|
|
138
|
-
const { type, folder } = await import('../utils/index.js').then((m) => ({
|
|
139
|
-
type: m.parseItemId(id)?.type,
|
|
140
|
-
folder: m.TYPE_TO_DIRECTORY[m.parseItemId(id)?.type || 'task'],
|
|
141
|
-
}));
|
|
142
|
-
|
|
143
|
-
if (!type) {
|
|
144
|
-
throw new Error(`Invalid item ID: ${id}`);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const metadataPath = join(devcrumbsDir, folder, `${id}.json`);
|
|
148
|
-
if (!existsSync(metadataPath)) {
|
|
149
|
-
throw new Error(`Item ${id} not found`);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const metadata: ItemMetadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
153
|
-
|
|
154
|
-
// Remove tags
|
|
155
|
-
metadata.tags = metadata.tags.filter((tag) => !tagsToRemove.includes(tag));
|
|
156
|
-
metadata.updated = getCurrentTimestamp();
|
|
157
|
-
|
|
158
|
-
writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
159
|
-
|
|
160
|
-
// Update index
|
|
161
|
-
const indexPath = join(devcrumbsDir, 'index.json');
|
|
162
|
-
const index = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
163
|
-
const itemIndex = index.items.findIndex((i: { id: string }) => i.id === id);
|
|
164
|
-
if (itemIndex >= 0) {
|
|
165
|
-
index.items[itemIndex].updated = metadata.updated;
|
|
166
|
-
}
|
|
167
|
-
index.last_updated = getCurrentTimestamp();
|
|
168
|
-
writeFileSync(indexPath, JSON.stringify(index, null, 2));
|
|
169
|
-
|
|
170
|
-
result.success.push(id);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
result.failed.push({
|
|
173
|
-
id,
|
|
174
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return result;
|
|
180
|
-
}
|
package/src/core/context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["context.ts"],"names":[],"mappings":"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"}
|
package/src/core/context.ts
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import type { ContextLevel, QuickContext } from '../schemas/project.js';
|
|
4
|
-
import { CACHE_CONFIG, getCache } from '../utils/cache.js';
|
|
5
|
-
|
|
6
|
-
interface PackageInfo {
|
|
7
|
-
name: string;
|
|
8
|
-
purpose: string;
|
|
9
|
-
dependencies: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface ItemCounts {
|
|
13
|
-
total: number;
|
|
14
|
-
by_type: Record<string, number>;
|
|
15
|
-
by_status: Record<string, number>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface RecentUpdate {
|
|
19
|
-
id: string;
|
|
20
|
-
type: string;
|
|
21
|
-
title: string;
|
|
22
|
-
updated: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface ContextResponse {
|
|
26
|
-
context_level: ContextLevel;
|
|
27
|
-
tokens_used: number;
|
|
28
|
-
static_context?: unknown;
|
|
29
|
-
dynamic_context: {
|
|
30
|
-
packages: PackageInfo[];
|
|
31
|
-
active_items: ItemCounts;
|
|
32
|
-
recent_updates: RecentUpdate[];
|
|
33
|
-
};
|
|
34
|
-
suggestions?: string[];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Analyze packages from workspace (with caching)
|
|
39
|
-
*/
|
|
40
|
-
export async function analyzePackages(projectDir: string): Promise<PackageInfo[]> {
|
|
41
|
-
const cache = getCache();
|
|
42
|
-
const cacheKey = `package_analysis:${projectDir}`;
|
|
43
|
-
const packagesDir = path.join(projectDir, 'packages');
|
|
44
|
-
|
|
45
|
-
// Try cache first
|
|
46
|
-
const cached = cache.get<PackageInfo[]>(cacheKey, CACHE_CONFIG.PACKAGE_ANALYSIS_TTL, packagesDir);
|
|
47
|
-
if (cached) {
|
|
48
|
-
return cached;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const packages: PackageInfo[] = [];
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
const entries = await fs.readdir(packagesDir, { withFileTypes: true });
|
|
55
|
-
|
|
56
|
-
for (const entry of entries) {
|
|
57
|
-
if (entry.isDirectory()) {
|
|
58
|
-
const pkgPath = path.join(packagesDir, entry.name, 'package.json');
|
|
59
|
-
try {
|
|
60
|
-
const content = await fs.readFile(pkgPath, 'utf-8');
|
|
61
|
-
const pkg = JSON.parse(content);
|
|
62
|
-
|
|
63
|
-
packages.push({
|
|
64
|
-
name: pkg.name || entry.name,
|
|
65
|
-
purpose: pkg.description || 'No description',
|
|
66
|
-
dependencies: Object.keys(pkg.dependencies || {}),
|
|
67
|
-
});
|
|
68
|
-
} catch {
|
|
69
|
-
// Skip if no package.json
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
} catch {
|
|
74
|
-
// No packages directory
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Cache the result
|
|
78
|
-
cache.set(cacheKey, packages, packagesDir);
|
|
79
|
-
|
|
80
|
-
return packages;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Get item counts from index (with caching)
|
|
85
|
-
*/
|
|
86
|
-
export async function getItemCounts(devcrumbsDir: string): Promise<ItemCounts> {
|
|
87
|
-
const cache = getCache();
|
|
88
|
-
const cacheKey = `item_counts:${devcrumbsDir}`;
|
|
89
|
-
const indexPath = path.join(devcrumbsDir, 'index.json');
|
|
90
|
-
|
|
91
|
-
// Try cache first
|
|
92
|
-
const cached = cache.get<ItemCounts>(cacheKey, CACHE_CONFIG.ITEM_COUNTS_TTL, indexPath);
|
|
93
|
-
if (cached) {
|
|
94
|
-
return cached;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
const content = await fs.readFile(indexPath, 'utf-8');
|
|
99
|
-
const index = JSON.parse(content);
|
|
100
|
-
|
|
101
|
-
const counts: ItemCounts = {
|
|
102
|
-
total: index.items.length,
|
|
103
|
-
by_type: {},
|
|
104
|
-
by_status: {},
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
for (const item of index.items) {
|
|
108
|
-
counts.by_type[item.type] = (counts.by_type[item.type] || 0) + 1;
|
|
109
|
-
counts.by_status[item.status] = (counts.by_status[item.status] || 0) + 1;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Cache the result
|
|
113
|
-
cache.set(cacheKey, counts, indexPath);
|
|
114
|
-
|
|
115
|
-
return counts;
|
|
116
|
-
} catch {
|
|
117
|
-
return { total: 0, by_type: {}, by_status: {} };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Get recent updates (last N days) (with caching)
|
|
123
|
-
*/
|
|
124
|
-
export async function getRecentUpdates(devcrumbsDir: string, days: number): Promise<RecentUpdate[]> {
|
|
125
|
-
const cache = getCache();
|
|
126
|
-
const cacheKey = `recent_updates:${devcrumbsDir}:${days}`;
|
|
127
|
-
const indexPath = path.join(devcrumbsDir, 'index.json');
|
|
128
|
-
|
|
129
|
-
// Try cache first
|
|
130
|
-
const cached = cache.get<RecentUpdate[]>(cacheKey, CACHE_CONFIG.RECENT_UPDATES_TTL, indexPath);
|
|
131
|
-
if (cached) {
|
|
132
|
-
return cached;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
const content = await fs.readFile(indexPath, 'utf-8');
|
|
139
|
-
const index = JSON.parse(content);
|
|
140
|
-
|
|
141
|
-
const updates = index.items
|
|
142
|
-
.filter((item: { updated: string }) => new Date(item.updated).getTime() > cutoff)
|
|
143
|
-
.sort(
|
|
144
|
-
(a: { updated: string }, b: { updated: string }) =>
|
|
145
|
-
new Date(b.updated).getTime() - new Date(a.updated).getTime()
|
|
146
|
-
)
|
|
147
|
-
.slice(0, 10)
|
|
148
|
-
.map((item: { id: string; type: string; title: string; updated: string }) => ({
|
|
149
|
-
id: item.id,
|
|
150
|
-
type: item.type,
|
|
151
|
-
title: item.title,
|
|
152
|
-
updated: item.updated,
|
|
153
|
-
}));
|
|
154
|
-
|
|
155
|
-
// Cache the result
|
|
156
|
-
cache.set(cacheKey, updates, indexPath);
|
|
157
|
-
|
|
158
|
-
return updates;
|
|
159
|
-
} catch {
|
|
160
|
-
return [];
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Read PROJECT.md if exists (with caching)
|
|
166
|
-
*/
|
|
167
|
-
export async function readProjectMd(devcrumbsDir: string): Promise<QuickContext | null> {
|
|
168
|
-
const cache = getCache();
|
|
169
|
-
const cacheKey = `project_md:${devcrumbsDir}`;
|
|
170
|
-
const projectPath = path.join(devcrumbsDir, 'PROJECT.md');
|
|
171
|
-
|
|
172
|
-
// Try cache first
|
|
173
|
-
const cached = cache.get<QuickContext | null>(cacheKey, CACHE_CONFIG.PROJECT_MD_TTL, projectPath);
|
|
174
|
-
if (cached !== null) {
|
|
175
|
-
return cached;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
try {
|
|
179
|
-
const content = await fs.readFile(projectPath, 'utf-8');
|
|
180
|
-
|
|
181
|
-
// Parse markdown to extract context (simplified)
|
|
182
|
-
// In production, use a proper markdown parser
|
|
183
|
-
const techStack: Record<string, string> = {};
|
|
184
|
-
const packages: PackageInfo[] = [];
|
|
185
|
-
|
|
186
|
-
// Extract tech stack (look for bullet points after "### Tech Stack")
|
|
187
|
-
const techStackMatch = content.match(/### Tech Stack\n([\s\S]*?)(?=\n###|$)/);
|
|
188
|
-
if (techStackMatch) {
|
|
189
|
-
const lines = techStackMatch[1].split('\n');
|
|
190
|
-
for (const line of lines) {
|
|
191
|
-
const match = line.match(/- \*\*(.+?)\*\*: (.+)/);
|
|
192
|
-
if (match) {
|
|
193
|
-
techStack[match[1]] = match[2];
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Extract project type
|
|
199
|
-
const projectTypeMatch = content.match(/### Project Type\n(.+)/);
|
|
200
|
-
const projectType = projectTypeMatch?.[1] || 'Unknown';
|
|
201
|
-
|
|
202
|
-
const result = {
|
|
203
|
-
tech_stack: techStack,
|
|
204
|
-
packages,
|
|
205
|
-
project_type: projectType,
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
// Cache the result
|
|
209
|
-
cache.set(cacheKey, result, projectPath);
|
|
210
|
-
|
|
211
|
-
return result;
|
|
212
|
-
} catch {
|
|
213
|
-
// Cache the null result (file doesn't exist)
|
|
214
|
-
cache.set(cacheKey, null);
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Estimate token count (rough approximation: 1 token ≈ 4 chars)
|
|
221
|
-
*/
|
|
222
|
-
export function estimateTokens(obj: unknown): number {
|
|
223
|
-
const str = JSON.stringify(obj);
|
|
224
|
-
return Math.ceil(str.length / 4);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Get quick context
|
|
229
|
-
*/
|
|
230
|
-
export async function getQuickContext(
|
|
231
|
-
projectDir: string,
|
|
232
|
-
devcrumbsDir: string
|
|
233
|
-
): Promise<ContextResponse> {
|
|
234
|
-
const packages = await analyzePackages(projectDir);
|
|
235
|
-
const activeItems = await getItemCounts(devcrumbsDir);
|
|
236
|
-
const recentUpdates = await getRecentUpdates(devcrumbsDir, 7);
|
|
237
|
-
const staticContext = await readProjectMd(devcrumbsDir);
|
|
238
|
-
|
|
239
|
-
const response: ContextResponse = {
|
|
240
|
-
context_level: 'quick',
|
|
241
|
-
tokens_used: 0,
|
|
242
|
-
dynamic_context: {
|
|
243
|
-
packages,
|
|
244
|
-
active_items: activeItems,
|
|
245
|
-
recent_updates: recentUpdates,
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
if (staticContext) {
|
|
250
|
-
response.static_context = staticContext;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
response.tokens_used = estimateTokens(response);
|
|
254
|
-
|
|
255
|
-
// Add suggestions
|
|
256
|
-
const suggestions: string[] = [];
|
|
257
|
-
if (!staticContext) {
|
|
258
|
-
suggestions.push('Consider creating .devcrumbs/PROJECT.md for static context');
|
|
259
|
-
}
|
|
260
|
-
if (activeItems.by_status.blocked > 0) {
|
|
261
|
-
suggestions.push(`${activeItems.by_status.blocked} blocked items need attention`);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (suggestions.length > 0) {
|
|
265
|
-
response.suggestions = suggestions;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
return response;
|
|
269
|
-
}
|
package/src/core/get.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["get.ts"],"names":[],"mappings":";;AAaA,0BAyBC;AAtCD,qCAAmD;AACnD,yCAAiC;AAEjC,gDAAmE;AAOnE;;GAEG;AACI,KAAK,UAAU,OAAO,CAAC,SAAiB,EAAE,MAAc;IAC7D,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,sBAAW,EAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,4BAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC;IAEpE,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,IAAA,oBAAU,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9F,OAAO;QACL,QAAQ;QACR,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
package/src/core/get.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import type { ItemMetadata } from '../schemas/index.js';
|
|
4
|
-
import { TYPE_TO_DIRECTORY, parseItemId } from '../utils/index.js';
|
|
5
|
-
|
|
6
|
-
export interface GetItemResult {
|
|
7
|
-
metadata: ItemMetadata;
|
|
8
|
-
description: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Core business logic for getting an item
|
|
13
|
-
*/
|
|
14
|
-
export async function getItem(devcrumbsDir: string, itemId: string): Promise<GetItemResult> {
|
|
15
|
-
if (!existsSync(devcrumbsDir)) {
|
|
16
|
-
throw new Error('Project not initialized. Run devcrumbs-init first.');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const parsed = parseItemId(itemId);
|
|
20
|
-
if (!parsed) {
|
|
21
|
-
throw new Error(`Invalid item ID: ${itemId}`);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const typeFolder = TYPE_TO_DIRECTORY[parsed.type];
|
|
25
|
-
const metadataPath = join(devcrumbsDir, typeFolder, `${itemId}.json`);
|
|
26
|
-
const descriptionPath = join(devcrumbsDir, typeFolder, `${itemId}.md`);
|
|
27
|
-
|
|
28
|
-
if (!existsSync(metadataPath)) {
|
|
29
|
-
throw new Error(`Item not found: ${itemId}`);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const metadata: ItemMetadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
33
|
-
const description = existsSync(descriptionPath) ? readFileSync(descriptionPath, 'utf-8') : '';
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
metadata,
|
|
37
|
-
description,
|
|
38
|
-
};
|
|
39
|
-
}
|
package/src/core/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,mCAAyE;AAAhE,iGAAA,OAAO,OAAA;AAChB,mCAAuD;AAA9C,iGAAA,OAAO,OAAA;AAChB,qCAAgF;AAAvE,oGAAA,SAAS,OAAA;AAClB,yCAAqF;AAA5E,uGAAA,UAAU,OAAA;AACnB,2CAMsB;AALpB,yGAAA,WAAW,OAAA;AAEX,wGAAA,UAAU,OAAA;AAIZ,2CAOsB;AANpB,6GAAA,eAAe,OAAA;AACf,6GAAA,eAAe,OAAA;AACf,2GAAA,aAAa,OAAA;AACb,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AACb,4GAAA,cAAc,OAAA;AAEhB,mDAK0B;AAJxB,iHAAA,eAAe,OAAA;AACf,6GAAA,WAAW,OAAA;AACX,gHAAA,cAAc,OAAA"}
|
package/src/core/index.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export { addItem, type AddItemArgs, type AddItemResult } from './add.js';
|
|
2
|
-
export { getItem, type GetItemResult } from './get.js';
|
|
3
|
-
export { listItems, type ListItemsArgs, type ListItemsResult } from './list.js';
|
|
4
|
-
export { updateItem, type UpdateItemArgs, type UpdateItemResult } from './update.js';
|
|
5
|
-
export {
|
|
6
|
-
archiveItem,
|
|
7
|
-
type ArchiveItemResult,
|
|
8
|
-
purgeItems,
|
|
9
|
-
type PurgeItemsArgs,
|
|
10
|
-
type PurgeItemsResult,
|
|
11
|
-
} from './archive.js';
|
|
12
|
-
export {
|
|
13
|
-
getQuickContext,
|
|
14
|
-
analyzePackages,
|
|
15
|
-
getItemCounts,
|
|
16
|
-
getRecentUpdates,
|
|
17
|
-
readProjectMd,
|
|
18
|
-
estimateTokens,
|
|
19
|
-
} from './context.js';
|
|
20
|
-
export {
|
|
21
|
-
bulkUpdateItems,
|
|
22
|
-
bulkAddTags,
|
|
23
|
-
bulkRemoveTags,
|
|
24
|
-
type BulkUpdateResult,
|
|
25
|
-
} from './bulk-update.js';
|
|
26
|
-
export { validateRelationship, type ValidationResult, type WorkItem } from './validation.js';
|
package/src/core/list.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["list.ts"],"names":[],"mappings":"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"}
|
package/src/core/list.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import type {
|
|
4
|
-
DevCrumbsIndex,
|
|
5
|
-
EisenhowerQuadrant,
|
|
6
|
-
ItemStatus,
|
|
7
|
-
ItemType,
|
|
8
|
-
Priority,
|
|
9
|
-
} from '../schemas/index.js';
|
|
10
|
-
import { TYPE_TO_DIRECTORY } from '../utils/index.js';
|
|
11
|
-
|
|
12
|
-
export interface ListItemsArgs {
|
|
13
|
-
type?: ItemType;
|
|
14
|
-
status?: ItemStatus;
|
|
15
|
-
priority?: Priority;
|
|
16
|
-
assignee?: string;
|
|
17
|
-
tags?: string[];
|
|
18
|
-
eisenhower?: EisenhowerQuadrant;
|
|
19
|
-
limit?: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface ListItemsResult {
|
|
23
|
-
count: number;
|
|
24
|
-
items: DevCrumbsIndex['items'];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Core business logic for listing items with filters
|
|
29
|
-
*/
|
|
30
|
-
export async function listItems(
|
|
31
|
-
devcrumbsDir: string,
|
|
32
|
-
args: ListItemsArgs = {}
|
|
33
|
-
): Promise<ListItemsResult> {
|
|
34
|
-
if (!existsSync(devcrumbsDir)) {
|
|
35
|
-
throw new Error('Project not initialized. Run devcrumbs-init first.');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const indexPath = join(devcrumbsDir, 'index.json');
|
|
39
|
-
const index: DevCrumbsIndex = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
40
|
-
|
|
41
|
-
let items = [...index.items];
|
|
42
|
-
|
|
43
|
-
// Apply filters
|
|
44
|
-
if (args.type) {
|
|
45
|
-
items = items.filter((i) => i.type === args.type);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (args.status) {
|
|
49
|
-
items = items.filter((i) => i.status === args.status);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (args.priority) {
|
|
53
|
-
items = items.filter((i) => i.priority === args.priority);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (args.assignee) {
|
|
57
|
-
// Load full metadata for assignee filter
|
|
58
|
-
items = items.filter((i) => {
|
|
59
|
-
const metadataPath = join(devcrumbsDir, TYPE_TO_DIRECTORY[i.type], `${i.id}.json`);
|
|
60
|
-
if (!existsSync(metadataPath)) return false;
|
|
61
|
-
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
62
|
-
return metadata.assignee === args.assignee;
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (args.tags && args.tags.length > 0) {
|
|
67
|
-
// Load full metadata for tags filter
|
|
68
|
-
const filterTags = args.tags;
|
|
69
|
-
items = items.filter((i) => {
|
|
70
|
-
const metadataPath = join(devcrumbsDir, TYPE_TO_DIRECTORY[i.type], `${i.id}.json`);
|
|
71
|
-
if (!existsSync(metadataPath)) return false;
|
|
72
|
-
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
73
|
-
return filterTags.every((tag) => metadata.tags.includes(tag));
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (args.eisenhower) {
|
|
78
|
-
// Load full metadata for eisenhower filter
|
|
79
|
-
items = items.filter((i) => {
|
|
80
|
-
const metadataPath = join(devcrumbsDir, TYPE_TO_DIRECTORY[i.type], `${i.id}.json`);
|
|
81
|
-
if (!existsSync(metadataPath)) return false;
|
|
82
|
-
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
83
|
-
return metadata.eisenhower === args.eisenhower;
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Apply limit
|
|
88
|
-
if (args.limit && args.limit > 0) {
|
|
89
|
-
items = items.slice(0, args.limit);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
-
count: items.length,
|
|
94
|
-
items,
|
|
95
|
-
};
|
|
96
|
-
}
|
package/src/core/update.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["update.ts"],"names":[],"mappings":"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"}
|