@utilarium/dreadcabinet 0.0.16-dev.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 (128) hide show
  1. package/.nvmrc +2 -0
  2. package/LICENSE +190 -0
  3. package/README.md +95 -0
  4. package/dist/configure.d.ts +5 -0
  5. package/dist/configure.js +44 -0
  6. package/dist/configure.js.map +1 -0
  7. package/dist/constants.d.ts +36 -0
  8. package/dist/constants.js +53 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/defaults.d.ts +2 -0
  11. package/dist/defaults.js +32 -0
  12. package/dist/defaults.js.map +1 -0
  13. package/dist/dreadcabinet.cjs +1793 -0
  14. package/dist/dreadcabinet.cjs.map +1 -0
  15. package/dist/dreadcabinet.d.ts +131 -0
  16. package/dist/dreadcabinet.js +111 -0
  17. package/dist/dreadcabinet.js.map +1 -0
  18. package/dist/error/ArgumentError.d.ts +5 -0
  19. package/dist/error/ArgumentError.js +26 -0
  20. package/dist/error/ArgumentError.js.map +1 -0
  21. package/dist/input/input.d.ts +7 -0
  22. package/dist/input/input.js +13 -0
  23. package/dist/input/input.js.map +1 -0
  24. package/dist/input/process.d.ts +5 -0
  25. package/dist/input/process.js +36 -0
  26. package/dist/input/process.js.map +1 -0
  27. package/dist/input/structured.d.ts +15 -0
  28. package/dist/input/structured.js +324 -0
  29. package/dist/input/structured.js.map +1 -0
  30. package/dist/input/unstructured.d.ts +2 -0
  31. package/dist/input/unstructured.js +45 -0
  32. package/dist/input/unstructured.js.map +1 -0
  33. package/dist/logger.d.ts +2 -0
  34. package/dist/logger.js +19 -0
  35. package/dist/logger.js.map +1 -0
  36. package/dist/operate.d.ts +2 -0
  37. package/dist/operate.js +27 -0
  38. package/dist/operate.js.map +1 -0
  39. package/dist/output.d.ts +7 -0
  40. package/dist/output.js +99 -0
  41. package/dist/output.js.map +1 -0
  42. package/dist/read.d.ts +4 -0
  43. package/dist/read.js +30 -0
  44. package/dist/read.js.map +1 -0
  45. package/dist/util/dates.d.ts +60 -0
  46. package/dist/util/dates.js +699 -0
  47. package/dist/util/dates.js.map +1 -0
  48. package/dist/util/storage.d.ts +33 -0
  49. package/dist/util/storage.js +140 -0
  50. package/dist/util/storage.js.map +1 -0
  51. package/dist/validate.d.ts +4 -0
  52. package/dist/validate.js +134 -0
  53. package/dist/validate.js.map +1 -0
  54. package/guide/architecture.md +60 -0
  55. package/guide/configuration.md +132 -0
  56. package/guide/development.md +110 -0
  57. package/guide/index.md +62 -0
  58. package/guide/usage.md +166 -0
  59. package/output/kodrdriv/250703-0645-commit-message.md +21 -0
  60. package/output/kodrdriv/250703-0653-commit-message.md +1 -0
  61. package/output/kodrdriv/250703-0654-commit-message.md +1 -0
  62. package/output/kodrdriv/250703-0655-release-notes.md +51 -0
  63. package/output/kodrdriv/250703-0700-commit-message.md +1 -0
  64. package/output/kodrdriv/250703-0700-release-notes.md +8 -0
  65. package/output/kodrdriv/250703-0706-commit-message.md +1 -0
  66. package/output/kodrdriv/250703-0706-release-notes.md +11 -0
  67. package/output/kodrdriv/250703-0717-commit-message.md +1 -0
  68. package/output/kodrdriv/250703-0719-commit-message.md +1 -0
  69. package/output/kodrdriv/250703-0719-release-notes.md +17 -0
  70. package/output/kodrdriv/250703-0730-commit-message.md +1 -0
  71. package/output/kodrdriv/250703-0730-release-notes.md +11 -0
  72. package/output/kodrdriv/250703-1510-commit-message.md +1 -0
  73. package/output/kodrdriv/250710-0805-commit-message.md +3 -0
  74. package/output/kodrdriv/250710-0815-commit-message.md +1 -0
  75. package/output/kodrdriv/250710-0815-release-notes.md +39 -0
  76. package/output/kodrdriv/260107-2021-commit-message.md +37 -0
  77. package/output/kodrdriv/260108-0432-commit-message.md +6 -0
  78. package/output/kodrdriv/260108-0435-commit-message.md +3 -0
  79. package/output/kodrdriv/260108-0436-commit-message.md +4 -0
  80. package/output/kodrdriv/260108-0439-release-notes.md +63 -0
  81. package/output/kodrdriv/260108-0543-commit-message.md +19 -0
  82. package/output/kodrdriv/260108-0550-commit-message.md +3 -0
  83. package/output/kodrdriv/260108-0550-release-notes.md +19 -0
  84. package/output/kodrdriv/260108-0600-commit-message.md +3 -0
  85. package/output/kodrdriv/260110-0717-commit-message.md +4 -0
  86. package/output/kodrdriv/260110-1152-commit-message.md +1 -0
  87. package/output/kodrdriv/260110-1850-commit-message.md +1 -0
  88. package/output/kodrdriv/260110-1852-release-notes.md +33 -0
  89. package/output/kodrdriv/260112-2257-commit-message.md +5 -0
  90. package/output/kodrdriv/260112-2317-commit-message.md +1 -0
  91. package/output/kodrdriv/260112-2318-release-notes.md +42 -0
  92. package/output/kodrdriv/260113-0053-commit-message.md +1 -0
  93. package/output/kodrdriv/260113-0054-commit-message.md +1 -0
  94. package/output/kodrdriv/260113-0054-release-notes.md +49 -0
  95. package/output/kodrdriv/260130-1132-commit-message.md +1 -0
  96. package/output/kodrdriv/260130-1135-commit-message.md +1 -0
  97. package/output/kodrdriv/260130-1335-commit-message.md +10 -0
  98. package/output/kodrdriv/RELEASE_NOTES.md +47 -0
  99. package/output/kodrdriv/RELEASE_TITLE.md +1 -0
  100. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T04-21-54-623Z.md +372 -0
  101. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-32-36-513Z.md +55 -0
  102. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-35-58-580Z.md +105 -0
  103. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-36-05-658Z.md +53 -0
  104. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-43-55-498Z.md +178 -0
  105. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-10-230Z.md +53 -0
  106. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-35-136Z.md +52 -0
  107. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T14-00-30-772Z.md +52 -0
  108. package/output/kodrdriv/agentic-reflection-commit-2026-01-10T15-17-43-324Z.md +53 -0
  109. package/output/kodrdriv/agentic-reflection-commit-2026-01-10T19-52-47-424Z.md +97 -0
  110. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-23-123Z.md +138 -0
  111. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-45-038Z.md +114 -0
  112. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-49-467Z.md +114 -0
  113. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T06-57-00-384Z.md +169 -0
  114. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-29-292Z.md +114 -0
  115. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-47-579Z.md +114 -0
  116. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-48-55-599Z.md +144 -0
  117. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-53-53-725Z.md +114 -0
  118. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-54-11-600Z.md +97 -0
  119. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-32-17-053Z.md +174 -0
  120. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-35-00-887Z.md +152 -0
  121. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-02-16-553Z.md +236 -0
  122. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-17-22-227Z.md +347 -0
  123. package/output/kodrdriv/agentic-reflection-release-2026-01-08T12-39-08-279Z.md +507 -0
  124. package/output/kodrdriv/agentic-reflection-release-2026-01-08T13-50-57-683Z.md +183 -0
  125. package/output/kodrdriv/agentic-reflection-release-2026-01-11T02-52-39-082Z.md +347 -0
  126. package/output/kodrdriv/agentic-reflection-release-2026-01-13T07-18-21-218Z.md +315 -0
  127. package/output/kodrdriv/agentic-reflection-release-2026-01-13T08-54-59-340Z.md +354 -0
  128. package/package.json +80 -0
