vibe-commander 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/AGENTS.md +18 -0
  2. package/README.ko.md +643 -0
  3. package/README.md +643 -0
  4. package/dist/adapters/cli/commands/context-resolver.js +30 -0
  5. package/dist/adapters/cli/commands/git-helpers.js +5 -3
  6. package/dist/adapters/cli/commands/init-helpers.js +1 -1
  7. package/dist/adapters/cli/commands/io-helpers.js +6 -2
  8. package/dist/adapters/cli/commands/list-units.d.ts +2 -3
  9. package/dist/adapters/cli/commands/list-units.js +8 -34
  10. package/dist/adapters/cli/commands/schema.js +7 -3
  11. package/dist/adapters/cli/commands/set-unit.d.ts +5 -0
  12. package/dist/adapters/cli/commands/set-unit.js +149 -10
  13. package/dist/adapters/cli/commands/skill-install.js +10 -4
  14. package/dist/adapters/cli/formatters-schema.d.ts +17 -0
  15. package/dist/adapters/cli/formatters-schema.js +155 -0
  16. package/dist/adapters/cli/formatters-unit.d.ts +0 -8
  17. package/dist/adapters/cli/formatters-unit.js +4 -146
  18. package/dist/adapters/cli/index.js +2 -1
  19. package/dist/adapters/cli/output.js +3 -0
  20. package/dist/adapters/cli/router.d.ts +1 -12
  21. package/dist/adapters/cli/router.js +12 -107
  22. package/dist/adapters/cli/stdin-parser.d.ts +23 -0
  23. package/dist/adapters/cli/stdin-parser.js +121 -0
  24. package/dist/config/schema.d.ts +2 -9
  25. package/dist/config/schema.js +143 -56
  26. package/dist/core/parsers/dep-line-parser.js +7 -3
  27. package/dist/core/parsers/dependency-extractor.js +80 -14
  28. package/dist/core/parsers/index.d.ts +2 -1
  29. package/dist/core/parsers/index.js +3 -1
  30. package/dist/core/parsers/plan-parser-helpers.js +5 -0
  31. package/dist/core/parsers/subsection-extractor.d.ts +20 -0
  32. package/dist/core/parsers/subsection-extractor.js +56 -0
  33. package/dist/core/parsers/title-extractor.d.ts +16 -0
  34. package/dist/core/parsers/title-extractor.js +26 -0
  35. package/dist/core/renderers/index.d.ts +2 -1
  36. package/dist/core/renderers/index.js +1 -1
  37. package/dist/core/renderers/marker-utils.js +5 -3
  38. package/dist/core/renderers/schema-renderer.d.ts +16 -0
  39. package/dist/core/renderers/schema-renderer.js +21 -0
  40. package/dist/core/renderers/section-renderer.d.ts +9 -1
  41. package/dist/core/renderers/section-renderer.js +14 -5
  42. package/dist/core/resolvers/backlog-resolver.d.ts +37 -0
  43. package/dist/core/resolvers/backlog-resolver.js +50 -0
  44. package/dist/core/resolvers/index.d.ts +0 -2
  45. package/examples/nextjs-web.config.json +73 -0
  46. package/examples/python-backend.config.json +91 -0
  47. package/examples/tauri-app.config.json +95 -0
  48. package/examples/vscode-tasks.json +101 -0
  49. package/package.json +14 -2
  50. package/schemas/config-schema.json +409 -0
  51. package/skills/claude/SKILL.md +22 -0
  52. package/skills/common/cli-reference.md +22 -0
  53. package/skills/cursor/SKILL.md +22 -0
  54. package/dist/adapters/cli/formatters.d.ts +0 -2
  55. package/dist/adapters/cli/formatters.js +0 -3
@@ -16,5 +16,5 @@ export { updateSection, updateField } from './section-updater.js';
16
16
  // 마커 유틸리티
17
17
  export { createBeginMarker, createEndMarker, findMarkerRange, isValidSectionKey, wrapWithMarkers, stripMarkers, } from './marker-utils.js';
18
18
  // 스키마 렌더러
