agentweaver 0.1.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/README.md +243 -0
- package/dist/artifacts.js +29 -0
- package/dist/errors.js +6 -0
- package/dist/index.js +1218 -0
- package/dist/interactive-ui.js +427 -0
- package/dist/jira.js +56 -0
- package/dist/markdown.js +183 -0
- package/dist/prompts.js +47 -0
- package/dist/tui.js +80 -0
- package/package.json +58 -0
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const BASE_PROMPT_HEADER = "Основная задача:";
|
|
2
|
+
export const EXTRA_PROMPT_HEADER = "Дополнительные указания:";
|
|
3
|
+
export const PLAN_PROMPT_TEMPLATE = "Посмотри и проанализируй задачу в {jira_task_file}. " +
|
|
4
|
+
"Разработай системный дизайн решения, запиши в {design_file}. " +
|
|
5
|
+
"Разработай подробный план реализации и запиши его в {plan_file}. " +
|
|
6
|
+
"Разработай план тестирования для QA и запиши в {qa_file}. ";
|
|
7
|
+
export const IMPLEMENT_PROMPT_TEMPLATE = "Проанализируй системный дизайн {design_file}, план реализации {plan_file} и приступай к реализации по плану. " +
|
|
8
|
+
"По окончании обязательно прогони вне песочницы линтер, все тесты, сгенерируй make swagger. " +
|
|
9
|
+
"Исправь ошибки линтера и тестов, если будут.";
|
|
10
|
+
export const REVIEW_PROMPT_TEMPLATE = "Проведи код-ревью текущих изменений. " +
|
|
11
|
+
"Сверься с задачей в {jira_task_file}, дизайном {design_file} и планом {plan_file}. " +
|
|
12
|
+
"Замечания и комментарии запиши в {review_file}. " +
|
|
13
|
+
"Если больше нет блокеров, препятствующих merge - создай файл ready-to-merge.md.";
|
|
14
|
+
export const REVIEW_REPLY_PROMPT_TEMPLATE = "Твой коллега провёл код-ревью и записал комментарии в {review_file}. " +
|
|
15
|
+
"Проанализируй комментарии к код-ревью, сверься с задачей в {jira_task_file}, " +
|
|
16
|
+
"дизайном {design_file}, планом {plan_file} и запиши свои комментарии в {review_reply_file}.";
|
|
17
|
+
export const REVIEW_SUMMARY_PROMPT_TEMPLATE = "Посмотри в {review_file}. " +
|
|
18
|
+
"Сделай краткий список комментариев без подробностей, 3-7 пунктов. " +
|
|
19
|
+
"Запиши результат в {review_summary_file}.";
|
|
20
|
+
export const REVIEW_REPLY_SUMMARY_PROMPT_TEMPLATE = "Посмотри в {review_reply_file}. " +
|
|
21
|
+
"Сделай краткий список ответов и итоговых действий без подробностей, 3-7 пунктов. " +
|
|
22
|
+
"Запиши результат в {review_reply_summary_file}.";
|
|
23
|
+
export const REVIEW_FIX_PROMPT_TEMPLATE = "Проанализируй комментарии в {review_reply_file}. " +
|
|
24
|
+
"Исправь то, что содержится в дополнительных указаниях, а если таковых нет - исправь все пункты. " +
|
|
25
|
+
"По окончании обязательно прогони вне песочницы линтер, все тесты, сгенерируй make swagger. " +
|
|
26
|
+
"Исправь ошибки линтера и тестов, если будут. " +
|
|
27
|
+
"По завершении резюме запиши в {review_fix_file}.";
|
|
28
|
+
export const TASK_SUMMARY_PROMPT_TEMPLATE = "Посмотри в {jira_task_file}. " +
|
|
29
|
+
"Сделай краткое резюме задачи, на 1-2 абзаца, " +
|
|
30
|
+
"запиши в {task_summary_file}.";
|
|
31
|
+
export const TEST_FIX_PROMPT_TEMPLATE = "Прогони тесты, исправь ошибки.";
|
|
32
|
+
export const TEST_LINTER_FIX_PROMPT_TEMPLATE = "Прогони линтер, исправь замечания.";
|
|
33
|
+
export const AUTO_REVIEW_FIX_EXTRA_PROMPT = "Исправлять только блокеры, критикалы и важные";
|
|
34
|
+
export function formatTemplate(template, values) {
|
|
35
|
+
let result = template;
|
|
36
|
+
for (const [key, value] of Object.entries(values)) {
|
|
37
|
+
result = result.replaceAll(`{${key}}`, value);
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
export function formatPrompt(basePrompt, extraPrompt) {
|
|
42
|
+
const sections = [`${BASE_PROMPT_HEADER}\n${basePrompt.trim()}`];
|
|
43
|
+
if (extraPrompt?.trim()) {
|
|
44
|
+
sections.push(`${EXTRA_PROMPT_HEADER}\n${extraPrompt.trim()}`);
|
|
45
|
+
}
|
|
46
|
+
return sections.join("\n\n");
|
|
47
|
+
}
|
package/dist/tui.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
const RESET = "\u001b[0m";
|
|
3
|
+
const BOLD = "\u001b[1m";
|
|
4
|
+
const DIM = "\u001b[2m";
|
|
5
|
+
const RED = "\u001b[31m";
|
|
6
|
+
const GREEN = "\u001b[32m";
|
|
7
|
+
const YELLOW = "\u001b[33m";
|
|
8
|
+
const BLUE = "\u001b[34m";
|
|
9
|
+
const MAGENTA = "\u001b[35m";
|
|
10
|
+
const CYAN = "\u001b[36m";
|
|
11
|
+
const defaultAdapter = {
|
|
12
|
+
writeStdout: (text) => {
|
|
13
|
+
process.stdout.write(text);
|
|
14
|
+
},
|
|
15
|
+
writeStderr: (text) => {
|
|
16
|
+
process.stderr.write(text);
|
|
17
|
+
},
|
|
18
|
+
supportsTransientStatus: true,
|
|
19
|
+
supportsPassthrough: true,
|
|
20
|
+
};
|
|
21
|
+
let outputAdapter = defaultAdapter;
|
|
22
|
+
function color(text, ansi) {
|
|
23
|
+
return `${ansi}${text}${RESET}`;
|
|
24
|
+
}
|
|
25
|
+
export function stripAnsi(text) {
|
|
26
|
+
return text.replace(/\u001b\[[0-9;]*m/g, "");
|
|
27
|
+
}
|
|
28
|
+
function visibleLength(text) {
|
|
29
|
+
return stripAnsi(text).length;
|
|
30
|
+
}
|
|
31
|
+
export function setOutputAdapter(adapter) {
|
|
32
|
+
outputAdapter = adapter ?? defaultAdapter;
|
|
33
|
+
}
|
|
34
|
+
export function getOutputAdapter() {
|
|
35
|
+
return outputAdapter;
|
|
36
|
+
}
|
|
37
|
+
export function renderPanel(title, body, borderColor) {
|
|
38
|
+
const lines = body.split("\n");
|
|
39
|
+
const width = Math.max(visibleLength(title) + 2, ...lines.map((line) => visibleLength(line)), 10);
|
|
40
|
+
const top = `┌${"─".repeat(width + 2)}┐`;
|
|
41
|
+
const middle = lines
|
|
42
|
+
.map((line) => {
|
|
43
|
+
const pad = width - visibleLength(line);
|
|
44
|
+
return `│ ${line}${" ".repeat(Math.max(0, pad))} │`;
|
|
45
|
+
})
|
|
46
|
+
.join("\n");
|
|
47
|
+
const bottom = `└${"─".repeat(width + 2)}┘`;
|
|
48
|
+
if (!borderColor) {
|
|
49
|
+
return `${top}\n│ ${title.padEnd(width)} │\n├${"─".repeat(width + 2)}┤\n${middle}\n${bottom}`;
|
|
50
|
+
}
|
|
51
|
+
return `${color(top, borderColor)}\n${color(`│ ${title.padEnd(width)} │`, borderColor)}\n${color(`├${"─".repeat(width + 2)}┤`, borderColor)}\n${middle}\n${color(bottom, borderColor)}`;
|
|
52
|
+
}
|
|
53
|
+
export function printInfo(message) {
|
|
54
|
+
outputAdapter.writeStdout(`${color(message, `${BOLD}${CYAN}`)}\n`);
|
|
55
|
+
}
|
|
56
|
+
export function printError(message) {
|
|
57
|
+
outputAdapter.writeStderr(`${color(message, `${BOLD}${RED}`)}\n`);
|
|
58
|
+
}
|
|
59
|
+
export function printPrompt(toolName, prompt) {
|
|
60
|
+
outputAdapter.writeStdout(`${renderPanel(`${toolName} Prompt`, prompt, BLUE)}\n`);
|
|
61
|
+
}
|
|
62
|
+
export function printSummary(title, text) {
|
|
63
|
+
outputAdapter.writeStdout(`${renderPanel(title, text.trim() || "Empty summary", YELLOW)}\n`);
|
|
64
|
+
}
|
|
65
|
+
export function printPanel(title, text, tone) {
|
|
66
|
+
const borderColor = tone === "green" ? GREEN : tone === "yellow" ? YELLOW : tone === "magenta" ? MAGENTA : CYAN;
|
|
67
|
+
outputAdapter.writeStdout(`${renderPanel(title, text, borderColor)}\n`);
|
|
68
|
+
}
|
|
69
|
+
export function formatDone(elapsed) {
|
|
70
|
+
return `${color("Done", GREEN)} ${elapsed}`;
|
|
71
|
+
}
|
|
72
|
+
export function dim(text) {
|
|
73
|
+
return color(text, DIM);
|
|
74
|
+
}
|
|
75
|
+
export function bold(text) {
|
|
76
|
+
return color(text, BOLD);
|
|
77
|
+
}
|
|
78
|
+
export function bye() {
|
|
79
|
+
outputAdapter.writeStdout(`${color("Bye", CYAN)}\n`);
|
|
80
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentweaver",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI orchestrator for Jira/Codex/Claude engineering workflows",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent",
|
|
7
|
+
"cli",
|
|
8
|
+
"jira",
|
|
9
|
+
"codex",
|
|
10
|
+
"claude",
|
|
11
|
+
"tui",
|
|
12
|
+
"developer-tools"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/seko99/AgentWeaver#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/seko99/AgentWeaver/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/seko99/AgentWeaver.git"
|
|
21
|
+
},
|
|
22
|
+
"license": "UNLICENSED",
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "dist/index.js",
|
|
25
|
+
"exports": "./dist/index.js",
|
|
26
|
+
"bin": {
|
|
27
|
+
"agentweaver": "dist/index.js"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"packageManager": "npm@9.2.0",
|
|
37
|
+
"preferGlobal": true,
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p tsconfig.json",
|
|
40
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
41
|
+
"prepublishOnly": "npm run check && npm run build",
|
|
42
|
+
"pack:check": "npm pack --dry-run",
|
|
43
|
+
"start": "node dist/index.js",
|
|
44
|
+
"dev": "node --loader ts-node/esm src/index.ts"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18.19.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.17.30",
|
|
51
|
+
"ts-node": "^10.9.2",
|
|
52
|
+
"typescript": "^5.8.3"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"markdown-it": "^14.1.1",
|
|
56
|
+
"neo-blessed": "^0.2.0"
|
|
57
|
+
}
|
|
58
|
+
}
|