maskweaver 0.9.3 → 0.9.5

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 (246) hide show
  1. package/README.ko.md +279 -325
  2. package/README.md +109 -113
  3. package/assets/commands/meta/commands.json +34 -34
  4. package/assets/commands/weave-agents.md +12 -52
  5. package/assets/commands/weave-approve.md +12 -51
  6. package/assets/commands/weave-archive.md +21 -0
  7. package/assets/commands/weave-build.md +20 -89
  8. package/assets/commands/weave-craft.md +22 -43
  9. package/assets/commands/weave-help.md +37 -106
  10. package/assets/commands/weave-init.md +26 -108
  11. package/assets/commands/weave-interview.md +13 -111
  12. package/assets/commands/weave-map.md +13 -99
  13. package/assets/commands/weave-prepare.md +23 -69
  14. package/assets/commands/weave-refine-plan.md +26 -59
  15. package/assets/commands/weave-repair.md +22 -70
  16. package/assets/commands/weave-status.md +22 -155
  17. package/assets/commands/weave-troubleshoot.md +11 -47
  18. package/assets/commands/weave-verify.md +23 -44
  19. package/assets/commands/weave-worktree.md +27 -69
  20. package/dist/cli/doctor.js +5 -21
  21. package/dist/cli/install.d.ts +0 -8
  22. package/dist/cli/install.js +0 -39
  23. package/dist/context/config.d.ts +0 -22
  24. package/dist/context/config.js +0 -28
  25. package/dist/context/feature.d.ts +0 -39
  26. package/dist/context/feature.js +0 -77
  27. package/dist/context/files.d.ts +0 -13
  28. package/dist/context/files.js +1 -24
  29. package/dist/context/index.d.ts +0 -7
  30. package/dist/context/index.js +0 -12
  31. package/dist/context/project.d.ts +0 -21
  32. package/dist/context/project.js +0 -30
  33. package/dist/context/types.d.ts +0 -48
  34. package/dist/context/types.js +0 -12
  35. package/dist/context/utils.d.ts +0 -18
  36. package/dist/context/utils.js +0 -27
  37. package/dist/core/engine/promptBuilder.d.ts +0 -17
  38. package/dist/core/engine/promptBuilder.js +0 -28
  39. package/dist/core/index.d.ts +0 -6
  40. package/dist/core/index.js +0 -9
  41. package/dist/core/loader/MaskLoader.d.ts +0 -23
  42. package/dist/core/loader/MaskLoader.js +0 -29
  43. package/dist/core/schema/types.d.ts +0 -47
  44. package/dist/core/schema/types.js +0 -6
  45. package/dist/core/schema/validator.d.ts +0 -14
  46. package/dist/core/schema/validator.js +0 -18
  47. package/dist/i18n/index.d.ts +0 -18
  48. package/dist/i18n/index.js +4 -23
  49. package/dist/index.d.ts +0 -8
  50. package/dist/index.js +0 -8
  51. package/dist/lib.d.ts +0 -5
  52. package/dist/lib.js +0 -12
  53. package/dist/memory/chunking.d.ts +0 -22
  54. package/dist/memory/chunking.js +2 -37
  55. package/dist/memory/core.d.ts +0 -29
  56. package/dist/memory/core.js +1 -52
  57. package/dist/memory/index.d.ts +0 -5
  58. package/dist/memory/index.js +0 -10
  59. package/dist/memory/indexer.d.ts +0 -21
  60. package/dist/memory/indexer.js +0 -44
  61. package/dist/memory/providers/examples.d.ts +0 -5
  62. package/dist/memory/providers/examples.js +4 -64
  63. package/dist/memory/providers/factory.d.ts +0 -44
  64. package/dist/memory/providers/factory.js +0 -46
  65. package/dist/memory/providers/index.d.ts +0 -26
  66. package/dist/memory/providers/index.js +0 -28
  67. package/dist/memory/providers/ollama.d.ts +0 -6
  68. package/dist/memory/providers/ollama.js +1 -8
  69. package/dist/memory/providers/openai.d.ts +0 -6
  70. package/dist/memory/providers/openai.js +1 -8
  71. package/dist/memory/providers/openrouter.d.ts +0 -6
  72. package/dist/memory/providers/openrouter.js +0 -8
  73. package/dist/memory/providers/text-only.d.ts +0 -13
  74. package/dist/memory/providers/text-only.js +0 -17
  75. package/dist/memory/providers/types.d.ts +0 -39
  76. package/dist/memory/providers/types.js +0 -7
  77. package/dist/memory/providers/voyage.d.ts +0 -22
  78. package/dist/memory/providers/voyage.js +1 -24
  79. package/dist/memory/search/hybrid.d.ts +0 -12
  80. package/dist/memory/search/hybrid.js +1 -22
  81. package/dist/memory/store/sqlite.d.ts +0 -72
  82. package/dist/memory/store/sqlite.js +4 -127
  83. package/dist/plugin/config/index.d.ts +0 -112
  84. package/dist/plugin/config/index.js +0 -115
  85. package/dist/plugin/index.d.ts +0 -13
  86. package/dist/plugin/index.js +1 -124
  87. package/dist/plugin/tools/command-registry.d.ts +0 -6
  88. package/dist/plugin/tools/command-registry.js +0 -14
  89. package/dist/plugin/tools/context.d.ts +0 -12
  90. package/dist/plugin/tools/context.js +0 -58
  91. package/dist/plugin/tools/maskSave.d.ts +0 -3
  92. package/dist/plugin/tools/maskSave.js +0 -3
  93. package/dist/plugin/tools/memoryGet.d.ts +0 -3
  94. package/dist/plugin/tools/memoryGet.js +0 -3
  95. package/dist/plugin/tools/memoryIndexer.d.ts +0 -3
  96. package/dist/plugin/tools/memoryIndexer.js +0 -10
  97. package/dist/plugin/tools/memorySearch.d.ts +0 -31
  98. package/dist/plugin/tools/memorySearch.js +0 -79
  99. package/dist/plugin/tools/memoryWrite.d.ts +0 -8
  100. package/dist/plugin/tools/memoryWrite.js +0 -32
  101. package/dist/plugin/tools/retrospect.d.ts +0 -3
  102. package/dist/plugin/tools/retrospect.js +0 -3
  103. package/dist/plugin/tools/slashcommand.d.ts +0 -11
  104. package/dist/plugin/tools/slashcommand.js +0 -38
  105. package/dist/plugin/tools/squad.d.ts +0 -12
  106. package/dist/plugin/tools/squad.js +11 -83
  107. package/dist/plugin/tools/weave.d.ts +0 -6
  108. package/dist/plugin/tools/weave.js +0 -78
  109. package/dist/plugin/types.d.ts +0 -20
  110. package/dist/plugin/types.js +0 -7
  111. package/dist/retrospect/index.d.ts +0 -7
  112. package/dist/retrospect/index.js +0 -9
  113. package/dist/retrospect/mask-save.d.ts +0 -12
  114. package/dist/retrospect/mask-save.js +1 -80
  115. package/dist/retrospect/retrospect.d.ts +0 -18
  116. package/dist/retrospect/retrospect.js +0 -63
  117. package/dist/retrospect/strategies/base.d.ts +0 -15
  118. package/dist/retrospect/strategies/base.js +0 -7
  119. package/dist/retrospect/strategies/deep.d.ts +0 -12
  120. package/dist/retrospect/strategies/deep.js +0 -24
  121. package/dist/retrospect/strategies/index.d.ts +0 -12
  122. package/dist/retrospect/strategies/index.js +0 -12
  123. package/dist/retrospect/strategies/quick.d.ts +0 -12
  124. package/dist/retrospect/strategies/quick.js +0 -19
  125. package/dist/retrospect/strategies/standard.d.ts +0 -12
  126. package/dist/retrospect/strategies/standard.js +0 -15
  127. package/dist/retrospect/types.d.ts +0 -7
  128. package/dist/retrospect/types.js +0 -7
  129. package/dist/shared/config.d.ts +0 -105
  130. package/dist/shared/config.js +0 -33
  131. package/dist/shared/errors.d.ts +0 -18
  132. package/dist/shared/errors.js +0 -19
  133. package/dist/shared/generate-agents.d.ts +0 -69
  134. package/dist/shared/generate-agents.js +2 -86
  135. package/dist/shared/image.d.ts +0 -67
  136. package/dist/shared/image.js +6 -104
  137. package/dist/shared/index.d.ts +0 -5
  138. package/dist/shared/index.js +0 -7
  139. package/dist/shared/model-registry.d.ts +0 -72
  140. package/dist/shared/model-registry.js +5 -95
  141. package/dist/shared/types.d.ts +0 -15
  142. package/dist/shared/types.js +0 -3
  143. package/dist/shared-context/dag.d.ts +0 -105
  144. package/dist/shared-context/dag.js +3 -114
  145. package/dist/shared-context/index.d.ts +0 -5
  146. package/dist/shared-context/index.js +0 -15
  147. package/dist/shared-context/logger.d.ts +0 -37
  148. package/dist/shared-context/logger.js +0 -41
  149. package/dist/shared-context/parallel-executor.d.ts +0 -54
  150. package/dist/shared-context/parallel-executor.js +4 -56
  151. package/dist/shared-context/session.d.ts +0 -56
  152. package/dist/shared-context/session.js +0 -47
  153. package/dist/shared-context/squad.d.ts +0 -68
  154. package/dist/shared-context/squad.js +0 -63
  155. package/dist/shared-context/storage.d.ts +0 -132
  156. package/dist/shared-context/storage.js +0 -116
  157. package/dist/shared-context/task.d.ts +0 -120
  158. package/dist/shared-context/task.js +0 -152
  159. package/dist/shared-context/test/dag.test.js +9 -14
  160. package/dist/shared-context/test/logger.test.d.ts +0 -8
  161. package/dist/shared-context/test/logger.test.js +0 -52
  162. package/dist/shared-context/test/session.test.d.ts +0 -7
  163. package/dist/shared-context/test/session.test.js +0 -63
  164. package/dist/shared-context/test/squad.test.d.ts +0 -10
  165. package/dist/shared-context/test/squad.test.js +2 -68
  166. package/dist/shared-context/test/storage.test.d.ts +0 -8
  167. package/dist/shared-context/test/storage.test.js +0 -68
  168. package/dist/shared-context/test/task.test.d.ts +0 -7
  169. package/dist/shared-context/test/task.test.js +0 -54
  170. package/dist/shared-context/test/watchdog.test.d.ts +0 -7
  171. package/dist/shared-context/test/watchdog.test.js +3 -58
  172. package/dist/shared-context/types.d.ts +0 -215
  173. package/dist/shared-context/types.js +0 -125
  174. package/dist/shared-context/watchdog.d.ts +0 -127
  175. package/dist/shared-context/watchdog.js +0 -148
  176. package/dist/shared-context/worktree.d.ts +0 -68
  177. package/dist/shared-context/worktree.js +2 -34
  178. package/dist/verify/budget.d.ts +0 -29
  179. package/dist/verify/budget.js +0 -34
  180. package/dist/verify/critical-files.d.ts +0 -17
  181. package/dist/verify/critical-files.js +0 -37
  182. package/dist/verify/escalation.d.ts +0 -20
  183. package/dist/verify/escalation.js +0 -22
  184. package/dist/verify/index.d.ts +0 -5
  185. package/dist/verify/index.js +0 -11
  186. package/dist/verify/prompts.d.ts +0 -20
  187. package/dist/verify/prompts.js +0 -20
  188. package/dist/verify/types.d.ts +0 -26
  189. package/dist/verify/types.js +1 -12
  190. package/dist/verify/verifier.d.ts +0 -29
  191. package/dist/verify/verifier.js +0 -54
  192. package/dist/version.d.ts +1 -16
  193. package/dist/version.js +1 -16
  194. package/dist/weave/bridge.d.ts +0 -35
  195. package/dist/weave/bridge.js +0 -51
  196. package/dist/weave/environment/detector.d.ts +0 -6
  197. package/dist/weave/environment/detector.js +4 -45
  198. package/dist/weave/environment/index.d.ts +0 -19
  199. package/dist/weave/environment/index.js +1 -39
  200. package/dist/weave/environment/issues.d.ts +0 -35
  201. package/dist/weave/environment/issues.js +0 -59
  202. package/dist/weave/git.d.ts +0 -8
  203. package/dist/weave/git.js +0 -8
  204. package/dist/weave/index.d.ts +0 -13
  205. package/dist/weave/index.js +2 -28
  206. package/dist/weave/knowledge/global.d.ts +0 -39
  207. package/dist/weave/knowledge/global.js +2 -78
  208. package/dist/weave/loop.js +0 -3
  209. package/dist/weave/orchestrator.d.ts +0 -69
  210. package/dist/weave/orchestrator.js +1 -101
  211. package/dist/weave/phase-manager.d.ts +0 -64
  212. package/dist/weave/phase-manager.js +0 -89
  213. package/dist/weave/security/secret-scan.d.ts +0 -14
  214. package/dist/weave/security/secret-scan.js +0 -19
  215. package/dist/weave/stages/build.js +0 -15
  216. package/dist/weave/stages/execute.d.ts +0 -42
  217. package/dist/weave/stages/execute.js +4 -86
  218. package/dist/weave/stages/handoff.d.ts +0 -7
  219. package/dist/weave/stages/handoff.js +0 -43
  220. package/dist/weave/stages/index.d.ts +0 -3
  221. package/dist/weave/stages/index.js +0 -3
  222. package/dist/weave/stages/intake.d.ts +0 -8
  223. package/dist/weave/stages/intake.js +5 -65
  224. package/dist/weave/stages/map.d.ts +0 -1
  225. package/dist/weave/stages/openspec.d.ts +0 -1
  226. package/dist/weave/stages/plan.d.ts +0 -11
  227. package/dist/weave/stages/plan.js +1 -53
  228. package/dist/weave/stages/refine.d.ts +0 -7
  229. package/dist/weave/stages/refine.js +0 -7
  230. package/dist/weave/stages/research.d.ts +0 -6
  231. package/dist/weave/stages/research.js +0 -6
  232. package/dist/weave/stages/spec.d.ts +0 -12
  233. package/dist/weave/stages/spec.js +0 -17
  234. package/dist/weave/types.d.ts +0 -20
  235. package/dist/weave/types.js +0 -5
  236. package/dist/weave/verification/commands.d.ts +0 -12
  237. package/dist/weave/verification/commands.js +0 -19
  238. package/dist/weave/verification/index.d.ts +0 -6
  239. package/dist/weave/verification/index.js +1 -19
  240. package/dist/weave/verification/playwright.d.ts +0 -47
  241. package/dist/weave/verification/playwright.js +1 -90
  242. package/dist/weave/worktree.d.ts +0 -16
  243. package/dist/weave/worktree.js +0 -23
  244. package/dist/weave/yaml-repair.d.ts +0 -39
  245. package/dist/weave/yaml-repair.js +13 -116
  246. package/package.json +1 -1