19
- export { COMMAND_REGISTRY, SCHEMA_SUBCOMMANDS, renderCommandsSchema, renderTypesSchema, } from './schema-renderer.js';
19
+ export { COMMAND_REGISTRY, SCHEMA_SUBCOMMANDS, renderConfigSchema, renderCommandsSchema, renderTypesSchema, } from './schema-renderer.js';
20
20
  //# sourceMappingURL=index.js.map
@@ -10,10 +10,12 @@
10
10
  * @module
11
11
  */
12
12
  import { stripCR } from '../parsers/md-utils.js';
13
+ /** HTML 주석 마커의 네임스페이스 접두어 */
14
+ const MARKER_PREFIX = 'vc';
13
15
  /** sectionKey 허용 패턴: 영문 소문자 시작, 소문자+숫자+하이픈 */
14
16
  const SECTION_KEY_RE = /^[a-z][a-z0-9-]*$/;
15
17
  /** 마커 라인 매칭 정규식 */
16
- const MARKER_LINE_RE = /^<!--\s*vc:(begin|end):([a-z][a-z0-9-]*)\s*-->$/;
18
+ const MARKER_LINE_RE = new RegExp(`^<!--\\s*${MARKER_PREFIX}:(begin|end):([a-z][a-z0-9-]*)\\s*-->$`);
17
19
  /**
18
20
  * sectionKey가 유효한지 검증한다
19
21
  *
@@ -28,7 +30,7 @@ export function isValidSectionKey(key) {
28
30
  * @example createBeginMarker('implement') → '<!-- vc:begin:implement -->'
29
31
  */
30
32
  export function createBeginMarker(sectionKey) {
31
- return `<!-- vc:begin:${sectionKey} -->`;
33
+ return `<!-- ${MARKER_PREFIX}:begin:${sectionKey} -->`;
32
34
  }
33
35
  /**
34
36
  * end 마커 문자열을 생성한다
@@ -36,7 +38,7 @@ export function createBeginMarker(sectionKey) {
36
38
  * @example createEndMarker('implement') → '<!-- vc:end:implement -->'
37
39
  */
38
40
  export function createEndMarker(sectionKey) {
39
- return `<!-- vc:end:${sectionKey} -->`;
41
+ return `<!-- ${MARKER_PREFIX}:end:${sectionKey} -->`;
40
42
  }
41
43
  /**
42
44
  * 라인 배열에서 지정된 sectionKey의 마커 범위를 찾는다
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
+ import { z } from 'zod';
10
11
  import type { UnitTypeConfig } from '../../types/index.js';
11
12
  /** CLI 커맨드 인자 스키마 */
