taskin 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/commands/commands.types.d.ts +13 -0
- package/dist/commands/commands.types.js +6 -0
- package/dist/commands/commands.types.js.map +1 -0
- package/dist/commands/define-command/define-command.d.ts +6 -0
- package/dist/commands/define-command/define-command.js +27 -0
- package/dist/commands/define-command/define-command.js.map +1 -0
- package/dist/commands/define-command/define-command.test.d.ts +4 -0
- package/dist/commands/define-command/define-command.test.js +125 -0
- package/dist/commands/define-command/define-command.test.js.map +1 -0
- package/dist/commands/define-command/define-command.types.d.ts +49 -0
- package/dist/commands/define-command/define-command.types.js +5 -0
- package/dist/commands/define-command/define-command.types.js.map +1 -0
- package/dist/commands/define-command/index.d.ts +5 -0
- package/dist/commands/define-command/index.js +6 -0
- package/dist/commands/define-command/index.js.map +1 -0
- package/dist/commands/finish.d.ts +4 -0
- package/dist/commands/finish.js +69 -0
- package/dist/commands/finish.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +192 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +4 -0
- package/dist/commands/lint.js +31 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.js +132 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pause.d.ts +4 -0
- package/dist/commands/pause.js +69 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/start.d.ts +4 -0
- package/dist/commands/start.js +70 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/colors.d.ts +26 -0
- package/dist/lib/colors.js +42 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.d.ts +36 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.js +219 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.d.ts +81 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js +152 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.d.ts +4 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.js +146 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.d.ts +52 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.js +6 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.js.map +1 -0
- package/dist/lib/file-system-task-linter/index.d.ts +6 -0
- package/dist/lib/file-system-task-linter/index.js +7 -0
- package/dist/lib/file-system-task-linter/index.js.map +1 -0
- package/dist/lib/help.d.ts +4 -0
- package/dist/lib/help.js +104 -0
- package/dist/lib/help.js.map +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.js +7 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/provider-installer/index.d.ts +5 -0
- package/dist/lib/provider-installer/index.js +6 -0
- package/dist/lib/provider-installer/index.js.map +1 -0
- package/dist/lib/provider-installer/provider-installer.d.ts +28 -0
- package/dist/lib/provider-installer/provider-installer.js +86 -0
- package/dist/lib/provider-installer/provider-installer.js.map +1 -0
- package/dist/lib/provider-installer/provider-installer.types.d.ts +4 -0
- package/dist/lib/provider-installer/provider-installer.types.js +5 -0
- package/dist/lib/provider-installer/provider-installer.types.js.map +1 -0
- package/dist/lib/provider-installer.d.ts +27 -0
- package/dist/lib/provider-installer.js +86 -0
- package/dist/lib/provider-installer.js.map +1 -0
- package/dist/lib/provider-registry/index.d.ts +5 -0
- package/dist/lib/provider-registry/index.js +6 -0
- package/dist/lib/provider-registry/index.js.map +1 -0
- package/dist/lib/provider-registry/provider-registry.d.ts +9 -0
- package/dist/lib/provider-registry/provider-registry.js +111 -0
- package/dist/lib/provider-registry/provider-registry.js.map +1 -0
- package/dist/lib/provider-registry/provider-registry.types.d.ts +5 -0
- package/dist/lib/provider-registry/provider-registry.types.js +6 -0
- package/dist/lib/provider-registry/provider-registry.types.js.map +1 -0
- package/dist/lib/provider-registry.d.ts +26 -0
- package/dist/lib/provider-registry.js +111 -0
- package/dist/lib/provider-registry.js.map +1 -0
- package/dist/lib/task-linter/index.d.ts +5 -0
- package/dist/lib/task-linter/index.js +6 -0
- package/dist/lib/task-linter/index.js.map +1 -0
- package/dist/lib/task-linter/task-linter.d.ts +36 -0
- package/dist/lib/task-linter/task-linter.js +219 -0
- package/dist/lib/task-linter/task-linter.js.map +1 -0
- package/dist/lib/task-linter/task-linter.types.d.ts +52 -0
- package/dist/lib/task-linter/task-linter.types.js +6 -0
- package/dist/lib/task-linter/task-linter.types.js.map +1 -0
- package/dist/lib/task-linter.d.ts +29 -0
- package/dist/lib/task-linter.js +215 -0
- package/dist/lib/task-linter.js.map +1 -0
- package/dist/lib/task-linter.types.d.ts +38 -0
- package/dist/lib/task-linter.types.js +5 -0
- package/dist/lib/task-linter.types.js.map +1 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.js +29 -0
- package/dist/main.js.map +1 -0
- package/dist/taskin.d.ts +33 -0
- package/dist/taskin.js +101 -0
- package/dist/taskin.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/provider-registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry
|
|
3
|
+
* Central registry of available task providers
|
|
4
|
+
*/
|
|
5
|
+
import type { ProviderInfo } from './provider-registry.types.js';
|
|
6
|
+
export declare const AVAILABLE_PROVIDERS: ProviderInfo[];
|
|
7
|
+
export declare function getProviderById(id: string): ProviderInfo | undefined;
|
|
8
|
+
export declare function getAvailableProviders(): ProviderInfo[];
|
|
9
|
+
export declare function getAllProviders(): ProviderInfo[];
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry
|
|
3
|
+
* Central registry of available task providers
|
|
4
|
+
*/
|
|
5
|
+
export const AVAILABLE_PROVIDERS = [
|
|
6
|
+
{
|
|
7
|
+
id: 'fs',
|
|
8
|
+
name: 'š File System',
|
|
9
|
+
description: 'Store tasks as Markdown files in a local TASKS/ directory',
|
|
10
|
+
packageName: '@taskin/fs-task-provider',
|
|
11
|
+
configSchema: {
|
|
12
|
+
required: ['tasksDir'],
|
|
13
|
+
properties: {
|
|
14
|
+
tasksDir: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Directory to store task files',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
status: 'stable',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'redmine',
|
|
24
|
+
name: 'š“ Redmine',
|
|
25
|
+
description: 'Sync tasks with Redmine issues via REST API',
|
|
26
|
+
packageName: '@taskin/redmine-task-provider',
|
|
27
|
+
configSchema: {
|
|
28
|
+
required: ['apiUrl', 'apiKey', 'projectId'],
|
|
29
|
+
properties: {
|
|
30
|
+
apiUrl: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Redmine server URL (e.g., https://redmine.example.com)',
|
|
33
|
+
},
|
|
34
|
+
apiKey: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Your Redmine API key',
|
|
37
|
+
secret: true,
|
|
38
|
+
},
|
|
39
|
+
projectId: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Project identifier or ID',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
status: 'coming-soon',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'jira',
|
|
49
|
+
name: 'šµ Jira',
|
|
50
|
+
description: 'Sync tasks with Jira issues via REST API',
|
|
51
|
+
packageName: '@taskin/jira-task-provider',
|
|
52
|
+
configSchema: {
|
|
53
|
+
required: ['apiUrl', 'email', 'apiToken', 'projectKey'],
|
|
54
|
+
properties: {
|
|
55
|
+
apiUrl: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'Jira server URL (e.g., https://company.atlassian.net)',
|
|
58
|
+
},
|
|
59
|
+
email: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
description: 'Your Atlassian account email',
|
|
62
|
+
},
|
|
63
|
+
apiToken: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'Your Jira API token',
|
|
66
|
+
secret: true,
|
|
67
|
+
},
|
|
68
|
+
projectKey: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Project key (e.g., PROJ)',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
status: 'coming-soon',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'github',
|
|
78
|
+
name: 'š GitHub Issues',
|
|
79
|
+
description: 'Sync tasks with GitHub Issues',
|
|
80
|
+
packageName: '@taskin/github-task-provider',
|
|
81
|
+
configSchema: {
|
|
82
|
+
required: ['owner', 'repo', 'token'],
|
|
83
|
+
properties: {
|
|
84
|
+
owner: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'Repository owner (username or organization)',
|
|
87
|
+
},
|
|
88
|
+
repo: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
description: 'Repository name',
|
|
91
|
+
},
|
|
92
|
+
token: {
|
|
93
|
+
type: 'string',
|
|
94
|
+
description: 'GitHub Personal Access Token',
|
|
95
|
+
secret: true,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
status: 'coming-soon',
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
export function getProviderById(id) {
|
|
103
|
+
return AVAILABLE_PROVIDERS.find((p) => p.id === id);
|
|
104
|
+
}
|
|
105
|
+
export function getAvailableProviders() {
|
|
106
|
+
return AVAILABLE_PROVIDERS.filter((p) => p.status !== 'coming-soon');
|
|
107
|
+
}
|
|
108
|
+
export function getAllProviders() {
|
|
109
|
+
return AVAILABLE_PROVIDERS;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../src/lib/provider-registry/provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD;QACE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;SACF;QACD,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,+BAA+B;QAC5C,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC;YAC3C,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sBAAsB;oBACnC,MAAM,EAAE,IAAI;iBACb;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC;YACvD,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;iBACrE;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;oBAClC,MAAM,EAAE,IAAI;iBACb;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;YACpC,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;oBAC3C,MAAM,EAAE,IAAI;iBACb;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.types.js","sourceRoot":"","sources":["../../../src/lib/provider-registry/provider-registry.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry
|
|
3
|
+
* Central registry of available task providers
|
|
4
|
+
*/
|
|
5
|
+
export interface ProviderInfo {
|
|
6
|
+
configSchema: {
|
|
7
|
+
properties: Record<
|
|
8
|
+
string,
|
|
9
|
+
{
|
|
10
|
+
description: string;
|
|
11
|
+
type: string;
|
|
12
|
+
secret?: boolean;
|
|
13
|
+
}
|
|
14
|
+
>;
|
|
15
|
+
required: string[];
|
|
16
|
+
};
|
|
17
|
+
description: string;
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
packageName: string;
|
|
21
|
+
status: 'stable' | 'beta' | 'coming-soon';
|
|
22
|
+
}
|
|
23
|
+
export declare const AVAILABLE_PROVIDERS: ProviderInfo[];
|
|
24
|
+
export declare function getProviderById(id: string): ProviderInfo | undefined;
|
|
25
|
+
export declare function getAvailableProviders(): ProviderInfo[];
|
|
26
|
+
export declare function getAllProviders(): ProviderInfo[];
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry
|
|
3
|
+
* Central registry of available task providers
|
|
4
|
+
*/
|
|
5
|
+
export const AVAILABLE_PROVIDERS = [
|
|
6
|
+
{
|
|
7
|
+
id: 'fs',
|
|
8
|
+
name: 'š File System',
|
|
9
|
+
description: 'Store tasks as Markdown files in a local TASKS/ directory',
|
|
10
|
+
packageName: '@taskin/fs-task-provider',
|
|
11
|
+
configSchema: {
|
|
12
|
+
required: ['tasksDir'],
|
|
13
|
+
properties: {
|
|
14
|
+
tasksDir: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Directory to store task files',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
status: 'stable',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'redmine',
|
|
24
|
+
name: 'š“ Redmine',
|
|
25
|
+
description: 'Sync tasks with Redmine issues via REST API',
|
|
26
|
+
packageName: '@taskin/redmine-task-provider',
|
|
27
|
+
configSchema: {
|
|
28
|
+
required: ['apiUrl', 'apiKey', 'projectId'],
|
|
29
|
+
properties: {
|
|
30
|
+
apiUrl: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Redmine server URL (e.g., https://redmine.example.com)',
|
|
33
|
+
},
|
|
34
|
+
apiKey: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Your Redmine API key',
|
|
37
|
+
secret: true,
|
|
38
|
+
},
|
|
39
|
+
projectId: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Project identifier or ID',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
status: 'coming-soon',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'jira',
|
|
49
|
+
name: 'šµ Jira',
|
|
50
|
+
description: 'Sync tasks with Jira issues via REST API',
|
|
51
|
+
packageName: '@taskin/jira-task-provider',
|
|
52
|
+
configSchema: {
|
|
53
|
+
required: ['apiUrl', 'email', 'apiToken', 'projectKey'],
|
|
54
|
+
properties: {
|
|
55
|
+
apiUrl: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'Jira server URL (e.g., https://company.atlassian.net)',
|
|
58
|
+
},
|
|
59
|
+
email: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
description: 'Your Atlassian account email',
|
|
62
|
+
},
|
|
63
|
+
apiToken: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'Your Jira API token',
|
|
66
|
+
secret: true,
|
|
67
|
+
},
|
|
68
|
+
projectKey: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Project key (e.g., PROJ)',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
status: 'coming-soon',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'github',
|
|
78
|
+
name: 'š GitHub Issues',
|
|
79
|
+
description: 'Sync tasks with GitHub Issues',
|
|
80
|
+
packageName: '@taskin/github-task-provider',
|
|
81
|
+
configSchema: {
|
|
82
|
+
required: ['owner', 'repo', 'token'],
|
|
83
|
+
properties: {
|
|
84
|
+
owner: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'Repository owner (username or organization)',
|
|
87
|
+
},
|
|
88
|
+
repo: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
description: 'Repository name',
|
|
91
|
+
},
|
|
92
|
+
token: {
|
|
93
|
+
type: 'string',
|
|
94
|
+
description: 'GitHub Personal Access Token',
|
|
95
|
+
secret: true,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
status: 'coming-soon',
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
export function getProviderById(id) {
|
|
103
|
+
return AVAILABLE_PROVIDERS.find((p) => p.id === id);
|
|
104
|
+
}
|
|
105
|
+
export function getAvailableProviders() {
|
|
106
|
+
return AVAILABLE_PROVIDERS.filter((p) => p.status !== 'coming-soon');
|
|
107
|
+
}
|
|
108
|
+
export function getAllProviders() {
|
|
109
|
+
return AVAILABLE_PROVIDERS;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/lib/provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD;QACE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;SACF;QACD,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,+BAA+B;QAC5C,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC;YAC3C,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sBAAsB;oBACnC,MAAM,EAAE,IAAI;iBACb;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC;YACvD,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;iBACrE;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;oBAClC,MAAM,EAAE,IAAI;iBACb;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;YACpC,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;oBAC3C,MAAM,EAAE,IAAI;iBACb;aACF;SACF;QACD,MAAM,EAAE,aAAa;KACtB;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/task-linter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FileLintResult,
|
|
3
|
+
FileValidationError,
|
|
4
|
+
IFileSystemTaskLinter,
|
|
5
|
+
TaskMetadata,
|
|
6
|
+
} from './task-linter.types.js';
|
|
7
|
+
/**
|
|
8
|
+
* FileSystem-specific TaskLinter implementation
|
|
9
|
+
* Validates task markdown files in the local filesystem
|
|
10
|
+
*/
|
|
11
|
+
export declare class TaskLinter implements IFileSystemTaskLinter {
|
|
12
|
+
private errors;
|
|
13
|
+
private addError;
|
|
14
|
+
/**
|
|
15
|
+
* Validate task file name format (FileSystem-specific)
|
|
16
|
+
*/
|
|
17
|
+
validateFileName(fileName: string): FileValidationError | null;
|
|
18
|
+
private extractMetadata;
|
|
19
|
+
/**
|
|
20
|
+
* Validate task metadata (FileSystem-specific)
|
|
21
|
+
*/
|
|
22
|
+
validateMetadata(
|
|
23
|
+
metadata: TaskMetadata,
|
|
24
|
+
filePath: string,
|
|
25
|
+
): FileValidationError[];
|
|
26
|
+
private validateContent;
|
|
27
|
+
/**
|
|
28
|
+
* Lint a single task file (FileSystem-specific)
|
|
29
|
+
*/
|
|
30
|
+
lintFile(filePath: string): Promise<FileValidationError[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Lint all task files in the specified directory (FileSystem-specific)
|
|
33
|
+
*/
|
|
34
|
+
lintDirectory(tasksDir: string): Promise<FileLintResult>;
|
|
35
|
+
static printResults(result: FileLintResult): void;
|
|
36
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { readdir, readFile } from 'fs/promises';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const VALID_STATUSES = ['pending', 'in-progress', 'done', 'blocked'];
|
|
5
|
+
const VALID_TYPES = ['feat', 'fix', 'chore', 'docs', 'refactor', 'test'];
|
|
6
|
+
/**
|
|
7
|
+
* FileSystem-specific TaskLinter implementation
|
|
8
|
+
* Validates task markdown files in the local filesystem
|
|
9
|
+
*/
|
|
10
|
+
export class TaskLinter {
|
|
11
|
+
errors = [];
|
|
12
|
+
addError(file, message, severity = 'error', line) {
|
|
13
|
+
this.errors.push({ file, message, severity, line });
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate task file name format (FileSystem-specific)
|
|
17
|
+
*/
|
|
18
|
+
validateFileName(fileName) {
|
|
19
|
+
const pattern = /^task-\d{2,3}-[a-z0-9-]+\.md$/;
|
|
20
|
+
if (!pattern.test(fileName)) {
|
|
21
|
+
return {
|
|
22
|
+
file: fileName,
|
|
23
|
+
message: 'Invalid filename. Expected: task-NNN-kebab-case-title.md',
|
|
24
|
+
severity: 'error',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
extractMetadata(content) {
|
|
30
|
+
const headerSection = content.split(/^##/m)[0];
|
|
31
|
+
const statusMatch = headerSection.match(/^Status:\s*(.+)$/im);
|
|
32
|
+
const typeMatch = headerSection.match(/^Type:\s*(.+)$/im);
|
|
33
|
+
const assigneeMatch = headerSection.match(/^Assignee:\s*(.+)$/im);
|
|
34
|
+
return {
|
|
35
|
+
status: statusMatch?.[1]?.trim().toLowerCase(),
|
|
36
|
+
type: typeMatch?.[1]?.trim().toLowerCase(),
|
|
37
|
+
assignee: assigneeMatch?.[1]?.trim(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate task metadata (FileSystem-specific)
|
|
42
|
+
*/
|
|
43
|
+
validateMetadata(metadata, filePath) {
|
|
44
|
+
const errors = [];
|
|
45
|
+
if (!metadata.status) {
|
|
46
|
+
errors.push({
|
|
47
|
+
file: filePath,
|
|
48
|
+
message: 'Missing required metadata: Status',
|
|
49
|
+
severity: 'error',
|
|
50
|
+
});
|
|
51
|
+
} else if (!VALID_STATUSES.includes(metadata.status)) {
|
|
52
|
+
errors.push({
|
|
53
|
+
file: filePath,
|
|
54
|
+
message: `Invalid status "${metadata.status}". Valid: ${VALID_STATUSES.join(', ')}`,
|
|
55
|
+
severity: 'error',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!metadata.type) {
|
|
59
|
+
errors.push({
|
|
60
|
+
file: filePath,
|
|
61
|
+
message: 'Missing required metadata: Type',
|
|
62
|
+
severity: 'error',
|
|
63
|
+
});
|
|
64
|
+
} else if (!VALID_TYPES.includes(metadata.type)) {
|
|
65
|
+
errors.push({
|
|
66
|
+
file: filePath,
|
|
67
|
+
message: `Invalid type "${metadata.type}". Valid: ${VALID_TYPES.join(', ')}`,
|
|
68
|
+
severity: 'error',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (!metadata.assignee) {
|
|
72
|
+
errors.push({
|
|
73
|
+
file: filePath,
|
|
74
|
+
message: 'Missing recommended metadata: Assignee',
|
|
75
|
+
severity: 'warning',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return errors;
|
|
79
|
+
}
|
|
80
|
+
validateContent(filename, content) {
|
|
81
|
+
const lines = content.split('\n');
|
|
82
|
+
// Check H1 heading
|
|
83
|
+
if (!lines[0]?.trim().startsWith('# ')) {
|
|
84
|
+
this.addError(
|
|
85
|
+
filename,
|
|
86
|
+
'Task file must start with a level 1 heading (# Task NNN ā Title)',
|
|
87
|
+
'error',
|
|
88
|
+
1,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const h1Pattern = /^#\s+(?:š§©\s+)?Task\s+\d{2,3}\s+[ā-]\s+.+$/i;
|
|
92
|
+
if (lines[0] && !h1Pattern.test(lines[0])) {
|
|
93
|
+
this.addError(
|
|
94
|
+
filename,
|
|
95
|
+
'H1 heading must follow format: "# Task NNN ā Title"',
|
|
96
|
+
'error',
|
|
97
|
+
1,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
const metadata = this.extractMetadata(content);
|
|
101
|
+
const metadataErrors = this.validateMetadata(metadata, filename);
|
|
102
|
+
metadataErrors.forEach((error) => {
|
|
103
|
+
this.addError(error.file, error.message, error.severity, error.line);
|
|
104
|
+
});
|
|
105
|
+
const h2Sections = content.match(/^##\s+.+$/gm);
|
|
106
|
+
if (!h2Sections || h2Sections.length === 0) {
|
|
107
|
+
this.addError(
|
|
108
|
+
filename,
|
|
109
|
+
'Task should have at least one section (## heading)',
|
|
110
|
+
'warning',
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const firstH2Index = content.indexOf('\n##');
|
|
114
|
+
if (firstH2Index > -1) {
|
|
115
|
+
const afterH2 = content.substring(firstH2Index);
|
|
116
|
+
if (
|
|
117
|
+
afterH2.match(/^Status:/im) ||
|
|
118
|
+
afterH2.match(/^Type:/im) ||
|
|
119
|
+
afterH2.match(/^Assignee:/im)
|
|
120
|
+
) {
|
|
121
|
+
this.addError(
|
|
122
|
+
filename,
|
|
123
|
+
'Metadata must be placed BEFORE the first ## section',
|
|
124
|
+
'error',
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Lint a single task file (FileSystem-specific)
|
|
131
|
+
*/
|
|
132
|
+
async lintFile(filePath) {
|
|
133
|
+
const errors = [];
|
|
134
|
+
// Validate filename
|
|
135
|
+
const fileName = filePath.split('/').pop() || filePath;
|
|
136
|
+
const fileNameError = this.validateFileName(fileName);
|
|
137
|
+
if (fileNameError) {
|
|
138
|
+
errors.push(fileNameError);
|
|
139
|
+
}
|
|
140
|
+
// Read and validate content
|
|
141
|
+
try {
|
|
142
|
+
const content = await readFile(filePath, 'utf-8');
|
|
143
|
+
this.errors = [];
|
|
144
|
+
this.validateContent(fileName, content);
|
|
145
|
+
errors.push(...this.errors);
|
|
146
|
+
} catch (error) {
|
|
147
|
+
errors.push({
|
|
148
|
+
file: fileName,
|
|
149
|
+
message: `Failed to read file: ${error}`,
|
|
150
|
+
severity: 'error',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return errors;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Lint all task files in the specified directory (FileSystem-specific)
|
|
157
|
+
*/
|
|
158
|
+
async lintDirectory(tasksDir) {
|
|
159
|
+
this.errors = [];
|
|
160
|
+
try {
|
|
161
|
+
const files = await readdir(tasksDir);
|
|
162
|
+
const taskFiles = files.filter((f) => f.endsWith('.md'));
|
|
163
|
+
for (const file of taskFiles) {
|
|
164
|
+
const fileNameError = this.validateFileName(file);
|
|
165
|
+
if (fileNameError) {
|
|
166
|
+
this.addError(file, fileNameError.message, fileNameError.severity);
|
|
167
|
+
}
|
|
168
|
+
const content = await readFile(join(tasksDir, file), 'utf-8');
|
|
169
|
+
this.validateContent(file, content);
|
|
170
|
+
}
|
|
171
|
+
const errors = this.errors.filter((e) => e.severity === 'error');
|
|
172
|
+
const warnings = this.errors.filter((e) => e.severity === 'warning');
|
|
173
|
+
return {
|
|
174
|
+
errors,
|
|
175
|
+
warnings,
|
|
176
|
+
filesChecked: taskFiles.length,
|
|
177
|
+
valid: errors.length === 0,
|
|
178
|
+
};
|
|
179
|
+
} catch (error) {
|
|
180
|
+
throw new Error(`Failed to lint tasks: ${error}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
static printResults(result) {
|
|
184
|
+
if (result.errors.length === 0 && result.warnings.length === 0) {
|
|
185
|
+
console.log(
|
|
186
|
+
chalk.green(`ā
All ${result.filesChecked} task files are valid!\n`),
|
|
187
|
+
);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
console.log(
|
|
191
|
+
chalk.bold(
|
|
192
|
+
`\nš Validation Results (${result.filesChecked} files checked):\n`,
|
|
193
|
+
),
|
|
194
|
+
);
|
|
195
|
+
const errorsByFile = new Map();
|
|
196
|
+
[...result.errors, ...result.warnings].forEach((error) => {
|
|
197
|
+
if (!errorsByFile.has(error.file)) {
|
|
198
|
+
errorsByFile.set(error.file, []);
|
|
199
|
+
}
|
|
200
|
+
errorsByFile.get(error.file).push(error);
|
|
201
|
+
});
|
|
202
|
+
for (const [file, fileErrors] of errorsByFile) {
|
|
203
|
+
console.log(chalk.cyan(`\nš ${file}`));
|
|
204
|
+
for (const error of fileErrors) {
|
|
205
|
+
const icon =
|
|
206
|
+
error.severity === 'error' ? chalk.red('ā') : chalk.yellow('ā ļø');
|
|
207
|
+
const location = error.line ? `:${error.line}` : '';
|
|
208
|
+
console.log(` ${icon} ${error.message}${location}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
console.log('\n' + 'ā'.repeat(60));
|
|
212
|
+
console.log(
|
|
213
|
+
chalk.bold(
|
|
214
|
+
`\nš Summary: ${chalk.red(result.errors.length + ' error(s)')}, ${chalk.yellow(result.warnings.length + ' warning(s)')}\n`,
|
|
215
|
+
),
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=task-linter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-linter.js","sourceRoot":"","sources":["../../../src/lib/task-linter/task-linter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task linter types
|
|
3
|
+
* Re-exports from @taskin/types-ts + FileSystem-specific extensions
|
|
4
|
+
*/
|
|
5
|
+
import type { TaskValidationIssue } from '@taskin/types-ts';
|
|
6
|
+
export type { TaskMetadata, TaskValidationIssue } from '@taskin/types-ts';
|
|
7
|
+
/**
|
|
8
|
+
* FileSystem-specific validation error
|
|
9
|
+
* Extends TaskValidationIssue with file-specific information
|
|
10
|
+
*/
|
|
11
|
+
export interface FileValidationError
|
|
12
|
+
extends Omit<TaskValidationIssue, 'taskId'> {
|
|
13
|
+
file: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* FileSystem-specific lint result
|
|
17
|
+
* Contains file-based validation results
|
|
18
|
+
*/
|
|
19
|
+
export interface FileLintResult {
|
|
20
|
+
errors: FileValidationError[];
|
|
21
|
+
filesChecked: number;
|
|
22
|
+
valid: boolean;
|
|
23
|
+
warnings: FileValidationError[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* FileSystem-specific task linter interface
|
|
27
|
+
* Defines validation operations for file-based task providers
|
|
28
|
+
*/
|
|
29
|
+
export interface IFileSystemTaskLinter {
|
|
30
|
+
/**
|
|
31
|
+
* Lint all task files in a directory
|
|
32
|
+
* @param tasksDir - Directory containing task markdown files
|
|
33
|
+
* @returns Validation results for all files
|
|
34
|
+
*/
|
|
35
|
+
lintDirectory(tasksDir: string): Promise<FileLintResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Lint a single task file
|
|
38
|
+
* @param filePath - Path to the task markdown file
|
|
39
|
+
* @returns Array of validation errors found in the file
|
|
40
|
+
*/
|
|
41
|
+
lintFile(filePath: string): Promise<FileValidationError[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Validate task metadata
|
|
44
|
+
* @param metadata - Task metadata to validate
|
|
45
|
+
* @param fileName - Name of the file being validated
|
|
46
|
+
* @returns Array of validation errors
|
|
47
|
+
*/
|
|
48
|
+
validateMetadata(
|
|
49
|
+
metadata: Record<string, unknown>,
|
|
50
|
+
fileName: string,
|
|
51
|
+
): FileValidationError[];
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-linter.types.js","sourceRoot":"","sources":["../../../src/lib/task-linter/task-linter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|