task-master-agent 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 +56 -0
- package/bin/task-master-agent.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +24 -0
- package/dist/detect-project.d.ts +9 -0
- package/dist/detect-project.js +74 -0
- package/dist/init.d.ts +5 -0
- package/dist/init.js +67 -0
- package/package.json +45 -0
- package/templates/cursor/task-master.mdc +39 -0
- package/templates/prompts/task-master-prompt.md +46 -0
- package/templates/rules/task-master.md +24 -0
- package/templates/workflows/task-next.md +16 -0
- package/templates/workflows/verify-task.ejs +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# task-master-agent
|
|
2
|
+
|
|
3
|
+
Task Master 규칙과 워크플로우를 Antigravity, Cursor 등 AI 코딩 에이전트에 설치하는 CLI 도구입니다.
|
|
4
|
+
|
|
5
|
+
PRD를 구조화된 태스크로 파싱하고, 태스크 관리·실행·검증을 AI 에이전트가 수행할 수 있도록 설정합니다.
|
|
6
|
+
|
|
7
|
+
## 설치
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx task-master-agent init
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`--force` 옵션으로 기존 파일을 덮어쓸 수 있습니다.
|
|
14
|
+
|
|
15
|
+
## 설치되는 파일
|
|
16
|
+
|
|
17
|
+
| 경로 | 용도 |
|
|
18
|
+
|------|------|
|
|
19
|
+
| `.agent/rules/task-master.md` | Task Master 역할 정의 (Antigravity) |
|
|
20
|
+
| `.agent/workflows/task-next.md` | 다음 태스크 실행 워크플로우 |
|
|
21
|
+
| `.agent/workflows/verify-task.md` | 태스크 검증 워크플로우 (프로젝트 구조에 맞춤 생성) |
|
|
22
|
+
| `.agent/prompts/task-master-prompt.md` | 프롬프트 예시 모음 |
|
|
23
|
+
| `.cursor/rules/task-master.mdc` | Cursor용 Task Master 룰 |
|
|
24
|
+
|
|
25
|
+
## 프로젝트 감지
|
|
26
|
+
|
|
27
|
+
`init` 실행 시 `package.json`, `pnpm-workspace.yaml`, `turbo.json`을 분석하여:
|
|
28
|
+
|
|
29
|
+
- **pnpm + turbo**: `pnpm typecheck`, `pnpm lint`, `pnpm build` 사용
|
|
30
|
+
- **pnpm workspaces**: `apps/*`, `packages/*` 등 워크스페이스 패키지별 검증 단계 생성
|
|
31
|
+
- **단일 프로젝트**: `npm run build`, `npm run test` 등 기본 스크립트 사용
|
|
32
|
+
|
|
33
|
+
`verify-task.md`가 프로젝트 구조에 맞게 자동 생성됩니다.
|
|
34
|
+
|
|
35
|
+
## Antigravity 사용
|
|
36
|
+
|
|
37
|
+
Antigravity는 `.agent/rules/`, `.agent/workflows/`를 **자동 발견**합니다. 수동 등록 불필요.
|
|
38
|
+
|
|
39
|
+
| 슬래시 커맨드 | 용도 |
|
|
40
|
+
|---------------|------|
|
|
41
|
+
| `/task-next` | 다음 태스크 찾아서 구현 + 검증 |
|
|
42
|
+
| `/verify-task` | 현재 작업 검증 |
|
|
43
|
+
|
|
44
|
+
## Cursor 사용
|
|
45
|
+
|
|
46
|
+
`.cursor/rules/task-master.mdc`는 `prd/`, `TASK_BREAKDOWN.md`, `PRODUCT_REQUIREMENTS.md` 관련 파일을 열었을 때 적용됩니다.
|
|
47
|
+
|
|
48
|
+
## 필요한 프로젝트 구조
|
|
49
|
+
|
|
50
|
+
- `PRODUCT_REQUIREMENTS.md` 또는 `prd/` 폴더: PRD 문서
|
|
51
|
+
- `.agent/TASK_BREAKDOWN.md`: 태스크 정의 (직접 작성 또는 AI가 생성)
|
|
52
|
+
- `.agent/PROJECT_CONTEXT.md`: 프로젝트 컨텍스트 (선택)
|
|
53
|
+
|
|
54
|
+
## 라이선스
|
|
55
|
+
|
|
56
|
+
MIT
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runInit } from "./init.js";
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
const force = args.includes("--force");
|
|
5
|
+
const cwd = process.cwd();
|
|
6
|
+
if (args.includes("init")) {
|
|
7
|
+
runInit({ cwd, force });
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.log(`
|
|
11
|
+
task-master-agent - Task Master rules for AI coding agents
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
npx task-master-agent init [--force]
|
|
15
|
+
|
|
16
|
+
Options:
|
|
17
|
+
--force Overwrite existing files
|
|
18
|
+
|
|
19
|
+
After init:
|
|
20
|
+
- Antigravity: .agent/rules, .agent/workflows 자동 인식
|
|
21
|
+
- Cursor: .cursor/rules/task-master.mdc 적용
|
|
22
|
+
- Slash: /task-next, /verify-task
|
|
23
|
+
`);
|
|
24
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ProjectDetect {
|
|
2
|
+
packageManager: "pnpm" | "npm" | "yarn";
|
|
3
|
+
runCmd: string;
|
|
4
|
+
hasTurbo: boolean;
|
|
5
|
+
workspaces: string[];
|
|
6
|
+
workspacePackages: string[];
|
|
7
|
+
scripts: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function detectProject(cwd: string): ProjectDetect;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
const DEFAULT_SCRIPTS = ["typecheck", "lint", "build", "test"];
|
|
4
|
+
export function detectProject(cwd) {
|
|
5
|
+
const pkgPath = join(cwd, "package.json");
|
|
6
|
+
const pkg = existsSync(pkgPath)
|
|
7
|
+
? JSON.parse(readFileSync(pkgPath, "utf-8"))
|
|
8
|
+
: {};
|
|
9
|
+
const pnpmWorkspacePath = join(cwd, "pnpm-workspace.yaml");
|
|
10
|
+
const hasPnpmWorkspace = existsSync(pnpmWorkspacePath);
|
|
11
|
+
const hasTurbo = existsSync(join(cwd, "turbo.json"));
|
|
12
|
+
const hasYarnWorkspace = Array.isArray(pkg.workspaces) || typeof pkg.workspaces === "object";
|
|
13
|
+
let packageManager = "npm";
|
|
14
|
+
let runCmd = "npm run";
|
|
15
|
+
let workspaces = [];
|
|
16
|
+
let workspacePackages = [];
|
|
17
|
+
if (hasPnpmWorkspace) {
|
|
18
|
+
packageManager = "pnpm";
|
|
19
|
+
runCmd = "pnpm";
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(pnpmWorkspacePath, "utf-8");
|
|
22
|
+
const match = content.match(/packages:\s*\n([\s\S]*?)(?=\n[A-Za-z]|\n$)/);
|
|
23
|
+
if (match) {
|
|
24
|
+
workspaces = match[1]
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map((s) => s.trim().replace(/['"]/g, "").replace(/^-\s*/, ""))
|
|
27
|
+
.filter((s) => s && !s.startsWith("#"));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
workspaces = ["apps/*", "packages/*"];
|
|
32
|
+
}
|
|
33
|
+
workspacePackages = expandWorkspaceGlobs(cwd, workspaces);
|
|
34
|
+
}
|
|
35
|
+
else if (hasYarnWorkspace) {
|
|
36
|
+
packageManager = "yarn";
|
|
37
|
+
runCmd = "yarn";
|
|
38
|
+
const ws = pkg.workspaces;
|
|
39
|
+
workspaces = Array.isArray(ws) ? ws : ws?.packages ?? [];
|
|
40
|
+
workspacePackages = expandWorkspaceGlobs(cwd, workspaces);
|
|
41
|
+
}
|
|
42
|
+
const scripts = pkg.scripts ?? {};
|
|
43
|
+
return {
|
|
44
|
+
packageManager,
|
|
45
|
+
runCmd,
|
|
46
|
+
hasTurbo,
|
|
47
|
+
workspaces,
|
|
48
|
+
workspacePackages,
|
|
49
|
+
scripts,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function expandWorkspaceGlobs(cwd, patterns) {
|
|
53
|
+
const packages = [];
|
|
54
|
+
for (const pattern of patterns) {
|
|
55
|
+
if (pattern.includes("*")) {
|
|
56
|
+
const [base, glob] = pattern.split("/");
|
|
57
|
+
const basePath = join(cwd, base);
|
|
58
|
+
if (existsSync(basePath)) {
|
|
59
|
+
try {
|
|
60
|
+
const entries = readdirSync(basePath, { withFileTypes: true });
|
|
61
|
+
for (const e of entries) {
|
|
62
|
+
if (e.isDirectory() && !e.name.startsWith(".")) {
|
|
63
|
+
packages.push(e.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
packages.push(base.replace("*", "app"));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return [...new Set(packages)];
|
|
74
|
+
}
|
package/dist/init.d.ts
ADDED
package/dist/init.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mkdirSync, copyFileSync, readFileSync, writeFileSync, existsSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { render } from "ejs";
|
|
5
|
+
import { detectProject } from "./detect-project.js";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const PKG_ROOT = join(__dirname, "..");
|
|
8
|
+
const TEMPLATES = join(PKG_ROOT, "templates");
|
|
9
|
+
function ensureDir(dir) {
|
|
10
|
+
if (!existsSync(dir)) {
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function copyIfNotExists(src, dest, force) {
|
|
15
|
+
if (!existsSync(dest) || force) {
|
|
16
|
+
ensureDir(dirname(dest));
|
|
17
|
+
copyFileSync(src, dest);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
export function runInit(options) {
|
|
23
|
+
const { cwd, force = false } = options;
|
|
24
|
+
const project = detectProject(cwd);
|
|
25
|
+
const agentRules = join(cwd, ".agent", "rules");
|
|
26
|
+
const agentWorkflows = join(cwd, ".agent", "workflows");
|
|
27
|
+
const agentPrompts = join(cwd, ".agent", "prompts");
|
|
28
|
+
const cursorRules = join(cwd, ".cursor", "rules");
|
|
29
|
+
ensureDir(agentRules);
|
|
30
|
+
ensureDir(agentWorkflows);
|
|
31
|
+
ensureDir(agentPrompts);
|
|
32
|
+
ensureDir(cursorRules);
|
|
33
|
+
const copied = [];
|
|
34
|
+
if (copyIfNotExists(join(TEMPLATES, "rules", "task-master.md"), join(agentRules, "task-master.md"), force)) {
|
|
35
|
+
copied.push(".agent/rules/task-master.md");
|
|
36
|
+
}
|
|
37
|
+
if (copyIfNotExists(join(TEMPLATES, "workflows", "task-next.md"), join(agentWorkflows, "task-next.md"), force)) {
|
|
38
|
+
copied.push(".agent/workflows/task-next.md");
|
|
39
|
+
}
|
|
40
|
+
if (copyIfNotExists(join(TEMPLATES, "cursor", "task-master.mdc"), join(cursorRules, "task-master.mdc"), force)) {
|
|
41
|
+
copied.push(".cursor/rules/task-master.mdc");
|
|
42
|
+
}
|
|
43
|
+
if (copyIfNotExists(join(TEMPLATES, "prompts", "task-master-prompt.md"), join(agentPrompts, "task-master-prompt.md"), force)) {
|
|
44
|
+
copied.push(".agent/prompts/task-master-prompt.md");
|
|
45
|
+
}
|
|
46
|
+
const verifyTaskDest = join(agentWorkflows, "verify-task.md");
|
|
47
|
+
const verifyTaskTemplate = readFileSync(join(TEMPLATES, "workflows", "verify-task.ejs"), "utf-8");
|
|
48
|
+
const verifyTaskRendered = render(verifyTaskTemplate, {
|
|
49
|
+
packageManager: project.packageManager,
|
|
50
|
+
runCmd: project.runCmd,
|
|
51
|
+
hasTurbo: project.hasTurbo,
|
|
52
|
+
workspacePackages: project.workspacePackages,
|
|
53
|
+
});
|
|
54
|
+
if (!existsSync(verifyTaskDest) || force) {
|
|
55
|
+
writeFileSync(verifyTaskDest, verifyTaskRendered);
|
|
56
|
+
copied.push(".agent/workflows/verify-task.md");
|
|
57
|
+
}
|
|
58
|
+
if (copied.length > 0) {
|
|
59
|
+
console.log("✅ task-master-agent initialized:");
|
|
60
|
+
copied.forEach((f) => console.log(` - ${f}`));
|
|
61
|
+
console.log("\n📌 Antigravity: .agent/rules, .agent/workflows 자동 인식");
|
|
62
|
+
console.log("📌 Cursor: .cursor/rules/task-master.mdc 적용");
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log("ℹ️ task-master-agent: 이미 설치됨. --force 로 덮어쓰기 가능");
|
|
66
|
+
}
|
|
67
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "task-master-agent",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Task Master rules and workflows for AI coding agents (Antigravity, Cursor)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"task-master-agent": "./bin/task-master-agent.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "pnpm build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"task-master",
|
|
16
|
+
"antigravity",
|
|
17
|
+
"cursor",
|
|
18
|
+
"ai-agent",
|
|
19
|
+
"prd",
|
|
20
|
+
"task-management"
|
|
21
|
+
],
|
|
22
|
+
"author": "Minikanko",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/Minikanko/task-master-agent.git"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"bin",
|
|
30
|
+
"dist",
|
|
31
|
+
"templates"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"ejs": "^3.1.10"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/ejs": "^3.1.5",
|
|
38
|
+
"@types/node": "^22.10.0",
|
|
39
|
+
"typescript": "^5.7.0"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18"
|
|
43
|
+
},
|
|
44
|
+
"packageManager": "pnpm@9.1.0"
|
|
45
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Task Master 역할 - PRD 파싱, 태스크 생성/관리, 복잡도 분석
|
|
3
|
+
globs: "**/prd/**","**/TASK_BREAKDOWN.md","**/PRODUCT_REQUIREMENTS.md"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Task Master 역할
|
|
8
|
+
|
|
9
|
+
PRD/태스크 관련 파일이 열려 있거나, 사용자가 태스크 관리 관련 요청을 하면 **Task Master** 역할로 동작한다.
|
|
10
|
+
|
|
11
|
+
## 핵심 동작
|
|
12
|
+
|
|
13
|
+
1. **PRD 파싱 → 태스크 생성**: `PRODUCT_REQUIREMENTS.md`, `prd/*.md`를 분석해 구조화된 태스크 목록 생성
|
|
14
|
+
2. **태스크 확장**: 개별 태스크를 서브태스크로 세분화 (구현 상세, 완료 기준 포함)
|
|
15
|
+
3. **태스크 목록/상세**: `TASK_BREAKDOWN.md` 형식으로 목록 제공 또는 특정 태스크 상세 표시
|
|
16
|
+
4. **태스크 업데이트**: 사용자 요청에 따라 태스크 내용 수정
|
|
17
|
+
5. **복잡도 분석**: 태스크별 난이도·예상 시간·의존성 분석 제안
|
|
18
|
+
6. **태스크 실행**: `TASK_BREAKDOWN.md`의 완료 기준에 따라 구현 후 `.agent/workflows/verify-task.md` 검증 수행
|
|
19
|
+
|
|
20
|
+
## 출력 형식 (TASK_BREAKDOWN.md 준수)
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
### N.N 태스크 제목 [우선순위]
|
|
24
|
+
**예상 시간**: Xh | **난이도**: ⭐~⭐⭐⭐
|
|
25
|
+
|
|
26
|
+
#### 수행 작업
|
|
27
|
+
- 항목 1
|
|
28
|
+
- 항목 2
|
|
29
|
+
|
|
30
|
+
#### 완료 기준
|
|
31
|
+
- [ ] 기준 1
|
|
32
|
+
- [ ] 기준 2
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 참조 문서
|
|
36
|
+
|
|
37
|
+
- `.agent/TASK_BREAKDOWN.md` - 기존 태스크 정의
|
|
38
|
+
- `.agent/PROJECT_CONTEXT.md` - 프로젝트 컨텍스트
|
|
39
|
+
- `.agent/workflows/verify-task.md` - 태스크 완료 검증
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Task Master 모드 활성화 프롬프트
|
|
2
|
+
|
|
3
|
+
> `npx task-master-agent init` 실행 후, Antigravity/Cursor에서 `.agent/rules/`와 `.agent/workflows/`가 자동으로 인식됩니다.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Antigravity 사용
|
|
8
|
+
|
|
9
|
+
파일이 `.agent/`에 있으면 Antigravity가 **자동 발견**합니다. 수동 등록 불필요.
|
|
10
|
+
|
|
11
|
+
| 슬래시 커맨드 | 용도 |
|
|
12
|
+
|---------------|------|
|
|
13
|
+
| `/task-next` | 다음 태스크 찾아서 구현 + 검증 |
|
|
14
|
+
| `/verify-task` | 현재 작업 검증 |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 기본 활성화 (간단)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
태스크 마스터 역할로 동작해줘. [원하는 작업]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 작업별 프롬프트 예시
|
|
27
|
+
|
|
28
|
+
### PRD → 태스크 파싱
|
|
29
|
+
```
|
|
30
|
+
PRD(PRODUCT_REQUIREMENTS.md 또는 prd/파일)를 분석해서 구조화된 태스크 목록을 만들어줘. TASK_BREAKDOWN.md 형식으로 작성해.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 다음 태스크 실행
|
|
34
|
+
```
|
|
35
|
+
다음 수행할 태스크를 찾아서 구현해줘. TASK_BREAKDOWN.md와 verify-task 워크플로우를 따라 검증까지 완료해.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 태스크 목록 조회
|
|
39
|
+
```
|
|
40
|
+
대기 중인 태스크 목록을 보여줘. 우선순위와 난이도 순으로 정렬해.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 복잡도 분석
|
|
44
|
+
```
|
|
45
|
+
현재 태스크들의 복잡도를 분석해줘. 더 세분화가 필요한 태스크가 있으면 알려줘.
|
|
46
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Task Master 역할
|
|
2
|
+
|
|
3
|
+
PRD/태스크 관련 요청 시 **Task Master** 역할로 동작한다.
|
|
4
|
+
|
|
5
|
+
## 핵심 동작
|
|
6
|
+
|
|
7
|
+
1. **PRD 파싱** → `PRODUCT_REQUIREMENTS.md`, `prd/*.md` 분석 후 구조화된 태스크 목록 생성
|
|
8
|
+
2. **태스크 확장** → 개별 태스크를 서브태스크로 세분화 (구현 상세, 완료 기준 포함)
|
|
9
|
+
3. **태스크 목록/상세** → `TASK_BREAKDOWN.md` 형식으로 목록 또는 특정 태스크 상세 제공
|
|
10
|
+
4. **태스크 업데이트** → 사용자 요청에 따라 태스크 내용 수정
|
|
11
|
+
5. **복잡도 분석** → 태스크별 난이도·예상 시간·의존성 분석
|
|
12
|
+
6. **태스크 실행** → `TASK_BREAKDOWN.md` 완료 기준에 따라 구현 후 `verify-task` 워크플로우로 검증
|
|
13
|
+
|
|
14
|
+
## 출력 형식 (TASK_BREAKDOWN.md 준수)
|
|
15
|
+
|
|
16
|
+
- 마커: 🔴 필수 / 🟡 권장 / 🟢 선택
|
|
17
|
+
- 난이도: ⭐~⭐⭐⭐
|
|
18
|
+
- 완료 기준: `- [ ]` 체크리스트
|
|
19
|
+
|
|
20
|
+
## 참조 문서
|
|
21
|
+
|
|
22
|
+
- @.agent/TASK_BREAKDOWN.md
|
|
23
|
+
- @.agent/PROJECT_CONTEXT.md
|
|
24
|
+
- @.agent/workflows/verify-task.md
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 다음 수행할 태스크를 찾아 구현하고 검증까지 완료
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 다음 태스크 실행
|
|
6
|
+
|
|
7
|
+
1. `TASK_BREAKDOWN.md`에서 미완료 태스크 중 **가장 우선순위가 높은 것**을 선택한다.
|
|
8
|
+
2. 해당 태스크의 **수행 작업**과 **완료 기준**을 확인한다.
|
|
9
|
+
3. 요구사항에 따라 코드를 구현한다.
|
|
10
|
+
4. 구현 완료 후 **verify-task** 워크플로우를 호출하여 검증한다.
|
|
11
|
+
5. 검증 통과 시 해당 태스크의 완료 기준을 체크하고, 다음 태스크로 진행한다.
|
|
12
|
+
|
|
13
|
+
## 참조
|
|
14
|
+
|
|
15
|
+
- @.agent/TASK_BREAKDOWN.md
|
|
16
|
+
- @.agent/workflows/verify-task.md
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 태스크 완료 후 자동 검증 워크플로우
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 태스크 완료 후 검증 워크플로우
|
|
6
|
+
|
|
7
|
+
이 워크플로우는 모든 태스크 완료 시 **반드시** 수행해야 하는 검증 단계입니다.
|
|
8
|
+
|
|
9
|
+
> ⚠️ **중요**: 검증은 단순 빌드/린트 체크가 아닌, **구현된 기능과 UI가 요구사항에 부합하는지**까지 포함합니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1단계: 코드 품질 검증
|
|
14
|
+
<% if (hasTurbo) { %>// turbo
|
|
15
|
+
<% } %>```bash
|
|
16
|
+
<%= runCmd %> typecheck
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
<% if (hasTurbo) { %>// turbo
|
|
20
|
+
<% } %>```bash
|
|
21
|
+
<%= runCmd %> lint
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 2단계: 빌드 검증
|
|
25
|
+
<% if (hasTurbo) { %>// turbo
|
|
26
|
+
<% } %>```bash
|
|
27
|
+
<%= runCmd %> build
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
<% if (workspacePackages.length > 0) { %>## 3단계: 앱별 런타임 검증
|
|
31
|
+
|
|
32
|
+
<% workspacePackages.forEach(function(pkg) { %>### <%= pkg %> 변경 시
|
|
33
|
+
<% if (hasTurbo) { %>// turbo
|
|
34
|
+
<% } %>```bash
|
|
35
|
+
<%= packageManager === 'pnpm' ? 'pnpm --filter ' + pkg + ' dev' : runCmd + ' --workspace=' + pkg + ' dev' %>
|
|
36
|
+
```
|
|
37
|
+
- 변경된 화면/기능 동작 확인
|
|
38
|
+
|
|
39
|
+
<% }); %>
|
|
40
|
+
<% } %>## <%= workspacePackages.length > 0 ? '4' : '3' %>단계: 요구사항 충족 검증 ⭐ 핵심
|
|
41
|
+
|
|
42
|
+
> 💡 **이 단계가 가장 중요합니다.** 코드가 빌드되더라도 요구사항을 충족하지 않으면 태스크 미완료입니다.
|
|
43
|
+
|
|
44
|
+
### 기능 요구사항 검증
|
|
45
|
+
| 검증 항목 | 확인 방법 |
|
|
46
|
+
|----------|----------|
|
|
47
|
+
| **명세된 기능 동작** | 태스크에 정의된 모든 기능이 실제로 동작하는가? |
|
|
48
|
+
| **엣지 케이스 처리** | 빈 값, 잘못된 입력 등 예외 상황 처리가 되는가? |
|
|
49
|
+
| **에러 핸들링** | 에러 발생 시 적절한 피드백이 표시되는가? |
|
|
50
|
+
|
|
51
|
+
### 검증 방법
|
|
52
|
+
1. **브라우저 도구 활용** - 실제 화면 캡처 및 동작 테스트
|
|
53
|
+
2. **PRD 문서 대조** - `prd/*.md` 파일의 요구사항과 구현 내용 비교
|
|
54
|
+
3. **TASK_BREAKDOWN.md 체크** - 완료 기준 항목 하나씩 확인
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 검증 결과 처리
|
|
59
|
+
|
|
60
|
+
### ✅ 모든 검증 통과 시
|
|
61
|
+
1. `TASK_BREAKDOWN.md`에서 완료 기준 항목 체크
|
|
62
|
+
2. 다음 태스크로 진행
|
|
63
|
+
|
|
64
|
+
### ❌ 검증 실패 시
|
|
65
|
+
1. **실패 원인 분석** → 수정 → 재검증
|
|
66
|
+
2. 모든 검증 통과 시까지 반복
|