@@ -1,10 +1,3 @@
1
- /**
2
- * Context Configuration
3
- *
4
- * 컨텍스트 시스템의 설정과 경로 유틸리티
5
- *
6
- * "Configuration should be obvious and in one place" - Kent Beck
7
- */
8
1
  export declare const CONTEXT_CONFIG: {
9
2
  readonly paths: {
10
3
  readonly contextDir: ".opencode/context";
@@ -15,23 +8,8 @@ export declare const CONTEXT_CONFIG: {
15
8
  readonly status: "active";
16
9
  };
17
10
  };
18
- /**
19
- * 컨텍스트 디렉토리 경로 반환
20
- */
21
11
  export declare function getContextDir(basePath: string): string;
22
- /**
23
- * 프로젝트 컨텍스트 파일 경로 반환
24
- */
25
12
  export declare function getProjectPath(basePath: string): string;
26
- /**
27
- * 피처 디렉토리 경로 반환
28
- */
29
13
  export declare function getFeaturesDir(basePath: string): string;
30
- /**
31
- * 특정 피처 파일 경로 반환
32
- */
33
14
  export declare function getFeaturePath(basePath: string, id: string): string;
34
- /**
35
- * 설정 내보내기 (외부 모듈에서 참조용)
36
- */
37
15
  export declare function getContextConfig(): typeof CONTEXT_CONFIG;
@@ -1,14 +1,4 @@
1
- /**
2
- * Context Configuration
3
- *
4
- * 컨텍스트 시스템의 설정과 경로 유틸리티
5
- *
6
- * "Configuration should be obvious and in one place" - Kent Beck
7
- */
8
1
  import { join } from 'path';
9
- // ============================================================================
10
- // Configuration
11
- // ============================================================================
12
2
  export const CONTEXT_CONFIG = {
13
3
  paths: {
14
4
  contextDir: '.opencode/context',
@@ -19,36 +9,18 @@ export const CONTEXT_CONFIG = {
19
9
  status: 'active',
20
10
  },
21
11
  };
22
- // ============================================================================
23
- // Path Utilities
24
- // ============================================================================
25
- /**
26
- * 컨텍스트 디렉토리 경로 반환
27
- */
28
12
  export function getContextDir(basePath) {
29
13
  return join(basePath, CONTEXT_CONFIG.paths.contextDir);
30
14
  }
31
- /**
32
- * 프로젝트 컨텍스트 파일 경로 반환
33
- */
34
15
  export function getProjectPath(basePath) {
35
16
  return join(getContextDir(basePath), CONTEXT_CONFIG.paths.projectFile);
36
17
  }
37
- /**
38
- * 피처 디렉토리 경로 반환
39
- */
40
18
  export function getFeaturesDir(basePath) {
41
19
  return join(getContextDir(basePath), CONTEXT_CONFIG.paths.featuresDir);
42
20
  }
43
- /**
44
- * 특정 피처 파일 경로 반환
45
- */
46
21
  export function getFeaturePath(basePath, id) {
47
22
  return join(getFeaturesDir(basePath), `${id}.json`);
48
23
  }
49
- /**
50
- * 설정 내보내기 (외부 모듈에서 참조용)
51
- */
52
24
  export function getContextConfig() {
53
25
  return CONTEXT_CONFIG;
54
26
  }
@@ -1,48 +1,9 @@
1
- /**
2
- * Feature Management
3
- *
4
- * 피처의 생성, 조회, 업데이트, 목록, 전환, 완료, 삭제
5
- *
6
- * "Keep functions small and focused" - Kent Beck
7
- */
8
1
  import type { FeatureContext, FeatureUpdate, Result } from './types.js';
9
- /**
10
- * 새로운 피처를 생성합니다.
11
- */
12
2
  export declare function createFeature(basePath: string, name: string, goal: string): Promise<Result<FeatureContext>>;
13
- /**
14
- * 특정 피처를 조회합니다.
15
- */
16
3
  export declare function getFeature(basePath: string, id: string): Promise<Result<FeatureContext>>;
17
- /**
18
- * 피처를 업데이트합니다.
19
- */
20
4
  export declare function updateFeature(basePath: string, id: string, updates: FeatureUpdate): Promise<Result<FeatureContext>>;
21
- /**
22
- * 모든 피처 목록을 반환합니다.
23
- */
24
5
  export declare function listFeatures(basePath: string): Promise<Result<FeatureContext[]>>;
25
- /**
26
- * 활성 피처를 전환합니다.
27
- *
28
- * 프로젝트 컨텍스트의 activeFeatureId를 업데이트하고,
29
- * 해당 피처의 상태를 'active'로 변경합니다.
30
- */
31
6
  export declare function switchFeature(basePath: string, id: string): Promise<Result<FeatureContext>>;
32
- /**
33
- * 피처를 완료 처리합니다.
34
- *
35
- * - 상태를 'completed'로 변경
36
- * - activeFeatureId에서 제거
37
- */
38
7
  export declare function completeFeature(basePath: string, id: string): Promise<Result<FeatureContext>>;
39
- /**
40
- * 피처를 삭제합니다.
41
- *
42
- * 주의: 이 작업은 되돌릴 수 없습니다.
43
- */
44
8
  export declare function deleteFeature(basePath: string, id: string): Promise<Result<void>>;
45
- /**
46
- * 현재 활성 피처를 조회합니다.
47
- */
48
9
  export declare function getActiveFeature(basePath: string): Promise<Result<FeatureContext | null>>;
@@ -1,32 +1,17 @@
1
- /**
2
- * Feature Management
3
- *
4
- * 피처의 생성, 조회, 업데이트, 목록, 전환, 완료, 삭제
5
- *
6
- * "Keep functions small and focused" - Kent Beck
7
- */
8
1
  import { randomUUID } from 'crypto';
9
2
  import { readFile, writeFile, readdir, unlink } from 'fs/promises';
10
3
  import { existsSync } from 'fs';
11
4
  import { CONTEXT_CONFIG, getFeaturePath, getFeaturesDir } from './config.js';
12
5
  import { now, errorMessage } from './utils.js';
13
6
  import { getProjectContext, saveProjectContext, initContextDir } from './project.js';
14
- // ============================================================================
15
- // Create Feature
16
- // ============================================================================
17
- /**
18
- * 새로운 피처를 생성합니다.
19
- */
20
7
  export async function createFeature(basePath, name, goal) {
21
8
  try {
22
- // 입력 검증
23
9
  if (!name || name.trim().length === 0) {
24
10
  return { success: false, error: '[Context] Feature name is required' };
25
11
  }
26
12
  if (!goal || goal.trim().length === 0) {
27
13
  return { success: false, error: '[Context] Feature goal is required' };
28
14
  }
29
- // 디렉토리 확인/초기화
30
15
  if (!existsSync(getFeaturesDir(basePath))) {
31
16
  const initResult = await initContextDir(basePath);
32
17
  if (!initResult.success) {
@@ -55,12 +40,6 @@ export async function createFeature(basePath, name, goal) {
55
40
  };
56
41
  }
57
42
  }
58
- // ============================================================================
59
- // Read Feature
60
- // ============================================================================
61
- /**
62
- * 특정 피처를 조회합니다.
63
- */
64
43
  export async function getFeature(basePath, id) {
65
44
  try {
66
45
  const featurePath = getFeaturePath(basePath, id);
@@ -81,20 +60,12 @@ export async function getFeature(basePath, id) {
81
60
  };
82
61
  }
83
62
  }
84
- // ============================================================================
85
- // Update Feature
86
- // ============================================================================
87
- /**
88
- * 피처를 업데이트합니다.
89
- */
90
63
  export async function updateFeature(basePath, id, updates) {
91
64
  try {
92
- // 기존 피처 조회
93
65
  const existing = await getFeature(basePath, id);
94
66
  if (!existing.success || !existing.data) {
95
67
  return existing;
96
68
  }
97
- // 업데이트 적용 (id와 createdAt은 불변)
98
69
  const updated = {
99
70
  ...existing.data,
100
71
  ...updates,
@@ -113,12 +84,6 @@ export async function updateFeature(basePath, id, updates) {
113
84
  };
114
85
  }
115
86
  }
116
- // ============================================================================
117
- // List Features
118
- // ============================================================================
119
- /**
120
- * 모든 피처 목록을 반환합니다.
121
- */
122
87
  export async function listFeatures(basePath) {
123
88
  try {
124
89
  const featuresDir = getFeaturesDir(basePath);
@@ -135,7 +100,6 @@ export async function listFeatures(basePath) {
135
100
  features.push(result.data);
136
101
  }
137
102
  }
138
- // 최신 업데이트 순으로 정렬
139
103
  features.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
140
104
  return { success: true, data: features };
141
105
  }
@@ -146,44 +110,29 @@ export async function listFeatures(basePath) {
146
110
  };
147
111
  }
148
112
  }
149
- // ============================================================================
150
- // Switch Feature
151
- // ============================================================================
152
- /**
153
- * 활성 피처를 전환합니다.
154
- *
155
- * 프로젝트 컨텍스트의 activeFeatureId를 업데이트하고,
156
- * 해당 피처의 상태를 'active'로 변경합니다.
157
- */
158
113
  export async function switchFeature(basePath, id) {
159
114
  try {
160
- // 피처 존재 확인
161
115
  const feature = await getFeature(basePath, id);
162
116
  if (!feature.success || !feature.data) {
163
117
  return feature;
164
118
  }
165
- // 이미 completed인 피처는 전환 불가
166
119
  if (feature.data.status === 'completed') {
167
120
  return {
168
121
  success: false,
169
122
  error: '[Context] Cannot switch to completed feature. Reopen it first.',
170
123
  };
171
124
  }
172
- // 프로젝트 컨텍스트 업데이트
173
125
  const projectResult = await getProjectContext(basePath);
174
126
  const project = projectResult.success && projectResult.data
175
127
  ? projectResult.data
176
128
  : { name: 'unnamed' };
177
- // 이전 활성 피처를 paused로 변경
178
129
  if (project.activeFeatureId && project.activeFeatureId !== id) {
179
130
  await updateFeature(basePath, project.activeFeatureId, { status: 'paused' });
180
131
  }
181
- // 현재 피처를 active로 변경
182
132
  const updated = await updateFeature(basePath, id, { status: 'active' });
183
133
  if (!updated.success) {
184
134
  return updated;
185
135
  }
186
- // 프로젝트 컨텍스트에 activeFeatureId 저장
187
136
  project.activeFeatureId = id;
188
137
  await saveProjectContext(basePath, project);
189
138
  return updated;
@@ -195,23 +144,12 @@ export async function switchFeature(basePath, id) {
195
144
  };
196
145
  }
197
146
  }
198
- // ============================================================================
199
- // Complete Feature
200
- // ============================================================================
201
- /**
202
- * 피처를 완료 처리합니다.
203
- *
204
- * - 상태를 'completed'로 변경
205
- * - activeFeatureId에서 제거
206
- */
207
147
  export async function completeFeature(basePath, id) {
208
148
  try {
209
- // 피처 상태 변경
210
149
  const updated = await updateFeature(basePath, id, { status: 'completed' });
211
150
  if (!updated.success) {
212
151
  return updated;
213
152
  }
214
- // 프로젝트 컨텍스트에서 activeFeatureId 제거 (해당 피처인 경우)
215
153
  const projectResult = await getProjectContext(basePath);
216
154
  if (projectResult.success && projectResult.data) {
217
155
  if (projectResult.data.activeFeatureId === id) {
@@ -228,14 +166,6 @@ export async function completeFeature(basePath, id) {
228
166
  };
229
167
  }
230
168
  }
231
- // ============================================================================
232
- // Delete Feature
233
- // ============================================================================
234
- /**
235
- * 피처를 삭제합니다.
236
- *
237
- * 주의: 이 작업은 되돌릴 수 없습니다.
238
- */
239
169
  export async function deleteFeature(basePath, id) {
240
170
  try {
241
171
  const featurePath = getFeaturePath(basePath, id);
@@ -245,7 +175,6 @@ export async function deleteFeature(basePath, id) {
245
175
  error: `[Context] Feature not found: ${id}`,
246
176
  };
247
177
  }
248
- // 활성 피처인 경우 프로젝트 컨텍스트에서 제거
249
178
  const projectResult = await getProjectContext(basePath);
250
179
  if (projectResult.success && projectResult.data) {
251
180
  if (projectResult.data.activeFeatureId === id) {
@@ -263,12 +192,6 @@ export async function deleteFeature(basePath, id) {
263
192
  };
264
193
  }
265
194
  }
266
- // ============================================================================
267
- // Get Active Feature
268
- // ============================================================================
269
- /**
270
- * 현재 활성 피처를 조회합니다.
271
- */
272
195
  export async function getActiveFeature(basePath) {
273
196
  try {
274
197
  const projectResult = await getProjectContext(basePath);
@@ -1,16 +1,3 @@
1
- /**
2
- * Feature File Management
3
- *
4
- * 피처에 파일 추가/제거
5
- *
6
- * "Simple operations, clearly named" - Kent Beck
7
- */
8
1
  import type { FeatureContext, Result } from './types.js';
9
- /**
10
- * 피처에 파일을 추가합니다.
11
- */
12
2
  export declare function addFileToFeature(basePath: string, id: string, filePath: string): Promise<Result<FeatureContext>>;
13
- /**
14
- * 피처에서 파일을 제거합니다.
15
- */
16
3
  export declare function removeFileFromFeature(basePath: string, id: string, filePath: string): Promise<Result<FeatureContext>>;
@@ -1,47 +1,24 @@
1
- /**
2
- * Feature File Management
3
- *
4
- * 피처에 파일 추가/제거
5
- *
6
- * "Simple operations, clearly named" - Kent Beck
7
- */
8
1
  import { normalizePath } from './utils.js';
9
2
  import { getFeature, updateFeature } from './feature.js';
10
- // ============================================================================
11
- // Add File
12
- // ============================================================================
13
- /**
14
- * 피처에 파일을 추가합니다.
15
- */
16
3
  export async function addFileToFeature(basePath, id, filePath) {
17
4
  const feature = await getFeature(basePath, id);
18
5
  if (!feature.success || !feature.data) {
19
6
  return feature;
20
7
  }
21
- // 정규화된 경로
22
8
  const normalizedPath = normalizePath(filePath);
23
- // 중복 체크
24
9
  if (feature.data.files.includes(normalizedPath)) {
25
- return { success: true, data: feature.data }; // 이미 있으면 그냥 성공
10
+ return { success: true, data: feature.data };
26
11
  }
27
12
  const updatedFiles = [...feature.data.files, normalizedPath];
28
13
  return updateFeature(basePath, id, { files: updatedFiles });
29
14
  }
30
- // ============================================================================
31
- // Remove File
32
- // ============================================================================
33
- /**
34
- * 피처에서 파일을 제거합니다.
35
- */
36
15
  export async function removeFileFromFeature(basePath, id, filePath) {
37
16
  const feature = await getFeature(basePath, id);
38
17
  if (!feature.success || !feature.data) {
39
18
  return feature;
40
19
  }
41
- // 정규화된 경로
42
20
  const normalizedPath = normalizePath(filePath);
43
21
  const updatedFiles = feature.data.files.filter(f => f !== normalizedPath);
44
- // 변경이 없으면 그냥 성공
45
22
  if (updatedFiles.length === feature.data.files.length) {
46
23
  return { success: true, data: feature.data };
47
24
  }
@@ -1,10 +1,3 @@
1
- /**
2
- * Context Package
3
- *
4
- * 피처 기반 컨텍스트 관리 시스템
5
- *
6
- * "Export only what's needed" - Kent Beck
7
- */
8
1
  export type { FeatureContext, ProjectContext, FeatureUpdate, Result, } from './types.js';
9
2
  export { CONTEXT_CONFIG, getContextDir, getProjectPath, getFeaturesDir, getFeaturePath, getContextConfig, } from './config.js';
10
3
  export { getProjectContext, saveProjectContext, initContextDir, } from './project.js';
@@ -1,17 +1,5 @@
1
- /**
2
- * Context Package
3
- *
4
- * 피처 기반 컨텍스트 관리 시스템
5
- *
6
- * "Export only what's needed" - Kent Beck
7
- */
8
- // Configuration
9
1
  export { CONTEXT_CONFIG, getContextDir, getProjectPath, getFeaturesDir, getFeaturePath, getContextConfig, } from './config.js';
10
- // Project Context
11
2
  export { getProjectContext, saveProjectContext, initContextDir, } from './project.js';
12
- // Feature Management
13
3
  export { createFeature, getFeature, updateFeature, listFeatures, switchFeature, completeFeature, deleteFeature, getActiveFeature, } from './feature.js';
14
- // File Management
15
4
  export { addFileToFeature, removeFileFromFeature, } from './files.js';
16
- // Utilities
17
5
  export { now, errorMessage, normalizePath, } from './utils.js';
@@ -1,25 +1,4 @@
1
- /**
2
- * Project Context Management
3
- *
4
- * 프로젝트 전체 메타데이터 관리
5
- *
6
- * "Each function should do one thing and do it well" - Kent Beck
7
- */
8
1
  import type { ProjectContext, Result } from './types.js';
9
- /**
10
- * 프로젝트 컨텍스트를 읽어옵니다.
11
- */
12
2
  export declare function getProjectContext(basePath: string): Promise<Result<ProjectContext>>;
13
- /**
14
- * 프로젝트 컨텍스트를 저장합니다.
15
- */
16
3
  export declare function saveProjectContext(basePath: string, context: ProjectContext): Promise<Result<void>>;
17
- /**
18
- * 컨텍스트 디렉토리 구조를 초기화합니다.
19
- *
20
- * 생성 구조:
21
- * .opencode/context/
22
- * ├── project.json
23
- * └── features/
24
- */
25
4
  export declare function initContextDir(basePath: string): Promise<Result<void>>;
@@ -1,20 +1,7 @@
1
- /**
2
- * Project Context Management
3
- *
4
- * 프로젝트 전체 메타데이터 관리
5
- *
6
- * "Each function should do one thing and do it well" - Kent Beck
7
- */
8
1
  import { mkdir, readFile, writeFile } from 'fs/promises';
9
2
  import { existsSync } from 'fs';
10
3
  import { getContextDir, getProjectPath } from './config.js';
11
4
  import { errorMessage } from './utils.js';
12
- // ============================================================================
13
- // Project Context Operations
14
- // ============================================================================
15
- /**
16
- * 프로젝트 컨텍스트를 읽어옵니다.
17
- */
18
5
  export async function getProjectContext(basePath) {
19
6
  try {
20
7
  const projectPath = getProjectPath(basePath);
@@ -35,13 +22,9 @@ export async function getProjectContext(basePath) {
35
22
  };
36
23
  }
37
24
  }
38
- /**
39
- * 프로젝트 컨텍스트를 저장합니다.
40
- */
41
25
  export async function saveProjectContext(basePath, context) {
42
26
  try {
43
27
  const projectPath = getProjectPath(basePath);
44
- // 디렉토리가 없으면 초기화
45
28
  if (!existsSync(getContextDir(basePath))) {
46
29
  const initResult = await initContextDir(basePath);
47
30
  if (!initResult.success) {
@@ -58,25 +41,12 @@ export async function saveProjectContext(basePath, context) {
58
41
  };
59
42
  }
60
43
  }
61
- // ============================================================================
62
- // Directory Initialization
63
- // ============================================================================
64
- /**
65
- * 컨텍스트 디렉토리 구조를 초기화합니다.
66
- *
67
- * 생성 구조:
68
- * .opencode/context/
69
- * ├── project.json
70
- * └── features/
71
- */
72
44
  export async function initContextDir(basePath) {
73
45
  try {
74
46
  const { getFeaturesDir } = await import('./config.js');
75
47
  const featuresDir = getFeaturesDir(basePath);
76
48
  const projectPath = getProjectPath(basePath);
77
- // 디렉토리 생성 (recursive)
78
49
  await mkdir(featuresDir, { recursive: true });
79
- // project.json이 없으면 기본값으로 생성
80
50
  if (!existsSync(projectPath)) {
81
51
  const defaultProject = {
82
52
  name: basePath.split(/[/\\]/).pop() || 'unnamed-project',
@@ -1,69 +1,21 @@
1
- /**
2
- * Context Type Definitions
3
- *
4
- * 피처 기반 컨텍스트 관리 시스템의 타입 정의
5
- *
6
- * 설계 원칙:
7
- * - 명확한 이름으로 의도 표현 (Intention-Revealing Names)
8
- * - 타입 안전성 (Type Safety)
9
- * - 불변성 강조 (Immutability)
10
- *
11
- * @author Kent Beck's Dummy Human
12
- */
13
- /**
14
- * 피처 컨텍스트
15
- *
16
- * 하나의 작업 단위를 나타냅니다. 로그인 기능 구현, 버그 수정 등
17
- * 각 피처는 관련 파일들과 현재 진행 상태를 추적합니다.
18
- */
19
1
  export interface FeatureContext {
20
- /** 고유 식별자 (UUID) */
21
2
  id: string;
22
- /** 피처 이름 (예: "login-oauth") */
23
3
  name: string;
24
- /** 한 줄 목표 설명 */
25
4
  goal: string;
26
- /** 현재 상태 */
27
5
  status: 'active' | 'paused' | 'completed';
28
- /** 관련 파일 목록 */
29
6
  files: string[];
30
- /** 마지막 작업 상태 스냅샷 */
31
7
  lastContext: string;
32
- /** 막힌 부분 (선택) */
33
8
  blockers?: string;
34
- /** 생성 시각 (ISO 8601) */
35
9
  createdAt: string;
36
- /** 마지막 수정 시각 (ISO 8601) */
37
10
  updatedAt: string;
38
11
  }
39
- /**
40
- * 프로젝트 컨텍스트
41
- *
42
- * 프로젝트 전체에 대한 메타 정보를 관리합니다.
43
- */
44
12
  export interface ProjectContext {
45
- /** 프로젝트 이름 */
46
13
  name: string;
47
- /** 기술 스택 */
48
14
  techStack?: string[];
49
- /** 코딩 컨벤션 */
50
15
  conventions?: string;
51
- /** 현재 활성 피처 ID */
52
16
  activeFeatureId?: string;
53
17
  }
54
- /**
55
- * 피처 업데이트 입력
56
- *
57
- * Partial을 사용하되 id와 createdAt은 변경 불가
58
- */
59
18
  export type FeatureUpdate = Partial<Omit<FeatureContext, 'id' | 'createdAt'>>;
60
- /**
61
- * 작업 결과 타입
62
- *
63
- * 모든 작업은 성공/실패를 명시적으로 반환
64
- *
65
- * "Make the return value obvious" - Kent Beck
66
- */
67
19
  export interface Result<T> {
68
20
  success: boolean;
69
21
  data?: T;
@@ -1,13 +1 @@
1
- /**
2
- * Context Type Definitions
3
- *
4
- * 피처 기반 컨텍스트 관리 시스템의 타입 정의
5
- *
6
- * 설계 원칙:
7
- * - 명확한 이름으로 의도 표현 (Intention-Revealing Names)
8
- * - 타입 안전성 (Type Safety)
9
- * - 불변성 강조 (Immutability)
10
- *
11
- * @author Kent Beck's Dummy Human
12
- */
13
1
  export {};
@@ -1,21 +1,3 @@
1
- /**
2
- * Context Utilities
3
- *
4
- * 작은, 재사용 가능한 유틸리티 함수들
5
- *
6
- * "Small functions, well named, doing one thing" - Kent Beck
7
- */
8
- /**
9
- * 현재 시각을 ISO 8601 형식으로 반환
10
- */
11
1
  export declare function now(): string;
12
- /**
13
- * 에러에서 메시지 추출
14
- *
15
- * "Handle errors gracefully" - Kent Beck
16
- */
17
2
  export declare function errorMessage(error: unknown): string;
18
- /**
19
- * 파일 경로 정규화 (Windows 백슬래시 → 슬래시)
20
- */
21
3
  export declare function normalizePath(filePath: string): string;
@@ -1,39 +1,12 @@
1
- /**
2
- * Context Utilities
3
- *
4
- * 작은, 재사용 가능한 유틸리티 함수들
5
- *
6
- * "Small functions, well named, doing one thing" - Kent Beck
7
- */
8
- // ============================================================================
9
- // Time Utilities
10
- // ============================================================================
11
- /**
12
- * 현재 시각을 ISO 8601 형식으로 반환
13
- */
14
1
  export function now() {
15
2
  return new Date().toISOString();
16
3
  }
17
- // ============================================================================
18
- // Error Handling
19
- // ============================================================================
20
- /**
21
- * 에러에서 메시지 추출
22
- *
23
- * "Handle errors gracefully" - Kent Beck
24
- */
25
4
  export function errorMessage(error) {
26
5
  if (error instanceof Error) {
27
6
  return error.message;
28
7
  }
29
8
  return String(error);
30
9
  }
31
- // ============================================================================
32
- // Path Normalization
33
- // ============================================================================
34
- /**
35
- * 파일 경로 정규화 (Windows 백슬래시 → 슬래시)
36
- */
37
10
  export function normalizePath(filePath) {
38
11
  return filePath.replace(/\\/g, '/');
39
12
  }
@@ -1,28 +1,11 @@
1
- /**
2
- * Prompt Builder
3
- *
4
- * Builds system prompts from mask definitions.
5
- */
6
1
  import type { MaskSchema, LoadedMask } from '../schema/types';
7
2
  export interface PromptBuilderOptions {
8
- /** Include metadata in prompt header */
9
3
  includeMetadata?: boolean;
10
- /** Include usage examples */
11
4
  includeExamples?: boolean;
12
- /** Additional context to append */
13
5
  additionalContext?: string;
14
6
  }
15
- /**
16
- * Build a system prompt from a mask
17
- */
18
7
  export declare function buildPrompt(mask: MaskSchema | LoadedMask, options?: PromptBuilderOptions): string;
19
- /**
20
- * Build a minimal prompt (just the core system prompt)
21
- */
22
8
  export declare function buildMinimalPrompt(mask: MaskSchema | LoadedMask): string;
23
- /**
24
- * Build a rich prompt with all available information
25
- */
26
9
  export declare function buildRichPrompt(mask: MaskSchema | LoadedMask): string;
27
10
  export declare const promptBuilder: {
28
11
  build: typeof buildPrompt;