12
13
  export interface ArgSchema {
@@ -69,6 +70,21 @@ export type SchemaResult = {
69
70
  export declare const COMMAND_REGISTRY: CommandSchema[];
70
71
  /** schema 서브커맨드 도움말 정보 */
71
72
  export declare const SCHEMA_SUBCOMMANDS: SchemaSubcommandInfo[];
73
+ /**
74
+ * 프로젝트 설정 스키마를 JSON Schema (Draft 2020-12) 형식으로 렌더링한다
75
+ *
76
+ * Zod 4의 z.toJSONSchema() 내장 기능을 활용하여 변환.
77
+ * 에이전트가 설정 파일 구조를 런타임에 조회할 수 있도록 한다.
78
+ *
79
+ * @param schema - 변환할 Zod 스키마
80
+ * @param metadata - 스키마 메타데이터 ($id, title, description)
81
+ * @returns JSON Schema 호환 객체
82
+ */
83
+ export declare function renderConfigSchema(schema: z.ZodType, metadata?: {
84
+ id?: string;
85
+ title?: string;
86
+ description?: string;
87
+ }): Record<string, unknown>;
72
88
  /**
73
89
  * 커맨드 메타데이터를 구조화된 형태로 렌더링한다
74
90
  *
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
+ import { z } from 'zod';
10
11
  // ── 커맨드 레지스트리 (정적 메타데이터) ──
11
12
  const GLOBAL_FLAGS = [
12
13
  { name: '--help', alias: '-h', type: 'boolean', description: '도움말 출력' },
@@ -127,6 +128,26 @@ export const SCHEMA_SUBCOMMANDS = [
127
128
  { name: 'types', description: '현재 프로젝트의 유닛 유형 목록 + ID 패턴 출력' },
128
129
  ];
129
130
  // ── 공개 API ──
131
+ /**
132
+ * 프로젝트 설정 스키마를 JSON Schema (Draft 2020-12) 형식으로 렌더링한다
133
+ *
134
+ * Zod 4의 z.toJSONSchema() 내장 기능을 활용하여 변환.
135
+ * 에이전트가 설정 파일 구조를 런타임에 조회할 수 있도록 한다.
136
+ *
137
+ * @param schema - 변환할 Zod 스키마
138
+ * @param metadata - 스키마 메타데이터 ($id, title, description)
139
+ * @returns JSON Schema 호환 객체
140
+ */
141
+ export function renderConfigSchema(schema, metadata) {
142
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
143
+ const jsonSchema = z.toJSONSchema(schema);
144
+ return {
145
+ ...jsonSchema,
146
+ ...(metadata?.id && { $id: metadata.id }),
147
+ ...(metadata?.title && { title: metadata.title }),
148
+ ...(metadata?.description && { description: metadata.description }),
149
+ };
150
+ }
130
151
  /**
131
152
  * 커맨드 메타데이터를 구조화된 형태로 렌더링한다
132
153
  *
@@ -12,6 +12,13 @@
12
12
  * @module
13
13
  */
14
14
  import type { CommandContext, UnitTypeConfig } from '../../types/index.js';
15
+ /** renderSection 옵션 */
16
+ export interface RenderSectionOptions {
17
+ /** 보존할 기존 특별 요청사항 콘텐츠 (헤딩 포함). truthy이면 설정 기반 렌더링 대신 사용 */
18
+ preservedSpecialRequests?: string;
19
+ /** 특별 요청사항 섹션 헤딩 (기본: "### 특별 요청사항") */
20
+ specialRequestsHeading?: string;
21
+ }
15
22
  /**
16
23
  * 커맨드 파일 섹션을 렌더링한다
17
24
  *
@@ -25,7 +32,8 @@ import type { CommandContext, UnitTypeConfig } from '../../types/index.js';
25
32
  * @param context - 렌더링할 전체 컨텍스트 (유닛 메타 + 의존성 + 특별 요청)
26
33
  * @param unitTypeConfig - 유닛 유형 설정 (headerTemplate, collectDeps 등)
27
34
  * @param docPrefix - 문서 경로 앞에 붙일 프리픽스 (기본: "@")
35
+ * @param options - 추가 렌더링 옵션 (보존 콘텐츠, 커스텀 헤딩 등)
28
36
  * @returns 렌더링된 섹션 본문 문자열
29
37
  */
30
- export declare function renderSection(context: CommandContext, unitTypeConfig: UnitTypeConfig, docPrefix?: string): string;
38
+ export declare function renderSection(context: CommandContext, unitTypeConfig: UnitTypeConfig, docPrefix?: string, options?: RenderSectionOptions): string;
31
39
  //# sourceMappingURL=section-renderer.d.ts.map
@@ -16,6 +16,8 @@ import { interpolateTemplate } from './template-engine.js';
16
16
  const DEFAULT_DOC_PREFIX = '@';
17
17
  /** 빈 항목 표시 마커 */
18
18
  const EMPTY_MARKER = '-';
19
+ /** 기본 특별 요청사항 헤딩 */
20
+ const DEFAULT_SPECIAL_REQUESTS_HEADING = '### 특별 요청사항';
19
21
  /**
20
22
  * 커맨드 파일 섹션을 렌더링한다
21
23
  *
@@ -29,9 +31,10 @@ const EMPTY_MARKER = '-';
29
31
  * @param context - 렌더링할 전체 컨텍스트 (유닛 메타 + 의존성 + 특별 요청)
30
32
  * @param unitTypeConfig - 유닛 유형 설정 (headerTemplate, collectDeps 등)
31
33
  * @param docPrefix - 문서 경로 앞에 붙일 프리픽스 (기본: "@")
34
+ * @param options - 추가 렌더링 옵션 (보존 콘텐츠, 커스텀 헤딩 등)
32
35
  * @returns 렌더링된 섹션 본문 문자열
33
36
  */
34
- export function renderSection(context, unitTypeConfig, docPrefix = DEFAULT_DOC_PREFIX) {
37
+ export function renderSection(context, unitTypeConfig, docPrefix = DEFAULT_DOC_PREFIX, options) {
35
38
  const lines = [];
36
39
  // 1. Header block (headerTemplate 변수 보간)
37
40
  const header = interpolateTemplate(unitTypeConfig.headerTemplate, context.unit);
@@ -42,8 +45,14 @@ export function renderSection(context, unitTypeConfig, docPrefix = DEFAULT_DOC_P
42
45
  renderDepDocs(lines, context, docPrefix);
43
46
  renderDepCommits(lines, context);
44
47
  }
45
- // 3. 특별 요청사항 (항상 렌더링)
46
- renderSpecialRequests(lines, context);
48
+ // 3. 특별 요청사항: 보존 콘텐츠가 있으면 그대로 사용, 없으면 설정에서 렌더링
49
+ if (options?.preservedSpecialRequests) {
50
+ lines.push('');
51
+ lines.push(...options.preservedSpecialRequests.split('\n'));
52
+ }
53
+ else {
54
+ renderSpecialRequests(lines, context, options?.specialRequestsHeading);
55
+ }
47
56
  return lines.join('\n');
48
57
  }
49
58
  /**
@@ -113,9 +122,9 @@ function renderDepCommits(lines, context) {
113
122
  * 모든 미결정 질문이 답변되었으면 자동으로 ✅를 추가한다.
114
123
  * 답변된 페어링 질문은 특별 요청사항 뒤에 체크리스트 형태로 렌더링.
115
124
  */
116
- function renderSpecialRequests(lines, context) {
125
+ function renderSpecialRequests(lines, context, heading) {
117
126
  lines.push('');
118
- lines.push('### 특별 요청사항');
127
+ lines.push(heading ?? DEFAULT_SPECIAL_REQUESTS_HEADING);
119
128
  const allAnswered = areAllQuestionsAnswered(context);
120
129
  if (context.specialRequests.length > 0) {
121
130
  for (const req of context.specialRequests) {
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 백로그 분류 리졸버 — Layer 1 (Core)
3
+ *
4
+ * 파싱된 백로그 항목들을 필터링하고 상태별(ready/inProgress/blocked)로 분류한다.
5
+ *
6
+ * @module
7
+ */
8
+ import type { BacklogEntry, ToolResult } from '../../types/index.js';
9
+ /** 백로그 분류 옵션 */
10
+ export interface BacklogFilterOptions {
11
+ phase?: string;
12
+ excludeCompleted?: boolean;
13
+ }
14
+ /** 백로그 분류 결과 */
15
+ export interface ClassifiedBacklog {
16
+ total: number;
17
+ inProgress: BacklogEntry[];
18
+ ready: BacklogEntry[];
19
+ blocked: BacklogEntry[];
20
+ phase?: string;
21
+ }
22
+ /**
23
+ * 백로그 항목들을 분류한다 (Pure Function)
24
+ *
25
+ * @param entries - 파싱된 전체 백로그 항목
26
+ * @param options - 필터링 옵션
27
+ * @returns 분류된 결과
28
+ */
29
+ export declare function classifyBacklog(entries: BacklogEntry[], options?: BacklogFilterOptions): ToolResult<ClassifiedBacklog>;
30
+ /**
31
+ * 유닛 ID에서 phase 태그를 추출한다 (Pure Function)
32
+ *
33
+ * "U-016[Mvp]" → "Mvp"
34
+ * "CP-MVP-03" → null
35
+ */
36
+ export declare function extractPhaseFromId(unitId: string): string | null;
37
+ //# sourceMappingURL=backlog-resolver.d.ts.map
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 백로그 분류 리졸버 — Layer 1 (Core)
3
+ *
4
+ * 파싱된 백로그 항목들을 필터링하고 상태별(ready/inProgress/blocked)로 분류한다.
5
+ *
6
+ * @module
7
+ */
8
+ import { ok } from '../../types/index.js';
9
+ /**
10
+ * 백로그 항목들을 분류한다 (Pure Function)
11
+ *
12
+ * @param entries - 파싱된 전체 백로그 항목
13
+ * @param options - 필터링 옵션
14
+ * @returns 분류된 결과
15
+ */
16
+ export function classifyBacklog(entries, options = {}) {
17
+ const { phase, excludeCompleted = true } = options;
18
+ // 1. 완료 항목 제외 (옵션에 따라)
19
+ let activeEntries = excludeCompleted ? entries.filter((e) => e.status !== 'completed') : entries;
20
+ // 2. phase 필터링 (대소문자 무시)
21
+ if (phase) {
22
+ const normalizedPhase = phase.toLowerCase();
23
+ activeEntries = activeEntries.filter((e) => {
24
+ const entryPhase = extractPhaseFromId(e.unitId);
25
+ return entryPhase !== null && entryPhase.toLowerCase() === normalizedPhase;
26
+ });
27
+ }
28
+ // 3. 상태별 분류
29
+ const inProgress = activeEntries.filter((e) => e.status === 'inProgress');
30
+ const ready = activeEntries.filter((e) => e.status === 'ready');
31
+ const blocked = activeEntries.filter((e) => e.status === 'blocked');
32
+ return ok({
33
+ total: activeEntries.length,
34
+ inProgress,
35
+ ready,
36
+ blocked,
37
+ ...(phase !== undefined && { phase }),
38
+ });
39
+ }
40
+ /**
41
+ * 유닛 ID에서 phase 태그를 추출한다 (Pure Function)
42
+ *
43
+ * "U-016[Mvp]" → "Mvp"
44
+ * "CP-MVP-03" → null
45
+ */
46
+ export function extractPhaseFromId(unitId) {
47
+ const match = unitId.match(/\[([^\]]+)\]$/);
48
+ return match?.[1] ?? null;
49
+ }
50
+ //# sourceMappingURL=backlog-resolver.js.map
@@ -8,8 +8,6 @@
8
8
  export { resolveDepDocs } from './dep-doc-resolver.js';
9
9
  export type { DepDocPattern } from './dep-doc-resolver.js';
10
10
  export { findDepCommits } from './dep-commit-resolver.js';
11
- export type { CommitEntry } from './dep-commit-resolver.js';
12
11
  export { filterCommitsByChangedFiles, matchesGlobPattern } from './commit-filter.js';
13
- export type { CommitWithFiles, CommitFilterOptions } from './commit-filter.js';
14
12
  export { mergeConfigs, isPlainObject } from './config-merger.js';
15
13
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/viilab/vibe-commander/main/schemas/config-schema.json",
3
+ "version": 1,
4
+
5
+ "paths": {
6
+ "commands": ".cursor/context.md",
7
+ "roadmap": "docs/backlog.md",
8
+ "docRoots": {
9
+ "spec": "docs/specs",
10
+ "result": "docs/results"
11
+ },
12
+ "refactorSubDir": null
13
+ },
14
+
15
+ "unitTypes": [
16
+ {
17
+ "key": "feature",
18
+ "displayName": "Feature",
19
+ "idPattern": "^FEAT-\\d+$",
20
+ "planDir": "spec",
21
+ "commandSection": "# Current Feature",
22
+ "collectDeps": true,
23
+ "headerTemplate": "### Feature: {{title}}\n- Spec: @{{planPath}}\n- Latest Commit: -"
24
+ },
25
+ {
26
+ "key": "bugfix",
27
+ "displayName": "Bugfix",
28
+ "idPattern": "^BUG-\\d+$",
29
+ "planDir": "spec",
30
+ "commandSection": "# Current Bugfix",
31
+ "collectDeps": true,
32
+ "headerTemplate": "### Bugfix: {{title}}\n- Spec: @{{planPath}}\n- Latest Commit: -"
33
+ }
34
+ ],
35
+
36
+ "planParsing": {
37
+ "titleSource": "frontmatter:title",
38
+ "dependsSource": "frontmatter",
39
+ "dependsSectionName": null,
40
+ "pairingQuestionSection": "Open Questions"
41
+ },
42
+
43
+ "backlogParsing": {
44
+ "sectionHeader": "## Backlog",
45
+ "entryPattern": "- \\[(?<status>.)\\] (?<id>\\S+) — (?<title>.+?)(?:\\s*\\(deps: (?<deps>[^)]+)\\))?$",
46
+ "completedSection": "### Done",
47
+ "statusMap": {
48
+ "ready": " ",
49
+ "inProgress": "~",
50
+ "completed": "x",
51
+ "blocked": "!"
52
+ }
53
+ },
54
+
55
+ "commitSearch": {
56
+ "strategy": "git-log-grep",
57
+ "extractId": "shortId",
58
+ "maxResults": 3,
59
+ "excludePaths": ["docs/**", "*.md"],
60
+ "requirePaths": ["src/**", "app/**"]
61
+ },
62
+
63
+ "commandSections": {
64
+ "separator": "---",
65
+ "preserveOtherSections": true,
66
+ "useMarkers": false
67
+ },
68
+
69
+ "defaultSpecialRequests": [
70
+ "**Use Next.js App Router patterns**",
71
+ "**Run `pnpm test` before marking complete**"
72
+ ]
73
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/viilab/vibe-commander/main/schemas/config-schema.json",
3
+ "version": 1,
4
+
5
+ "paths": {
6
+ "commands": ".dev/context.md",
7
+ "roadmap": ".dev/backlog.md",
8
+ "docRoots": {
9
+ "plan": ".dev/plans",
10
+ "result": ".dev/results",
11
+ "runbook": ".dev/runbooks"
12
+ },
13
+ "refactorSubDir": null
14
+ },
15
+
16
+ "unitTypes": [
17
+ {
18
+ "key": "task",
19
+ "displayName": "Task",
20
+ "idPattern": "^TASK-\\d{3,}$",
21
+ "planDir": "plan",
22
+ "commandSection": "# Current Task",
23
+ "collectDeps": true,
24
+ "headerTemplate": "### Task: {{title}}\n- Plan: @{{planPath}}\n- Commit: -"
25
+ },
26
+ {
27
+ "key": "refactor",
28
+ "displayName": "Refactor",
29
+ "idPattern": "^REFACTOR-\\d{3,}$",
30
+ "planDir": "plan",
31
+ "commandSection": "# Current Refactor",
32
+ "collectDeps": false,
33
+ "headerTemplate": "### Refactor: {{title}}\n- Plan: @{{planPath}}\n- Commit: -"
34
+ }
35
+ ],
36
+
37
+ "docDiscovery": {
38
+ "plan": { "pattern": "{{unitId}}.md" },
39
+ "result": { "pattern": "{{unitId}}.md" },
40
+ "runbook": { "pattern": "{{shortId}}-*-runbook.md", "glob": true }
41
+ },
42
+
43
+ "planParsing": {
44
+ "titleSource": "h1",
45
+ "dependsSource": "metadata-table",
46
+ "dependsSectionName": null,
47
+ "pairingQuestionSection": "Open Questions",
48
+ "metadataTable": {
49
+ "idField": "Task ID",
50
+ "phaseField": "Sprint",
51
+ "dependsField": "Depends On"
52
+ }
53
+ },
54
+
55
+ "backlogParsing": {
56
+ "sectionHeader": "## Sprint Backlog",
57
+ "entryPattern": "- (?<status>[⬜🔄✅❌]) \\[(?<id>\\S+)\\]\\((?<path>[^)]+)\\)\\s*(?<title>[^(]+?)(?:\\s*\\(deps: (?<deps>[^)]+)\\))?$",
58
+ "completedSection": "### Completed",
59
+ "statusMap": {
60
+ "ready": "⬜",
61
+ "inProgress": "🔄",
62
+ "completed": "✅",
63
+ "blocked": "❌"
64
+ }
65
+ },
66
+
67
+ "commitSearch": {
68
+ "strategy": "git-log-grep",
69
+ "extractId": "shortId",
70
+ "maxResults": 5,
71
+ "excludePaths": [".dev/**"],
72
+ "requirePaths": ["src/**", "apps/**", "tests/**"]
73
+ },
74
+
75
+ "commandSections": {
76
+ "separator": "---",
77
+ "preserveOtherSections": true,
78
+ "commitFieldName": "Latest Commit",
79
+ "useMarkers": true
80
+ },
81
+
82
+ "defaultSpecialRequests": [
83
+ "**Follow Django best practices and PEP 8**",
84
+ "**Run `pytest` before marking complete**"
85
+ ],
86
+
87
+ "customRequests": {
88
+ "migration": "**Create and test Django migrations for any model changes**",
89
+ "api-docs": "**Update OpenAPI/Swagger documentation for API changes**"
90
+ }
91
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/viilab/vibe-commander/main/schemas/config-schema.json",
3
+ "version": 1,
4
+
5
+ "paths": {
6
+ "commands": "vibe/commands.md",
7
+ "roadmap": "vibe/roadmap.md",
8
+ "docRoots": {
9
+ "plan": "vibe/unit-plans",
10
+ "result": "vibe/unit-results",
11
+ "runbook": "vibe/unit-runbooks",
12
+ "refactorSub": "vibe/refactors"
13
+ },
14
+ "refactorSubDir": "vibe/refactors"
15
+ },
16
+
17
+ "unitTypes": [
18
+ {
19
+ "key": "refactor-sub",
20
+ "displayName": "리팩토링 서브유닛",
21
+ "idPattern": "^RU-\\d+-[A-Z]\\d+$",
22
+ "planDir": "refactorSub",
23
+ "commandSection": "# 리팩토링 유닛 구현 (의존X)",
24
+ "collectDeps": false,
25
+ "headerTemplate": "### 현재 리팩토링 유닛: [ID: {{unitId}}] {{titleOnly}}\n- 계획서: @{{planPath}}\n- Commit: -"
26
+ },
27
+ {
28
+ "key": "implement",
29
+ "displayName": "유닛 구현",
30
+ "idPattern": "^(U-\\d+|CP-).*",
31
+ "planDir": "plan",
32
+ "commandSection": "# 유닛 구현",
33
+ "collectDeps": true,
34
+ "headerTemplate": "### 현재 구현 유닛: {{title}}\n- 개발 계획서: @{{planPath}}\n- Commit: -"
35
+ },
36
+ {
37
+ "key": "refactor",
38
+ "displayName": "리팩토링 유닛",
39
+ "idPattern": "^RU-\\d+\\[.*\\]$",
40
+ "planDir": "plan",
41
+ "commandSection": "# 리팩토링 유닛 제안",
42
+ "collectDeps": true,
43
+ "headerTemplate": "### 현재 리팩토링 유닛: {{title}}\n- 계획서: @{{planPath}}\n- Commit: -"
44
+ }
45
+ ],
46
+
47
+ "docDiscovery": {
48
+ "plan": { "pattern": "{{unitId}}.md" },
49
+ "result": { "pattern": "{{unitId}}.md" },
50
+ "runbook": { "pattern": "{{shortId}}-*-runbook.md", "glob": true },
51
+ "refactorSub": { "pattern": "{{unitId}}.md" }
52
+ },
53
+
54
+ "planParsing": {
55
+ "titleSource": "h1",
56
+ "dependsSource": "section",
57
+ "dependsSectionName": "이전 작업에서 가져올 것",
58
+ "pairingQuestionSection": "페어링 질문",
59
+ "metadataTable": {
60
+ "idField": "Unit ID",
61
+ "phaseField": "Phase",
62
+ "dependsField": "의존성"
63
+ }
64
+ },
65
+
66
+ "commitSearch": {
67
+ "strategy": "git-log-grep",
68
+ "extractId": "shortId",
69
+ "maxResults": 5,
70
+ "excludePaths": ["vibe/**", "docs/**"],
71
+ "requirePaths": ["src/**", "src-tauri/**"]
72
+ },
73
+
74
+ "commandSections": {
75
+ "separator": "---------------------------------------------------",
76
+ "preserveOtherSections": true,
77
+ "useMarkers": true
78
+ },
79
+
80
+ "defaultSpecialRequests": [
81
+ "**페어링 질문의 결정을 확인합니다**"
82
+ ],
83
+
84
+ "specialRequestsByType": {
85
+ "implement": [
86
+ "**Tauri v2 공식 문서를 참고하여 구현합니다**",
87
+ "**Shell Tool을 이용하여 직접 테스트합니다**"
88
+ ]
89
+ },
90
+
91
+ "customRequests": {
92
+ "doc-update": "**vibe/architecture.md, vibe/progress.md, vibe/roadmap.md 문서를 업데이트합니다**",
93
+ "playwright": "**Playwright를 사용하여 E2E 테스트를 실행합니다**"
94
+ }
95
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "version": "2.0.0",
3
+ "tasks": [
4
+ {
5
+ "label": "vc: Set Unit",
6
+ "type": "shell",
7
+ "command": "npx vc set-unit ${input:unitId}",
8
+ "group": "build",
9
+ "presentation": {
10
+ "reveal": "always",
11
+ "panel": "shared",
12
+ "clear": true
13
+ },
14
+ "problemMatcher": []
15
+ },
16
+ {
17
+ "label": "vc: Set Unit (Dry Run)",
18
+ "type": "shell",
19
+ "command": "npx vc set-unit ${input:unitId} --dry-run",
20
+ "group": "build",
21
+ "presentation": {
22
+ "reveal": "always",
23
+ "panel": "shared",
24
+ "clear": true
25
+ },
26
+ "problemMatcher": []
27
+ },
28
+ {
29
+ "label": "vc: Update Commit (HEAD)",
30
+ "type": "shell",
31
+ "command": "npx vc update-commit",
32
+ "group": "build",
33
+ "presentation": {
34
+ "reveal": "always",
35
+ "panel": "shared",
36
+ "clear": true
37
+ },
38
+ "problemMatcher": []
39
+ },
40
+ {
41
+ "label": "vc: Update Commit (N)",
42
+ "type": "shell",
43
+ "command": "npx vc update-commit ${input:commitCount}",
44
+ "group": "build",
45
+ "presentation": {
46
+ "reveal": "always",
47
+ "panel": "shared",
48
+ "clear": true
49
+ },
50
+ "problemMatcher": []
51
+ },
52
+ {
53
+ "label": "vc: List Units",
54
+ "type": "shell",
55
+ "command": "npx vc list-units",
56
+ "group": "build",
57
+ "presentation": {
58
+ "reveal": "always",
59
+ "panel": "shared",
60
+ "clear": true
61
+ },
62
+ "problemMatcher": []
63
+ },
64
+ {
65
+ "label": "vc: Validate",
66
+ "type": "shell",
67
+ "command": "npx vc validate",
68
+ "group": "build",
69
+ "presentation": {
70
+ "reveal": "always",
71
+ "panel": "shared",
72
+ "clear": true
73
+ },
74
+ "problemMatcher": []
75
+ },
76
+ {
77
+ "label": "vc: Context (JSON)",
78
+ "type": "shell",
79
+ "command": "npx vc context ${input:unitId} --json",
80
+ "group": "build",
81
+ "presentation": {
82
+ "reveal": "always",
83
+ "panel": "shared",
84
+ "clear": true
85
+ },
86
+ "problemMatcher": []
87
+ }
88
+ ],
89
+ "inputs": [
90
+ {
91
+ "id": "unitId",
92
+ "type": "promptString",
93
+ "description": "유닛 ID 입력 (예: U-001[Mvp])"
94
+ },
95
+ {
96
+ "id": "commitCount",
97
+ "type": "promptString",
98
+ "description": "최근 커밋 수 (예: 3)"
99
+ }
100
+ ]
101
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-commander",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "Unit-based vibe coding workflow automation CLI — automate context collection from unit ID to command file in 10 seconds",
6
6
  "license": "MIT",
@@ -34,9 +34,12 @@
34
34
  "dist/**/*.d.ts",
35
35
  "!dist/**/*.d.ts.map",
36
36
  "skills/",
37
+ "schemas/",
38
+ "examples/",
37
39
  "AGENTS.md",
38
40
  "LICENSE",
39
- "README.md"
41
+ "README.md",
42
+ "README.ko.md"
40
43
  ],
41
44
  "scripts": {
42
45
  "dev": "tsx src/adapters/cli/index.ts",
@@ -73,6 +76,15 @@
73
76
  "typescript-eslint": "^8.54.0",
74
77
  "vitest": "^4.0.18"
75
78
  },
79
+ "main": "./dist/index.js",
80
+ "types": "./dist/index.d.ts",
81
+ "exports": {
82
+ ".": {
83
+ "types": "./dist/index.d.ts",
84
+ "import": "./dist/index.js"
85
+ },
86
+ "./package.json": "./package.json"
87
+ },
76
88
  "engines": {
77
89
  "node": ">=24.0.0"
78
90
  }