@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.
Files changed (33) hide show
  1. package/dist/core/config.d.ts +20 -0
  2. package/dist/core/config.d.ts.map +1 -0
  3. package/dist/core/config.js +54 -0
  4. package/dist/core/config.js.map +1 -0
  5. package/dist/core/features.d.ts +24 -0
  6. package/dist/core/features.d.ts.map +1 -0
  7. package/dist/core/features.js +33 -0
  8. package/dist/core/features.js.map +1 -0
  9. package/dist/core/implementations/FilesystemIssueRepository.d.ts +18 -0
  10. package/dist/core/implementations/FilesystemIssueRepository.d.ts.map +1 -0
  11. package/dist/core/implementations/FilesystemIssueRepository.js +149 -0
  12. package/dist/core/implementations/FilesystemIssueRepository.js.map +1 -0
  13. package/dist/core/interfaces/IHierarchyService.d.ts +32 -0
  14. package/dist/core/interfaces/IHierarchyService.d.ts.map +1 -0
  15. package/dist/core/interfaces/IHierarchyService.js +2 -0
  16. package/dist/core/interfaces/IHierarchyService.js.map +1 -0
  17. package/dist/core/interfaces/IIssueRepository.d.ts +55 -0
  18. package/dist/core/interfaces/IIssueRepository.d.ts.map +1 -0
  19. package/dist/core/interfaces/IIssueRepository.js +2 -0
  20. package/dist/core/interfaces/IIssueRepository.js.map +1 -0
  21. package/dist/core/interfaces/IPipelineService.d.ts +38 -0
  22. package/dist/core/interfaces/IPipelineService.d.ts.map +1 -0
  23. package/dist/core/interfaces/IPipelineService.js +2 -0
  24. package/dist/core/interfaces/IPipelineService.js.map +1 -0
  25. package/dist/core/interfaces/IWorkflowService.d.ts +38 -0
  26. package/dist/core/interfaces/IWorkflowService.d.ts.map +1 -0
  27. package/dist/core/interfaces/IWorkflowService.js +2 -0
  28. package/dist/core/interfaces/IWorkflowService.js.map +1 -0
  29. package/dist/core/interfaces/index.d.ts +5 -0
  30. package/dist/core/interfaces/index.d.ts.map +1 -0
  31. package/dist/core/interfaces/index.js +2 -0
  32. package/dist/core/interfaces/index.js.map +1 -0
  33. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IHierarchyService.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IIssueRepository.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IPipelineService.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IWorkflowService.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -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.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",