jell-utils 0.1.0 β†’ 0.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.
Files changed (170) hide show
  1. package/.claude/commands/tm/add-dependency.md +58 -0
  2. package/.claude/commands/tm/add-subtask.md +79 -0
  3. package/.claude/commands/tm/add-task.md +81 -0
  4. package/.claude/commands/tm/analyze-complexity.md +124 -0
  5. package/.claude/commands/tm/analyze-project.md +100 -0
  6. package/.claude/commands/tm/auto-implement-tasks.md +100 -0
  7. package/.claude/commands/tm/command-pipeline.md +80 -0
  8. package/.claude/commands/tm/complexity-report.md +120 -0
  9. package/.claude/commands/tm/convert-task-to-subtask.md +74 -0
  10. package/.claude/commands/tm/expand-all-tasks.md +52 -0
  11. package/.claude/commands/tm/expand-task.md +52 -0
  12. package/.claude/commands/tm/fix-dependencies.md +82 -0
  13. package/.claude/commands/tm/help.md +101 -0
  14. package/.claude/commands/tm/init-project-quick.md +49 -0
  15. package/.claude/commands/tm/init-project.md +53 -0
  16. package/.claude/commands/tm/install-taskmaster.md +118 -0
  17. package/.claude/commands/tm/learn.md +106 -0
  18. package/.claude/commands/tm/list-tasks-by-status.md +42 -0
  19. package/.claude/commands/tm/list-tasks-with-subtasks.md +30 -0
  20. package/.claude/commands/tm/list-tasks.md +46 -0
  21. package/.claude/commands/tm/next-task.md +69 -0
  22. package/.claude/commands/tm/parse-prd-with-research.md +51 -0
  23. package/.claude/commands/tm/parse-prd.md +52 -0
  24. package/.claude/commands/tm/project-status.md +67 -0
  25. package/.claude/commands/tm/quick-install-taskmaster.md +23 -0
  26. package/.claude/commands/tm/remove-all-subtasks.md +94 -0
  27. package/.claude/commands/tm/remove-dependency.md +65 -0
  28. package/.claude/commands/tm/remove-subtask.md +87 -0
  29. package/.claude/commands/tm/remove-subtasks.md +89 -0
  30. package/.claude/commands/tm/remove-task.md +110 -0
  31. package/.claude/commands/tm/setup-models.md +52 -0
  32. package/.claude/commands/tm/show-task.md +85 -0
  33. package/.claude/commands/tm/smart-workflow.md +58 -0
  34. package/.claude/commands/tm/sync-readme.md +120 -0
  35. package/.claude/commands/tm/tm-main.md +147 -0
  36. package/.claude/commands/tm/to-cancelled.md +58 -0
  37. package/.claude/commands/tm/to-deferred.md +50 -0
  38. package/.claude/commands/tm/to-done.md +47 -0
  39. package/.claude/commands/tm/to-in-progress.md +39 -0
  40. package/.claude/commands/tm/to-pending.md +35 -0
  41. package/.claude/commands/tm/to-review.md +43 -0
  42. package/.claude/commands/tm/update-single-task.md +122 -0
  43. package/.claude/commands/tm/update-task.md +75 -0
  44. package/.claude/commands/tm/update-tasks-from-id.md +111 -0
  45. package/.claude/commands/tm/validate-dependencies.md +72 -0
  46. package/.claude/commands/tm/view-models.md +52 -0
  47. package/.claude/settings.local.json +17 -3
  48. package/.cursor/commands/tm/add-dependency.md +55 -0
  49. package/.cursor/commands/tm/add-subtask.md +76 -0
  50. package/.cursor/commands/tm/add-task.md +78 -0
  51. package/.cursor/commands/tm/analyze-complexity.md +121 -0
  52. package/.cursor/commands/tm/analyze-project.md +97 -0
  53. package/.cursor/commands/tm/auto-implement-tasks.md +97 -0
  54. package/.cursor/commands/tm/command-pipeline.md +77 -0
  55. package/.cursor/commands/tm/complexity-report.md +117 -0
  56. package/.cursor/commands/tm/convert-task-to-subtask.md +71 -0
  57. package/.cursor/commands/tm/expand-all-tasks.md +51 -0
  58. package/.cursor/commands/tm/expand-task.md +49 -0
  59. package/.cursor/commands/tm/fix-dependencies.md +81 -0
  60. package/.cursor/commands/tm/help.md +98 -0
  61. package/.cursor/commands/tm/init-project-quick.md +46 -0
  62. package/.cursor/commands/tm/init-project.md +50 -0
  63. package/.cursor/commands/tm/install-taskmaster.md +117 -0
  64. package/.cursor/commands/tm/learn.md +103 -0
  65. package/.cursor/commands/tm/list-tasks-by-status.md +39 -0
  66. package/.cursor/commands/tm/list-tasks-with-subtasks.md +29 -0
  67. package/.cursor/commands/tm/list-tasks.md +43 -0
  68. package/.cursor/commands/tm/next-task.md +66 -0
  69. package/.cursor/commands/tm/parse-prd-with-research.md +48 -0
  70. package/.cursor/commands/tm/parse-prd.md +49 -0
  71. package/.cursor/commands/tm/project-status.md +64 -0
  72. package/.cursor/commands/tm/quick-install-taskmaster.md +22 -0
  73. package/.cursor/commands/tm/remove-all-subtasks.md +93 -0
  74. package/.cursor/commands/tm/remove-dependency.md +62 -0
  75. package/.cursor/commands/tm/remove-subtask.md +84 -0
  76. package/.cursor/commands/tm/remove-subtasks.md +86 -0
  77. package/.cursor/commands/tm/remove-task.md +107 -0
  78. package/.cursor/commands/tm/setup-models.md +51 -0
  79. package/.cursor/commands/tm/show-task.md +82 -0
  80. package/.cursor/commands/tm/smart-workflow.md +55 -0
  81. package/.cursor/commands/tm/sync-readme.md +117 -0
  82. package/.cursor/commands/tm/tm-main.md +146 -0
  83. package/.cursor/commands/tm/to-cancelled.md +55 -0
  84. package/.cursor/commands/tm/to-deferred.md +47 -0
  85. package/.cursor/commands/tm/to-done.md +44 -0
  86. package/.cursor/commands/tm/to-in-progress.md +36 -0
  87. package/.cursor/commands/tm/to-pending.md +32 -0
  88. package/.cursor/commands/tm/to-review.md +40 -0
  89. package/.cursor/commands/tm/update-single-task.md +119 -0
  90. package/.cursor/commands/tm/update-task.md +72 -0
  91. package/.cursor/commands/tm/update-tasks-from-id.md +108 -0
  92. package/.cursor/commands/tm/validate-dependencies.md +71 -0
  93. package/.cursor/commands/tm/view-models.md +51 -0
  94. package/.cursor/mcp.json +20 -0
  95. package/.cursor/rules/cursor_rules.mdc +53 -0
  96. package/.cursor/rules/self_improve.mdc +72 -0
  97. package/.cursor/rules/taskmaster/dev_workflow.mdc +424 -0
  98. package/.cursor/rules/taskmaster/taskmaster.mdc +573 -0
  99. package/.env.example +12 -0
  100. package/.gemini/commands/tm/add-dependency.toml +58 -0
  101. package/.gemini/commands/tm/add-subtask.toml +79 -0
  102. package/.gemini/commands/tm/add-task.toml +81 -0
  103. package/.gemini/commands/tm/analyze-complexity.toml +124 -0
  104. package/.gemini/commands/tm/analyze-project.toml +100 -0
  105. package/.gemini/commands/tm/auto-implement-tasks.toml +100 -0
  106. package/.gemini/commands/tm/command-pipeline.toml +80 -0
  107. package/.gemini/commands/tm/complexity-report.toml +120 -0
  108. package/.gemini/commands/tm/convert-task-to-subtask.toml +74 -0
  109. package/.gemini/commands/tm/expand-all-tasks.toml +54 -0
  110. package/.gemini/commands/tm/expand-task.toml +52 -0
  111. package/.gemini/commands/tm/fix-dependencies.toml +84 -0
  112. package/.gemini/commands/tm/help.toml +101 -0
  113. package/.gemini/commands/tm/init-project-quick.toml +49 -0
  114. package/.gemini/commands/tm/init-project.toml +53 -0
  115. package/.gemini/commands/tm/install-taskmaster.toml +120 -0
  116. package/.gemini/commands/tm/learn.toml +106 -0
  117. package/.gemini/commands/tm/list-tasks-by-status.toml +42 -0
  118. package/.gemini/commands/tm/list-tasks-with-subtasks.toml +32 -0
  119. package/.gemini/commands/tm/list-tasks.toml +46 -0
  120. package/.gemini/commands/tm/next-task.toml +69 -0
  121. package/.gemini/commands/tm/parse-prd-with-research.toml +51 -0
  122. package/.gemini/commands/tm/parse-prd.toml +52 -0
  123. package/.gemini/commands/tm/project-status.toml +67 -0
  124. package/.gemini/commands/tm/quick-install-taskmaster.toml +25 -0
  125. package/.gemini/commands/tm/remove-all-subtasks.toml +96 -0
  126. package/.gemini/commands/tm/remove-dependency.toml +65 -0
  127. package/.gemini/commands/tm/remove-subtask.toml +87 -0
  128. package/.gemini/commands/tm/remove-subtasks.toml +89 -0
  129. package/.gemini/commands/tm/remove-task.toml +110 -0
  130. package/.gemini/commands/tm/setup-models.toml +54 -0
  131. package/.gemini/commands/tm/show-task.toml +85 -0
  132. package/.gemini/commands/tm/smart-workflow.toml +58 -0
  133. package/.gemini/commands/tm/sync-readme.toml +120 -0
  134. package/.gemini/commands/tm/tm-main.toml +149 -0
  135. package/.gemini/commands/tm/to-cancelled.toml +58 -0
  136. package/.gemini/commands/tm/to-deferred.toml +50 -0
  137. package/.gemini/commands/tm/to-done.toml +47 -0
  138. package/.gemini/commands/tm/to-in-progress.toml +39 -0
  139. package/.gemini/commands/tm/to-pending.toml +35 -0
  140. package/.gemini/commands/tm/to-review.toml +43 -0
  141. package/.gemini/commands/tm/update-single-task.toml +122 -0
  142. package/.gemini/commands/tm/update-task.toml +75 -0
  143. package/.gemini/commands/tm/update-tasks-from-id.toml +111 -0
  144. package/.gemini/commands/tm/validate-dependencies.toml +74 -0
  145. package/.gemini/commands/tm/view-models.toml +54 -0
  146. package/.gemini/settings.json +20 -0
  147. package/.mcp.json +15 -0
  148. package/.taskmaster/CLAUDE.md +435 -0
  149. package/.taskmaster/config.json +44 -0
  150. package/.taskmaster/docs/prd.txt +584 -0
  151. package/.taskmaster/state.json +6 -0
  152. package/.taskmaster/tasks/tasks.json +304 -0
  153. package/.taskmaster/templates/example_prd.txt +47 -0
  154. package/.taskmaster/templates/example_prd_rpg.txt +511 -0
  155. package/CLAUDE.md +4 -138
  156. package/README.md +551 -0
  157. package/coverage/clover.xml +134 -22
  158. package/coverage/coverage-final.json +1 -1
  159. package/coverage/lcov-report/index.html +21 -21
  160. package/coverage/lcov-report/index.js.html +854 -29
  161. package/coverage/lcov.info +246 -39
  162. package/internal-docs/CLAUDE.md +139 -0
  163. package/internal-docs/NPM_DEPLOYMENT_GUIDE.md +203 -0
  164. package/internal-docs/OBSIDIAN_PROJECT_PROMPT.md +302 -0
  165. package/lib/index.d.ts +88 -0
  166. package/lib/index.js +275 -0
  167. package/package.json +11 -3
  168. /package/{DEPLOYMENT.md β†’ internal-docs/DEPLOYMENT.md} +0 -0
  169. /package/{TEST_RESULTS.md β†’ internal-docs/TEST_RESULTS.md} +0 -0
  170. /package/{TEST_SIMULATION.md β†’ internal-docs/TEST_SIMULATION.md} +0 -0