@@ -0,0 +1,372 @@
1
+ # Agentic Workflow - Self-Reflection Report
2
+
3
+ Generated: 2026-01-08T04:21:54.623Z
4
+
5
+ ## Execution Summary
6
+
7
+ - **Iterations**: 6
8
+ - **Tool Calls**: 12
9
+ - **Unique Tools**: 3
10
+
11
+ ## Tool Effectiveness Analysis
12
+
13
+ | Tool | Calls | Success | Failures | Success Rate | Avg Duration |
14
+ |------|-------|---------|----------|--------------|--------------|
15
+ | get_file_content | 10 | 10 | 0 | 100.0% | 1ms |
16
+ | group_files_by_concern | 1 | 1 | 0 | 100.0% | 1ms |
17
+ | search_codebase | 1 | 1 | 0 | 100.0% | 30ms |
18
+
19
+ ### Tool Performance Insights
20
+
21
+ **Most Frequently Used:**
22
+ - group_files_by_concern: 1 calls
23
+ - get_file_content: 10 calls
24
+ - search_codebase: 1 calls
25
+
26
+ ## Recommendations for Improvement
27
+
28
+ *No specific recommendations at this time. Execution appears optimal.*
29
+
30
+ ## Detailed Execution Timeline
31
+
32
+ | Time | Iteration | Tool | Result | Duration |
33
+ |------|-----------|------|--------|----------|
34
+ | 8:20:43 PM | 1 | group_files_by_concern | ✅ Success | 1ms |
35
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 1ms |
36
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 0ms |
37
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 1ms |
38
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 0ms |
39
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 0ms |
40
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 1ms |
41
+ | 8:20:46 PM | 2 | get_file_content | ✅ Success | 0ms |
42
+ | 8:21:08 PM | 3 | get_file_content | ✅ Success | 1ms |
43
+ | 8:21:08 PM | 3 | get_file_content | ✅ Success | 1ms |
44
+ | 8:21:22 PM | 4 | search_codebase | ✅ Success | 30ms |
45
+ | 8:21:23 PM | 5 | get_file_content | ✅ Success | 1ms |
46
+
47
+ ## Conversation History
48
+
49
+ <details>
50
+ <summary>Click to expand full agentic interaction</summary>
51
+
52
+ ```json
53
+ [
54
+ {
55
+ "role": "system",
56
+ "content": "You are a professional software engineer writing commit messages for your team.\n\n## Available Tools\n\n### Understanding\n\n**get_file_history** _(cheap)_\nGet git commit history for one or more files to understand their evolution and past changes\n\nParameters:\n- `filePaths` (required): Array of file paths to get history for\n- `limit`: Maximum number of commits to return (default: 10)\n- `format`: Output format: \"summary\" for brief or \"detailed\" for full messages\n\n**When to use:** Get git commit history for one or more files to understand their evolution and past changes\n\n**Examples:**\n- Check if file has recent refactoring: `get_file_history({\"filePaths\":[\"src/auth.ts\"],\"limit\":5})`\n- Understand evolution of multiple related files: `get_file_history({\"filePaths\":[\"src/user.ts\",\"src/auth.ts\"],\"limit\":10,\"format\":\"detailed\"})`\n\n---\n\n**get_file_content** _(moderate)_\nGet the complete current content of a file to understand context around changes. Returns a message if the file does not exist (e.g., if it was deleted).\n\nParameters:\n- `filePath` (required): Path to the file\n- `includeLineNumbers`: Include line numbers in output (default: false)\n\n**When to use:** Get the complete current content of a file to understand context around changes. Returns a message if the file does not exist (e.g., if it was deleted).\n\n**Examples:**\n- See full class definition for modified method: `get_file_content({\"filePath\":\"src/services/auth.ts\",\"includeLineNumbers\":true})`\n- Check imports and structure: `get_file_content({\"filePath\":\"src/utils/helpers.ts\"})`\n\n---\n\n**get_related_tests** _(cheap)_\nFind test files related to production files to understand what the code is supposed to do\n\nParameters:\n- `filePaths` (required): Production file paths\n\n**When to use:** Find test files related to production files to understand what the code is supposed to do\n\n**Examples:**\n- Find tests for modified service: `get_related_tests({\"filePaths\":[\"src/services/auth.ts\"]})`\n\n---\n\n**analyze_diff_section** _(cheap)_\nGet expanded context around specific lines in a file to better understand changes\n\nParameters:\n- `filePath` (required): File containing the section to analyze\n- `startLine` (required): Starting line number\n- `endLine` (required): Ending line number\n- `contextLines`: Number of additional context lines to show before and after (default: 10)\n\n**When to use:** Get expanded context around specific lines in a file to better understand changes\n\n**Examples:**\n- See context around confusing change: `analyze_diff_section({\"filePath\":\"src/auth.ts\",\"startLine\":45,\"endLine\":52,\"contextLines\":15})`\n\n---\n\n**get_recent_commits** _(cheap)_\nGet recent commits that modified the same files to understand recent work in this area\n\nParameters:\n- `filePaths` (required): Files to check for recent commits\n- `since`: Time period to look back (e.g., \"1 week ago\", \"2 days ago\")\n- `limit`: Maximum number of commits to return (default: 5)\n\n**When to use:** Get recent commits that modified the same files to understand recent work in this area\n\n**Examples:**\n- Check for duplicate commit messages: `get_recent_commits({\"filePaths\":[\"src/auth.ts\"],\"since\":\"1 week ago\",\"limit\":5})`\n\n---\n\n### Analysis\n\n**search_codebase** _(moderate)_\nSearch for code patterns, function names, or text across the codebase using git grep\n\nParameters:\n- `query` (required): Search pattern (can be plain text or regex)\n- `fileTypes`: Limit search to specific file extensions (e.g., [\"ts\", \"js\"])\n- `contextLines`: Number of context lines to show around matches (default: 2)\n\n**When to use:** Search for code patterns, function names, or text across the codebase using git grep\n\n**Examples:**\n- Find all uses of a renamed function: `search_codebase({\"query\":\"oldFunctionName\",\"fileTypes\":[\"ts\",\"tsx\"]})`\n- Check if pattern exists elsewhere: `search_codebase({\"query\":\"pattern.*string\",\"contextLines\":3})`\n\n---\n\n**get_file_dependencies** _(moderate)_\nFind which files import or depend on the changed files to assess change impact\n\nParameters:\n- `filePaths` (required): Files to analyze dependencies for\n\n**When to use:** Find which files import or depend on the changed files to assess change impact\n\n**Examples:**\n- Check impact of util function change: `get_file_dependencies({\"filePaths\":[\"src/utils/format.ts\"]})`\n\n---\n\n### Organization\n\n**group_files_by_concern** _(cheap)_\nAnalyze changed files and suggest logical groupings that might represent separate commits\n\nParameters:\n- `filePaths` (required): All changed files to analyze\n\n**When to use:** Analyze changed files and suggest logical groupings that might represent separate commits\n\n**Examples:**\n- Check if multiple unrelated changes should be split: `group_files_by_concern({\"filePaths\":[\"src/auth.ts\",\"README.md\",\"tests/auth.test.ts\",\"package.json\"]})`\n\n---\n\n\n\n## Your Task\n\nWrite a commit message that clearly explains what changed and why. Your message should help teammates understand the changes without needing to read the diff.\n\nThink about:\n- What problem does this solve?\n- How do the changes work together?\n- What should reviewers focus on?\n- Are there any important implications?\n\nUse the available tools to investigate the changes. The more you understand, the better your message will be.\n\n**Important**: If additional context is provided (from context files or other sources), use your judgment:\n- If the context is relevant to these specific changes, incorporate it\n- If the context describes unrelated changes or other packages, ignore it\n- Don't force connections between unrelated information\n- Focus on accurately describing what actually changed in this commit\n\n## Investigation Approach\n\nUse tools based on what you need to know:\n- group_files_by_concern - understand how files relate\n- get_file_content - see full context when diffs are unclear\n- get_file_history - understand how code evolved\n- get_file_dependencies - assess impact of changes\n- get_recent_commits - avoid duplicate messages\n- get_related_tests - understand behavior changes\n- search_codebase - find usage patterns\n\n## Writing Style\n\nWrite naturally and directly:\n- Use plain language, not corporate speak\n- Be specific and concrete\n- Avoid buzzwords and jargon\n- No emojis or excessive punctuation\n- No phrases like \"this commit\" or \"this PR\"\n- No meta-commentary about the commit itself\n\nFollow conventional commit format when appropriate (feat:, fix:, refactor:, docs:, test:, chore:), but prioritize clarity over formality.\n\n## Output Format\n\nWhen ready, format your response as:\n\nCOMMIT_MESSAGE:\n[Your commit message here]\n\nIf changes should be split into multiple commits:\n\nSUGGESTED_SPLITS:\nSplit 1:\nFiles: [list of files]\nRationale: [why these belong together]\nMessage: [commit message for this split]\n\nSplit 2:\n...\n\nOutput only the commit message and splits. No conversational remarks or follow-up offers."
57
+ },
58
+ {
59
+ "role": "user",
60
+ "content": "I have staged changes that need a commit message.\n\nChanged files (16):\n - .DS_Store\n - .github/workflows/dependency-review.yml\n - .github/workflows/npm-publish.yml\n - .github/workflows/pnpm-publish.yml\n - .github/workflows/test.yml\n - LICENSE\n - README.md\n - docs/pnpm-lock.yaml\n - docs/public/contributing.md\n - docs/public/faq.md\n - docs/src/App.tsx\n - package.json\n - pnpm-lock.yaml\n - pnpm-workspace.yaml\n - src/.DS_Store\n - tests/.DS_Store\n\nDiff:\ndiff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml\nnew file mode 100644\nindex 0000000..88bcf61\n--- /dev/null\n+++ b/.github/workflows/dependency-review.yml\n@@ -0,0 +1,41 @@\n+# Dependency Review Action\n+#\n+# This Action will scan dependency manifest files that change as part of a Pull Request,\n+# surfacing known-vulnerable versions of the packages declared or updated in the PR.\n+# Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable\n+# packages will be blocked from merging.\n+#\n+# Source repository: https://github.com/actions/dependency-review-action\n+# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement\n+name: 'Dependency review'\n+on:\n+ push:\n+ branches: [ \"working\" ]\n+ pull_request:\n+ branches: [ \"main\", \"working\" ]\n+\n+# If using a dependency submission action in this workflow this permission will need to be set to:\n+#\n+# permissions:\n+# contents: write\n+#\n+# https://docs.github.com/en/enterprise-cloud@latest/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api\n+permissions:\n+ contents: read\n+ # Write permissions for pull-requests are required for using the `comment-summary-in-pr` option, comment out if you aren't using this option\n+ pull-requests: write\n+\n+jobs:\n+ dependency-review:\n+ runs-on: ubuntu-latest\n+ steps:\n+ - name: 'Checkout repository'\n+ uses: actions/checkout@v4\n+ - name: 'Dependency Review'\n+ uses: actions/dependency-review-action@v4\n+ # Commonly enabled options, see https://github.com/actions/dependency-review-action#configuration-options for all available options.\n+ with:\n+ comment-summary-in-pr: always\n+ # fail-on-severity: moderate\n+ # deny-licenses: GPL-1.0-or-later, LGPL-2.0-or-later\n+ # retry-on-snapshot-warnings: true\ndiff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml\nnew file mode 100644\nindex 0000000..5643759\n--- /dev/null\n+++ b/.github/workflows/npm-publish.yml\n@@ -0,0 +1,33 @@\n+# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n+# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages\n+\n+name: Node.js Package (npm)\n+\n+on:\n+ release:\n+ types: [created]\n+\n+permissions:\n+ contents: write\n+ packages: write\n+ id-token: write\n+\n+jobs:\n+ publish-npm:\n+ runs-on: ubuntu-latest\n+ timeout-minutes: 15\n+ steps:\n+ - uses: actions/checkout@v4\n+ - uses: actions/setup-node@v4\n+ with:\n+ node-version: 22\n+ registry-url: https://registry.npmjs.org/\n+ - name: Update npm\n+ run: npm install -g npm@latest\n+ - name: Install dependencies\n+ run: npm ci --verbose --foreground-scripts\n+ timeout-minutes: 10\n+ - run: npm publish --access public\n+ env:\n+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n+\ndiff --git a/.github/workflows/pnpm-publish.yml b/.github/workflows/pnpm-publish.yml\ndeleted file mode 100644\nindex 207da34..0000000\n--- a/.github/workflows/pnpm-publish.yml\n+++ /dev/null\n@@ -1,47 +0,0 @@\n-# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n-# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages\n-\n-name: Node.js Package\n-\n-on:\n- release:\n- types: [created]\n-\n-permissions:\n- contents: write\n- packages: write\n- id-token: write\n-\n-jobs:\n- build:\n- runs-on: ubuntu-latest\n- steps:\n- - uses: actions/checkout@v4\n- - uses: actions/setup-node@v4\n- with:\n- node-version: 22\n- - uses: pnpm/action-setup@v4\n- - run: pnpm install --frozen-lockfile --strict-peer-dependencies\n- - run: pnpm run lint\n- - run: pnpm run build\n- - run: pnpm test\n- - uses: codecov/codecov-action@v5\n- with:\n- slug: theunwalked/dreadcabinet\n- token: ${{ secrets.CODECOV_TOKEN }}\n-\n-\n- publish-npm:\n- needs: build\n- runs-on: ubuntu-latest\n- steps:\n- - uses: actions/checkout@v4\n- - uses: actions/setup-node@v4\n- with:\n- node-version: 22\n- registry-url: https://registry.npmjs.org/\n- - uses: pnpm/action-setup@v4\n- - run: pnpm install --frozen-lockfile --strict-peer-dependencies\n- - run: pnpm publish --access public --no-git-checks\n- env:\n- NODE_AUTH_TOKEN: ${{secrets.npm_token}}\ndiff --git a/.github/workflows/test.yml b/.github/workflows/test.yml\nindex d119d57..1b1c8b4 100644\n--- a/.github/workflows/test.yml\n+++ b/.github/workflows/test.yml\n@@ -1,11 +1,10 @@\n name: Run Tests\n \n on:\n- push:\n+ pull_request:\n branches:\n - main\n- - 'release/**'\n- - 'feature/**'\n+ - working\n \n permissions:\n contents: read\ndiff --git a/LICENSE b/LICENSE\nindex 02112fd..95c915e 100644\n--- a/LICENSE\n+++ b/LICENSE\n@@ -175,7 +175,7 @@\n \n END OF TERMS AND CONDITIONS\n \n- Copyright 2025 Semicolon Ambulance\n+ Copyright 2025 Tim O'Brien\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\ndiff --git a/README.md b/README.md\nindex 5e84415..931ab1d 100644\n--- a/README.md\n+++ b/README.md\n@@ -25,7 +25,7 @@ npm install @theunwalked/dreadcabinet\n # yarn\n yarn add @theunwalked/dreadcabinet\n \n-# pnpm \n+# pnpm\n pnpm add @theunwalked/dreadcabinet\n ```\n \n@@ -95,4 +95,4 @@ We welcome contributions! Please see our [Contributing Guide](https://semicolona\n \n ## License\n \n-[Apache-2.0](./LICENSE) © 2025 Semicolon Ambulance \n\\n+[Apache-2.0](./LICENSE) © 2025 Tim O'Brien \n\\ndiff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml\n... [CHANGE OMITTED: File too large (114760 bytes > 20480 limit)] ...\n\ndiff --git a/docs/public/contributing.md b/docs/public/contributing.md\nindex 418ec35..a73a913 100644\n--- a/docs/public/contributing.md\n+++ b/docs/public/contributing.md\n@@ -6,7 +6,7 @@ We welcome contributions to DreadCabinet! This guide will help you get started w\n \n ### Prerequisites\n \n-- **Node.js** 18+ and **pnpm** 8+\n+- **Node.js** 18+ and **npm** 9+\n - **Git** for version control\n - **TypeScript** knowledge (the project is written in TypeScript)\n \n@@ -14,28 +14,28 @@ We welcome contributions to DreadCabinet! This guide will help you get started w\n \n 1. **Fork and clone the repository**:\n ```bash\n- git clone https://github.com/SemicolonAmbulance/dreadcabinet.git\n+ git clone https://github.com/tobrien/dreadcabinet.git\n cd dreadcabinet\n ```\n \n 2. **Install dependencies**:\n ```bash\n- pnpm install\n+ npm install\n ```\n \n 3. **Build the project**:\n ```bash\n- pnpm run build\n+ npm run build\n ```\n \n 4. **Run tests**:\n ```bash\n- pnpm run test\n+ npm test\n ```\n \n 5. **Start development mode**:\n ```bash\n- pnpm run dev\n+ npm run dev\n ```\n \n ### Project Structure\n@@ -81,16 +81,16 @@ Run the full test suite:\n \n ```bash\n # Run tests with coverage\n-pnpm run test\n+npm test\n \n # Run tests in watch mode during development\n-pnpm run test:watch\n+npm test --watch\n \n # Run linting\n-pnpm run lint\n+npm run lint\n \n # Fix linting issues automatically\n-pnpm run lint:fix\n+npm run lint:fix\n ```\n \n ### 4. Update Documentation\n@@ -259,7 +259,7 @@ Help improve test coverage:\n ### Before Submitting\n \n - [ ] Tests pass locally\n-- [ ] Code is properly formatted (`pnpm run lint:fix`)\n+- [ ] Code is properly formatted (`npm run lint:fix`)\n - [ ] Documentation is updated\n - [ ] Commit messages follow conventional format\n - [ ] Branch is up to date with main\ndiff --git a/docs/public/faq.md b/docs/public/faq.md\nindex 745f055..8305fce 100644\n--- a/docs/public/faq.md\n+++ b/docs/public/faq.md\n@@ -278,7 +278,7 @@ Check these common issues:\n \n ### How do I report bugs or request features?\n \n-1. Check the [GitHub issues](https://github.com/SemicolonAmbulance/dreadcabinet/issues) for existing reports\n+1. Check the [GitHub issues](https://github.com/tobrien/dreadcabinet/issues) for existing reports\n 2. Create a new issue with:\n - Clear description of the problem or feature request\n - Code examples demonstrating the issue\ndiff --git a/docs/src/App.tsx b/docs/src/App.tsx\nindex 695c68c..d2aed8a 100644\n--- a/docs/src/App.tsx\n+++ b/docs/src/App.tsx\n@@ -137,7 +137,7 @@ function App() {\n </div>\n <p className=\"subtitle\">Organize Your Digital Chaos</p>\n <div className=\"header-links\">\n- <a href=\"https://github.com/SemicolonAmbulance/dreadcabinet\" target=\"_blank\" rel=\"noopener noreferrer\">\n+ <a href=\"https://github.com/tobrien/dreadcabinet\" target=\"_blank\" rel=\"noopener noreferrer\">\n GitHub\n </a>\n <a href=\"https://www.npmjs.com/package/@theunwalked/dreadcabinet\" target=\"_blank\" rel=\"noopener noreferrer\">\n@@ -178,8 +178,8 @@ function App() {\n <div className=\"footer-content\">\n <p>\n Built with ❤️ by{' '}\n- <a href=\"https://github.com/SemicolonAmbulance\" target=\"_blank\" rel=\"noopener noreferrer\">\n- Semicolon Ambulance\n+ <a href=\"https://github.com/tobrien\" target=\"_blank\" rel=\"noopener noreferrer\">\n+ Tim O'Brien\n </a>\n </p>\n <p className=\"license\">Licensed under Apache-2.0</p>\ndiff --git a/package.json b/package.json\nindex 63fc44e..c320827 100644\n--- a/package.json\n+++ b/package.json\n@@ -7,9 +7,8 @@\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n- \"url\": \"git+https://github.com/SemicolonAmbulance/dreadcabinet.git\"\n+ \"url\": \"git+https://github.com/tobrien/dreadcabinet.git\"\n },\n- \"packageManager\": \"pnpm@10.13.1\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/dreadcabinet.d.ts\",\n@@ -18,17 +17,17 @@\n }\n },\n \"scripts\": {\n- \"build\": \"pnpm run lint && tsc --noEmit && vite build\",\n+ \"build\": \"npm run lint && tsc --noEmit && vite build\",\n \"start\": \"dist/main.js\",\n \"dev\": \"vite build --watch\",\n- \"watch\": \"pnpm run dev\",\n- \"test\": \"pnpm run test:readme && pnpm run test:coverage\",\n+ \"watch\": \"npm run dev\",\n+ \"test\": \"npm run test:readme && npm run test:coverage\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:readme\": \"doccident -c .markdown-doctest-setup.mjs README.md\",\n \"lint\": \"eslint . --ext .ts\",\n \"lint:fix\": \"eslint . --ext .ts --fix\",\n \"clean\": \"rm -rf dist\",\n- \"prepublishOnly\": \"pnpm run clean && pnpm run build\"\n+ \"prepublishOnly\": \"npm run clean && npm run build\"\n },\n \"keywords\": [\n \"focus\",\n@@ -36,7 +35,7 @@\n \"notes\",\n \"genai\"\n ],\n- \"author\": \"Semicolon Ambulance <semicolonambulance@proton.me>\",\n+ \"author\": \"Tim O'Brien <tobrien@discursive.com>\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"commander\": \"^14.0.0\",\n@@ -69,9 +68,7 @@\n \"vite-plugin-node\": \"^7.0.0\",\n \"vitest\": \"^3.2.4\"\n },\n- \"pnpm\": {\n- \"overrides\": {\n- \"wrap-ansi\": \"7.0.0\"\n- }\n+ \"overrides\": {\n+ \"wrap-ansi\": \"7.0.0\"\n }\n }\ndiff --git a/pnpm-lock.yaml b/pnpm-lock.yaml\n... [CHANGE OMITTED: File too large (201252 bytes > 20480 limit)] ...\n\ndiff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml\ndeleted file mode 100644\nindex 0967ef4..0000000\n--- a/pnpm-workspace.yaml\n+++ /dev/null\n@@ -1 +0,0 @@\n-{}\ndiff --git a/src/.DS_Store b/src/.DS_Store\nnew file mode 100644\nindex 0000000..5438e14\nBinary files /dev/null and b/src/.DS_Store differ\ndiff --git a/tests/.DS_Store b/tests/.DS_Store\nnew file mode 100644\nindex 0000000..30800e4\nBinary files /dev/null and b/tests/.DS_Store differ\n\n\n[SUMMARY: 2 files omitted due to size limits. Original diff: 327995 bytes, processed diff: 12223 bytes]\n\nRecent commit history for context:\ncommit 591887a67d0cc1e6845c8b4a07a990c23788efb3\nAuthor: SemicolonAmbulance <SemicolonAmbulance@proton.me>\nDate: Thu Jul 10 08:17:14 2025 -0700\n\n 0.0.10\n \n (#37)\n \n * Add empty pnpm-workspace.yaml to initialize workspace support and enable pnpm to treat the repository as a monorepo root.\n \n * Remove moment-timezone and related timezone dependencies; provide static IANA timezone list and use dayjs exclusively for timezone support\n \n Removes the moment-timezone dependency along with associated packages (luxon, winston, js-yaml and their types) from the codebase and updates `.npmignore` to exclude additional config and docs files from npm package distribution. Introduces a static list of IANA timezone names directly in `src/util/dates.ts` to replace runtime timezone name queries, and updates the `validTimezones()` function to return this static array using only dayjs for all timezone-related operations. This simplifies dependencies, reduces bundle size, and eliminates dynamic timezone database requirements while maintaining support for timezone-aware date manipulation.\n \n * Bump dependencies in package.json: update packageManager to pnpm@10.13.1, upgrade zod to 4.0.2, @swc/core to 1.12.11, @theunwalked/cardigantime to 0.0.16, @types/node to 24.0.12, @typescript-eslint/eslint-plugin and parser to 8.36.0, and vite to 7.0.4. These updates address bug fixes, compatibility improvements, and ensure alignment with the latest ecosystem standards.\n \n * No staged changes detected; commit aborted.\n \n * 0.0.10\n\ncommit 468c3f60c6455ea49870121bc04df0f36ad49a21\nAuthor: SemicolonAmbulance <SemicolonAmbulance@proton.me>\nDate: Thu Jul 3 07:32:19 2025 -0700\n\n 0.0.9\n \n (#33)\n \n * Removes the empty pnpm-workspace.yaml file from the project root, eliminating unused workspace configuration and restoring default pnpm behavior for package management.\n \n * 0.0.9\n\ncommit 8cf1ab26ab76946ef619199f0015ba125049b55e\nAuthor: SemicolonAmbulance <SemicolonAmbulance@proton.me>\nDate: Thu Jul 3 07:21:07 2025 -0700\n\n 0.0.8\n \n (#32)\n \n * Removes redundant TypeScript build and typecheck scripts from docs/package.json, consolidating to a single \"vite build\" step. Updates docs/tsconfig.json to specify \"src/**/*\" for source inclusion, excludes common output directories, and refines compiler options for clarity and stricter type checking. Adds a pnpm-workspace.yaml override to link @theunwalked/cardigantime to a local package, facilitating development with local dependency sources. These changes streamline configuration, reduce duplication, and support improved local package development workflows.\n \n * 0.0.7\n \n * Removes the `overrides` section from `pnpm-workspace.yaml`, eliminating the local link to `@theunwalked/cardigantime`. The workspace configuration now uses an empty object, reverting to default dependency resolution and workspace behavior.\n \n * 0.0.8\n\n\nAnalyze these changes and write a clear commit message. Consider:\n- What problem does this solve?\n- How do the changes work together?\n- Should this be one commit or multiple?\n\nIf context information is provided, use it only if relevant to these specific changes.\nDon't force connections that don't exist - if context doesn't apply to this package,\nsimply ignore it and focus on the actual changes.\n\nInvestigate as needed to write an accurate, helpful message."
61
+ },
62
+ {
63
+ "role": "assistant",
64
+ "content": null,
65
+ "tool_calls": [
66
+ {
67
+ "id": "call_GYzk5N066MR05KWtO8bsfJPZ",
68
+ "type": "function",
69
+ "function": {
70
+ "name": "group_files_by_concern",
71
+ "arguments": "{\"filePaths\":[\".DS_Store\",\".github/workflows/dependency-review.yml\",\".github/workflows/npm-publish.yml\",\".github/workflows/pnpm-publish.yml\",\".github/workflows/test.yml\",\"LICENSE\",\"README.md\",\"docs/pnpm-lock.yaml\",\"docs/public/contributing.md\",\"docs/public/faq.md\",\"docs/src/App.tsx\",\"package.json\",\"pnpm-lock.yaml\",\"pnpm-workspace.yaml\",\"src/.DS_Store\",\"tests/.DS_Store\"]}"
72
+ }
73
+ }
74
+ ]
75
+ },
76
+ {
77
+ "role": "tool",
78
+ "tool_call_id": "call_GYzk5N066MR05KWtO8bsfJPZ",
79
+ "content": "other (9 files):\n - .DS_Store\n - .github/workflows/dependency-review.yml\n - .github/workflows/npm-publish.yml\n - .github/workflows/pnpm-publish.yml\n - .github/workflows/test.yml\n - LICENSE\n - docs/pnpm-lock.yaml\n - pnpm-lock.yaml\n - pnpm-workspace.yaml\n\ndocumentation (3 files):\n - README.md\n - docs/public/contributing.md\n - docs/public/faq.md\n\nsource:docs/src (1 files):\n - docs/src/App.tsx\n\ndependencies (1 files):\n - package.json\n\nsource:src (1 files):\n - src/.DS_Store\n\ntests (1 files):\n - tests/.DS_Store\n\nSuggestion: These 6 groups might be better as separate commits if they represent different concerns.",
80
+ "name": "group_files_by_concern"
81
+ },
82
+ {
83
+ "role": "assistant",
84
+ "content": null,
85
+ "tool_calls": [
86
+ {
87
+ "id": "call_ln2nwipKkFy16Y7Fjm4Dublq",
88
+ "type": "function",
89
+ "function": {
90
+ "name": "get_file_content",
91
+ "arguments": "{\"filePath\": \".github/workflows/test.yml\", \"includeLineNumbers\": true}"
92
+ }
93
+ },
94
+ {
95
+ "id": "call_lbmpbR7qGdZX2FBjHSmk2EHD",
96
+ "type": "function",
97
+ "function": {
98
+ "name": "get_file_content",
99
+ "arguments": "{\"filePath\": \".github/workflows/npm-publish.yml\", \"includeLineNumbers\": true}"
100
+ }
101
+ },
102
+ {
103
+ "id": "call_kUyMToxSNxEBj3l3TBkzgv7F",
104
+ "type": "function",
105
+ "function": {
106
+ "name": "get_file_content",
107
+ "arguments": "{\"filePath\": \".github/workflows/dependency-review.yml\", \"includeLineNumbers\": true}"
108
+ }
109
+ },
110
+ {
111
+ "id": "call_7QZ3LCkzfuBV3wmvSyLUpBcY",
112
+ "type": "function",
113
+ "function": {
114
+ "name": "get_file_content",
115
+ "arguments": "{\"filePath\": \"package.json\", \"includeLineNumbers\": true}"
116
+ }
117
+ },
118
+ {
119
+ "id": "call_gb8qXdr1A9ZRReZHIKbm4l1q",
120
+ "type": "function",
121
+ "function": {
122
+ "name": "get_file_content",
123
+ "arguments": "{\"filePath\": \"README.md\", \"includeLineNumbers\": true}"
124
+ }
125
+ },
126
+ {
127
+ "id": "call_2TYv8p07uqKbi5vmR1FnovDy",
128
+ "type": "function",
129
+ "function": {
130
+ "name": "get_file_content",
131
+ "arguments": "{\"filePath\": \"docs/public/contributing.md\", \"includeLineNumbers\": true}"
132
+ }
133
+ },
134
+ {
135
+ "id": "call_N3us55DhWzdw8iP1IgrfzJfa",
136
+ "type": "function",
137
+ "function": {
138
+ "name": "get_file_content",
139
+ "arguments": "{\"filePath\": \"docs/src/App.tsx\", \"includeLineNumbers\": true}"
140
+ }
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "role": "tool",
146
+ "tool_call_id": "call_ln2nwipKkFy16Y7Fjm4Dublq",
147
+ "content": "1: name: Run Tests\n2: \n3: on:\n4: pull_request:\n5: branches:\n6: - main\n7: - working\n8: \n9: permissions:\n10: contents: read\n11: statuses: write\n12: \n13: jobs:\n14: test:\n15: runs-on: ubuntu-latest\n16: steps:\n17: - uses: actions/checkout@v4\n18: - uses: actions/setup-node@v4\n19: with:\n20: node-version: 22\n21: - uses: pnpm/action-setup@v4\n22: - run: pnpm install --frozen-lockfile --strict-peer-dependencies\n23: - run: pnpm run lint\n24: - run: pnpm run build\n25: - run: pnpm test\n26: - uses: codecov/codecov-action@v5\n27: with:\n28: slug: theunwalked/dreadcabinet\n29: token: ${{ secrets.CODECOV_TOKEN }}\n30: ",
148
+ "name": "get_file_content"
149
+ },
150
+ {
151
+ "role": "tool",
152
+ "tool_call_id": "call_lbmpbR7qGdZX2FBjHSmk2EHD",
153
+ "content": "1: # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n2: # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages\n3: \n4: name: Node.js Package (npm)\n5: \n6: on:\n7: release:\n8: types: [created]\n9: \n10: permissions:\n11: contents: write\n12: packages: write\n13: id-token: write\n14: \n15: jobs:\n16: publish-npm:\n17: runs-on: ubuntu-latest\n18: timeout-minutes: 15\n19: steps:\n20: - uses: actions/checkout@v4\n21: - uses: actions/setup-node@v4\n22: with:\n23: node-version: 22\n24: registry-url: https://registry.npmjs.org/\n25: - name: Update npm\n26: run: npm install -g npm@latest\n27: - name: Install dependencies\n28: run: npm ci --verbose --foreground-scripts\n29: timeout-minutes: 10\n30: - run: npm publish --access public\n31: env:\n32: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n33: \n34: ",
154
+ "name": "get_file_content"
155
+ },
156
+ {
157
+ "role": "tool",
158
+ "tool_call_id": "call_kUyMToxSNxEBj3l3TBkzgv7F",
159
+ "content": "1: # Dependency Review Action\n2: #\n3: # This Action will scan dependency manifest files that change as part of a Pull Request,\n4: # surfacing known-vulnerable versions of the packages declared or updated in the PR.\n5: # Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable\n6: # packages will be blocked from merging.\n7: #\n8: # Source repository: https://github.com/actions/dependency-review-action\n9: # Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement\n10: name: 'Dependency review'\n11: on:\n12: push:\n13: branches: [ \"working\" ]\n14: pull_request:\n15: branches: [ \"main\", \"working\" ]\n16: \n17: # If using a dependency submission action in this workflow this permission will need to be set to:\n18: #\n19: # permissions:\n20: # contents: write\n21: #\n22: # https://docs.github.com/en/enterprise-cloud@latest/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api\n23: permissions:\n24: contents: read\n25: # Write permissions for pull-requests are required for using the `comment-summary-in-pr` option, comment out if you aren't using this option\n26: pull-requests: write\n27: \n28: jobs:\n29: dependency-review:\n30: runs-on: ubuntu-latest\n31: steps:\n32: - name: 'Checkout repository'\n33: uses: actions/checkout@v4\n34: - name: 'Dependency Review'\n35: uses: actions/dependency-review-action@v4\n36: # Commonly enabled options, see https://github.com/actions/dependency-review-action#configuration-options for all available options.\n37: with:\n38: comment-summary-in-pr: always\n39: # fail-on-severity: moderate\n40: # deny-licenses: GPL-1.0-or-later, LGPL-2.0-or-later\n41: # retry-on-snapshot-warnings: true\n42: ",
160
+ "name": "get_file_content"
161
+ },
162
+ {
163
+ "role": "tool",
164
+ "tool_call_id": "call_7QZ3LCkzfuBV3wmvSyLUpBcY",
165
+ "content": "1: {\n2: \"name\": \"@theunwalked/dreadcabinet\",\n3: \"version\": \"0.0.10\",\n4: \"description\": \"dreadcabinet organizes the chaos.\",\n5: \"main\": \"dist/dreadcabinet.cjs\",\n6: \"module\": \"dist/dreadcabinet.js\",\n7: \"type\": \"module\",\n8: \"repository\": {\n9: \"type\": \"git\",\n10: \"url\": \"git+https://github.com/tobrien/dreadcabinet.git\"\n11: },\n12: \"exports\": {\n13: \".\": {\n14: \"types\": \"./dist/dreadcabinet.d.ts\",\n15: \"import\": \"./dist/dreadcabinet.js\",\n16: \"require\": \"./dist/dreadcabinet.cjs\"\n17: }\n18: },\n19: \"scripts\": {\n20: \"build\": \"npm run lint && tsc --noEmit && vite build\",\n21: \"start\": \"dist/main.js\",\n22: \"dev\": \"vite build --watch\",\n23: \"watch\": \"npm run dev\",\n24: \"test\": \"npm run test:readme && npm run test:coverage\",\n25: \"test:coverage\": \"vitest run --coverage\",\n26: \"test:readme\": \"doccident -c .markdown-doctest-setup.mjs README.md\",\n27: \"lint\": \"eslint . --ext .ts\",\n28: \"lint:fix\": \"eslint . --ext .ts --fix\",\n29: \"clean\": \"rm -rf dist\",\n30: \"prepublishOnly\": \"npm run clean && npm run build\"\n31: },\n32: \"keywords\": [\n33: \"focus\",\n34: \"productivity\",\n35: \"notes\",\n36: \"genai\"\n37: ],\n38: \"author\": \"Tim O'Brien <tobrien@discursive.com>\",\n39: \"license\": \"Apache-2.0\",\n40: \"dependencies\": {\n41: \"commander\": \"^14.0.0\",\n42: \"dayjs\": \"^1.11.13\",\n43: \"glob\": \"^11.0.3\",\n44: \"zod\": \"^4.0.2\"\n45: },\n46: \"devDependencies\": {\n47: \"@babel/core\": \"^7.28.0\",\n48: \"@babel/plugin-transform-modules-commonjs\": \"^7.27.1\",\n49: \"@babel/plugin-transform-typescript\": \"^7.28.0\",\n50: \"@babel/preset-typescript\": \"^7.27.1\",\n51: \"@doccident/doccident\": \"^0.0.1\",\n52: \"@eslint/eslintrc\": \"^3.3.1\",\n53: \"@eslint/js\": \"^9.30.1\",\n54: \"@rollup/plugin-replace\": \"^6.0.2\",\n55: \"@swc/core\": \"^1.12.11\",\n56: \"@theunwalked/cardigantime\": \"^0.0.16\",\n57: \"@types/node\": \"^24.0.12\",\n58: \"@typescript-eslint/eslint-plugin\": \"^8.36.0\",\n59: \"@typescript-eslint/parser\": \"^8.36.0\",\n60: \"@vitest/coverage-v8\": \"^3.2.4\",\n61: \"eslint\": \"^9.30.1\",\n62: \"eslint-plugin-import\": \"^2.32.0\",\n63: \"globals\": \"^16.3.0\",\n64: \"mockdate\": \"^3.0.5\",\n65: \"typescript\": \"^5.8.3\",\n66: \"vite\": \"^7.0.4\",\n67: \"vite-plugin-dts\": \"^4.5.4\",\n68: \"vite-plugin-node\": \"^7.0.0\",\n69: \"vitest\": \"^3.2.4\"\n70: },\n71: \"overrides\": {\n72: \"wrap-ansi\": \"7.0.0\"\n73: }\n74: }\n75: ",
166
+ "name": "get_file_content"
167
+ },
168
+ {
169
+ "role": "tool",
170
+ "tool_call_id": "call_gb8qXdr1A9ZRReZHIKbm4l1q",
171
+ "content": "1: # DreadCabinet\n2: \n3: > A powerful tool that brings order to your digital chaos, one file at a time!\n4: > Organize, rename, and transform your notes or files based on date, subject, and other metadata—all within your own CLI applications.\n5: \n6: ## Features\n7: \n8: - **Date-based organization** – Place files into folders by year, month, or day (or no structure at all). \n9: - **Flexible filename generation** – Include date, time, and a subject in filenames. \n10: - **Recursion** – Process all subdirectories (or just the top level) as you prefer. \n11: - **Timezone support** – Convert file timestamps or metadata to a specific timezone for naming. \n12: - **Extension filtering** – Restrict processing to certain file types. \n13: - **No destructive operations** – Original files remain untouched; DreadCabinet only creates copies in a new directory structure.\n14: - **Concurrent processing** – Process multiple files in parallel for improved performance.\n15: \n16: ## Installation\n17: \n18: ```bash\n19: npm install @theunwalked/dreadcabinet\n20: ```\n21: \n22: *Or with other package managers:*\n23: \n24: ```bash\n25: # yarn\n26: yarn add @theunwalked/dreadcabinet\n27: \n28: # pnpm\n29: pnpm add @theunwalked/dreadcabinet\n30: ```\n31: \n32: ## Quick Start\n33: \n34: DreadCabinet is a library designed to be integrated into your own CLI tools. Here's a basic example:\n35: \n36: ```javascript\n37: import { Command } from 'commander';\n38: import * as DreadCabinet from '@theunwalked/dreadcabinet';\n39: \n40: // Create a new instance with options\n41: const instance = DreadCabinet.create({\n42: defaults: {\n43: timezone: 'America/New_York',\n44: extensions: ['md', 'txt'],\n45: outputStructure: 'month',\n46: outputDirectory: './dist',\n47: }\n48: });\n49: \n50: // Configure your command\n51: const program = new Command();\n52: await instance.configure(program);\n53: \n54: // Parse arguments and process\n55: program.parse(process.argv);\n56: const cliArgs = program.opts();\n57: const config = await instance.read(cliArgs);\n58: const finalConfig = instance.applyDefaults(config);\n59: await instance.validate(finalConfig);\n60: \n61: // Use the operator to process files\n62: const operator = await instance.operate(finalConfig);\n63: await operator.process(async (file) => {\n64: // Your file processing logic here\n65: });\n66: ```\n67: \n68: Once integrated, users can process files with commands like:\n69: \n70: ```bash\n71: my-app \\\n72: --input-directory . \\\n73: --output-directory ./organized \\\n74: --output-structure month \\\n75: --extensions md\n76: ```\n77: \n78: ## Documentation\n79: \n80: For complete documentation, including detailed configuration options, advanced usage examples, and integration guides, visit:\n81: \n82: **[📖 DreadCabinet Documentation](https://semicolonambulance.github.io/dreadcabinet/)**\n83: \n84: ### Quick Links\n85: \n86: - [Getting Started Guide](https://semicolonambulance.github.io/dreadcabinet/#getting-started)\n87: - [CLI Options Reference](https://semicolonambulance.github.io/dreadcabinet/#cli-options)\n88: - [Configuration Files](https://semicolonambulance.github.io/dreadcabinet/#configuration-files)\n89: - [Advanced Usage](https://semicolonambulance.github.io/dreadcabinet/#advanced-usage)\n90: - [API Reference](https://semicolonambulance.github.io/dreadcabinet/#api-reference)\n91: \n92: ## Contributing\n93: \n94: We welcome contributions! Please see our [Contributing Guide](https://semicolonambulance.github.io/dreadcabinet/#contributing) for details.\n95: \n96: ## License\n97: \n98: [Apache-2.0](./LICENSE) © 2025 Tim O'Brien ",
172
+ "name": "get_file_content"
173
+ },
174
+ {
175
+ "role": "tool",
176
+ "tool_call_id": "call_2TYv8p07uqKbi5vmR1FnovDy",
177
+ "content": "1: # Contributing to DreadCabinet\n2: \n3: We welcome contributions to DreadCabinet! This guide will help you get started with contributing to the project.\n4: \n5: ## Getting Started\n6: \n7: ### Prerequisites\n8: \n9: - **Node.js** 18+ and **npm** 9+\n10: - **Git** for version control\n11: - **TypeScript** knowledge (the project is written in TypeScript)\n12: \n13: ### Setting Up the Development Environment\n14: \n15: 1. **Fork and clone the repository**:\n16: ```bash\n17: git clone https://github.com/tobrien/dreadcabinet.git\n18: cd dreadcabinet\n19: ```\n20: \n21: 2. **Install dependencies**:\n22: ```bash\n23: npm install\n24: ```\n25: \n26: 3. **Build the project**:\n27: ```bash\n28: npm run build\n29: ```\n30: \n31: 4. **Run tests**:\n32: ```bash\n33: npm test\n34: ```\n35: \n36: 5. **Start development mode**:\n37: ```bash\n38: npm run dev\n39: ```\n40: \n41: ### Project Structure\n42: \n43: ```\n44: dreadcabinet/\n45: ├── src/ # Source code\n46: │ ├── configure.ts # CLI configuration\n47: │ ├── dreadcabinet.ts # Main library entry\n48: │ ├── input/ # Input processing\n49: │ ├── output.ts # Output handling\n50: │ ├── operate.ts # File operations\n51: │ ├── validate.ts # Configuration validation\n52: │ └── util/ # Utility functions\n53: ├── tests/ # Test files\n54: ├── docs/ # Documentation site\n55: ├── dist/ # Compiled output\n56: └── coverage/ # Test coverage reports\n57: ```\n58: \n59: ## Development Workflow\n60: \n61: ### 1. Create a Branch\n62: \n63: Create a feature branch from `main`:\n64: \n65: ```bash\n66: git checkout -b feature/your-feature-name\n67: # or\n68: git checkout -b fix/issue-description\n69: ```\n70: \n71: ### 2. Make Your Changes\n72: \n73: - Write clean, well-documented TypeScript code\n74: - Follow the existing code style and patterns\n75: - Add tests for new functionality\n76: - Update documentation as needed\n77: \n78: ### 3. Test Your Changes\n79: \n80: Run the full test suite:\n81: \n82: ```bash\n83: # Run tests with coverage\n84: npm test\n85: \n86: # Run tests in watch mode during development\n87: npm test --watch\n88: \n89: # Run linting\n90: npm run lint\n91: \n92: # Fix linting issues automatically\n93: npm run lint:fix\n94: ```\n95: \n96: ### 4. Update Documentation\n97: \n98: If your changes affect the API or user-facing features:\n99: \n100: - Update relevant documentation in `docs/public/`\n101: - Add examples to demonstrate new features\n102: - Update the README if needed\n103: \n104: ### 5. Commit Your Changes\n105: \n106: We use conventional commits. Format your commit messages like:\n107: \n108: ```bash\n109: # Features\n110: git commit -m \"feat: add support for custom date patterns\"\n111: \n112: # Bug fixes\n113: git commit -m \"fix: handle timezone conversion edge cases\"\n114: \n115: # Documentation\n116: git commit -m \"docs: add examples for advanced filename options\"\n117: \n118: # Tests\n119: git commit -m \"test: add coverage for collision handling\"\n120: ```\n121: \n122: ### 6. Push and Create Pull Request\n123: \n124: ```bash\n125: git push origin feature/your-feature-name\n126: ```\n127: \n128: Then create a pull request on GitHub with:\n129: - Clear description of changes\n130: - Reference to any related issues\n131: - Screenshots or examples if applicable\n132: \n133: ## Code Style Guidelines\n134: \n135: ### TypeScript Style\n136: \n137: - Use TypeScript strict mode\n138: - Prefer `interface` over `type` for object shapes\n139: - Use meaningful variable and function names\n140: - Add JSDoc comments for public APIs\n141: \n142: ```typescript\n143: /**\n144: * Processes files based on the provided configuration\n145: * @param config - The validated DreadCabinet configuration\n146: * @returns Promise that resolves to an operator instance\n147: */\n148: export async function operate(config: Config): Promise<Operator> {\n149: // Implementation\n150: }\n151: ```\n152: \n153: ### Error Handling\n154: \n155: - Use custom error classes from `src/error/`\n156: - Provide helpful error messages\n157: - Include context in error messages\n158: \n159: ```typescript\n160: import { ArgumentError } from './error/ArgumentError';\n161: \n162: if (!isValidTimezone(timezone)) {\n163: throw new ArgumentError(`Invalid timezone: ${timezone}. Must be a valid IANA timezone identifier.`);\n164: }\n165: ```\n166: \n167: ### Testing Style\n168: \n169: - Write descriptive test names\n170: - Use `describe` blocks to group related tests\n171: - Test both success and error cases\n172: - Mock external dependencies\n173: \n174: ```typescript\n175: describe('operate', () => {\n176: describe('when configuration is valid', () => {\n177: it('should return an operator instance', async () => {\n178: const config = createValidConfig();\n179: const operator = await operate(config);\n180: expect(operator).toBeDefined();\n181: });\n182: });\n183: \n184: describe('when configuration is invalid', () => {\n185: it('should throw ConfigurationError', async () => {\n186: const invalidConfig = createInvalidConfig();\n187: await expect(operate(invalidConfig)).rejects.toThrow(ConfigurationError);\n188: });\n189: });\n190: });\n191: ```\n192: \n193: ## Types of Contributions\n194: \n195: ### 🐛 Bug Reports\n196: \n197: When reporting bugs, please include:\n198: \n199: - **Description**: Clear description of the bug\n200: - **Steps to reproduce**: Minimal steps to trigger the issue\n201: - **Expected behavior**: What you expected to happen\n202: - **Actual behavior**: What actually happened\n203: - **Environment**: Node.js version, OS, DreadCabinet version\n204: - **Code example**: Minimal code that reproduces the issue\n205: \n206: ### ✨ Feature Requests\n207: \n208: For feature requests, please include:\n209: \n210: - **Use case**: Why this feature would be valuable\n211: - **Proposed API**: How you imagine the feature would work\n212: - **Alternatives**: Other ways to achieve the same goal\n213: - **Breaking changes**: Whether this would break existing code\n214: \n215: ### 📚 Documentation Improvements\n216: \n217: Documentation contributions are always welcome:\n218: \n219: - Fix typos and grammar\n220: - Improve existing examples\n221: - Add new examples for complex use cases\n222: - Translate documentation (if supported in the future)\n223: \n224: ### 🧪 Tests\n225: \n226: Help improve test coverage:\n227: \n228: - Add tests for edge cases\n229: - Improve existing test descriptions\n230: - Add integration tests\n231: - Performance tests for large file sets\n232: \n233: ## Development Guidelines\n234: \n235: ### Adding New Features\n236: \n237: 1. **Start with an issue**: Discuss the feature before implementing\n238: 2. **Design the API**: Consider how it fits with existing patterns\n239: 3. **Write tests first**: Consider TDD approach\n240: 4. **Implement incrementally**: Small, focused commits\n241: 5. **Update documentation**: Include examples and API docs\n242: \n243: ### Modifying Existing Features\n244: \n245: 1. **Understand the impact**: Consider backwards compatibility\n246: 2. **Add deprecation warnings**: If changing existing APIs\n247: 3. **Update all affected tests**: Ensure comprehensive coverage\n248: 4. **Update documentation**: Reflect all changes\n249: \n250: ### Performance Considerations\n251: \n252: - Profile performance-critical code\n253: - Consider memory usage for large file sets\n254: - Test with realistic data sizes\n255: - Document performance characteristics\n256: \n257: ## Pull Request Guidelines\n258: \n259: ### Before Submitting\n260: \n261: - [ ] Tests pass locally\n262: - [ ] Code is properly formatted (`npm run lint:fix`)\n263: - [ ] Documentation is updated\n264: - [ ] Commit messages follow conventional format\n265: - [ ] Branch is up to date with main\n266: \n267: ### Pull Request Description\n268: \n269: Include:\n270: \n271: - **Summary**: Brief description of changes\n272: - **Motivation**: Why this change is needed\n273: - **Testing**: How you tested the changes\n274: - **Breaking changes**: Any backwards incompatible changes\n275: - **Related issues**: Link to GitHub issues\n276: \n277: ### Review Process\n278: \n279: 1. **Automated checks**: CI tests must pass\n280: 2. **Code review**: At least one maintainer review\n281: 3. **Documentation review**: For user-facing changes\n282: 4. **Final testing**: Maintainers may do additional testing\n283: \n284: ## Release Process\n285: \n286: Releases are handled by maintainers:\n287: \n288: 1. Version bump following semantic versioning\n289: 2. Update changelog\n290: 3. Create GitHub release\n291: 4. Publish to npm\n292: 5. Update documentation site\n293: \n294: ## Community Guidelines\n295: \n296: ### Be Respectful\n297: \n298: - Use welcoming and inclusive language\n299: - Be respectful of differing viewpoints\n300: - Focus on what's best for the community\n301: - Show empathy towards other contributors\n302: \n303: ### Be Constructive\n304: \n305: - Provide helpful feedback in reviews\n306: - Suggest improvements rather than just pointing out problems\n307: - Help newcomers get started\n308: - Share knowledge and best practices\n309: \n310: ### Communication Channels\n311: \n312: - **GitHub Issues**: Bug reports, feature requests\n313: - **GitHub Discussions**: General questions, ideas\n314: - **Pull Requests**: Code contributions, reviews\n315: \n316: ## Getting Help\n317: \n318: ### Development Questions\n319: \n320: - Check existing issues and discussions\n321: - Ask questions in GitHub Discussions\n322: - Reach out to maintainers for complex issues\n323: \n324: ### Contribution Questions\n325: \n326: - Review this contributing guide\n327: - Look at recent pull requests for examples\n328: - Ask in GitHub Discussions\n329: \n330: ### Technical Support\n331: \n332: - Check the documentation first\n333: - Search existing issues\n334: - Create a new issue with detailed information\n335: \n336: ## Recognition\n337: \n338: Contributors are recognized in:\n339: \n340: - GitHub contributors list\n341: - Release notes for significant contributions\n342: - Documentation acknowledgments\n343: \n344: Thank you for contributing to DreadCabinet! 🎉 ",
178
+ "name": "get_file_content"
179
+ },
180
+ {
181
+ "role": "tool",
182
+ "tool_call_id": "call_N3us55DhWzdw8iP1IgrfzJfa",
183
+ "content": "1: import { useState, useEffect } from 'react'\n2: import LoadingSpinner from './components/LoadingSpinner'\n3: import ErrorMessage from './components/ErrorMessage'\n4: import MarkdownRenderer from './components/MarkdownRenderer'\n5: import './App.css'\n6: \n7: interface DocSection {\n8: id: string;\n9: title: string;\n10: file: string;\n11: description: string;\n12: }\n13: \n14: const DOC_SECTIONS: DocSection[] = [\n15: {\n16: id: 'getting-started',\n17: title: 'Getting Started',\n18: file: 'getting-started.md',\n19: description: 'Quick start guide and integration examples'\n20: },\n21: {\n22: id: 'cli-options',\n23: title: 'CLI Options Reference',\n24: file: 'cli-options.md',\n25: description: 'Complete reference for all command-line options'\n26: },\n27: {\n28: id: 'configuration-files',\n29: title: 'Configuration Files',\n30: file: 'configuration-files.md',\n31: description: 'Using YAML/JSON files with Cardigantime integration'\n32: },\n33: {\n34: id: 'advanced-usage',\n35: title: 'Advanced Usage',\n36: file: 'advanced-usage.md',\n37: description: 'Features configuration and advanced patterns'\n38: },\n39: {\n40: id: 'api-reference',\n41: title: 'API Reference',\n42: file: 'api-reference.md',\n43: description: 'Complete programmatic API documentation'\n44: },\n45: {\n46: id: 'faq',\n47: title: 'FAQ',\n48: file: 'faq.md',\n49: description: 'Frequently asked questions and troubleshooting'\n50: },\n51: {\n52: id: 'contributing',\n53: title: 'Contributing',\n54: file: 'contributing.md',\n55: description: 'How to contribute to DreadCabinet development'\n56: }\n57: ];\n58: \n59: function App() {\n60: const [activeSection, setActiveSection] = useState<string>('getting-started')\n61: const [content, setContent] = useState<string>('')\n62: const [loading, setLoading] = useState(true)\n63: const [error, setError] = useState<string | null>(null)\n64: const [sidebarOpen, setSidebarOpen] = useState(false)\n65: \n66: const getLogoPath = (sectionId: string): string => {\n67: switch (sectionId) {\n68: default:\n69: return '/dreadcabinet/dread-cabinet.png'\n70: }\n71: }\n72: \n73: const loadSection = async (sectionId: string) => {\n74: const section = DOC_SECTIONS.find(s => s.id === sectionId)\n75: if (!section) return\n76: \n77: setLoading(true)\n78: setError(null)\n79: \n80: try {\n81: const response = await fetch(`./${section.file}`)\n82: if (!response.ok) {\n83: throw new Error(`Failed to fetch ${section.title}: ${response.status}`)\n84: }\n85: const text = await response.text()\n86: setContent(text)\n87: setActiveSection(sectionId)\n88: setLoading(false)\n89: setSidebarOpen(false) // Close sidebar on mobile after selection\n90: } catch (err) {\n91: setError(err instanceof Error ? err.message : 'Unknown error')\n92: setLoading(false)\n93: }\n94: }\n95: \n96: useEffect(() => {\n97: // Load initial section\n98: loadSection('getting-started')\n99: }, [])\n100: \n101: if (loading) {\n102: return (\n103: <div className=\"app\">\n104: <div className=\"loading-container\">\n105: <LoadingSpinner />\n106: </div>\n107: </div>\n108: )\n109: }\n110: \n111: if (error) {\n112: return (\n113: <div className=\"app\">\n114: <div className=\"error-container\">\n115: <ErrorMessage message={error} />\n116: </div>\n117: </div>\n118: )\n119: }\n120: \n121: return (\n122: <div className=\"app\">\n123: <header className=\"header\">\n124: <div className=\"header-content\">\n125: <div className=\"header-main\">\n126: <div className=\"header-left\">\n127: <h1>DreadCabinet</h1>\n128: <button\n129: className=\"mobile-menu-button\"\n130: onClick={() => setSidebarOpen(!sidebarOpen)}\n131: aria-label=\"Toggle menu\"\n132: >\n133: ☰\n134: </button>\n135: </div>\n136: <img src={getLogoPath(activeSection)} alt=\"DreadCabinet logo\" className=\"logo\" />\n137: </div>\n138: <p className=\"subtitle\">Organize Your Digital Chaos</p>\n139: <div className=\"header-links\">\n140: <a href=\"https://github.com/tobrien/dreadcabinet\" target=\"_blank\" rel=\"noopener noreferrer\">\n141: GitHub\n142: </a>\n143: <a href=\"https://www.npmjs.com/package/@theunwalked/dreadcabinet\" target=\"_blank\" rel=\"noopener noreferrer\">\n144: NPM\n145: </a>\n146: </div>\n147: </div>\n148: </header>\n149: \n150: <div className=\"main-content\">\n151: <nav className={`sidebar ${sidebarOpen ? 'sidebar-open' : ''}`}>\n152: <div className=\"sidebar-content\">\n153: <h2>Documentation</h2>\n154: <ul className=\"nav-list\">\n155: {DOC_SECTIONS.map((section) => (\n156: <li key={section.id}>\n157: <button\n158: className={`nav-item ${activeSection === section.id ? 'active' : ''}`}\n159: onClick={() => loadSection(section.id)}\n160: >\n161: <span className=\"nav-title\">{section.title}</span>\n162: <span className=\"nav-description\">{section.description}</span>\n163: </button>\n164: </li>\n165: ))}\n166: </ul>\n167: </div>\n168: </nav>\n169: \n170: <main className=\"content\">\n171: <div className=\"markdown-container\">\n172: <MarkdownRenderer content={content} />\n173: </div>\n174: </main>\n175: </div>\n176: \n177: <footer className=\"footer\">\n178: <div className=\"footer-content\">\n179: <p>\n180: Built with ❤️ by{' '}\n181: <a href=\"https://github.com/tobrien\" target=\"_blank\" rel=\"noopener noreferrer\">\n182: Tim O'Brien\n183: </a>\n184: </p>\n185: <p className=\"license\">Licensed under Apache-2.0</p>\n186: </div>\n187: </footer>\n188: </div>\n189: )\n190: }\n191: \n192: export default App ",
184
+ "name": "get_file_content"
185
+ },
186
+ {
187
+ "role": "assistant",
188
+ "content": null,
189
+ "tool_calls": [
190
+ {
191
+ "id": "call_UTDeitvnD9o7XkZTmVG943EN",
192
+ "type": "function",
193
+ "function": {
194
+ "name": "get_file_content",
195
+ "arguments": "{\"filePath\": \"docs/public/faq.md\", \"includeLineNumbers\": true}"
196
+ }
197
+ },
198
+ {
199
+ "id": "call_zi0pM94cjRhg8vmYJMRwkDAL",
200
+ "type": "function",
201
+ "function": {
202
+ "name": "get_file_content",
203
+ "arguments": "{\"filePath\": \"LICENSE\", \"includeLineNumbers\": true}"
204
+ }
205
+ }
206
+ ]
207
+ },
208
+ {
209
+ "role": "tool",
210
+ "tool_call_id": "call_UTDeitvnD9o7XkZTmVG943EN",
211
+ "content": "1: # Frequently Asked Questions\n2: \n3: Common questions and answers about using DreadCabinet.\n4: \n5: ## General Questions\n6: \n7: ### What is DreadCabinet?\n8: \n9: DreadCabinet is a TypeScript/JavaScript library that brings order to your digital chaos by organizing, renaming, and transforming files based on date, subject, and other metadata. It's designed to be integrated into your own CLI applications rather than being a standalone tool.\n10: \n11: ### Is DreadCabinet a standalone CLI tool?\n12: \n13: No, DreadCabinet is a library that you integrate into your own CLI applications. This design gives you maximum flexibility to customize the file processing logic for your specific needs and integrate with your existing workflows.\n14: \n15: ### Why should I use DreadCabinet instead of writing my own file organization script?\n16: \n17: DreadCabinet provides:\n18: - Battle-tested file organization patterns\n19: - Robust date and timezone handling\n20: - Intelligent filename generation with collision handling\n21: - Concurrent processing capabilities\n22: - Comprehensive CLI option management\n23: - TypeScript support with full type definitions\n24: - Integration with configuration file libraries\n25: \n26: ## File Processing\n27: \n28: ### Will DreadCabinet overwrite my original files?\n29: \n30: No. DreadCabinet only reads your source files and creates renamed copies in the output directory. Your original files remain completely untouched. If you specify the same directory for both input and output, DreadCabinet will rename files (or add suffixes) to avoid overwriting.\n31: \n32: ### What file types does DreadCabinet support?\n33: \n34: DreadCabinet can process any file type, but by default it's configured to handle Markdown (`.md`) files. You can configure it to process any file extensions you need:\n35: \n36: ```bash\n37: my-app --extensions md txt json yaml\n38: ```\n39: \n40: ### How do I specify multiple file extensions?\n41: \n42: Pass them as space-separated arguments to `--extensions`:\n43: \n44: ```bash\n45: my-app --extensions md txt markdown rst\n46: ```\n47: \n48: Or in a configuration file:\n49: ```yaml\n50: extensions:\n51: - md\n52: - txt\n53: - markdown\n54: ```\n55: \n56: ### What happens if two files produce the same date and subject?\n57: \n58: DreadCabinet automatically detects collisions and appends an extra identifier so files don't overwrite each other. You might see:\n59: \n60: ```\n61: 2025-05-13-meeting.md\n62: 2025-05-13-meeting-1.md\n63: 2025-05-13-meeting-a7b9.md\n64: ```\n65: \n66: ## Date and Time Handling\n67: \n68: ### How does DreadCabinet detect dates in files?\n69: \n70: DreadCabinet uses a hierarchical approach:\n71: \n72: 1. **File metadata/front matter** (if your application implements parsing)\n73: 2. **Filename patterns** (e.g., `2025-01-15-notes.md`)\n74: 3. **File modification timestamp** (as fallback)\n75: \n76: The exact implementation depends on how you integrate DreadCabinet into your application.\n77: \n78: ### Does DreadCabinet parse YAML front matter automatically?\n79: \n80: DreadCabinet provides the framework, but you implement the parsing logic. This gives you full control over how metadata is extracted from your files. See the [Advanced Usage](advanced-usage.md#subject-extraction-strategies) guide for examples.\n81: \n82: ### Why is the filename missing the full date when I use `--output-structure month`?\n83: \n84: DreadCabinet automatically omits redundant parts of the date in filenames if they're already included in the directory path. This prevents something like `2025/05/13/2025-05-13-my-note.md`.\n85: \n86: For example:\n87: - With `--output-structure month`: `2025/05/13-meeting.md`\n88: - With `--output-structure day`: `2025/05/13/meeting.md`\n89: \n90: This is by design to keep filenames clean and avoid redundancy.\n91: \n92: ### Can I force DreadCabinet to always include the full date in filenames?\n93: \n94: Currently, DreadCabinet automatically handles date redundancy. If you need different behavior, you can implement custom filename generation in your processing function or request this as a feature enhancement.\n95: \n96: ### What timezone formats does DreadCabinet support?\n97: \n98: DreadCabinet supports any timezone from the [IANA Time Zone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Examples:\n99: \n100: - `America/New_York`\n101: - `Europe/London` \n102: - `Asia/Tokyo`\n103: - `Etc/UTC`\n104: \n105: ## Performance and Concurrency\n106: \n107: ### How many files can DreadCabinet process concurrently?\n108: \n109: By default, DreadCabinet processes files sequentially (`--concurrency 1`). You can increase this based on your system capabilities:\n110: \n111: ```bash\n112: # Process 5 files simultaneously\n113: my-app --concurrency 5\n114: \n115: # For powerful systems\n116: my-app --concurrency 10\n117: ```\n118: \n119: A good rule of thumb is to set concurrency between 2-10 depending on your system and the complexity of your file processing operations.\n120: \n121: ### Will high concurrency improve performance?\n122: \n123: It depends on your workload:\n124: \n125: - **I/O-bound operations** (copying, reading files): Higher concurrency usually helps\n126: - **CPU-bound operations** (text processing, image manipulation): Concurrency equal to CPU cores is often optimal\n127: - **Memory-intensive operations**: Lower concurrency to avoid exhausting system memory\n128: \n129: Start with a low value and experiment to find the optimal setting for your use case.\n130: \n131: ### How do I process only a subset of files for testing?\n132: \n133: Use the `--limit` option:\n134: \n135: ```bash\n136: # Process only the first 10 files found\n137: my-app --limit 10\n138: \n139: # Test with 50 files\n140: my-app --limit 50\n141: ```\n142: \n143: This is useful for testing configurations on large file collections.\n144: \n145: ## Configuration\n146: \n147: ### Can I use configuration files instead of command-line arguments?\n148: \n149: Yes! DreadCabinet integrates well with `@theunwalked/cardigantime` for configuration file support. You can use YAML, JSON, or JavaScript configuration files. See the [Configuration Files](configuration-files.md) guide for detailed examples.\n150: \n151: ### How do command-line arguments override configuration files?\n152: \n153: The typical precedence order is:\n154: \n155: 1. Application defaults (lowest)\n156: 2. Configuration file values\n157: 3. Environment variables (if implemented)\n158: 4. Command-line arguments (highest)\n159: \n160: This means CLI arguments always win, allowing for flexible overrides.\n161: \n162: ### Can I have different configurations for different environments?\n163: \n164: Yes! You can maintain separate configuration files:\n165: \n166: ```\n167: .config/\n168: ├── development.yaml\n169: ├── staging.yaml\n170: └── production.yaml\n171: ```\n172: \n173: Then specify which one to use:\n174: ```bash\n175: my-app --config-file .config/production.yaml\n176: ```\n177: \n178: ## Integration and Development\n179: \n180: ### How do I integrate DreadCabinet with my existing CLI tool?\n181: \n182: Follow these basic steps:\n183: \n184: 1. Install DreadCabinet: `npm install @theunwalked/dreadcabinet`\n185: 2. Create a DreadCabinet instance with your defaults\n186: 3. Configure your Commander.js program with DreadCabinet options\n187: 4. Parse CLI arguments and validate configuration\n188: 5. Create an operator and implement your file processing logic\n189: \n190: See the [Getting Started](getting-started.md) guide for a complete example.\n191: \n192: ### Can I customize which CLI options are available?\n193: \n194: Yes! Use the `features` array when creating your DreadCabinet instance:\n195: \n196: ```javascript\n197: const instance = DreadCabinet.create({\n198: features: ['input', 'output', 'extensions']\n199: // This only enables basic input/output and extension filtering\n200: });\n201: ```\n202: \n203: See [Advanced Usage](advanced-usage.md#features-configuration) for all available features.\n204: \n205: ### How do I implement custom subject extraction?\n206: \n207: Implement your own logic in the processing function:\n208: \n209: ```javascript\n210: await operator.process(async (file) => {\n211: const content = await fs.readFile(file.path, 'utf8');\n212: \n213: // Custom subject extraction logic\n214: const subject = extractSubjectFromContent(content);\n215: \n216: // Use the subject in your processing\n217: console.log(`Processing: ${subject}`);\n218: });\n219: ```\n220: \n221: ### Can I use DreadCabinet with languages other than JavaScript/TypeScript?\n222: \n223: DreadCabinet is specifically designed for Node.js/JavaScript/TypeScript applications. For other languages, you might consider:\n224: \n225: 1. Creating a Node.js wrapper that calls your main application\n226: 2. Using DreadCabinet as inspiration to implement similar functionality in your language\n227: 3. Creating a standalone CLI tool with DreadCabinet and calling it from your application\n228: \n229: ## Troubleshooting\n230: \n231: ### I'm getting \"Configuration validation failed\" errors\n232: \n233: This usually means:\n234: \n235: 1. **Invalid option values**: Check that your extensions, timezone, or structure values are valid\n236: 2. **Type mismatches**: Ensure numbers are numbers, booleans are booleans, etc.\n237: 3. **Missing required fields**: Some combinations of features require certain options\n238: \n239: Enable detailed logging to see exactly what's failing:\n240: \n241: ```javascript\n242: try {\n243: await instance.validate(config);\n244: } catch (error) {\n245: console.error('Validation details:', error.issues); // For Zod validation errors\n246: }\n247: ```\n248: \n249: ### Files aren't being found\n250: \n251: Check these common issues:\n252: \n253: 1. **File extensions**: Make sure your `--extensions` setting includes the files you want to process\n254: 2. **Directory structure**: Verify the `--input-directory` path is correct\n255: 3. **Recursive processing**: Add `--recursive` if your files are in subdirectories\n256: 4. **File permissions**: Ensure DreadCabinet can read the input directory\n257: \n258: ### Output files are going to unexpected locations\n259: \n260: 1. **Check output structure**: The `--output-structure` setting affects where files are placed\n261: 2. **Verify output directory**: Make sure `--output-directory` is set correctly\n262: 3. **Date detection**: If dates aren't being detected properly, files might be organized by their modification time\n263: \n264: ### Performance is slower than expected\n265: \n266: 1. **Reduce concurrency**: High concurrency can sometimes hurt performance\n267: 2. **Check file processing logic**: Complex processing functions will be slower\n268: 3. **Use selective processing**: Skip unchanged files or add filters\n269: 4. **Profile your code**: Use Node.js profiling tools to find bottlenecks\n270: \n271: ## Getting Help\n272: \n273: ### Where can I find more examples?\n274: \n275: - Check the [Getting Started](getting-started.md) guide for basic examples\n276: - See [Advanced Usage](advanced-usage.md) for complex scenarios\n277: - Review the [API Reference](api-reference.md) for complete documentation\n278: \n279: ### How do I report bugs or request features?\n280: \n281: 1. Check the [GitHub issues](https://github.com/tobrien/dreadcabinet/issues) for existing reports\n282: 2. Create a new issue with:\n283: - Clear description of the problem or feature request\n284: - Code examples demonstrating the issue\n285: - Your environment details (Node.js version, OS, etc.)\n286: - Steps to reproduce\n287: \n288: ### Can I contribute to DreadCabinet?\n289: \n290: Yes! Contributions are welcome. See the [Contributing Guide](contributing.md) for details on:\n291: \n292: - Setting up the development environment\n293: - Running tests\n294: - Submitting pull requests\n295: - Code style guidelines ",
212
+ "name": "get_file_content"
213
+ },
214
+ {
215
+ "role": "tool",
216
+ "tool_call_id": "call_zi0pM94cjRhg8vmYJMRwkDAL",
217
+ "content": "1: Apache License\n2: Version 2.0, January 2004\n3: http://www.apache.org/licenses/\n4: \n5: TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n6: \n7: 1. Definitions.\n8: \n9: \"License\" shall mean the terms and conditions for use, reproduction,\n10: and distribution as defined by Sections 1 through 9 of this document.\n11: \n12: \"Licensor\" shall mean the copyright owner or entity authorized by\n13: the copyright owner that is granting the License.\n14: \n15: \"Legal Entity\" shall mean the union of the acting entity and all\n16: other entities that control, are controlled by, or are under common\n17: control with that entity. For the purposes of this definition,\n18: \"control\" means (i) the power, direct or indirect, to cause the\n19: direction or management of such entity, whether by contract or\n20: otherwise, or (ii) ownership of fifty percent (50%) or more of the\n21: outstanding shares, or (iii) beneficial ownership of such entity.\n22: \n23: \"You\" (or \"Your\") shall mean an individual or Legal Entity\n24: exercising permissions granted by this License.\n25: \n26: \"Source\" form shall mean the preferred form for making modifications,\n27: including but not limited to software source code, documentation\n28: source, and configuration files.\n29: \n30: \"Object\" form shall mean any form resulting from mechanical\n31: transformation or translation of a Source form, including but\n32: not limited to compiled object code, generated documentation,\n33: and conversions to other media types.\n34: \n35: \"Work\" shall mean the work of authorship, whether in Source or\n36: Object form, made available under the License, as indicated by a\n37: copyright notice that is included in or attached to the work\n38: (an example is provided in the Appendix below).\n39: \n40: \"Derivative Works\" shall mean any work, whether in Source or Object\n41: form, that is based on (or derived from) the Work and for which the\n42: editorial revisions, annotations, elaborations, or other modifications\n43: represent, as a whole, an original work of authorship. For the purposes\n44: of this License, Derivative Works shall not include works that remain\n45: separable from, or merely link (or bind by name) to the interfaces of,\n46: the Work and Derivative Works thereof.\n47: \n48: \"Contribution\" shall mean any work of authorship, including\n49: the original version of the Work and any modifications or additions\n50: to that Work or Derivative Works thereof, that is intentionally\n51: submitted to Licensor for inclusion in the Work by the copyright owner\n52: or by an individual or Legal Entity authorized to submit on behalf of\n53: the copyright owner. For the purposes of this definition, \"submitted\"\n54: means any form of electronic, verbal, or written communication sent\n55: to the Licensor or its representatives, including but not limited to\n56: communication on electronic mailing lists, source code control systems,\n57: and issue tracking systems that are managed by, or on behalf of, the\n58: Licensor for the purpose of discussing and improving the Work, but\n59: excluding communication that is conspicuously marked or otherwise\n60: designated in writing by the copyright owner as \"Not a Contribution.\"\n61: \n62: \"Contributor\" shall mean Licensor and any individual or Legal Entity\n63: on behalf of whom a Contribution has been received by Licensor and\n64: subsequently incorporated within the Work.\n65: \n66: 2. Grant of Copyright License. Subject to the terms and conditions of\n67: this License, each Contributor hereby grants to You a perpetual,\n68: worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n69: copyright license to reproduce, prepare Derivative Works of,\n70: publicly display, publicly perform, sublicense, and distribute the\n71: Work and such Derivative Works in Source or Object form.\n72: \n73: 3. Grant of Patent License. Subject to the terms and conditions of\n74: this License, each Contributor hereby grants to You a perpetual,\n75: worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n76: (except as stated in this section) patent license to make, have made,\n77: use, offer to sell, sell, import, and otherwise transfer the Work,\n78: where such license applies only to those patent claims licensable\n79: by such Contributor that are necessarily infringed by their\n80: Contribution(s) alone or by combination of their Contribution(s)\n81: with the Work to which such Contribution(s) was submitted. If You\n82: institute patent litigation against any entity (including a\n83: cross-claim or counterclaim in a lawsuit) alleging that the Work\n84: or a Contribution incorporated within the Work constitutes direct\n85: or contributory patent infringement, then any patent licenses\n86: granted to You under this License for that Work shall terminate\n87: as of the date such litigation is filed.\n88: \n89: 4. Redistribution. You may reproduce and distribute copies of the\n90: Work or Derivative Works thereof in any medium, with or without\n91: modifications, and in Source or Object form, provided that You\n92: meet the following conditions:\n93: \n94: (a) You must give any other recipients of the Work or\n95: Derivative Works a copy of this License; and\n96: \n97: (b) You must cause any modified files to carry prominent notices\n98: stating that You changed the files; and\n99: \n100: (c) You must retain, in the Source form of any Derivative Works\n101: that You distribute, all copyright, patent, trademark, and\n102: attribution notices from the Source form of the Work,\n103: excluding those notices that do not pertain to any part of\n104: the Derivative Works; and\n105: \n106: (d) If the Work includes a \"NOTICE\" text file as part of its\n107: distribution, then any Derivative Works that You distribute must\n108: include a readable copy of the attribution notices contained\n109: within such NOTICE file, excluding those notices that do not\n110: pertain to any part of the Derivative Works, in at least one\n111: of the following places: within a NOTICE text file distributed\n112: as part of the Derivative Works; within the Source form or\n113: documentation, if provided along with the Derivative Works; or,\n114: within a display generated by the Derivative Works, if and\n115: wherever such third-party notices normally appear. The contents\n116: of the NOTICE file are for informational purposes only and\n117: do not modify the License. You may add Your own attribution\n118: notices within Derivative Works that You distribute, alongside\n119: or as an addendum to the NOTICE text from the Work, provided\n120: that such additional attribution notices cannot be construed\n121: as modifying the License.\n122: \n123: You may add Your own copyright statement to Your modifications and\n124: may provide additional or different license terms and conditions\n125: for use, reproduction, or distribution of Your modifications, or\n126: for any such Derivative Works as a whole, provided Your use,\n127: reproduction, and distribution of the Work otherwise complies with\n128: the conditions stated in this License.\n129: \n130: 5. Submission of Contributions. Unless You explicitly state otherwise,\n131: any Contribution intentionally submitted for inclusion in the Work\n132: by You to the Licensor shall be under the terms and conditions of\n133: this License, without any additional terms or conditions.\n134: Notwithstanding the above, nothing herein shall supersede or modify\n135: the terms of any separate license agreement you may have executed\n136: with Licensor regarding such Contributions.\n137: \n138: 6. Trademarks. This License does not grant permission to use the trade\n139: names, trademarks, service marks, or product names of the Licensor,\n140: except as required for reasonable and customary use in describing the\n141: origin of the Work and reproducing the content of the NOTICE file.\n142: \n143: 7. Disclaimer of Warranty. Unless required by applicable law or\n144: agreed to in writing, Licensor provides the Work (and each\n145: Contributor provides its Contributions) on an \"AS IS\" BASIS,\n146: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n147: implied, including, without limitation, any warranties or conditions\n148: of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n149: PARTICULAR PURPOSE. You are solely responsible for determining the\n150: appropriateness of using or redistributing the Work and assume any\n151: risks associated with Your exercise of permissions under this License.\n152: \n153: 8. Limitation of Liability. In no event and under no legal theory,\n154: whether in tort (including negligence), contract, or otherwise,\n155: unless required by applicable law (such as deliberate and grossly\n156: negligent acts) or agreed to in writing, shall any Contributor be\n157: liable to You for damages, including any direct, indirect, special,\n158: incidental, or consequential damages of any character arising as a\n159: result of this License or out of the use or inability to use the\n160: Work (including but not limited to damages for loss of goodwill,\n161: work stoppage, computer failure or malfunction, or any and all\n162: other commercial damages or losses), even if such Contributor\n163: has been advised of the possibility of such damages.\n164: \n165: 9. Accepting Warranty or Additional Liability. While redistributing\n166: the Work or Derivative Works thereof, You may choose to offer,\n167: and charge a fee for, acceptance of support, warranty, indemnity,\n168: or other liability obligations and/or rights consistent with this\n169: License. However, in accepting such obligations, You may act only\n170: on Your own behalf and on Your sole responsibility, not on behalf\n171: of any other Contributor, and only if You agree to indemnify,\n172: defend, and hold each Contributor harmless for any liability\n173: incurred by, or claims asserted against, such Contributor by reason\n174: of your accepting any such warranty or additional liability.\n175: \n176: END OF TERMS AND CONDITIONS\n177: \n178: Copyright 2025 Tim O'Brien\n179: \n180: Licensed under the Apache License, Version 2.0 (the \"License\");\n181: you may not use this file except in compliance with the License.\n182: You may obtain a copy of the License at\n183: \n184: http://www.apache.org/licenses/LICENSE-2.0\n185: \n186: Unless required by applicable law or agreed to in writing, software\n187: distributed under the License is distributed on an \"AS IS\" BASIS,\n188: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n189: See the License for the specific language governing permissions and\n190: limitations under the License.\n191: ",
218
+ "name": "get_file_content"
219
+ },
220
+ {
221
+ "role": "assistant",
222
+ "content": null,
223
+ "tool_calls": [
224
+ {
225
+ "id": "call_Ipz7gsVtvlWKuLxKg9VJiDaK",
226
+ "type": "function",
227
+ "function": {
228
+ "name": "search_codebase",
229
+ "arguments": "{\"query\":\"DS_Store\",\"contextLines\":2}"
230
+ }
231
+ }
232
+ ]
233
+ },
234
+ {
235
+ "role": "tool",
236
+ "tool_call_id": "call_Ipz7gsVtvlWKuLxKg9VJiDaK",
237
+ "content": ".npmignore-4-dist/tests/\n.npmignore-5-tests/\n.npmignore:6:.DS_Store\n.npmignore-7-.eslintrc.json\n.npmignore-8-babel.config.js\n--\ndocs/.gitignore-17-!.vscode/extensions.json\ndocs/.gitignore-18-.idea\ndocs/.gitignore:19:.DS_Store\ndocs/.gitignore-20-*.suo\ndocs/.gitignore-21-*.ntvs*\n",
238
+ "name": "search_codebase"
239
+ },
240
+ {
241
+ "role": "assistant",
242
+ "content": null,
243
+ "tool_calls": [
244
+ {
245
+ "id": "call_axzMhuNAwpYeNIeBApL9wPZ0",
246
+ "type": "function",
247
+ "function": {
248
+ "name": "get_file_content",
249
+ "arguments": "{\"filePath\":\".npmignore\",\"includeLineNumbers\":true}"
250
+ }
251
+ }
252
+ ]
253
+ },
254
+ {
255
+ "role": "tool",
256
+ "tool_call_id": "call_axzMhuNAwpYeNIeBApL9wPZ0",
257
+ "content": "1: # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files\n2: coverage/\n3: node_modules/\n4: dist/tests/\n5: tests/\n6: .DS_Store\n7: .eslintrc.json\n8: babel.config.js\n9: cloudbuild.yaml\n10: jest.config.ts\n11: tsconfig.json\n12: yarn.lock\n13: .yarnrc.yml\n14: .npmignore\n15: .gitignore\n16: .github/\n17: .vscode/\n18: .yarn/\n19: src/\n20: .eslintrc\n21: .prettierrc\n22: jest.config.js\n23: tsconfig.json\n24: *.log\n25: .env\n26: .env.*\n27: README.md\n28: .markdown-doctest-setup.mjs\n29: eslint.config.mjs\n30: vite.config.ts\n31: vitest.config.ts\n32: .config/\n33: docs/\n34: ",
258
+ "name": "get_file_content"
259
+ },
260
+ {
261
+ "role": "assistant",
262
+ "content": "SUGGESTED_SPLITS:\nSplit 1:\nFiles: [.github/workflows/dependency-review.yml, .github/workflows/test.yml, .github/workflows/npm-publish.yml, .github/workflows/pnpm-publish.yml]\nRationale: CI/CD behavior changes (new security check, test trigger changes, and switching the release publish workflow to npm) are reviewable together and independent of docs/metadata updates.\nMessage: |\n ci: add dependency review and publish releases via npm\n\n - Add dependency-review workflow with PR summary comments\n - Run test workflow on pull requests to main/working (instead of push)\n - Replace pnpm-based publish workflow with npm publish using npm ci and NPM_TOKEN\n\nSplit 2:\nFiles: [package.json, pnpm-lock.yaml, docs/pnpm-lock.yaml, pnpm-workspace.yaml]\nRationale: Package manager/config changes (scripts/overrides/workspace + lockfile updates) should be reviewed as a cohesive “tooling” change.\nMessage: |\n chore: prefer npm scripts and drop pnpm workspace config\n\n - Switch build/test/watch/prepublish scripts from pnpm to npm\n - Move wrap-ansi override to top-level overrides\n - Remove pnpm-workspace.yaml\n - Update pnpm lockfiles to match dependency resolution\n\nSplit 3:\nFiles: [LICENSE, README.md, docs/public/contributing.md, docs/public/faq.md, docs/src/App.tsx]\nRationale: Ownership/branding and documentation link updates are user-facing but don’t affect runtime/CI behavior; easier to review separately.\nMessage: |\n docs: update repo links and attribution to tobrien\n\n - Update GitHub URLs across docs/site from SemicolonAmbulance to tobrien\n - Update contributing guide to use npm commands\n - Update LICENSE/README and docs footer attribution\n\nSplit 4:\nFiles: [.DS_Store, src/.DS_Store, tests/.DS_Store]\nRationale: Accidental OS-generated binaries shouldn’t ship; keep noise out of functional commits.\nMessage: |\n chore: remove accidentally committed .DS_Store files"
263
+ }
264
+ ]
265
+ ```
266
+
267
+ </details>
268
+
269
+ ## Generated Commit Message
270
+
271
+ ```
272
+ SUGGESTED_SPLITS:
273
+ Split 1:
274
+ Files: [.github/workflows/dependency-review.yml, .github/workflows/test.yml, .github/workflows/npm-publish.yml, .github/workflows/pnpm-publish.yml]
275
+ Rationale: CI/CD behavior changes (new security check, test trigger changes, and switching the release publish workflow to npm) are reviewable together and independent of docs/metadata updates.
276
+ Message: |
277
+ ci: add dependency review and publish releases via npm
278
+
279
+ - Add dependency-review workflow with PR summary comments
280
+ - Run test workflow on pull requests to main/working (instead of push)
281
+ - Replace pnpm-based publish workflow with npm publish using npm ci and NPM_TOKEN
282
+
283
+ Split 2:
284
+ Files: [package.json, pnpm-lock.yaml, docs/pnpm-lock.yaml, pnpm-workspace.yaml]
285
+ Rationale: Package manager/config changes (scripts/overrides/workspace + lockfile updates) should be reviewed as a cohesive “tooling” change.
286
+ Message: |
287
+ chore: prefer npm scripts and drop pnpm workspace config
288
+
289
+ - Switch build/test/watch/prepublish scripts from pnpm to npm
290
+ - Move wrap-ansi override to top-level overrides
291
+ - Remove pnpm-workspace.yaml
292
+ - Update pnpm lockfiles to match dependency resolution
293
+
294
+ Split 3:
295
+ Files: [LICENSE, README.md, docs/public/contributing.md, docs/public/faq.md, docs/src/App.tsx]
296
+ Rationale: Ownership/branding and documentation link updates are user-facing but don’t affect runtime/CI behavior; easier to review separately.
297
+ Message: |
298
+ docs: update repo links and attribution to tobrien
299
+
300
+ - Update GitHub URLs across docs/site from SemicolonAmbulance to tobrien
301
+ - Update contributing guide to use npm commands
302
+ - Update LICENSE/README and docs footer attribution
303
+
304
+ Split 4:
305
+ Files: [.DS_Store, src/.DS_Store, tests/.DS_Store]
306
+ Rationale: Accidental OS-generated binaries shouldn’t ship; keep noise out of functional commits.
307
+ Message: |
308
+ chore: remove accidentally committed .DS_Store files
309
+ ```
310
+
311
+ ## Suggested Commit Splits
312
+
313
+ ### Split 1
314
+
315
+ **Files**: [.github/workflows/dependency-review.yml, .github/workflows/test.yml, .github/workflows/npm-publish.yml, .github/workflows/pnpm-publish.yml]
316
+
317
+ **Rationale**: CI/CD behavior changes (new security check, test trigger changes, and switching the release publish workflow to npm) are reviewable together and independent of docs/metadata updates.
318
+
319
+ **Message**:
320
+ ```
321
+ |
322
+ ci: add dependency review and publish releases via npm
323
+
324
+ - Add dependency-review workflow with PR summary comments
325
+ - Run test workflow on pull requests to main/working (instead of push)
326
+ - Replace pnpm-based publish workflow with npm publish using npm ci and NPM_TOKEN
327
+ ```
328
+
329
+ ### Split 2
330
+
331
+ **Files**: [package.json, pnpm-lock.yaml, docs/pnpm-lock.yaml, pnpm-workspace.yaml]
332
+
333
+ **Rationale**: Package manager/config changes (scripts/overrides/workspace + lockfile updates) should be reviewed as a cohesive “tooling” change.
334
+
335
+ **Message**:
336
+ ```
337
+ |
338
+ chore: prefer npm scripts and drop pnpm workspace config
339
+
340
+ - Switch build/test/watch/prepublish scripts from pnpm to npm
341
+ - Move wrap-ansi override to top-level overrides
342
+ - Remove pnpm-workspace.yaml
343
+ - Update pnpm lockfiles to match dependency resolution
344
+ ```
345
+
346
+ ### Split 3
347
+
348
+ **Files**: [LICENSE, README.md, docs/public/contributing.md, docs/public/faq.md, docs/src/App.tsx]
349
+
350
+ **Rationale**: Ownership/branding and documentation link updates are user-facing but don’t affect runtime/CI behavior; easier to review separately.
351
+
352
+ **Message**:
353
+ ```
354
+ |
355
+ docs: update repo links and attribution to tobrien
356
+
357
+ - Update GitHub URLs across docs/site from SemicolonAmbulance to tobrien
358
+ - Update contributing guide to use npm commands
359
+ - Update LICENSE/README and docs footer attribution
360
+ ```
361
+
362
+ ### Split 4
363
+
364
+ **Files**: [.DS_Store, src/.DS_Store, tests/.DS_Store]
365
+
366
+ **Rationale**: Accidental OS-generated binaries shouldn’t ship; keep noise out of functional commits.
367
+
368
+ **Message**:
369
+ ```
370
+ |
371
+ chore: remove accidentally committed .DS_Store files
372
+ ```