mcp-spec-cli 1.1.0 → 1.2.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/api/spec-workflow.openapi.yaml +31 -23
- package/dist/cli.js +25 -14
- package/dist/cli.js.map +1 -1
- package/dist/features/shared/MarkdownTaskUpdater.d.ts +14 -0
- package/dist/features/shared/MarkdownTaskUpdater.d.ts.map +1 -0
- package/dist/features/shared/MarkdownTaskUpdater.js +75 -0
- package/dist/features/shared/MarkdownTaskUpdater.js.map +1 -0
- package/dist/features/shared/SpecManager.d.ts +4 -1
- package/dist/features/shared/SpecManager.d.ts.map +1 -1
- package/dist/features/shared/SpecManager.js +16 -16
- package/dist/features/shared/SpecManager.js.map +1 -1
- package/dist/features/shared/TaskGuidanceRepository.d.ts +36 -0
- package/dist/features/shared/TaskGuidanceRepository.d.ts.map +1 -0
- package/dist/features/shared/TaskGuidanceRepository.js +23 -0
- package/dist/features/shared/TaskGuidanceRepository.js.map +1 -0
- package/dist/features/shared/TaskLexer.d.ts +18 -0
- package/dist/features/shared/TaskLexer.d.ts.map +1 -0
- package/dist/features/shared/TaskLexer.js +60 -0
- package/dist/features/shared/TaskLexer.js.map +1 -0
- package/dist/features/shared/TemplateRepository.d.ts +14 -0
- package/dist/features/shared/TemplateRepository.d.ts.map +1 -0
- package/dist/features/shared/TemplateRepository.js +40 -0
- package/dist/features/shared/TemplateRepository.js.map +1 -0
- package/dist/features/shared/WorkflowStateRepository.d.ts +18 -0
- package/dist/features/shared/WorkflowStateRepository.d.ts.map +1 -0
- package/dist/features/shared/WorkflowStateRepository.js +30 -0
- package/dist/features/shared/WorkflowStateRepository.js.map +1 -0
- package/dist/features/shared/markdownTaskUpdater.d.ts +14 -0
- package/dist/features/shared/markdownTaskUpdater.d.ts.map +1 -0
- package/dist/features/shared/markdownTaskUpdater.js +75 -0
- package/dist/features/shared/markdownTaskUpdater.js.map +1 -0
- package/dist/features/shared/openApiLoader.d.ts +37 -42
- package/dist/features/shared/openApiLoader.d.ts.map +1 -1
- package/dist/features/shared/openApiLoader.js +13 -127
- package/dist/features/shared/openApiLoader.js.map +1 -1
- package/dist/features/shared/taskGuidanceRepository.d.ts +36 -0
- package/dist/features/shared/taskGuidanceRepository.d.ts.map +1 -0
- package/dist/features/shared/taskGuidanceRepository.js +23 -0
- package/dist/features/shared/taskGuidanceRepository.js.map +1 -0
- package/dist/features/shared/taskLexer.d.ts +18 -0
- package/dist/features/shared/taskLexer.d.ts.map +1 -0
- package/dist/features/shared/taskLexer.js +66 -0
- package/dist/features/shared/taskLexer.js.map +1 -0
- package/dist/features/shared/taskParser.d.ts +32 -13
- package/dist/features/shared/taskParser.d.ts.map +1 -1
- package/dist/features/shared/taskParser.js +72 -240
- package/dist/features/shared/taskParser.js.map +1 -1
- package/dist/features/shared/templateRepository.d.ts +14 -0
- package/dist/features/shared/templateRepository.d.ts.map +1 -0
- package/dist/features/shared/templateRepository.js +40 -0
- package/dist/features/shared/templateRepository.js.map +1 -0
- package/dist/features/shared/workflowStateRepository.d.ts +18 -0
- package/dist/features/shared/workflowStateRepository.d.ts.map +1 -0
- package/dist/features/shared/workflowStateRepository.js +30 -0
- package/dist/features/shared/workflowStateRepository.js.map +1 -0
- package/dist/features/task/TaskGuidancePresenter.d.ts +20 -0
- package/dist/features/task/TaskGuidancePresenter.d.ts.map +1 -0
- package/dist/features/task/TaskGuidancePresenter.js +84 -0
- package/dist/features/task/TaskGuidancePresenter.js.map +1 -0
- package/dist/features/task/completeTask.d.ts +3 -3
- package/dist/features/task/completeTask.d.ts.map +1 -1
- package/dist/features/task/completeTask.js +63 -309
- package/dist/features/task/completeTask.js.map +1 -1
- package/dist/features/task/taskGuidancePresenter.d.ts +20 -0
- package/dist/features/task/taskGuidancePresenter.d.ts.map +1 -0
- package/dist/features/task/taskGuidancePresenter.js +84 -0
- package/dist/features/task/taskGuidancePresenter.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { lexer } from 'marked';
|
|
2
|
+
/**
|
|
3
|
+
* TaskLexer uses 'marked' to extract relevant task tokens and their line numbers.
|
|
4
|
+
*/
|
|
5
|
+
export class TaskLexer {
|
|
6
|
+
/**
|
|
7
|
+
* Lexes the markdown content into a stream of task-related tokens.
|
|
8
|
+
*/
|
|
9
|
+
static lex(content) {
|
|
10
|
+
const tokens = lexer(content);
|
|
11
|
+
const taskTokens = [];
|
|
12
|
+
const lines = content.split('\n');
|
|
13
|
+
const findLineNumber = (raw, startFrom) => {
|
|
14
|
+
for (let i = startFrom; i < lines.length; i++) {
|
|
15
|
+
if (lines[i].includes(raw.split('\n')[0].trim())) {
|
|
16
|
+
return i + 1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return -1;
|
|
20
|
+
};
|
|
21
|
+
let currentLine = 0;
|
|
22
|
+
const processTokens = (tokens) => {
|
|
23
|
+
for (const token of tokens) {
|
|
24
|
+
if (token.type === 'heading') {
|
|
25
|
+
const line = findLineNumber(token.raw, currentLine);
|
|
26
|
+
if (line !== -1) {
|
|
27
|
+
taskTokens.push({
|
|
28
|
+
type: 'heading',
|
|
29
|
+
text: token.text,
|
|
30
|
+
depth: token.depth,
|
|
31
|
+
raw: token.raw,
|
|
32
|
+
line
|
|
33
|
+
});
|
|
34
|
+
currentLine = line;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (token.type === 'list_item') {
|
|
38
|
+
const line = findLineNumber(token.raw, currentLine);
|
|
39
|
+
if (line !== -1) {
|
|
40
|
+
taskTokens.push({
|
|
41
|
+
type: 'list_item',
|
|
42
|
+
text: token.text,
|
|
43
|
+
checked: token.checked,
|
|
44
|
+
raw: token.raw,
|
|
45
|
+
line
|
|
46
|
+
});
|
|
47
|
+
currentLine = line;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Recursively process tokens if any (for nested lists)
|
|
51
|
+
if ('tokens' in token && token.tokens) {
|
|
52
|
+
processTokens(token.tokens);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
processTokens(tokens);
|
|
57
|
+
return taskTokens;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=TaskLexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskLexer.js","sourceRoot":"","sources":["../../../src/features/shared/TaskLexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAS,MAAM,QAAQ,CAAC;AAWtC;;GAEG;AACH,MAAM,OAAO,SAAS;IACpB;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAe;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAU,EAAE;YAChE,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,aAAa,GAAG,CAAC,MAAe,EAAE,EAAE;YACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBACpD,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;wBAChB,UAAU,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,IAAI;yBACL,CAAC,CAAC;wBACH,WAAW,GAAG,IAAI,CAAC;oBACrB,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBACpD,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;wBAChB,UAAU,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,IAAI;yBACL,CAAC,CAAC;wBACH,WAAW,GAAG,IAAI,CAAC;oBACrB,CAAC;gBACH,CAAC;gBAED,uDAAuD;gBACvD,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACtC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TemplateRepository manages document templates from the OpenAPI spec.
|
|
3
|
+
*/
|
|
4
|
+
export declare class TemplateRepository {
|
|
5
|
+
/**
|
|
6
|
+
* Gets a document template by stage and interpolates variables.
|
|
7
|
+
*/
|
|
8
|
+
static getInterpolatedTemplate(stage: 'requirements' | 'design' | 'tasks' | 'skipped', variables: Record<string, any>): string;
|
|
9
|
+
/**
|
|
10
|
+
* Internal formatter for document templates.
|
|
11
|
+
*/
|
|
12
|
+
private static formatTemplate;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=TemplateRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateRepository.d.ts","sourceRoot":"","sources":["../../../src/features/shared/TemplateRepository.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAU9H;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;CAqB9B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { openApiLoader, OpenApiLoader } from './openApiLoader.js';
|
|
2
|
+
/**
|
|
3
|
+
* TemplateRepository manages document templates from the OpenAPI spec.
|
|
4
|
+
*/
|
|
5
|
+
export class TemplateRepository {
|
|
6
|
+
/**
|
|
7
|
+
* Gets a document template by stage and interpolates variables.
|
|
8
|
+
*/
|
|
9
|
+
static getInterpolatedTemplate(stage, variables) {
|
|
10
|
+
openApiLoader.loadSpec();
|
|
11
|
+
const template = openApiLoader.getDocumentTemplate(stage);
|
|
12
|
+
if (!template) {
|
|
13
|
+
throw new Error(`Template not found for stage: ${stage}`);
|
|
14
|
+
}
|
|
15
|
+
return this.formatTemplate(template, variables);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Internal formatter for document templates.
|
|
19
|
+
*/
|
|
20
|
+
static formatTemplate(template, values) {
|
|
21
|
+
const lines = [];
|
|
22
|
+
if (template.title) {
|
|
23
|
+
lines.push(`# ${OpenApiLoader.replaceVariables(template.title, values)}`);
|
|
24
|
+
lines.push('');
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(template.sections)) {
|
|
27
|
+
for (const section of template.sections) {
|
|
28
|
+
if (section.content) {
|
|
29
|
+
lines.push(OpenApiLoader.replaceVariables(section.content, values));
|
|
30
|
+
}
|
|
31
|
+
else if (section.placeholder) {
|
|
32
|
+
lines.push(section.placeholder);
|
|
33
|
+
}
|
|
34
|
+
lines.push('');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lines.join('\n').trim();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=TemplateRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateRepository.js","sourceRoot":"","sources":["../../../src/features/shared/TemplateRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,KAAsD,EAAE,SAA8B;QACnH,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,QAAa,EAAE,MAA2B;QACtE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAClC,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowStateRepository manages progress rules, stage names, and file mapping.
|
|
3
|
+
*/
|
|
4
|
+
export declare class WorkflowStateRepository {
|
|
5
|
+
/**
|
|
6
|
+
* Gets the display name for a given stage.
|
|
7
|
+
*/
|
|
8
|
+
static getStageDisplayName(stage: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Gets the file name associated with a stage.
|
|
11
|
+
*/
|
|
12
|
+
static getStageFileName(stage: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Calculates overall progress based on the state of each stage.
|
|
15
|
+
*/
|
|
16
|
+
static calculateOverallProgress(requirementsStatus: number, designStatus: number, tasksStatus: number): number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=WorkflowStateRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowStateRepository.d.ts","sourceRoot":"","sources":["../../../src/features/shared/WorkflowStateRepository.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,uBAAuB;IAClC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAMjD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM9C;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAI/G"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { openApiLoader } from './openApiLoader.js';
|
|
2
|
+
/**
|
|
3
|
+
* WorkflowStateRepository manages progress rules, stage names, and file mapping.
|
|
4
|
+
*/
|
|
5
|
+
export class WorkflowStateRepository {
|
|
6
|
+
/**
|
|
7
|
+
* Gets the display name for a given stage.
|
|
8
|
+
*/
|
|
9
|
+
static getStageDisplayName(stage) {
|
|
10
|
+
openApiLoader.loadSpec();
|
|
11
|
+
const stageNames = openApiLoader.getStageNames();
|
|
12
|
+
return stageNames[stage] || stage;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Gets the file name associated with a stage.
|
|
16
|
+
*/
|
|
17
|
+
static getStageFileName(stage) {
|
|
18
|
+
openApiLoader.loadSpec();
|
|
19
|
+
const fileNames = openApiLoader.getFileNames();
|
|
20
|
+
return fileNames[stage] || `${stage}.md`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Calculates overall progress based on the state of each stage.
|
|
24
|
+
*/
|
|
25
|
+
static calculateOverallProgress(requirementsStatus, designStatus, tasksStatus) {
|
|
26
|
+
// Current simple logic, could be moved to spec later
|
|
27
|
+
return Math.round((requirementsStatus + designStatus + tasksStatus) / 3);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=WorkflowStateRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowStateRepository.js","sourceRoot":"","sources":["../../../src/features/shared/WorkflowStateRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAClC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAa;QACtC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QACjD,OAAQ,UAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACnC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAQ,SAAiB,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,kBAA0B,EAAE,YAAoB,EAAE,WAAmB;QACnG,qDAAqD;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MarkdownTaskUpdater performs surgical updates to task checkboxes in Markdown content.
|
|
3
|
+
*/
|
|
4
|
+
export declare class MarkdownTaskUpdater {
|
|
5
|
+
/**
|
|
6
|
+
* Updates the checkbox for a task and its ancestors if they become fully completed.
|
|
7
|
+
*/
|
|
8
|
+
static updateTaskStatus(content: string, taskId: string, completed: boolean): string;
|
|
9
|
+
/**
|
|
10
|
+
* Updates the checkbox for multiple tasks specified by their IDs.
|
|
11
|
+
*/
|
|
12
|
+
static updateBatchTaskStatus(content: string, taskIds: string[], completed: boolean): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=markdownTaskUpdater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownTaskUpdater.d.ts","sourceRoot":"","sources":["../../../src/features/shared/markdownTaskUpdater.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM;IAuDpF;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM;CAW7F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { TaskLexer } from './taskLexer.js';
|
|
2
|
+
/**
|
|
3
|
+
* MarkdownTaskUpdater performs surgical updates to task checkboxes in Markdown content.
|
|
4
|
+
*/
|
|
5
|
+
export class MarkdownTaskUpdater {
|
|
6
|
+
/**
|
|
7
|
+
* Updates the checkbox for a task and its ancestors if they become fully completed.
|
|
8
|
+
*/
|
|
9
|
+
static updateTaskStatus(content, taskId, completed) {
|
|
10
|
+
const taskTokens = TaskLexer.lex(content);
|
|
11
|
+
let lines = content.split('\n');
|
|
12
|
+
const tasksToUpdate = new Set();
|
|
13
|
+
tasksToUpdate.add(taskId);
|
|
14
|
+
// Auto-mark parent tasks if all siblings are completed
|
|
15
|
+
if (completed && taskId.includes('.')) {
|
|
16
|
+
const parts = taskId.split('.');
|
|
17
|
+
let currentId = taskId;
|
|
18
|
+
while (currentId.includes('.')) {
|
|
19
|
+
const parentId = currentId.split('.').slice(0, -1).join('.');
|
|
20
|
+
const siblingTokens = taskTokens.filter(t => {
|
|
21
|
+
if (t.type !== 'list_item')
|
|
22
|
+
return false;
|
|
23
|
+
const match = t.text.match(/^(\d+(?:\.\d+)*)\.?/);
|
|
24
|
+
if (!match)
|
|
25
|
+
return false;
|
|
26
|
+
const id = match[1];
|
|
27
|
+
return id.startsWith(parentId + '.') && id.split('.').length === parentId.split('.').length + 1;
|
|
28
|
+
});
|
|
29
|
+
const allSiblingsDone = siblingTokens.every(t => {
|
|
30
|
+
const match = t.text.match(/^(\d+(?:\.\d+)*)\.?/);
|
|
31
|
+
const id = match ? match[1] : '';
|
|
32
|
+
return id === currentId ? true : !!t.checked;
|
|
33
|
+
});
|
|
34
|
+
if (allSiblingsDone) {
|
|
35
|
+
tasksToUpdate.add(parentId);
|
|
36
|
+
currentId = parentId;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (const id of tasksToUpdate) {
|
|
44
|
+
const taskToken = taskTokens.find(token => {
|
|
45
|
+
if (token.type !== 'list_item')
|
|
46
|
+
return false;
|
|
47
|
+
const idMatch = token.text.match(/^(\d+(?:\.\d+)*)\.?/);
|
|
48
|
+
return idMatch && idMatch[1] === id;
|
|
49
|
+
});
|
|
50
|
+
if (taskToken) {
|
|
51
|
+
const lineIndex = taskToken.line - 1;
|
|
52
|
+
const originalLine = lines[lineIndex];
|
|
53
|
+
const newStatus = completed ? '[x]' : '[ ]';
|
|
54
|
+
lines[lineIndex] = originalLine.replace(/\[\s?[x ]?\s?\]/, newStatus);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Updates the checkbox for multiple tasks specified by their IDs.
|
|
61
|
+
*/
|
|
62
|
+
static updateBatchTaskStatus(content, taskIds, completed) {
|
|
63
|
+
let updatedContent = content;
|
|
64
|
+
for (const taskId of taskIds) {
|
|
65
|
+
try {
|
|
66
|
+
updatedContent = this.updateTaskStatus(updatedContent, taskId, completed);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.warn(`Could not update task ${taskId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return updatedContent;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=markdownTaskUpdater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownTaskUpdater.js","sourceRoot":"","sources":["../../../src/features/shared/markdownTaskUpdater.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,7 @@
|
|
|
1
1
|
export interface OpenApiSpec {
|
|
2
|
-
paths:
|
|
3
|
-
'/spec': {
|
|
4
|
-
post: {
|
|
5
|
-
responses: {
|
|
6
|
-
'200': {
|
|
7
|
-
content: {
|
|
8
|
-
'application/json': {
|
|
9
|
-
schema: {
|
|
10
|
-
$ref: string;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
};
|
|
2
|
+
paths: Record<string, any>;
|
|
19
3
|
components: {
|
|
20
|
-
schemas: Record<string,
|
|
4
|
+
schemas: Record<string, any>;
|
|
21
5
|
};
|
|
22
6
|
'x-error-responses': Record<string, {
|
|
23
7
|
displayText: string;
|
|
@@ -28,8 +12,8 @@ export interface OpenApiSpec {
|
|
|
28
12
|
mimeType: string;
|
|
29
13
|
text?: string;
|
|
30
14
|
}>;
|
|
31
|
-
'x-global-config':
|
|
32
|
-
'x-document-templates': Record<string,
|
|
15
|
+
'x-global-config': Record<string, any>;
|
|
16
|
+
'x-document-templates': Record<string, any>;
|
|
33
17
|
'x-task-guidance-template'?: {
|
|
34
18
|
separator: string;
|
|
35
19
|
header: string;
|
|
@@ -53,36 +37,47 @@ export interface OpenApiSpec {
|
|
|
53
37
|
batchCompleted: string;
|
|
54
38
|
};
|
|
55
39
|
};
|
|
40
|
+
'x-workflow-config'?: {
|
|
41
|
+
stage_names: Record<string, string>;
|
|
42
|
+
file_names: Record<string, string>;
|
|
43
|
+
};
|
|
56
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* OpenApiLoader is a singleton for loading and accessing the raw spec data.
|
|
47
|
+
*/
|
|
57
48
|
export declare class OpenApiLoader {
|
|
58
49
|
private static instance;
|
|
59
50
|
private spec;
|
|
60
|
-
private examples;
|
|
61
51
|
private constructor();
|
|
62
52
|
static getInstance(): OpenApiLoader;
|
|
63
53
|
loadSpec(): OpenApiSpec;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
getStageNames(): Record<string, string>;
|
|
55
|
+
getFileNames(): Record<string, string>;
|
|
56
|
+
getDocumentTemplate(type: string): any;
|
|
57
|
+
getTaskGuidanceTemplate(): {
|
|
58
|
+
separator: string;
|
|
59
|
+
header: string;
|
|
60
|
+
instructions: {
|
|
61
|
+
prefix: string;
|
|
62
|
+
taskFocus: string;
|
|
63
|
+
progressTracking: string;
|
|
64
|
+
workflow: string;
|
|
65
|
+
};
|
|
66
|
+
prompts: {
|
|
67
|
+
firstTask: string;
|
|
68
|
+
nextTask: string;
|
|
69
|
+
continueTask: string;
|
|
70
|
+
batchContinue: string;
|
|
71
|
+
};
|
|
72
|
+
completionMessages: {
|
|
73
|
+
taskCompleted: string;
|
|
74
|
+
allCompleted: string;
|
|
75
|
+
alreadyCompleted: string;
|
|
76
|
+
batchSucceeded: string;
|
|
77
|
+
batchCompleted: string;
|
|
78
|
+
};
|
|
75
79
|
} | null;
|
|
76
|
-
|
|
77
|
-
getDocumentTemplate(templateType: string): unknown;
|
|
78
|
-
resolveResources(resources?: Array<unknown>): Array<{
|
|
79
|
-
uri: string;
|
|
80
|
-
title?: string;
|
|
81
|
-
mimeType: string;
|
|
82
|
-
text?: string;
|
|
83
|
-
}> | undefined;
|
|
84
|
-
getTaskGuidanceTemplate(): OpenApiSpec['x-task-guidance-template'] | null;
|
|
85
|
-
getExamplesCount(responseType: string): number;
|
|
80
|
+
static replaceVariables(template: string, variables: Record<string, any>): string;
|
|
86
81
|
}
|
|
87
82
|
export declare const openApiLoader: OpenApiLoader;
|
|
88
83
|
//# sourceMappingURL=openApiLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openApiLoader.d.ts","sourceRoot":"","sources":["../../../src/features/shared/openApiLoader.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE
|
|
1
|
+
{"version":3,"file":"openApiLoader.d.ts","sourceRoot":"","sources":["../../../src/features/shared/openApiLoader.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B,CAAC;IACF,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvG,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,0BAA0B,CAAC,EAAE;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAChG,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9F,kBAAkB,EAAE;YAAE,aAAa,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/I,CAAC;IACF,mBAAmB,CAAC,EAAE;QACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,IAAI,CAA4B;IAExC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,QAAQ,IAAI,WAAW;IAQvB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIvC,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAItC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAItC,uBAAuB;mBAhDV,MAAM;gBACT,MAAM;sBACA;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE;iBACtF;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE;4BACzE;YAAE,aAAa,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE;;IAiD/I,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;CAQlF;AAED,eAAO,MAAM,aAAa,eAA8B,CAAC"}
|
|
@@ -3,14 +3,14 @@ import * as fs from 'fs';
|
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { dirname } from 'path';
|
|
6
|
-
import { isObject } from './typeGuards.js';
|
|
7
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
7
|
const __dirname = dirname(__filename);
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* OpenApiLoader is a singleton for loading and accessing the raw spec data.
|
|
10
|
+
*/
|
|
10
11
|
export class OpenApiLoader {
|
|
11
12
|
static instance;
|
|
12
13
|
spec = null;
|
|
13
|
-
examples = new Map();
|
|
14
14
|
constructor() { }
|
|
15
15
|
static getInstance() {
|
|
16
16
|
if (!OpenApiLoader.instance) {
|
|
@@ -18,95 +18,27 @@ export class OpenApiLoader {
|
|
|
18
18
|
}
|
|
19
19
|
return OpenApiLoader.instance;
|
|
20
20
|
}
|
|
21
|
-
// Load OpenAPI specification
|
|
22
21
|
loadSpec() {
|
|
23
|
-
if (this.spec)
|
|
22
|
+
if (this.spec)
|
|
24
23
|
return this.spec;
|
|
25
|
-
}
|
|
26
24
|
const specPath = path.join(__dirname, '../../../api/spec-workflow.openapi.yaml');
|
|
27
25
|
const specContent = fs.readFileSync(specPath, 'utf8');
|
|
28
26
|
this.spec = yaml.load(specContent);
|
|
29
|
-
// Parse and cache all examples
|
|
30
|
-
this.cacheExamples();
|
|
31
27
|
return this.spec;
|
|
32
28
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (!this.spec)
|
|
36
|
-
return;
|
|
37
|
-
const schemas = this.spec.components.schemas;
|
|
38
|
-
for (const [schemaName, schema] of Object.entries(schemas)) {
|
|
39
|
-
if (!isObject(schema))
|
|
40
|
-
continue;
|
|
41
|
-
// Support standard OpenAPI 3.1.0 examples field
|
|
42
|
-
if ('examples' in schema && Array.isArray(schema.examples)) {
|
|
43
|
-
this.examples.set(schemaName, schema.examples);
|
|
44
|
-
}
|
|
45
|
-
// Maintain backward compatibility with custom x-examples field
|
|
46
|
-
else if ('x-examples' in schema && Array.isArray(schema['x-examples'])) {
|
|
47
|
-
this.examples.set(schemaName, schema['x-examples']);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// Get response example
|
|
52
|
-
getResponseExample(responseType, criteria) {
|
|
53
|
-
const examples = this.examples.get(responseType);
|
|
54
|
-
if (!examples || examples.length === 0) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
// If no filter criteria, return the first example
|
|
58
|
-
if (!criteria) {
|
|
59
|
-
return examples[0];
|
|
60
|
-
}
|
|
61
|
-
// Filter examples by criteria
|
|
62
|
-
for (const example of examples) {
|
|
63
|
-
let matches = true;
|
|
64
|
-
for (const [key, value] of Object.entries(criteria)) {
|
|
65
|
-
if (this.getNestedValue(example, key) !== value) {
|
|
66
|
-
matches = false;
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (matches) {
|
|
71
|
-
return example;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// No match found, return the first one
|
|
75
|
-
return examples[0];
|
|
29
|
+
getStageNames() {
|
|
30
|
+
return this.spec?.['x-global-config']?.stage_names || {};
|
|
76
31
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (!this.spec || !this.spec['x-error-responses']) {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
const errorResponse = this.spec['x-error-responses'][errorType];
|
|
83
|
-
return errorResponse?.displayText || null;
|
|
32
|
+
getFileNames() {
|
|
33
|
+
return this.spec?.['x-global-config']?.file_names || {};
|
|
84
34
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!this.spec)
|
|
88
|
-
return null;
|
|
89
|
-
const progressSchema = this.spec.components.schemas.Progress;
|
|
90
|
-
if (isObject(progressSchema) && 'x-progress-rules' in progressSchema) {
|
|
91
|
-
return progressSchema['x-progress-rules'];
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
35
|
+
getDocumentTemplate(type) {
|
|
36
|
+
return this.spec?.['x-document-templates']?.[type] || null;
|
|
94
37
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const keys = path.split('.');
|
|
98
|
-
let current = obj;
|
|
99
|
-
for (const key of keys) {
|
|
100
|
-
if (isObject(current) && key in current) {
|
|
101
|
-
current = current[key];
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
return undefined;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return current;
|
|
38
|
+
getTaskGuidanceTemplate() {
|
|
39
|
+
return this.spec?.['x-task-guidance-template'] || null;
|
|
108
40
|
}
|
|
109
|
-
//
|
|
41
|
+
// Still useful for interpolation across repositories
|
|
110
42
|
static replaceVariables(template, variables) {
|
|
111
43
|
let result = template;
|
|
112
44
|
for (const [key, value] of Object.entries(variables)) {
|
|
@@ -115,52 +47,6 @@ export class OpenApiLoader {
|
|
|
115
47
|
}
|
|
116
48
|
return result;
|
|
117
49
|
}
|
|
118
|
-
// Get shared resource - directly return MCP format
|
|
119
|
-
getSharedResource(resourceId) {
|
|
120
|
-
if (!this.spec || !this.spec['x-shared-resources']) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
return this.spec['x-shared-resources'][resourceId] || null;
|
|
124
|
-
}
|
|
125
|
-
// Get global configuration
|
|
126
|
-
getGlobalConfig() {
|
|
127
|
-
if (!this.spec)
|
|
128
|
-
return {};
|
|
129
|
-
return this.spec['x-global-config'] || {};
|
|
130
|
-
}
|
|
131
|
-
// Get document template
|
|
132
|
-
getDocumentTemplate(templateType) {
|
|
133
|
-
if (!this.spec)
|
|
134
|
-
return null;
|
|
135
|
-
return this.spec['x-document-templates']?.[templateType] || null;
|
|
136
|
-
}
|
|
137
|
-
// Resolve resource list - no conversion needed, use MCP format directly
|
|
138
|
-
resolveResources(resources) {
|
|
139
|
-
if (!resources || resources.length === 0) {
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
const resolved = [];
|
|
143
|
-
for (const resource of resources) {
|
|
144
|
-
if (isObject(resource) && 'ref' in resource && typeof resource.ref === 'string') {
|
|
145
|
-
// Get from shared resources - already in MCP format
|
|
146
|
-
const sharedResource = this.getSharedResource(resource.ref);
|
|
147
|
-
if (sharedResource) {
|
|
148
|
-
resolved.push(sharedResource);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return resolved.length > 0 ? resolved : undefined;
|
|
153
|
-
}
|
|
154
|
-
// Get task guidance template
|
|
155
|
-
getTaskGuidanceTemplate() {
|
|
156
|
-
if (!this.spec)
|
|
157
|
-
return null;
|
|
158
|
-
return this.spec['x-task-guidance-template'] || null;
|
|
159
|
-
}
|
|
160
|
-
// Debug method: get cached examples count
|
|
161
|
-
getExamplesCount(responseType) {
|
|
162
|
-
return this.examples.get(responseType)?.length || 0;
|
|
163
|
-
}
|
|
164
50
|
}
|
|
165
51
|
export const openApiLoader = OpenApiLoader.getInstance();
|
|
166
52
|
//# sourceMappingURL=openApiLoader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openApiLoader.js","sourceRoot":"","sources":["../../../src/features/shared/openApiLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"openApiLoader.js","sourceRoot":"","sources":["../../../src/features/shared/openApiLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAyBtC;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,IAAI,GAAuB,IAAI,CAAC;IAExC,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAgB,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,aAAa;QACX,OAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAS,EAAE,WAAW,IAAI,EAAE,CAAC;IACpE,CAAC;IAED,YAAY;QACV,OAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAS,EAAE,UAAU,IAAI,EAAE,CAAC;IACnE,CAAC;IAED,mBAAmB,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IAED,uBAAuB;QACrB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IAED,qDAAqD;IACrD,MAAM,CAAC,gBAAgB,CAAC,QAAgB,EAAE,SAA8B;QACtE,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskGuidanceRepository manages guidance-related data from the OpenAPI spec.
|
|
3
|
+
*/
|
|
4
|
+
export declare class TaskGuidanceRepository {
|
|
5
|
+
/**
|
|
6
|
+
* Loads the guidance template structure from the spec.
|
|
7
|
+
*/
|
|
8
|
+
static getGuidanceTemplate(): {
|
|
9
|
+
separator: string;
|
|
10
|
+
header: string;
|
|
11
|
+
instructions: {
|
|
12
|
+
prefix: string;
|
|
13
|
+
taskFocus: string;
|
|
14
|
+
progressTracking: string;
|
|
15
|
+
workflow: string;
|
|
16
|
+
};
|
|
17
|
+
prompts: {
|
|
18
|
+
firstTask: string;
|
|
19
|
+
nextTask: string;
|
|
20
|
+
continueTask: string;
|
|
21
|
+
batchContinue: string;
|
|
22
|
+
};
|
|
23
|
+
completionMessages: {
|
|
24
|
+
taskCompleted: string;
|
|
25
|
+
allCompleted: string;
|
|
26
|
+
alreadyCompleted: string;
|
|
27
|
+
batchSucceeded: string;
|
|
28
|
+
batchCompleted: string;
|
|
29
|
+
};
|
|
30
|
+
} | null;
|
|
31
|
+
/**
|
|
32
|
+
* Gets a specific completion message by key.
|
|
33
|
+
*/
|
|
34
|
+
static getCompletionMessage(key: string): string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=taskGuidanceRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskGuidanceRepository.d.ts","sourceRoot":"","sources":["../../../src/features/shared/taskGuidanceRepository.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,sBAAsB;IACjC;;OAEG;IACH,MAAM,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;IAK1B;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAKjD"}
|