@@ -0,0 +1,304 @@
1
+ {
2
+ "master": {
3
+ "tasks": [
4
+ {
5
+ "id": "16",
6
+ "title": "Implement formatDateAdvanced function with token support",
7
+ "description": "Create formatDateAdvanced function that supports multiple date format tokens (YYYY, MM, DD, HH, mm, ss, ddd, dddd) for flexible date formatting",
8
+ "details": "Implementation details:\n- Create src/date/formatDateAdvanced.ts file\n- Support tokens: YYYY (4-digit year), MM (2-digit month), DD (2-digit day), HH (2-digit hour), mm (2-digit minute), ss (2-digit second), ddd (short weekday), dddd (full weekday)\n- Korean weekday mappings: ['μΌμš”μΌ', 'μ›”μš”μΌ', 'ν™”μš”μΌ', 'μˆ˜μš”μΌ', 'λͺ©μš”일', 'κΈˆμš”μΌ', 'ν† μš”μΌ']\n- Short weekday: first character of full weekday (e.g., 'μ›”' from 'μ›”μš”μΌ')\n- Use string replacement for each token\n- Pad numbers with leading zeros using String.padStart(2, '0')\n- Export function from src/date/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction formatDateAdvanced(date: Date | string, format: string): string {\n const d = new Date(date)\n const weekdays = ['μΌμš”μΌ', 'μ›”μš”μΌ', 'ν™”μš”μΌ', 'μˆ˜μš”μΌ', 'λͺ©μš”일', 'κΈˆμš”μΌ', 'ν† μš”μΌ']\n \n const replacements = {\n YYYY: d.getFullYear().toString(),\n MM: (d.getMonth() + 1).toString().padStart(2, '0'),\n DD: d.getDate().toString().padStart(2, '0'),\n HH: d.getHours().toString().padStart(2, '0'),\n mm: d.getMinutes().toString().padStart(2, '0'),\n ss: d.getSeconds().toString().padStart(2, '0'),\n dddd: weekdays[d.getDay()],\n ddd: weekdays[d.getDay()].charAt(0)\n }\n \n let result = format\n for (const [token, value] of Object.entries(replacements)) {\n result = result.replace(new RegExp(token, 'g'), value)\n }\n return result\n}\n```",
9
+ "testStrategy": "Tests already exist in __tests__/date.test.ts (lines 56-82). Verify:\n- YYYY-MM-DD format outputs correct date\n- Korean format (YYYYλ…„ MMμ›” DD일) works\n- Time tokens (HH:mm:ss) work correctly\n- Weekday tokens (ddd, dddd) output Korean weekdays\n- Combined formats work properly\nRun: npm test -- date.test.ts",
10
+ "priority": "high",
11
+ "dependencies": [],
12
+ "status": "done",
13
+ "subtasks": [],
14
+ "updatedAt": "2025-12-26T02:23:03.194Z"
15
+ },
16
+ {
17
+ "id": "17",
18
+ "title": "Implement timeAgo function for relative time display",
19
+ "description": "Create timeAgo function that returns Korean relative time strings (방금 μ „, XλΆ„ μ „, Xμ‹œκ°„ μ „, μ–΄μ œ, X일 μ „, Xμ£Ό μ „, Xκ°œμ›” μ „, Xλ…„ μ „)",
20
+ "details": "Implementation details:\n- Create src/date/timeAgo.ts file\n- Calculate time difference in milliseconds between input date and current time\n- Apply Korean relative time logic:\n - < 1 minute: '방금 μ „'\n - < 1 hour: 'XλΆ„ μ „'\n - < 24 hours: 'Xμ‹œκ°„ μ „'\n - < 48 hours: 'μ–΄μ œ'\n - < 7 days: 'X일 μ „'\n - < 30 days: 'Xμ£Ό μ „'\n - < 12 months: 'Xκ°œμ›” μ „'\n - >= 12 months: 'Xλ…„ μ „'\n- Use Math.floor for calculating time units\n- Export from src/date/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction timeAgo(date: Date | string): string {\n const now = Date.now()\n const past = new Date(date).getTime()\n const diff = now - past\n \n const minute = 60 * 1000\n const hour = 60 * minute\n const day = 24 * hour\n const week = 7 * day\n const month = 30 * day\n const year = 365 * day\n \n if (diff < minute) return '방금 μ „'\n if (diff < hour) return `${Math.floor(diff / minute)}λΆ„ μ „`\n if (diff < day) return `${Math.floor(diff / hour)}μ‹œκ°„ μ „`\n if (diff < 2 * day) return 'μ–΄μ œ'\n if (diff < week) return `${Math.floor(diff / day)}일 μ „`\n if (diff < month) return `${Math.floor(diff / week)}μ£Ό μ „`\n if (diff < year) return `${Math.floor(diff / month)}κ°œμ›” μ „`\n return `${Math.floor(diff / year)}λ…„ μ „`\n}\n```",
21
+ "testStrategy": "Tests already exist in __tests__/date.test.ts (lines 84-124). Verify:\n- < 1 minute returns '방금 μ „'\n- Minutes, hours, days calculated correctly\n- 'μ–΄μ œ' for 24-48 hours\n- Weeks, months, years work correctly\nRun: npm test -- date.test.ts",
22
+ "priority": "high",
23
+ "dependencies": [],
24
+ "status": "done",
25
+ "subtasks": [],
26
+ "updatedAt": "2025-12-26T02:23:03.195Z"
27
+ },
28
+ {
29
+ "id": "18",
30
+ "title": "Implement getDaysInMonth function",
31
+ "description": "Create getDaysInMonth function that returns the number of days in a given month, accounting for leap years",
32
+ "details": "Implementation details:\n- Create src/date/getDaysInMonth.ts file\n- Accept year and month parameters (month 1-12)\n- Use Date object trick: create date for month+1 day 0, which gives last day of current month\n- Alternative: use array [31,28/29,31,30,31,30,31,31,30,31,30,31] with leap year check\n- Export from src/date/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction getDaysInMonth(year: number, month: number): number {\n // Create date for next month's day 0 (last day of current month)\n return new Date(year, month, 0).getDate()\n}\n```",
33
+ "testStrategy": "Tests already exist in __tests__/date.test.ts (lines 126-142). Verify:\n- February returns 28 in non-leap years (2025)\n- February returns 29 in leap years (2024)\n- December returns 31\n- April returns 30\nRun: npm test -- date.test.ts",
34
+ "priority": "medium",
35
+ "dependencies": [],
36
+ "status": "done",
37
+ "subtasks": [],
38
+ "updatedAt": "2025-12-26T02:23:03.197Z"
39
+ },
40
+ {
41
+ "id": "19",
42
+ "title": "Implement isLeapYear function",
43
+ "description": "Create isLeapYear function that determines if a given year is a leap year using standard leap year rules",
44
+ "details": "Implementation details:\n- Create src/date/isLeapYear.ts file\n- Apply leap year rules:\n 1. Divisible by 4: leap year candidate\n 2. Divisible by 100: NOT leap year (exception)\n 3. Divisible by 400: IS leap year (exception to exception)\n- Formula: (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)\n- Export from src/date/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)\n}\n```",
45
+ "testStrategy": "Tests already exist in __tests__/date.test.ts (lines 144-160). Verify:\n- 2024 (divisible by 4) returns true\n- 2025 (not divisible by 4) returns false\n- 2000 (divisible by 400) returns true\n- 1900 (divisible by 100 but not 400) returns false\nRun: npm test -- date.test.ts",
46
+ "priority": "medium",
47
+ "dependencies": [],
48
+ "status": "done",
49
+ "subtasks": [],
50
+ "updatedAt": "2025-12-26T02:23:03.198Z"
51
+ },
52
+ {
53
+ "id": "20",
54
+ "title": "Implement formatNumber function with thousand separators",
55
+ "description": "Create formatNumber function that formats numbers with thousand separators (commas)",
56
+ "details": "Implementation details:\n- Create src/number/formatNumber.ts file\n- Use Number.prototype.toLocaleString('en-US') for automatic thousand separators\n- Handle negative numbers correctly\n- Preserve decimal places if present\n- Export from src/number/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction formatNumber(num: number): string {\n return num.toLocaleString('en-US')\n}\n```",
57
+ "testStrategy": "Tests already exist in __tests__/number.test.ts (lines 38-55). Verify:\n- 1000 returns '1,000'\n- 1234567 returns '1,234,567'\n- 1234.56 returns '1,234.56'\n- 0 returns '0'\n- Negative numbers formatted correctly\nRun: npm test -- number.test.ts",
58
+ "priority": "high",
59
+ "dependencies": [],
60
+ "status": "done",
61
+ "subtasks": [],
62
+ "updatedAt": "2025-12-26T02:23:03.199Z"
63
+ },
64
+ {
65
+ "id": "21",
66
+ "title": "Implement formatCurrency function with multi-currency support",
67
+ "description": "Create formatCurrency function that formats numbers as currency with support for KRW, USD, EUR, JPY, CNY",
68
+ "details": "Implementation details:\n- Create src/number/formatCurrency.ts file\n- Default currency: KRW (원)\n- Currency symbols: KRW='원' (suffix), USD='$' (prefix), EUR='€' (prefix), JPY='Β₯' (prefix), CNY='Β₯' (prefix)\n- Use formatNumber internally for thousand separators\n- Position symbol based on currency (prefix or suffix)\n- Export from src/number/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\ntype CurrencyCode = 'KRW' | 'USD' | 'EUR' | 'JPY' | 'CNY'\n\nfunction formatCurrency(amount: number, currency: CurrencyCode = 'KRW'): string {\n const formatted = formatNumber(amount)\n \n const symbols = {\n KRW: { symbol: '원', prefix: false },\n USD: { symbol: '$', prefix: true },\n EUR: { symbol: '€', prefix: true },\n JPY: { symbol: 'Β₯', prefix: true },\n CNY: { symbol: 'Β₯', prefix: true }\n }\n \n const { symbol, prefix } = symbols[currency]\n return prefix ? `${symbol}${formatted}` : `${formatted}${symbol}`\n}\n```",
69
+ "testStrategy": "Tests already exist in __tests__/number.test.ts (lines 57-74). Verify:\n- Default (KRW): 1000 returns '1,000원'\n- USD: 1000 returns '$1,000'\n- EUR: 1000 returns '€1,000'\n- JPY: 1000 returns 'Β₯1,000'\nRun: npm test -- number.test.ts",
70
+ "priority": "high",
71
+ "dependencies": [
72
+ "20"
73
+ ],
74
+ "status": "done",
75
+ "subtasks": [],
76
+ "updatedAt": "2025-12-26T02:23:03.200Z"
77
+ },
78
+ {
79
+ "id": "22",
80
+ "title": "Implement formatFileSize function",
81
+ "description": "Create formatFileSize function that converts bytes to human-readable file sizes (B, KB, MB, GB, TB) with optional precision",
82
+ "details": "Implementation details:\n- Create src/number/formatFileSize.ts file\n- Units: B (bytes), KB (1024 bytes), MB (1024 KB), GB (1024 MB), TB (1024 GB)\n- Default precision: 0 for B/KB, 2 for MB/GB/TB\n- Allow custom precision parameter\n- Use 1024 as base (binary, not decimal)\n- Export from src/number/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction formatFileSize(bytes: number, precision?: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let size = bytes\n let unitIndex = 0\n \n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n \n const decimals = precision !== undefined ? precision : (unitIndex === 0 ? 0 : 2)\n return `${size.toFixed(decimals)} ${units[unitIndex]}`\n}\n```",
83
+ "testStrategy": "Tests already exist in __tests__/number.test.ts (lines 76-96). Verify:\n- 500 returns '500 B'\n- 1024 returns '1 KB'\n- 1048576 returns '1 MB'\n- 1073741824 returns '1 GB'\n- Custom precision: 1536 with precision 2 returns '1.50 KB'\nRun: npm test -- number.test.ts",
84
+ "priority": "medium",
85
+ "dependencies": [],
86
+ "status": "done",
87
+ "subtasks": [],
88
+ "updatedAt": "2025-12-26T02:23:03.201Z"
89
+ },
90
+ {
91
+ "id": "23",
92
+ "title": "Implement numberToKorean function",
93
+ "description": "Create numberToKorean function that converts Arabic numerals to Korean number words (일, 이, μ‚Ό, ...)",
94
+ "details": "Implementation details:\n- Create src/number/numberToKorean.ts file\n- Digit names: ['영', '일', '이', 'μ‚Ό', '사', '였', '윑', 'μΉ ', 'νŒ”', 'ꡬ']\n- Unit names: ['', 'μ‹­', 'λ°±', '천', '만', 'μ–΅', 'μ‘°']\n- Process number in groups of 4 digits (만 λ‹¨μœ„)\n- Handle special case: 0 returns '영'\n- Omit '일' before μ‹­, λ°±, 천 in standard Korean\n- Export from src/number/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction numberToKorean(num: number): string {\n if (num === 0) return '영'\n \n const digits = ['', '일', '이', 'μ‚Ό', '사', '였', '윑', 'μΉ ', 'νŒ”', 'ꡬ']\n const units = ['', 'μ‹­', 'λ°±', '천']\n const bigUnits = ['', '만', 'μ–΅', 'μ‘°']\n \n const processGroup = (n: number): string => {\n let result = ''\n let temp = n\n \n for (let i = 3; i >= 0; i--) {\n const digit = Math.floor(temp / Math.pow(10, i))\n temp %= Math.pow(10, i)\n \n if (digit > 0) {\n if (digit > 1 || i === 0) result += digits[digit]\n result += units[i]\n }\n }\n return result\n }\n \n let result = ''\n let groupIndex = 0\n let remaining = num\n \n while (remaining > 0) {\n const group = remaining % 10000\n if (group > 0) {\n const groupStr = processGroup(group)\n result = groupStr + bigUnits[groupIndex] + result\n }\n remaining = Math.floor(remaining / 10000)\n groupIndex++\n }\n \n return result\n}\n```",
95
+ "testStrategy": "Tests already exist in __tests__/number.test.ts (lines 98-132). Verify:\n- Single digits: 1 returns '일', 5 returns '였'\n- Tens: 10 returns 'μ‹­', 15 returns 'μ‹­μ˜€'\n- Hundreds: 100 returns 'λ°±', 123 returns '백이십삼'\n- Thousands: 1000 returns '천', 1234 returns 'μ²œμ΄λ°±μ‚Όμ‹­μ‚¬'\n- Ten thousands: 10000 returns '만', 12345 returns 'λ§Œμ΄μ²œμ‚Όλ°±μ‚¬μ‹­μ˜€'\n- Hundred million: 100000000 returns '일얡'\n- Zero: 0 returns '영'\nRun: npm test -- number.test.ts",
96
+ "priority": "medium",
97
+ "dependencies": [],
98
+ "status": "done",
99
+ "subtasks": [],
100
+ "updatedAt": "2025-12-26T02:23:03.201Z"
101
+ },
102
+ {
103
+ "id": "24",
104
+ "title": "Implement parseNumberFromString function",
105
+ "description": "Create parseNumberFromString function that extracts numeric value from formatted strings (with commas, currency symbols, etc.)",
106
+ "details": "Implementation details:\n- Create src/number/parseNumberFromString.ts file\n- Remove all non-numeric characters except decimal point and minus sign\n- Handle currency symbols ($, €, Β₯, 원), thousand separators (,), etc.\n- Use parseFloat to convert cleaned string to number\n- Return NaN if no valid number found\n- Export from src/number/index.ts and main src/index.ts\n\nPseudo-code:\n```typescript\nfunction parseNumberFromString(str: string): number {\n // Remove everything except digits, decimal point, and minus\n const cleaned = str.replace(/[^0-9.-]/g, '')\n return parseFloat(cleaned)\n}\n```",
107
+ "testStrategy": "Tests already exist in __tests__/number.test.ts (lines 134-148). Verify:\n- '1,234' returns 1234\n- '1,234.56' returns 1234.56\n- '$1,000' returns 1000\n- '1,000원' returns 1000\n- Plain numbers work: '12345' returns 12345\nRun: npm test -- number.test.ts",
108
+ "priority": "medium",
109
+ "dependencies": [],
110
+ "status": "done",
111
+ "subtasks": [],
112
+ "updatedAt": "2025-12-26T02:23:03.202Z"
113
+ },
114
+ {
115
+ "id": "25",
116
+ "title": "Create validation utilities module structure",
117
+ "description": "Set up validation utilities module with proper TypeScript structure and exports",
118
+ "details": "Implementation details:\n- Create src/validation/ directory\n- Create src/validation/index.ts as module entry point\n- Export all validation functions from index.ts\n- Update main src/index.ts to export validation utilities\n- Follow existing module pattern from date/, number/ modules\n\nFile structure:\n```\nsrc/validation/\nβ”œβ”€β”€ index.ts (exports)\nβ”œβ”€β”€ isEmail.ts\nβ”œβ”€β”€ isPhoneNumber.ts\nβ”œβ”€β”€ isUrl.ts\nβ”œβ”€β”€ formatPhoneNumber.ts\n└── formatBusinessNumber.ts\n```",
119
+ "testStrategy": "Verification:\n- Directory structure created correctly\n- Module exports configured\n- TypeScript compilation succeeds\n- No import errors in main index.ts\nRun: npm run build",
120
+ "priority": "high",
121
+ "dependencies": [],
122
+ "status": "done",
123
+ "subtasks": [],
124
+ "updatedAt": "2025-12-26T02:23:03.202Z"
125
+ },
126
+ {
127
+ "id": "26",
128
+ "title": "Implement isEmail validation function",
129
+ "description": "Create isEmail function to validate email addresses using RFC 5322 compliant regex pattern",
130
+ "details": "Implementation details:\n- Create src/validation/isEmail.ts file\n- Use comprehensive email regex pattern\n- Pattern should match: local-part@domain with proper character restrictions\n- Handle edge cases: dots, hyphens, special characters\n- Use regex test method for validation\n- Export from src/validation/index.ts\n\nRecommended regex (RFC 5322 simplified):\n```typescript\nfunction isEmail(email: string): boolean {\n const emailRegex = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\n return emailRegex.test(email)\n}\n```",
131
+ "testStrategy": "Create __tests__/validation/isEmail.test.ts:\n- Valid emails: 'test@example.com', 'user.name@domain.co.kr', 'name+tag@mail.com'\n- Invalid emails: 'invalid-email', 'test@', '@example.com', 'test@test'\n- Edge cases: empty string, no @ symbol, multiple @ symbols\nTarget coverage: 100%\nRun: npm test -- validation/isEmail.test.ts",
132
+ "priority": "high",
133
+ "dependencies": [
134
+ "25"
135
+ ],
136
+ "status": "done",
137
+ "subtasks": [],
138
+ "updatedAt": "2025-12-26T02:23:03.203Z"
139
+ },
140
+ {
141
+ "id": "27",
142
+ "title": "Implement isPhoneNumber validation function",
143
+ "description": "Create isPhoneNumber function to validate Korean phone numbers (mobile and landline)",
144
+ "details": "Implementation details:\n- Create src/validation/isPhoneNumber.ts file\n- Support mobile numbers: 010, 011, 016, 017, 018, 019\n- Support landline: area codes 02, 031-044, 051-055, 061-064\n- Accept formats: with/without hyphens\n- Mobile pattern: 01[016789]-?\\d{3,4}-?\\d{4}\n- Landline pattern: 0[2-6][1-5]?-?\\d{3,4}-?\\d{4}\n- Export from src/validation/index.ts\n\nPseudo-code:\n```typescript\nfunction isPhoneNumber(phone: string): boolean {\n const mobileRegex = /^01[016789]-?\\d{3,4}-?\\d{4}$/\n const landlineRegex = /^0[2-6][1-5]?-?\\d{3,4}-?\\d{4}$/\n \n return mobileRegex.test(phone) || landlineRegex.test(phone)\n}\n```",
145
+ "testStrategy": "Create __tests__/validation/isPhoneNumber.test.ts:\n- Valid mobile: '010-1234-5678', '01012345678', '011-123-4567'\n- Valid landline: '02-123-4567', '031-1234-5678'\n- Invalid: '1234-5678', '020-1234-5678', '010-12-34'\n- Edge cases: too short, too long, wrong prefixes\nTarget coverage: 100%\nRun: npm test -- validation/isPhoneNumber.test.ts",
146
+ "priority": "high",
147
+ "dependencies": [
148
+ "25"
149
+ ],
150
+ "status": "done",
151
+ "subtasks": [],
152
+ "updatedAt": "2025-12-26T02:23:03.204Z"
153
+ },
154
+ {
155
+ "id": "28",
156
+ "title": "Implement isUrl validation function",
157
+ "description": "Create isUrl function to validate URLs with support for http, https, ftp protocols",
158
+ "details": "Implementation details:\n- Create src/validation/isUrl.ts file\n- Support protocols: http, https, ftp\n- Validate domain structure\n- Allow localhost and IP addresses\n- Allow port numbers and paths\n- Use URL constructor for validation (try-catch approach)\n- Export from src/validation/index.ts\n\nPseudo-code:\n```typescript\nfunction isUrl(url: string): boolean {\n try {\n const parsed = new URL(url)\n return ['http:', 'https:', 'ftp:'].includes(parsed.protocol)\n } catch {\n return false\n }\n}\n```",
159
+ "testStrategy": "Create __tests__/validation/isUrl.test.ts:\n- Valid URLs: 'https://example.com', 'http://localhost:3000', 'ftp://files.example.com'\n- Valid with paths: 'https://example.com/path/to/page'\n- Invalid: 'not-a-url', 'htp://wrong.com', 'example.com' (no protocol)\n- Edge cases: empty string, malformed URLs\nTarget coverage: 100%\nRun: npm test -- validation/isUrl.test.ts",
160
+ "priority": "medium",
161
+ "dependencies": [
162
+ "25"
163
+ ],
164
+ "status": "done",
165
+ "subtasks": [],
166
+ "updatedAt": "2025-12-26T02:23:03.204Z"
167
+ },
168
+ {
169
+ "id": "29",
170
+ "title": "Implement formatPhoneNumber function",
171
+ "description": "Create formatPhoneNumber function to format Korean phone numbers with proper hyphen placement",
172
+ "details": "Implementation details:\n- Create src/validation/formatPhoneNumber.ts file\n- Remove all non-digit characters first\n- Detect number type: mobile (starts with 01) or landline (starts with 02-064)\n- Mobile format: 010-1234-5678 or 011-123-4567 (3-4-4 or 3-3-4)\n- Landline formats: 02-1234-5678 (2-4-4), 031-1234-5678 (3-4-4)\n- Return original if invalid length\n- Export from src/validation/index.ts\n\nPseudo-code:\n```typescript\nfunction formatPhoneNumber(phone: string): string {\n const digits = phone.replace(/[^0-9]/g, '')\n \n if (digits.startsWith('02')) {\n // Seoul: 02-XXXX-XXXX\n if (digits.length === 10) {\n return `${digits.slice(0, 2)}-${digits.slice(2, 6)}-${digits.slice(6)}`\n }\n } else if (digits.startsWith('01')) {\n // Mobile: 01X-XXXX-XXXX or 01X-XXX-XXXX\n if (digits.length === 11) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 7)}-${digits.slice(7)}`\n } else if (digits.length === 10) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`\n }\n } else if (/^0[3-6]/.test(digits)) {\n // Area code: 0XX-XXXX-XXXX\n if (digits.length === 11) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 7)}-${digits.slice(7)}`\n } else if (digits.length === 10) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`\n }\n }\n \n return phone // Return original if format not recognized\n}\n```",
173
+ "testStrategy": "Create __tests__/validation/formatPhoneNumber.test.ts:\n- Mobile: '01012345678' returns '010-1234-5678'\n- Seoul: '0212345678' returns '02-1234-5678'\n- Area code: '03112345678' returns '031-1234-5678'\n- Already formatted: '010-1234-5678' returns '010-1234-5678'\n- Invalid lengths handled gracefully\nTarget coverage: 100%\nRun: npm test -- validation/formatPhoneNumber.test.ts",
174
+ "priority": "medium",
175
+ "dependencies": [
176
+ "25"
177
+ ],
178
+ "status": "done",
179
+ "subtasks": [],
180
+ "updatedAt": "2025-12-26T02:23:03.205Z"
181
+ },
182
+ {
183
+ "id": "30",
184
+ "title": "Implement formatBusinessNumber function",
185
+ "description": "Create formatBusinessNumber function to format Korean business registration numbers (μ‚¬μ—…μžλ“±λ‘λ²ˆν˜Έ) in XXX-XX-XXXXX format",
186
+ "details": "Implementation details:\n- Create src/validation/formatBusinessNumber.ts file\n- Remove all non-digit characters\n- Validate length is exactly 10 digits\n- Format as XXX-XX-XXXXX\n- Return original string if invalid\n- Note: isBusinessNumber already exists in main util, consider using it for validation\n- Export from src/validation/index.ts\n\nPseudo-code:\n```typescript\nfunction formatBusinessNumber(brn: string): string {\n const digits = brn.replace(/[^0-9]/g, '')\n \n if (digits.length !== 10) {\n return brn // Return original if invalid length\n }\n \n return `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5)}`\n}\n```",
187
+ "testStrategy": "Create __tests__/validation/formatBusinessNumber.test.ts:\n- '1234567890' returns '123-45-67890'\n- '123-45-67890' returns '123-45-67890' (already formatted)\n- Invalid lengths: '12345' returns '12345' (unchanged)\n- Non-digit characters removed before formatting\nTarget coverage: 100%\nRun: npm test -- validation/formatBusinessNumber.test.ts",
188
+ "priority": "low",
189
+ "dependencies": [
190
+ "25"
191
+ ],
192
+ "status": "done",
193
+ "subtasks": [],
194
+ "updatedAt": "2025-12-26T02:23:03.205Z"
195
+ },
196
+ {
197
+ "id": "31",
198
+ "title": "Update package.json version to 0.2.0",
199
+ "description": "Update package version from 0.1.0 to 0.2.0 and add new keywords for improved npm discoverability",
200
+ "details": "Implementation details:\n- Update version field from \"0.1.0\" to \"0.2.0\"\n- Add new keywords to keywords array:\n - \"date-utils\"\n - \"number-formatting\"\n - \"validation\"\n - \"korean-utils\"\n - \"file-size\"\n - \"currency-formatting\"\n- Ensure description is clear and concise\n- No other package.json changes needed at this point",
201
+ "testStrategy": "Verification:\n- package.json version shows 0.2.0\n- Keywords array includes new entries\n- npm run build succeeds\n- All tests pass before publishing\nRun: npm test && npm run build",
202
+ "priority": "low",
203
+ "dependencies": [
204
+ "16",
205
+ "17",
206
+ "18",
207
+ "19",
208
+ "20",
209
+ "21",
210
+ "22",
211
+ "23",
212
+ "24",
213
+ "26",
214
+ "27",
215
+ "28",
216
+ "29",
217
+ "30"
218
+ ],
219
+ "status": "done",
220
+ "subtasks": [],
221
+ "updatedAt": "2025-12-26T02:24:49.336Z"
222
+ },
223
+ {
224
+ "id": "32",
225
+ "title": "Create comprehensive README documentation for v0.2.0",
226
+ "description": "Update README.md with complete documentation for all new date, number, and validation utilities with Korean and English examples",
227
+ "details": "Implementation details:\n- Add \"πŸ“… λ‚ μ§œ/μ‹œκ°„ μœ ν‹Έλ¦¬ν‹°\" section with formatDateAdvanced, timeAgo, getDaysInMonth, isLeapYear\n- Add \"πŸ’° 숫자 포맷 μœ ν‹Έλ¦¬ν‹°\" section with formatNumber, formatCurrency, formatFileSize, numberToKorean, parseNumberFromString\n- Add \"βœ… 검증 μœ ν‹Έλ¦¬ν‹°\" section with isEmail, isPhoneNumber, isUrl, formatPhoneNumber, formatBusinessNumber\n- Include code examples for each function\n- Update table of contents\n- Add usage examples showing real-world scenarios\n- Update installation instructions if needed\n- Maintain Korean language primary documentation (Korean-focused library)\n- Follow existing README.md structure and style",
228
+ "testStrategy": "Verification:\n- All new functions documented with examples\n- Code examples are syntactically correct\n- Links in table of contents work\n- Markdown renders properly on GitHub\n- No broken links or formatting issues\nManual review of rendered README on GitHub",
229
+ "priority": "medium",
230
+ "dependencies": [
231
+ "31"
232
+ ],
233
+ "status": "done",
234
+ "subtasks": [],
235
+ "updatedAt": "2025-12-26T02:26:24.939Z"
236
+ },
237
+ {
238
+ "id": "33",
239
+ "title": "Achieve 90%+ test coverage for all modules",
240
+ "description": "Write additional tests and improve existing test suites to achieve minimum 90% coverage across all modules (statements, branches, functions, lines)",
241
+ "details": "Implementation details:\n- Run coverage report: npm run test:coverage\n- Identify uncovered lines, branches, and functions\n- Add missing test cases for edge cases:\n - Null/undefined inputs\n - Empty strings\n - Invalid data types\n - Boundary conditions\n - Error handling paths\n- Focus on new modules (date, number, validation)\n- Ensure existing modules maintain coverage\n- Add tests for error scenarios and edge cases\n- Document any intentionally untested code\n\nTarget metrics (from PRD):\n- Statements: β‰₯90% (current 79.67%)\n- Branches: β‰₯85% (current 75.32%)\n- Functions: β‰₯95% (current 85.14%)\n- Lines: β‰₯90% (current 79.67%)",
242
+ "testStrategy": "Verification:\n- Run npm run test:coverage\n- Check coverage report meets all targets:\n - Statements β‰₯90%\n - Branches β‰₯85%\n - Functions β‰₯95%\n - Lines β‰₯90%\n- Review coverage report HTML for any gaps\n- All tests pass: npm test",
243
+ "priority": "high",
244
+ "dependencies": [
245
+ "16",
246
+ "17",
247
+ "18",
248
+ "19",
249
+ "20",
250
+ "21",
251
+ "22",
252
+ "23",
253
+ "24",
254
+ "26",
255
+ "27",
256
+ "28",
257
+ "29",
258
+ "30"
259
+ ],
260
+ "status": "done",
261
+ "subtasks": [],
262
+ "updatedAt": "2025-12-26T02:24:49.337Z"
263
+ },
264
+ {
265
+ "id": "34",
266
+ "title": "Verify build and prepare for npm publication",
267
+ "description": "Final verification that all code builds correctly, passes linting, and is ready for npm publish",
268
+ "details": "Implementation details:\n- Run full build: npm run build\n- Verify lib/ directory contains all compiled files\n- Run linter: npm run lint\n- Fix any linting errors: npm run lint:fix\n- Run all tests: npm test\n- Run coverage check: npm run test:coverage\n- Verify package.json exports are correct\n- Test import statements in lib/ output\n- Ensure no TypeScript errors\n- Check that all new functions are exported from main index.ts\n\nPre-publish checklist:\n- [ ] Build succeeds (npm run build)\n- [ ] All tests pass (npm test)\n- [ ] Coverage β‰₯90% (npm run test:coverage)\n- [ ] Linting passes (npm run lint)\n- [ ] README updated\n- [ ] Version updated to 0.2.0",
269
+ "testStrategy": "Verification:\n- npm run build completes without errors\n- npm run lint passes\n- npm test shows all tests passing\n- npm run test:coverage shows β‰₯90% coverage\n- lib/ directory structure correct\n- TypeScript definitions (.d.ts files) generated\n- All exports accessible from main package\nRun all npm scripts in sequence",
270
+ "priority": "high",
271
+ "dependencies": [
272
+ "31",
273
+ "32",
274
+ "33"
275
+ ],
276
+ "status": "done",
277
+ "subtasks": [],
278
+ "updatedAt": "2025-12-26T02:26:24.941Z"
279
+ },
280
+ {
281
+ "id": "35",
282
+ "title": "Publish v0.2.0 to npm registry",
283
+ "description": "Publish the updated jell-utils package to npm registry as version 0.2.0",
284
+ "details": "Implementation details:\n- Ensure logged into npm: npm whoami\n- Login if needed: npm login\n- Run prepublishOnly script (automatically runs tests and lint)\n- Publish to npm: npm publish\n- Verify package published: npm view jell-utils@0.2.0\n- Check package page on npmjs.com\n- Create GitHub release tag: git tag v0.2.0\n- Push tag: git push origin v0.2.0\n\nPost-publish verification:\n- Package visible on npmjs.com/package/jell-utils\n- Version 0.2.0 listed\n- README displays correctly\n- Installation works: npm install jell-utils@0.2.0",
285
+ "testStrategy": "Verification:\n- npm view jell-utils shows version 0.2.0\n- Package page on npmjs.com displays correctly\n- README renders properly on npm\n- Test installation in clean directory:\n - mkdir test-install && cd test-install\n - npm init -y\n - npm install jell-utils@0.2.0\n - Verify node_modules/jell-utils contains expected files\n- GitHub tag v0.2.0 created",
286
+ "priority": "high",
287
+ "dependencies": [
288
+ "34"
289
+ ],
290
+ "status": "pending",
291
+ "subtasks": []
292
+ }
293
+ ],
294
+ "metadata": {
295
+ "version": "1.0.0",
296
+ "lastModified": "2025-12-26T02:26:24.941Z",
297
+ "taskCount": 20,
298
+ "completedCount": 19,
299
+ "tags": [
300
+ "master"
301
+ ]
302
+ }
303
+ }
304
+ }
@@ -0,0 +1,47 @@
1
+ <context>
2
+ # Overview
3
+ [Provide a high-level overview of your product here. Explain what problem it solves, who it's for, and why it's valuable.]
4
+
5
+ # Core Features
6
+ [List and describe the main features of your product. For each feature, include:
7
+ - What it does
8
+ - Why it's important
9
+ - How it works at a high level]
10
+
11
+ # User Experience
12
+ [Describe the user journey and experience. Include:
13
+ - User personas
14
+ - Key user flows
15
+ - UI/UX considerations]
16
+ </context>
17
+ <PRD>
18
+ # Technical Architecture
19
+ [Outline the technical implementation details:
20
+ - System components
21
+ - Data models
22
+ - APIs and integrations
23
+ - Infrastructure requirements]
24
+
25
+ # Development Roadmap
26
+ [Break down the development process into phases:
27
+ - MVP requirements
28
+ - Future enhancements
29
+ - Do not think about timelines whatsoever -- all that matters is scope and detailing exactly what needs to be build in each phase so it can later be cut up into tasks]
30
+
31
+ # Logical Dependency Chain
32
+ [Define the logical order of development:
33
+ - Which features need to be built first (foundation)
34
+ - Getting as quickly as possible to something usable/visible front end that works
35
+ - Properly pacing and scoping each feature so it is atomic but can also be built upon and improved as development approaches]
36
+
37
+ # Risks and Mitigations
38
+ [Identify potential risks and how they'll be addressed:
39
+ - Technical challenges
40
+ - Figuring out the MVP that we can build upon
41
+ - Resource constraints]
42
+
43
+ # Appendix
44
+ [Include any additional information:
45
+ - Research findings
46
+ - Technical specifications]
47
+ </PRD>