@autocode-cli/autocode 0.3.0 → 0.5.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/dist/core/config.d.ts +20 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +54 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/features.d.ts +24 -0
- package/dist/core/features.d.ts.map +1 -0
- package/dist/core/features.js +33 -0
- package/dist/core/features.js.map +1 -0
- package/dist/core/implementations/FilesystemIssueRepository.d.ts +18 -0
- package/dist/core/implementations/FilesystemIssueRepository.d.ts.map +1 -0
- package/dist/core/implementations/FilesystemIssueRepository.js +149 -0
- package/dist/core/implementations/FilesystemIssueRepository.js.map +1 -0
- package/dist/core/interfaces/IHierarchyService.d.ts +32 -0
- package/dist/core/interfaces/IHierarchyService.d.ts.map +1 -0
- package/dist/core/interfaces/IHierarchyService.js +2 -0
- package/dist/core/interfaces/IHierarchyService.js.map +1 -0
- package/dist/core/interfaces/IIssueRepository.d.ts +55 -0
- package/dist/core/interfaces/IIssueRepository.d.ts.map +1 -0
- package/dist/core/interfaces/IIssueRepository.js +2 -0
- package/dist/core/interfaces/IIssueRepository.js.map +1 -0
- package/dist/core/interfaces/IPipelineService.d.ts +38 -0
- package/dist/core/interfaces/IPipelineService.d.ts.map +1 -0
- package/dist/core/interfaces/IPipelineService.js +2 -0
- package/dist/core/interfaces/IPipelineService.js.map +1 -0
- package/dist/core/interfaces/IWorkflowService.d.ts +38 -0
- package/dist/core/interfaces/IWorkflowService.d.ts.map +1 -0
- package/dist/core/interfaces/IWorkflowService.js +2 -0
- package/dist/core/interfaces/IWorkflowService.js.map +1 -0
- package/dist/core/interfaces/index.d.ts +5 -0
- package/dist/core/interfaces/index.d.ts.map +1 -0
- package/dist/core/interfaces/index.js +2 -0
- package/dist/core/interfaces/index.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface AutoCodeConfig {
|
|
2
|
+
root: string;
|
|
3
|
+
issuesPath: string;
|
|
4
|
+
pipelinesPath: string;
|
|
5
|
+
catalogPath: string;
|
|
6
|
+
port: number;
|
|
7
|
+
host: string;
|
|
8
|
+
claude: {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
model: string;
|
|
12
|
+
};
|
|
13
|
+
features: {
|
|
14
|
+
useNewDashboard: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare function loadConfig(): AutoCodeConfig;
|
|
18
|
+
export declare function getConfig(): AutoCodeConfig;
|
|
19
|
+
export declare function resetConfig(): void;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAE7B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IAGnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IAGZ,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IAGD,QAAQ,EAAE;QACR,eAAe,EAAE,OAAO,CAAA;KACzB,CAAA;CACF;AAmBD,wBAAgB,UAAU,IAAI,cAAc,CA2B3C;AAKD,wBAAgB,SAAS,IAAI,cAAc,CAK1C;AAGD,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
function getEnvBoolean(key, defaultValue) {
|
|
4
|
+
const value = process.env[key];
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return defaultValue;
|
|
7
|
+
return value === 'true' || value === '1';
|
|
8
|
+
}
|
|
9
|
+
function getEnvNumber(key, defaultValue) {
|
|
10
|
+
const value = process.env[key];
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
return defaultValue;
|
|
13
|
+
const parsed = parseInt(value, 10);
|
|
14
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
15
|
+
}
|
|
16
|
+
function getEnvString(key, defaultValue) {
|
|
17
|
+
return process.env[key] || defaultValue;
|
|
18
|
+
}
|
|
19
|
+
export function loadConfig() {
|
|
20
|
+
const root = resolve(getEnvString('AUTOCODE_ROOT', '.'));
|
|
21
|
+
// Valider que le root existe
|
|
22
|
+
if (!existsSync(root)) {
|
|
23
|
+
throw new Error(`AUTOCODE_ROOT does not exist: ${root}`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
root,
|
|
27
|
+
issuesPath: resolve(root, 'issues'),
|
|
28
|
+
pipelinesPath: resolve(root, 'pipelines'),
|
|
29
|
+
catalogPath: resolve(root, 'catalog'),
|
|
30
|
+
port: getEnvNumber('AUTOCODE_PORT', 3456),
|
|
31
|
+
host: getEnvString('AUTOCODE_HOST', 'localhost'),
|
|
32
|
+
claude: {
|
|
33
|
+
enabled: getEnvBoolean('CLAUDE_ENABLED', false),
|
|
34
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
35
|
+
model: getEnvString('ANTHROPIC_MODEL', 'claude-3-5-sonnet-20241022')
|
|
36
|
+
},
|
|
37
|
+
features: {
|
|
38
|
+
useNewDashboard: getEnvBoolean('AUTOCODE_USE_NEW_DASHBOARD', false)
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Singleton pour accès global
|
|
43
|
+
let _config = null;
|
|
44
|
+
export function getConfig() {
|
|
45
|
+
if (!_config) {
|
|
46
|
+
_config = loadConfig();
|
|
47
|
+
}
|
|
48
|
+
return _config;
|
|
49
|
+
}
|
|
50
|
+
// Pour les tests
|
|
51
|
+
export function resetConfig() {
|
|
52
|
+
_config = null;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA0B9B,SAAS,aAAa,CAAC,GAAW,EAAE,YAAqB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IAC5C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAA;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,YAAoB;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAA;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,YAAoB;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAA;IAExD,6BAA6B;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;QACnC,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;QACzC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;QAErC,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC;QACzC,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,WAAW,CAAC;QAEhD,MAAM,EAAE;YACN,OAAO,EAAE,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC;YAC/C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACrC,KAAK,EAAE,YAAY,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACrE;QAED,QAAQ,EAAE;YACR,eAAe,EAAE,aAAa,CAAC,4BAA4B,EAAE,KAAK,CAAC;SACpE;KACF,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,IAAI,OAAO,GAA0B,IAAI,CAAA;AAEzC,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,UAAU,EAAE,CAAA;IACxB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,WAAW;IACzB,OAAO,GAAG,IAAI,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface FeatureFlags {
|
|
2
|
+
/**
|
|
3
|
+
* Utiliser le nouveau dashboard Nuxt
|
|
4
|
+
* false = ancien dashboard Node.js
|
|
5
|
+
* true = nouveau dashboard Nuxt
|
|
6
|
+
*/
|
|
7
|
+
useNewDashboard: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Utiliser les nouvelles API Nitro
|
|
10
|
+
* false = anciennes routes HTTP
|
|
11
|
+
* true = nouvelles routes Nitro
|
|
12
|
+
*/
|
|
13
|
+
useNitroApi: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Activer le mode debug migration
|
|
16
|
+
* Affiche des logs détaillés de comparaison
|
|
17
|
+
*/
|
|
18
|
+
migrationDebug: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function loadFeatureFlags(): FeatureFlags;
|
|
21
|
+
export declare function getFeatureFlags(): FeatureFlags;
|
|
22
|
+
export declare function resetFeatureFlags(): void;
|
|
23
|
+
export declare function isFeatureEnabled(feature: keyof FeatureFlags): boolean;
|
|
24
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/core/features.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAA;IAExB;;;;OAIG;IACH,WAAW,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAA;CACxB;AAaD,wBAAgB,gBAAgB,IAAI,YAAY,CAe/C;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,OAAO,CAErE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const defaultFlags = {
|
|
2
|
+
useNewDashboard: false,
|
|
3
|
+
useNitroApi: false,
|
|
4
|
+
migrationDebug: false
|
|
5
|
+
};
|
|
6
|
+
function parseBoolean(value, defaultValue) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return defaultValue;
|
|
9
|
+
return value === 'true' || value === '1';
|
|
10
|
+
}
|
|
11
|
+
export function loadFeatureFlags() {
|
|
12
|
+
return {
|
|
13
|
+
useNewDashboard: parseBoolean(process.env.AUTOCODE_USE_NEW_DASHBOARD, defaultFlags.useNewDashboard),
|
|
14
|
+
useNitroApi: parseBoolean(process.env.AUTOCODE_USE_NITRO_API, defaultFlags.useNitroApi),
|
|
15
|
+
migrationDebug: parseBoolean(process.env.AUTOCODE_MIGRATION_DEBUG, defaultFlags.migrationDebug)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Singleton
|
|
19
|
+
let _flags = null;
|
|
20
|
+
export function getFeatureFlags() {
|
|
21
|
+
if (!_flags) {
|
|
22
|
+
_flags = loadFeatureFlags();
|
|
23
|
+
}
|
|
24
|
+
return _flags;
|
|
25
|
+
}
|
|
26
|
+
export function resetFeatureFlags() {
|
|
27
|
+
_flags = null;
|
|
28
|
+
}
|
|
29
|
+
// Helper pour utilisation dans le code
|
|
30
|
+
export function isFeatureEnabled(feature) {
|
|
31
|
+
return getFeatureFlags()[feature];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/core/features.ts"],"names":[],"mappings":"AAsBA,MAAM,YAAY,GAAiB;IACjC,eAAe,EAAE,KAAK;IACtB,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,KAAK;CACtB,CAAA;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,YAAqB;IACpE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IAC5C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,eAAe,EAAE,YAAY,CAC3B,OAAO,CAAC,GAAG,CAAC,0BAA0B,EACtC,YAAY,CAAC,eAAe,CAC7B;QACD,WAAW,EAAE,YAAY,CACvB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAClC,YAAY,CAAC,WAAW,CACzB;QACD,cAAc,EAAE,YAAY,CAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EACpC,YAAY,CAAC,cAAc,CAC5B;KACF,CAAA;AACH,CAAC;AAED,YAAY;AACZ,IAAI,MAAM,GAAwB,IAAI,CAAA;AAEtC,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,gBAAgB,EAAE,CAAA;IAC7B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,IAAI,CAAA;AACf,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,OAAO,eAAe,EAAE,CAAC,OAAO,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Issue, CreateIssueInput, ListIssuesOptions, IIssueRepository } from '../interfaces/index.js';
|
|
2
|
+
export declare class FilesystemIssueRepository implements IIssueRepository {
|
|
3
|
+
private readonly rootDir;
|
|
4
|
+
constructor(rootDir: string);
|
|
5
|
+
get(key: string): Promise<Issue | null>;
|
|
6
|
+
list(options?: ListIssuesOptions): Promise<Issue[]>;
|
|
7
|
+
create(input: CreateIssueInput): Promise<Issue>;
|
|
8
|
+
update(key: string, changes: Partial<Issue>): Promise<Issue>;
|
|
9
|
+
archive(key: string): Promise<void>;
|
|
10
|
+
move(key: string, targetColumn: string): Promise<Issue>;
|
|
11
|
+
moveToNext(key: string): Promise<Issue>;
|
|
12
|
+
private generateKey;
|
|
13
|
+
private findIssueDir;
|
|
14
|
+
private getColumnDirs;
|
|
15
|
+
private readIssue;
|
|
16
|
+
private matchesSearch;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=FilesystemIssueRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesystemIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/core/implementations/FilesystemIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAK1G,qBAAa,yBAA0B,YAAW,gBAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAOvC,IAAI,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA8BvD,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC;IAiC/C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IA2B5D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAWvD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAO7C,OAAO,CAAC,WAAW;YAKL,YAAY;YAWZ,aAAa;YAOb,SAAS;IAqBvB,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { readdir, readFile, writeFile, mkdir, rename } from 'fs/promises';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
export class FilesystemIssueRepository {
|
|
5
|
+
rootDir;
|
|
6
|
+
constructor(rootDir) {
|
|
7
|
+
this.rootDir = rootDir;
|
|
8
|
+
}
|
|
9
|
+
async get(key) {
|
|
10
|
+
const issueDir = await this.findIssueDir(key);
|
|
11
|
+
if (!issueDir)
|
|
12
|
+
return null;
|
|
13
|
+
return this.readIssue(issueDir, key);
|
|
14
|
+
}
|
|
15
|
+
async list(options = {}) {
|
|
16
|
+
const columns = await this.getColumnDirs();
|
|
17
|
+
const issues = [];
|
|
18
|
+
for (const column of columns) {
|
|
19
|
+
if (options.column && column.slug !== options.column)
|
|
20
|
+
continue;
|
|
21
|
+
const columnPath = join(this.rootDir, column.slug);
|
|
22
|
+
const entries = await readdir(columnPath, { withFileTypes: true });
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
if (!entry.isDirectory())
|
|
25
|
+
continue;
|
|
26
|
+
if (!entry.name.match(/^AC-\d{6}$/))
|
|
27
|
+
continue;
|
|
28
|
+
const issue = await this.readIssue(join(columnPath, entry.name), entry.name);
|
|
29
|
+
if (issue) {
|
|
30
|
+
if (options.search && !this.matchesSearch(issue, options.search))
|
|
31
|
+
continue;
|
|
32
|
+
if (options.parent && issue.parent_key !== options.parent)
|
|
33
|
+
continue;
|
|
34
|
+
issues.push(issue);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (options.limit) {
|
|
39
|
+
return issues.slice(0, options.limit);
|
|
40
|
+
}
|
|
41
|
+
return issues;
|
|
42
|
+
}
|
|
43
|
+
async create(input) {
|
|
44
|
+
const key = this.generateKey();
|
|
45
|
+
const issuePath = join(this.rootDir, 'backlog', key);
|
|
46
|
+
await mkdir(issuePath, { recursive: true });
|
|
47
|
+
const metadata = {
|
|
48
|
+
title: input.title,
|
|
49
|
+
priority: input.priority,
|
|
50
|
+
parent_key: input.parent_key,
|
|
51
|
+
acceptance_criteria: input.acceptance_criteria,
|
|
52
|
+
created_at: new Date().toISOString(),
|
|
53
|
+
updated_at: new Date().toISOString()
|
|
54
|
+
};
|
|
55
|
+
await writeFile(join(issuePath, 'metadata.json'), JSON.stringify(metadata, null, 2));
|
|
56
|
+
await writeFile(join(issuePath, 'description.md'), input.description);
|
|
57
|
+
return {
|
|
58
|
+
key,
|
|
59
|
+
...metadata,
|
|
60
|
+
description: input.description,
|
|
61
|
+
column_slug: 'backlog'
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async update(key, changes) {
|
|
65
|
+
const issueDir = await this.findIssueDir(key);
|
|
66
|
+
if (!issueDir)
|
|
67
|
+
throw new Error(`Issue ${key} not found`);
|
|
68
|
+
const current = await this.readIssue(issueDir, key);
|
|
69
|
+
if (!current)
|
|
70
|
+
throw new Error(`Issue ${key} not found`);
|
|
71
|
+
const updated = {
|
|
72
|
+
...current,
|
|
73
|
+
...changes,
|
|
74
|
+
updated_at: new Date().toISOString()
|
|
75
|
+
};
|
|
76
|
+
const { description, key: _key, column_slug: _column_slug, ...metadata } = updated;
|
|
77
|
+
await writeFile(join(issueDir, 'metadata.json'), JSON.stringify(metadata, null, 2));
|
|
78
|
+
if (changes.description) {
|
|
79
|
+
await writeFile(join(issueDir, 'description.md'), changes.description);
|
|
80
|
+
}
|
|
81
|
+
return updated;
|
|
82
|
+
}
|
|
83
|
+
async archive(key) {
|
|
84
|
+
const issueDir = await this.findIssueDir(key);
|
|
85
|
+
if (!issueDir)
|
|
86
|
+
throw new Error(`Issue ${key} not found`);
|
|
87
|
+
const archiveDir = join(this.rootDir, '_archive', key);
|
|
88
|
+
await mkdir(dirname(archiveDir), { recursive: true });
|
|
89
|
+
await rename(issueDir, archiveDir);
|
|
90
|
+
}
|
|
91
|
+
async move(key, targetColumn) {
|
|
92
|
+
const issueDir = await this.findIssueDir(key);
|
|
93
|
+
if (!issueDir)
|
|
94
|
+
throw new Error(`Issue ${key} not found`);
|
|
95
|
+
const targetDir = join(this.rootDir, targetColumn, key);
|
|
96
|
+
await mkdir(dirname(targetDir), { recursive: true });
|
|
97
|
+
await rename(issueDir, targetDir);
|
|
98
|
+
return this.get(key);
|
|
99
|
+
}
|
|
100
|
+
async moveToNext(key) {
|
|
101
|
+
// Déléguer au WorkflowService pour déterminer la colonne suivante
|
|
102
|
+
throw new Error('Use WorkflowService.moveToNext instead');
|
|
103
|
+
}
|
|
104
|
+
// Private helpers
|
|
105
|
+
generateKey() {
|
|
106
|
+
const num = Math.floor(Math.random() * 1000000);
|
|
107
|
+
return `AC-${num.toString().padStart(6, '0')}`;
|
|
108
|
+
}
|
|
109
|
+
async findIssueDir(key) {
|
|
110
|
+
const columns = await this.getColumnDirs();
|
|
111
|
+
for (const column of columns) {
|
|
112
|
+
const path = join(this.rootDir, column.slug, key);
|
|
113
|
+
if (existsSync(path))
|
|
114
|
+
return path;
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
async getColumnDirs() {
|
|
119
|
+
const entries = await readdir(this.rootDir, { withFileTypes: true });
|
|
120
|
+
return entries
|
|
121
|
+
.filter(e => e.isDirectory() && !e.name.startsWith('_'))
|
|
122
|
+
.map(e => ({ slug: e.name }));
|
|
123
|
+
}
|
|
124
|
+
async readIssue(dir, key) {
|
|
125
|
+
try {
|
|
126
|
+
const metadataRaw = await readFile(join(dir, 'metadata.json'), 'utf-8');
|
|
127
|
+
const metadata = JSON.parse(metadataRaw);
|
|
128
|
+
const description = await readFile(join(dir, 'description.md'), 'utf-8')
|
|
129
|
+
.catch(() => '');
|
|
130
|
+
const column_slug = dir.split('/').at(-2) || 'unknown';
|
|
131
|
+
return {
|
|
132
|
+
key,
|
|
133
|
+
column_slug,
|
|
134
|
+
description,
|
|
135
|
+
...metadata
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
matchesSearch(issue, search) {
|
|
143
|
+
const lower = search.toLowerCase();
|
|
144
|
+
return (issue.title.toLowerCase().includes(lower) ||
|
|
145
|
+
issue.description.toLowerCase().includes(lower) ||
|
|
146
|
+
issue.key.toLowerCase().includes(lower));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=FilesystemIssueRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesystemIssueRepository.js","sourceRoot":"","sources":["../../../src/core/implementations/FilesystemIssueRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Issue } from './IIssueRepository.js';
|
|
2
|
+
export interface IssueTreeNode extends Issue {
|
|
3
|
+
children?: IssueTreeNode[];
|
|
4
|
+
}
|
|
5
|
+
export interface IHierarchyService {
|
|
6
|
+
/**
|
|
7
|
+
* Définit le parent d'une issue
|
|
8
|
+
* @throws Error si création d'un cycle
|
|
9
|
+
*/
|
|
10
|
+
setParent(childKey: string, parentKey: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Retire le parent d'une issue
|
|
13
|
+
*/
|
|
14
|
+
removeParent(childKey: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Récupère les enfants directs
|
|
17
|
+
*/
|
|
18
|
+
getChildren(parentKey: string): Promise<Issue[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Récupère tout le sous-arbre
|
|
21
|
+
*/
|
|
22
|
+
getSubtree(rootKey: string): Promise<IssueTreeNode>;
|
|
23
|
+
/**
|
|
24
|
+
* Vérifie si tous les enfants sont terminés
|
|
25
|
+
*/
|
|
26
|
+
areAllChildrenDone(parentKey: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Récupère le chemin vers la racine
|
|
29
|
+
*/
|
|
30
|
+
getAncestors(key: string): Promise<Issue[]>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=IHierarchyService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IHierarchyService.d.ts","sourceRoot":"","sources":["../../../src/core/interfaces/IHierarchyService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAElD,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IAEhD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAEnD;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;CAC5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IHierarchyService.js","sourceRoot":"","sources":["../../../src/core/interfaces/IHierarchyService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface Issue {
|
|
2
|
+
key: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
column_slug: string;
|
|
6
|
+
priority?: 'low' | 'medium' | 'high' | 'critical';
|
|
7
|
+
parent_key?: string;
|
|
8
|
+
created_at: string;
|
|
9
|
+
updated_at: string;
|
|
10
|
+
acceptance_criteria?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CreateIssueInput {
|
|
13
|
+
title: string;
|
|
14
|
+
description: string;
|
|
15
|
+
priority?: Issue['priority'];
|
|
16
|
+
parent_key?: string;
|
|
17
|
+
acceptance_criteria?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface ListIssuesOptions {
|
|
20
|
+
column?: string;
|
|
21
|
+
search?: string;
|
|
22
|
+
limit?: number;
|
|
23
|
+
parent?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface IIssueRepository {
|
|
26
|
+
/**
|
|
27
|
+
* Récupère une issue par sa clé
|
|
28
|
+
*/
|
|
29
|
+
get(key: string): Promise<Issue | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Liste les issues avec filtres optionnels
|
|
32
|
+
*/
|
|
33
|
+
list(options?: ListIssuesOptions): Promise<Issue[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Crée une nouvelle issue
|
|
36
|
+
*/
|
|
37
|
+
create(input: CreateIssueInput): Promise<Issue>;
|
|
38
|
+
/**
|
|
39
|
+
* Met à jour une issue existante
|
|
40
|
+
*/
|
|
41
|
+
update(key: string, changes: Partial<Issue>): Promise<Issue>;
|
|
42
|
+
/**
|
|
43
|
+
* Archive une issue (soft delete)
|
|
44
|
+
*/
|
|
45
|
+
archive(key: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Déplace une issue vers une colonne
|
|
48
|
+
*/
|
|
49
|
+
move(key: string, targetColumn: string): Promise<Issue>;
|
|
50
|
+
/**
|
|
51
|
+
* Déplace vers la colonne suivante du pipeline
|
|
52
|
+
*/
|
|
53
|
+
moveToNext(key: string): Promise<Issue>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=IIssueRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/core/interfaces/IIssueRepository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IAEvC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IAEnD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAE/C;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAE5D;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEnC;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAEvD;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IIssueRepository.js","sourceRoot":"","sources":["../../../src/core/interfaces/IIssueRepository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Column } from './IWorkflowService.js';
|
|
2
|
+
export interface Pipeline {
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
active: boolean;
|
|
6
|
+
columns: Column[];
|
|
7
|
+
}
|
|
8
|
+
export interface IPipelineService {
|
|
9
|
+
/**
|
|
10
|
+
* Liste tous les pipelines
|
|
11
|
+
*/
|
|
12
|
+
list(): Promise<Pipeline[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Récupère le pipeline actif
|
|
15
|
+
*/
|
|
16
|
+
getActive(): Promise<Pipeline | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Récupère un pipeline par nom
|
|
19
|
+
*/
|
|
20
|
+
get(name: string): Promise<Pipeline | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Crée un nouveau pipeline
|
|
23
|
+
*/
|
|
24
|
+
create(pipeline: Omit<Pipeline, 'active'>): Promise<Pipeline>;
|
|
25
|
+
/**
|
|
26
|
+
* Met à jour un pipeline
|
|
27
|
+
*/
|
|
28
|
+
update(name: string, changes: Partial<Pipeline>): Promise<Pipeline>;
|
|
29
|
+
/**
|
|
30
|
+
* Active un pipeline
|
|
31
|
+
*/
|
|
32
|
+
activate(name: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Supprime un pipeline
|
|
35
|
+
*/
|
|
36
|
+
delete(name: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=IPipelineService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPipelineService.d.ts","sourceRoot":"","sources":["../../../src/core/interfaces/IPipelineService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE3B;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAErC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE3C;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE7D;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEnE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAErC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPipelineService.js","sourceRoot":"","sources":["../../../src/core/interfaces/IPipelineService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface Column {
|
|
2
|
+
name: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
wip_limit?: number;
|
|
5
|
+
actions?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TransitionResult {
|
|
8
|
+
allowed: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
targetColumn?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface IWorkflowService {
|
|
13
|
+
/**
|
|
14
|
+
* Récupère toutes les colonnes du pipeline
|
|
15
|
+
*/
|
|
16
|
+
getColumns(): Promise<Column[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Récupère une colonne par son slug
|
|
19
|
+
*/
|
|
20
|
+
getColumn(slug: string): Promise<Column | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Vérifie si une transition est autorisée
|
|
23
|
+
*/
|
|
24
|
+
canTransition(issueKey: string, targetColumn: string): Promise<TransitionResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Récupère la colonne suivante dans le pipeline
|
|
27
|
+
*/
|
|
28
|
+
getNextColumn(currentColumn: string): Promise<Column | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Vérifie la limite WIP d'une colonne
|
|
31
|
+
*/
|
|
32
|
+
checkWipLimit(columnSlug: string): Promise<{
|
|
33
|
+
ok: boolean;
|
|
34
|
+
current: number;
|
|
35
|
+
limit?: number;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=IWorkflowService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IWorkflowService.d.ts","sourceRoot":"","sources":["../../../src/core/interfaces/IWorkflowService.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAE/B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAE/C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAEhF;;OAEG;IACH,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAE5D;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IWorkflowService.js","sourceRoot":"","sources":["../../../src/core/interfaces/IWorkflowService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { Issue, CreateIssueInput, ListIssuesOptions, IIssueRepository } from './IIssueRepository.js';
|
|
2
|
+
export type { IssueTreeNode, IHierarchyService } from './IHierarchyService.js';
|
|
3
|
+
export type { Column, TransitionResult, IWorkflowService } from './IWorkflowService.js';
|
|
4
|
+
export type { Pipeline, IPipelineService } from './IPipelineService.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACzG,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC9E,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACvF,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/interfaces/index.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autocode-cli/autocode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Filesystem-based issues system with web dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@playwright/test": "^1.57.0",
|
|
56
56
|
"@types/node": "^22.10.2",
|
|
57
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
57
58
|
"concurrently": "^9.2.1",
|
|
58
59
|
"cypress": "^15.8.1",
|
|
59
60
|
"nodemon": "^3.1.11",
|