@pcircle/footprint 1.2.2 → 1.5.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 (184) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +125 -161
  3. package/SKILL.md +50 -50
  4. package/dist/src/analyzers/content-analyzer.d.ts.map +1 -1
  5. package/dist/src/analyzers/content-analyzer.js +20 -4
  6. package/dist/src/analyzers/content-analyzer.js.map +1 -1
  7. package/dist/src/cli/constants.d.ts +20 -0
  8. package/dist/src/cli/constants.d.ts.map +1 -0
  9. package/dist/src/cli/constants.js +25 -0
  10. package/dist/src/cli/constants.js.map +1 -0
  11. package/dist/src/cli/index.d.ts +3 -0
  12. package/dist/src/cli/index.d.ts.map +1 -0
  13. package/dist/src/cli/index.js +25 -0
  14. package/dist/src/cli/index.js.map +1 -0
  15. package/dist/src/cli/setup.d.ts +6 -0
  16. package/dist/src/cli/setup.d.ts.map +1 -0
  17. package/dist/src/cli/setup.js +356 -0
  18. package/dist/src/cli/setup.js.map +1 -0
  19. package/dist/src/cli/types.d.ts +38 -0
  20. package/dist/src/cli/types.d.ts.map +1 -0
  21. package/dist/src/cli/types.js +5 -0
  22. package/dist/src/cli/types.js.map +1 -0
  23. package/dist/src/cli/utils/config.d.ts +19 -0
  24. package/dist/src/cli/utils/config.d.ts.map +1 -0
  25. package/dist/src/cli/utils/config.js +86 -0
  26. package/dist/src/cli/utils/config.js.map +1 -0
  27. package/dist/src/cli/utils/detect.d.ts +14 -0
  28. package/dist/src/cli/utils/detect.d.ts.map +1 -0
  29. package/dist/src/cli/utils/detect.js +57 -0
  30. package/dist/src/cli/utils/detect.js.map +1 -0
  31. package/dist/src/cli/utils/env.d.ts +15 -0
  32. package/dist/src/cli/utils/env.d.ts.map +1 -0
  33. package/dist/src/cli/utils/env.js +85 -0
  34. package/dist/src/cli/utils/env.js.map +1 -0
  35. package/dist/src/cli/utils/validation.d.ts +17 -0
  36. package/dist/src/cli/utils/validation.d.ts.map +1 -0
  37. package/dist/src/cli/utils/validation.js +77 -0
  38. package/dist/src/cli/utils/validation.js.map +1 -0
  39. package/dist/src/index.d.ts +1 -1
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js +53 -38
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/lib/crypto/decrypt.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/decrypt.js +12 -8
  45. package/dist/src/lib/crypto/decrypt.js.map +1 -1
  46. package/dist/src/lib/crypto/encrypt.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/encrypt.js +6 -3
  48. package/dist/src/lib/crypto/encrypt.js.map +1 -1
  49. package/dist/src/lib/crypto/key-derivation.d.ts +1 -1
  50. package/dist/src/lib/crypto/key-derivation.d.ts.map +1 -1
  51. package/dist/src/lib/crypto/key-derivation.js +11 -11
  52. package/dist/src/lib/crypto/key-derivation.js.map +1 -1
  53. package/dist/src/lib/storage/database.d.ts +46 -3
  54. package/dist/src/lib/storage/database.d.ts.map +1 -1
  55. package/dist/src/lib/storage/database.js +175 -80
  56. package/dist/src/lib/storage/database.js.map +1 -1
  57. package/dist/src/lib/storage/export.d.ts +3 -4
  58. package/dist/src/lib/storage/export.d.ts.map +1 -1
  59. package/dist/src/lib/storage/export.js +75 -62
  60. package/dist/src/lib/storage/export.js.map +1 -1
  61. package/dist/src/lib/storage/salt-storage.d.ts +1 -1
  62. package/dist/src/lib/storage/salt-storage.d.ts.map +1 -1
  63. package/dist/src/lib/storage/salt-storage.js +26 -18
  64. package/dist/src/lib/storage/salt-storage.js.map +1 -1
  65. package/dist/src/lib/storage/schema.d.ts +1 -1
  66. package/dist/src/lib/storage/schema.d.ts.map +1 -1
  67. package/dist/src/lib/storage/schema.js +29 -47
  68. package/dist/src/lib/storage/schema.js.map +1 -1
  69. package/dist/src/lib/tool-wrapper.d.ts.map +1 -1
  70. package/dist/src/lib/tool-wrapper.js +2 -2
  71. package/dist/src/lib/tool-wrapper.js.map +1 -1
  72. package/dist/src/prompts/skill-prompt.d.ts +6 -0
  73. package/dist/src/prompts/skill-prompt.d.ts.map +1 -0
  74. package/dist/src/prompts/skill-prompt.js +125 -0
  75. package/dist/src/prompts/skill-prompt.js.map +1 -0
  76. package/dist/src/tools/capture-footprint.d.ts +2 -2
  77. package/dist/src/tools/capture-footprint.d.ts.map +1 -1
  78. package/dist/src/tools/capture-footprint.js +53 -12
  79. package/dist/src/tools/capture-footprint.js.map +1 -1
  80. package/dist/src/tools/delete-footprints.d.ts +19 -2
  81. package/dist/src/tools/delete-footprints.d.ts.map +1 -1
  82. package/dist/src/tools/delete-footprints.js +56 -8
  83. package/dist/src/tools/delete-footprints.js.map +1 -1
  84. package/dist/src/tools/export-footprints.d.ts +14 -6
  85. package/dist/src/tools/export-footprints.d.ts.map +1 -1
  86. package/dist/src/tools/export-footprints.js +54 -15
  87. package/dist/src/tools/export-footprints.js.map +1 -1
  88. package/dist/src/tools/get-footprint.d.ts +1 -7
  89. package/dist/src/tools/get-footprint.d.ts.map +1 -1
  90. package/dist/src/tools/get-footprint.js +26 -22
  91. package/dist/src/tools/get-footprint.js.map +1 -1
  92. package/dist/src/tools/index.d.ts +1 -3
  93. package/dist/src/tools/index.d.ts.map +1 -1
  94. package/dist/src/tools/index.js +1 -3
  95. package/dist/src/tools/index.js.map +1 -1
  96. package/dist/src/tools/list-footprints.d.ts +3 -17
  97. package/dist/src/tools/list-footprints.d.ts.map +1 -1
  98. package/dist/src/tools/list-footprints.js +27 -16
  99. package/dist/src/tools/list-footprints.js.map +1 -1
  100. package/dist/src/tools/manage-tags.d.ts +47 -0
  101. package/dist/src/tools/manage-tags.d.ts.map +1 -0
  102. package/dist/src/tools/manage-tags.js +109 -0
  103. package/dist/src/tools/manage-tags.js.map +1 -0
  104. package/dist/src/tools/search-footprints.d.ts +4 -18
  105. package/dist/src/tools/search-footprints.d.ts.map +1 -1
  106. package/dist/src/tools/search-footprints.js +32 -16
  107. package/dist/src/tools/search-footprints.js.map +1 -1
  108. package/dist/src/tools/suggest-capture.d.ts +1 -1
  109. package/dist/src/tools/suggest-capture.d.ts.map +1 -1
  110. package/dist/src/tools/suggest-capture.js +6 -2
  111. package/dist/src/tools/suggest-capture.js.map +1 -1
  112. package/dist/src/tools/verify-footprint.d.ts +7 -54
  113. package/dist/src/tools/verify-footprint.d.ts.map +1 -1
  114. package/dist/src/tools/verify-footprint.js +22 -19
  115. package/dist/src/tools/verify-footprint.js.map +1 -1
  116. package/dist/src/types.d.ts +4 -4
  117. package/dist/src/types.d.ts.map +1 -1
  118. package/dist/src/ui/register.js +3 -3
  119. package/dist/src/ui/register.js.map +1 -1
  120. package/dist/ui/dashboard.html +78 -65
  121. package/dist/ui/detail.html +69 -56
  122. package/dist/ui/export.html +72 -59
  123. package/package.json +28 -16
  124. package/dist/src/lib/errors/base-error.d.ts +0 -15
  125. package/dist/src/lib/errors/base-error.d.ts.map +0 -1
  126. package/dist/src/lib/errors/base-error.js +0 -34
  127. package/dist/src/lib/errors/base-error.js.map +0 -1
  128. package/dist/src/lib/errors/crypto-error.d.ts +0 -29
  129. package/dist/src/lib/errors/crypto-error.d.ts.map +0 -1
  130. package/dist/src/lib/errors/crypto-error.js +0 -43
  131. package/dist/src/lib/errors/crypto-error.js.map +0 -1
  132. package/dist/src/lib/errors/index.d.ts +0 -26
  133. package/dist/src/lib/errors/index.d.ts.map +0 -1
  134. package/dist/src/lib/errors/index.js +0 -26
  135. package/dist/src/lib/errors/index.js.map +0 -1
  136. package/dist/src/lib/errors/storage-error.d.ts +0 -25
  137. package/dist/src/lib/errors/storage-error.d.ts.map +0 -1
  138. package/dist/src/lib/errors/storage-error.js +0 -38
  139. package/dist/src/lib/errors/storage-error.js.map +0 -1
  140. package/dist/src/lib/errors/validation-error.d.ts +0 -21
  141. package/dist/src/lib/errors/validation-error.d.ts.map +0 -1
  142. package/dist/src/lib/errors/validation-error.js +0 -29
  143. package/dist/src/lib/errors/validation-error.js.map +0 -1
  144. package/dist/src/test-helpers.d.ts +0 -33
  145. package/dist/src/test-helpers.d.ts.map +0 -1
  146. package/dist/src/test-helpers.js +0 -108
  147. package/dist/src/test-helpers.js.map +0 -1
  148. package/dist/src/tools/get-tag-stats.d.ts +0 -30
  149. package/dist/src/tools/get-tag-stats.d.ts.map +0 -1
  150. package/dist/src/tools/get-tag-stats.js +0 -33
  151. package/dist/src/tools/get-tag-stats.js.map +0 -1
  152. package/dist/src/tools/remove-tag.d.ts +0 -22
  153. package/dist/src/tools/remove-tag.d.ts.map +0 -1
  154. package/dist/src/tools/remove-tag.js +0 -30
  155. package/dist/src/tools/remove-tag.js.map +0 -1
  156. package/dist/src/tools/rename-tag.d.ts +0 -24
  157. package/dist/src/tools/rename-tag.d.ts.map +0 -1
  158. package/dist/src/tools/rename-tag.js +0 -34
  159. package/dist/src/tools/rename-tag.js.map +0 -1
  160. package/dist/tests/error-handling.test.d.ts +0 -2
  161. package/dist/tests/error-handling.test.d.ts.map +0 -1
  162. package/dist/tests/error-handling.test.js +0 -114
  163. package/dist/tests/error-handling.test.js.map +0 -1
  164. package/dist/tests/fixtures.d.ts +0 -87
  165. package/dist/tests/fixtures.d.ts.map +0 -1
  166. package/dist/tests/fixtures.js +0 -130
  167. package/dist/tests/fixtures.js.map +0 -1
  168. package/dist/tests/integration.test.d.ts +0 -2
  169. package/dist/tests/integration.test.d.ts.map +0 -1
  170. package/dist/tests/integration.test.js +0 -115
  171. package/dist/tests/integration.test.js.map +0 -1
  172. package/dist/tests/resources.test.d.ts +0 -2
  173. package/dist/tests/resources.test.d.ts.map +0 -1
  174. package/dist/tests/resources.test.js +0 -73
  175. package/dist/tests/resources.test.js.map +0 -1
  176. package/dist/tests/setup.d.ts +0 -8
  177. package/dist/tests/setup.d.ts.map +0 -1
  178. package/dist/tests/setup.js +0 -8
  179. package/dist/tests/setup.js.map +0 -1
  180. package/dist/tests/tools.test.d.ts +0 -2
  181. package/dist/tests/tools.test.d.ts.map +0 -1
  182. package/dist/tests/tools.test.js +0 -224
  183. package/dist/tests/tools.test.js.map +0 -1
  184. package/dist/ui-tmp/ui/export.html +0 -409
@@ -55,11 +55,26 @@ const KEYWORD_CATEGORIES = {
55
55
  "requirement",
56
56
  ],
57
57
  };
58
+ /**
59
+ * Pre-compiled word-boundary regexes for each keyword to avoid
60
+ * creating RegExp objects on every call to matchesWord.
61
+ */
62
+ const WORD_PATTERNS = new Map();
63
+ for (const keywords of Object.values(KEYWORD_CATEGORIES)) {
64
+ for (const word of keywords) {
65
+ WORD_PATTERNS.set(word, new RegExp(`\\b${word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i"));
66
+ }
67
+ }
58
68
  /**
59
69
  * Match whole words only to avoid false positives
60
70
  * (e.g., "logarithm" should not match "algorithm")
61
71
  */
62
72
  function matchesWord(text, word) {
73
+ const cached = WORD_PATTERNS.get(word);
74
+ if (cached) {
75
+ return cached.test(text);
76
+ }
77
+ // Fallback for dynamic words not in KEYWORD_CATEGORIES
63
78
  const regex = new RegExp(`\\b${word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
64
79
  return regex.test(text);
65
80
  }
@@ -127,8 +142,9 @@ function generateTags(matches) {
127
142
  */
128
143
  function generateConversationId(matches) {
129
144
  const currentDate = new Date().toISOString().slice(0, 10);
145
+ const suffix = Math.random().toString(36).slice(2, 6);
130
146
  if (matches.length === 0) {
131
- return `conversation-${currentDate}`;
147
+ return `conversation-${currentDate}-${suffix}`;
132
148
  }
133
149
  // Extract key terms for ID generation
134
150
  const primaryKeywords = matches[0].keywords.slice(0, 2);
@@ -136,9 +152,9 @@ function generateConversationId(matches) {
136
152
  .map((k) => k.replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, ""))
137
153
  .filter((k) => k.length > 0);
138
154
  if (cleanKeywords.length > 0) {
139
- return `${cleanKeywords.join("-")}-${currentDate}`;
155
+ return `${cleanKeywords.join("-")}-${currentDate}-${suffix}`;
140
156
  }
141
- return `${matches[0].category}-discussion-${currentDate}`;
157
+ return `${matches[0].category}-discussion-${currentDate}-${suffix}`;
142
158
  }
143
159
  /**
144
160
  * Analyze conversation content and determine if it should be captured as evidence
@@ -148,7 +164,7 @@ function generateConversationId(matches) {
148
164
  */
149
165
  export function analyzeContent(summary) {
150
166
  const normalizedText = summary.toLowerCase();
151
- const wordCount = normalizedText.split(/\s+/).length;
167
+ const wordCount = normalizedText.split(/\s+/).filter((w) => w.length > 0).length || 1;
152
168
  // Find keyword matches
153
169
  const matches = findKeywordMatches(normalizedText);
154
170
  const shouldCapture = matches.length > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"content-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/content-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,EAAE,EAAE;QACF,QAAQ;QACR,uBAAuB;QACvB,WAAW;QACX,WAAW;QACX,aAAa;QACb,YAAY;QACZ,QAAQ;KACT;IACD,KAAK,EAAE;QACL,UAAU;QACV,WAAW;QACX,OAAO;QACP,WAAW;QACX,SAAS;QACT,OAAO;QACP,QAAQ;QACR,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,UAAU;QACV,WAAW;QACX,aAAa;QACb,UAAU;QACV,UAAU;QACV,SAAS;QACT,QAAQ;QACR,UAAU;KACX;IACD,QAAQ,EAAE;QACR,YAAY;QACZ,UAAU;QACV,OAAO;QACP,UAAU;QACV,OAAO;QACP,YAAY;QACZ,UAAU;QACV,MAAM;KACP;IACD,UAAU,EAAE;QACV,OAAO;QACP,YAAY;QACZ,UAAU;QACV,eAAe;QACf,YAAY;QACZ,QAAQ;QACR,aAAa;KACd;CACF,CAAC;AAEF;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EACtD,GAAG,CACJ,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtE,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAChD,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAC3B,CAAC;QACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,OAAuB,EACvB,SAAiB;IAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,gDAAgD;QAChD,+EAA+E;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,6BAA6B;QAClF,OAAO,GAAG,GAAG,YAAY,CAAC,CAAC,oBAAoB;IACjD,CAAC;IAED,8DAA8D;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAC3C,CAAC,CACF,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IAExD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAuB;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mFAAmF,CAAC;IAC7F,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CACxC,CAAC;IAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,OAAO,2CAA2C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAuB;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAuB;IACrD,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,gBAAgB,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,sCAAsC;IACtC,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,eAAe;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,eAAe,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAErD,uBAAuB;IACvB,MAAM,OAAO,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,uBAAuB;IACvB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3D,oBAAoB;IACpB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,uBAAuB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhE,OAAO;QACL,aAAa;QACb,MAAM;QACN,aAAa;QACb,uBAAuB;QACvB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;KAC/C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"content-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/content-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const DEFAULT_DATA_DIR: string;
2
+ export declare const CLAUDE_CONFIG_PATHS: {
3
+ darwin: string;
4
+ linux: string;
5
+ win32: string;
6
+ };
7
+ export declare const SHELL_RC_FILES: {
8
+ bash: string;
9
+ zsh: string;
10
+ fish: string;
11
+ };
12
+ export declare const MIN_PASSWORD_SCORE = 2;
13
+ export declare const MIN_PASSWORD_LENGTH = 12;
14
+ export declare const COLORS: {
15
+ success: string;
16
+ error: string;
17
+ warning: string;
18
+ info: string;
19
+ };
20
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AAEtE,eAAO,MAAM,mBAAmB;;;;CAU/B,CAAC;AAEF,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,eAAO,MAAM,MAAM;;;;;CAKlB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CLI constants for setup process
3
+ */
4
+ import * as os from "os";
5
+ import * as path from "path";
6
+ export const DEFAULT_DATA_DIR = path.join(os.homedir(), ".footprint");
7
+ export const CLAUDE_CONFIG_PATHS = {
8
+ darwin: path.join(os.homedir(), "Library/Application Support/Claude/claude_desktop_config.json"),
9
+ linux: path.join(os.homedir(), ".config/Claude/claude_desktop_config.json"),
10
+ win32: path.join(os.homedir(), "AppData/Roaming/Claude/claude_desktop_config.json"),
11
+ };
12
+ export const SHELL_RC_FILES = {
13
+ bash: ".bashrc",
14
+ zsh: ".zshrc",
15
+ fish: ".config/fish/config.fish",
16
+ };
17
+ export const MIN_PASSWORD_SCORE = 2; // zxcvbn score (0-4)
18
+ export const MIN_PASSWORD_LENGTH = 12;
19
+ export const COLORS = {
20
+ success: "#00FF00",
21
+ error: "#FF0000",
22
+ warning: "#FFA500",
23
+ info: "#00BFFF",
24
+ };
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,IAAI,CAAC,IAAI,CACf,EAAE,CAAC,OAAO,EAAE,EACZ,+DAA+D,CAChE;IACD,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,2CAA2C,CAAC;IAC3E,KAAK,EAAE,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,mDAAmD,CACpD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,0BAA0B;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC,qBAAqB;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /* global console, process */
3
+ import { runSetup } from "./setup.js";
4
+ const args = process.argv.slice(2);
5
+ const command = args[0];
6
+ async function main() {
7
+ switch (command) {
8
+ case "setup": {
9
+ await runSetup();
10
+ break;
11
+ }
12
+ default: {
13
+ // No command or unknown command - start MCP server
14
+ // Import and run server
15
+ const { main: startServer } = await import("../index.js");
16
+ await startServer();
17
+ break;
18
+ }
19
+ }
20
+ }
21
+ main().catch((error) => {
22
+ console.error("Error:", error);
23
+ process.exit(1);
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA,6BAA6B;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACR,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,mDAAmD;YACnD,wBAAwB;YACxB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Main setup flow with transaction-like rollback on failure
4
+ */
5
+ export declare function runSetup(): Promise<void>;
6
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":";AAqZA;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E9C"}
@@ -0,0 +1,356 @@
1
+ #!/usr/bin/env node
2
+ /* global console, process, Buffer, NodeJS */
3
+ import prompts from "prompts";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import { timingSafeEqual } from "crypto";
7
+ import * as path from "path";
8
+ import { detectSystem } from "./utils/detect.js";
9
+ import { validatePassword, validatePath } from "./utils/validation.js";
10
+ import { readClaudeConfig, writeClaudeConfig, backupConfig, addFootprintToConfig, } from "./utils/config.js";
11
+ import { generateEnvExport, appendToShellRc, removeFootprintFromRc, } from "./utils/env.js";
12
+ import { DEFAULT_DATA_DIR } from "./constants.js";
13
+ import * as fs from "fs";
14
+ /**
15
+ * Extract error message from unknown error type
16
+ */
17
+ function getErrorMessage(error) {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+ /**
21
+ * Timing-safe string comparison to prevent timing attacks
22
+ */
23
+ function safeCompare(a, b) {
24
+ const bufA = Buffer.from(a);
25
+ const bufB = Buffer.from(b);
26
+ const maxLen = Math.max(bufA.length, bufB.length);
27
+ const paddedA = Buffer.alloc(maxLen);
28
+ const paddedB = Buffer.alloc(maxLen);
29
+ bufA.copy(paddedA);
30
+ bufB.copy(paddedB);
31
+ return bufA.length === bufB.length && timingSafeEqual(paddedA, paddedB);
32
+ }
33
+ /**
34
+ * Welcome message
35
+ */
36
+ function printWelcome() {
37
+ console.log(chalk.bold.cyan("\n🦶 Welcome to Footprint Setup!\n"));
38
+ console.log("Let's configure your AI audit trail in 3 simple steps.\n");
39
+ }
40
+ /**
41
+ * Print system info
42
+ */
43
+ function printSystemInfo(system) {
44
+ console.log(chalk.gray("Detected System:"));
45
+ console.log(chalk.gray(` OS: ${system.platform}`));
46
+ console.log(chalk.gray(` Shell: ${system.shell}`));
47
+ if (system.claudeConfigPath) {
48
+ console.log(chalk.green(` āœ… Claude Desktop found at: ${system.claudeConfigPath}`));
49
+ }
50
+ else {
51
+ console.log(chalk.yellow(` āš ļø Claude Desktop config not found`));
52
+ }
53
+ console.log("");
54
+ }
55
+ /**
56
+ * Prompt for setup configuration
57
+ */
58
+ async function promptSetup(system) {
59
+ const response = await prompts([
60
+ {
61
+ type: "text",
62
+ name: "dataDir",
63
+ message: "Where should we store your data?",
64
+ initial: DEFAULT_DATA_DIR,
65
+ validate: (value) => {
66
+ const result = validatePath(value);
67
+ return result.valid ? true : result.message;
68
+ },
69
+ },
70
+ {
71
+ type: "password",
72
+ name: "passphrase",
73
+ message: "Create a secure passphrase (min 12 characters):",
74
+ validate: (value) => {
75
+ const result = validatePassword(value);
76
+ return result.valid ? true : result.message;
77
+ },
78
+ },
79
+ {
80
+ type: "password",
81
+ name: "confirmPassphrase",
82
+ message: "Confirm your passphrase:",
83
+ validate: (value, previous) => {
84
+ // Use timing-safe comparison to prevent timing attacks
85
+ return safeCompare(value, previous.passphrase)
86
+ ? true
87
+ : "Passphrases do not match";
88
+ },
89
+ },
90
+ {
91
+ type: system.claudeConfigPath ? "confirm" : null,
92
+ name: "autoConfig",
93
+ message: "Auto-configure Claude Desktop?",
94
+ initial: true,
95
+ },
96
+ ]);
97
+ if (!response.passphrase) {
98
+ return null; // User cancelled
99
+ }
100
+ return {
101
+ dataDir: response.dataDir,
102
+ passphrase: response.passphrase,
103
+ autoConfig: response.autoConfig ?? false,
104
+ };
105
+ }
106
+ /**
107
+ * Print security warning about password storage
108
+ */
109
+ function printSecurityWarning() {
110
+ console.log(chalk.bold.yellow("\nāš ļø Security Notice:\n"));
111
+ console.log(chalk.yellow("Your passphrase will be stored in configuration files on this system."));
112
+ console.log(chalk.yellow("We set restrictive permissions (600/700), but anyone with system access"));
113
+ console.log(chalk.yellow("or file system backups may be able to access it.\n"));
114
+ console.log(chalk.gray("Recommendations:"));
115
+ console.log(chalk.gray(" • Use a unique passphrase (not reused elsewhere)"));
116
+ console.log(chalk.gray(" • Ensure only you have access to this user account"));
117
+ console.log(chalk.gray(" • Encrypt your backups if they contain config files\n"));
118
+ }
119
+ /**
120
+ * Configure Claude Desktop with improved error handling
121
+ */
122
+ async function configureClaudeDesktop(configPath, config) {
123
+ const spinner = ora("Configuring Claude Desktop...").start();
124
+ try {
125
+ // Backup existing config
126
+ if (fs.existsSync(configPath)) {
127
+ const backupPath = backupConfig(configPath);
128
+ spinner.info(chalk.gray(`Backed up existing config to: ${backupPath}`));
129
+ }
130
+ // Read and update config
131
+ const claudeConfig = readClaudeConfig(configPath);
132
+ const updatedConfig = addFootprintToConfig(claudeConfig, config.dataDir, config.passphrase);
133
+ writeClaudeConfig(configPath, updatedConfig);
134
+ spinner.succeed(chalk.green("Claude Desktop configured!"));
135
+ }
136
+ catch (error) {
137
+ spinner.fail(chalk.red(`Failed to configure Claude Desktop: ${getErrorMessage(error)}`));
138
+ throw error;
139
+ }
140
+ }
141
+ /**
142
+ * Setup environment variables with improved error handling
143
+ */
144
+ async function setupEnvironment(system, config) {
145
+ if (!system.shellRcPath) {
146
+ console.log(chalk.yellow("\nāš ļø Shell RC file not found. Manual setup required:"));
147
+ console.log(chalk.gray(generateEnvExport(system.shell, config.dataDir, config.passphrase)));
148
+ return false;
149
+ }
150
+ const { setupEnv } = await prompts({
151
+ type: "confirm",
152
+ name: "setupEnv",
153
+ message: `Add environment variables to ${system.shellRcPath}?`,
154
+ initial: true,
155
+ });
156
+ if (!setupEnv)
157
+ return false;
158
+ const spinner = ora("Setting up environment variables...").start();
159
+ try {
160
+ const envExport = generateEnvExport(system.shell, config.dataDir, config.passphrase);
161
+ appendToShellRc(system.shellRcPath, envExport);
162
+ spinner.succeed(chalk.green("Environment variables configured!"));
163
+ return true;
164
+ }
165
+ catch (error) {
166
+ spinner.fail(chalk.red(`Failed to setup environment: ${getErrorMessage(error)}`));
167
+ throw error; // Propagate error for rollback
168
+ }
169
+ }
170
+ /**
171
+ * Create data directory with secure permissions (0o700)
172
+ */
173
+ async function createDataDirectory(dataDir) {
174
+ const spinner = ora("Creating data directory...").start();
175
+ const normalized = validatePath(dataDir).normalizedPath;
176
+ try {
177
+ fs.mkdirSync(normalized, { recursive: true, mode: 0o700 });
178
+ spinner.succeed(chalk.green(`Data directory created: ${normalized}`));
179
+ }
180
+ catch (error) {
181
+ const nodeError = error;
182
+ if (nodeError.code === "EEXIST") {
183
+ spinner.info(chalk.gray(`Data directory already exists: ${normalized}`));
184
+ // Ensure secure permissions on existing directory
185
+ try {
186
+ fs.chmodSync(normalized, 0o700);
187
+ }
188
+ catch (chmodError) {
189
+ spinner.warn(chalk.yellow(`Could not set permissions: ${getErrorMessage(chmodError)}`));
190
+ }
191
+ return;
192
+ }
193
+ spinner.fail(chalk.red(`Failed to create directory: ${getErrorMessage(error)}`));
194
+ throw error;
195
+ }
196
+ }
197
+ /**
198
+ * Print manual configuration instructions when Claude Desktop not found
199
+ */
200
+ function printManualConfigInstructions(config) {
201
+ console.log(chalk.yellow("\nāš ļø Claude Desktop not found. Manual configuration required."));
202
+ console.log(chalk.gray("Add to claude_desktop_config.json:"));
203
+ console.log(chalk.gray(JSON.stringify({
204
+ mcpServers: {
205
+ footprint: {
206
+ command: "npx",
207
+ args: ["@pcircle/footprint"],
208
+ env: {
209
+ FOOTPRINT_DATA_DIR: config.dataDir,
210
+ FOOTPRINT_PASSPHRASE: config.passphrase,
211
+ },
212
+ },
213
+ },
214
+ }, null, 2)));
215
+ }
216
+ /**
217
+ * Print next steps
218
+ */
219
+ function printNextSteps(_config) {
220
+ console.log(chalk.bold.green("\nšŸŽ‰ Setup Complete!\n"));
221
+ console.log(chalk.bold("Next steps:"));
222
+ console.log(chalk.gray(" 1. Close Claude Desktop completely"));
223
+ console.log(chalk.gray(" 2. Reopen Claude Desktop"));
224
+ console.log(chalk.gray(' 3. Say "capture this conversation" to test\n'));
225
+ console.log(chalk.yellow("āš ļø Important: Keep your passphrase safe!"));
226
+ console.log(chalk.gray(" Loss means permanent data loss.\n"));
227
+ }
228
+ /**
229
+ * Create rollback action for directory removal
230
+ */
231
+ function createDirectoryRollback(dirPath) {
232
+ return () => {
233
+ try {
234
+ if (fs.existsSync(dirPath)) {
235
+ fs.rmSync(dirPath, { recursive: true });
236
+ console.log(chalk.gray(` Rolled back: Removed ${dirPath}`));
237
+ }
238
+ }
239
+ catch (error) {
240
+ console.warn(chalk.yellow(` Warning: Failed to remove ${dirPath}: ${getErrorMessage(error)}`));
241
+ }
242
+ };
243
+ }
244
+ /**
245
+ * Create rollback action for config restoration
246
+ */
247
+ function createConfigRollback(backupPath, configPath) {
248
+ return () => {
249
+ try {
250
+ if (fs.existsSync(backupPath)) {
251
+ fs.copyFileSync(backupPath, configPath);
252
+ console.log(chalk.gray(` Rolled back: Restored config from backup`));
253
+ }
254
+ }
255
+ catch (error) {
256
+ console.warn(chalk.yellow(` Warning: Failed to restore config: ${getErrorMessage(error)}`));
257
+ }
258
+ };
259
+ }
260
+ /**
261
+ * Create rollback action for shell RC file modification
262
+ */
263
+ function createShellRcRollback(rcPath) {
264
+ return () => {
265
+ try {
266
+ if (removeFootprintFromRc(rcPath)) {
267
+ console.log(chalk.gray(` Rolled back: Removed Footprint config from ${rcPath}`));
268
+ }
269
+ }
270
+ catch (error) {
271
+ console.warn(chalk.yellow(` Warning: Failed to clean ${rcPath}: ${getErrorMessage(error)}`));
272
+ }
273
+ };
274
+ }
275
+ /**
276
+ * Find the most recent backup file for a config
277
+ */
278
+ function findLatestBackup(configPath) {
279
+ const dir = path.dirname(configPath);
280
+ const basename = path.basename(configPath);
281
+ const backupFiles = fs
282
+ .readdirSync(dir)
283
+ .filter((f) => f.startsWith(`${basename}.backup`))
284
+ .sort();
285
+ if (backupFiles.length === 0)
286
+ return null;
287
+ return path.join(dir, backupFiles[backupFiles.length - 1]);
288
+ }
289
+ /**
290
+ * Main setup flow with transaction-like rollback on failure
291
+ */
292
+ export async function runSetup() {
293
+ // Track all changes for potential rollback
294
+ const rollbackActions = [];
295
+ try {
296
+ printWelcome();
297
+ const system = detectSystem();
298
+ printSystemInfo(system);
299
+ const config = await promptSetup(system);
300
+ if (!config) {
301
+ console.log(chalk.yellow("\nSetup cancelled."));
302
+ process.exit(0);
303
+ }
304
+ // Print security warning about password storage
305
+ printSecurityWarning();
306
+ // Create data directory (tracked for rollback)
307
+ const normalized = validatePath(config.dataDir).normalizedPath;
308
+ const directoryCreated = !fs.existsSync(normalized);
309
+ await createDataDirectory(config.dataDir);
310
+ if (directoryCreated) {
311
+ rollbackActions.push(createDirectoryRollback(normalized));
312
+ }
313
+ // Configure Claude Desktop if requested (tracked for rollback)
314
+ if (config.autoConfig && system.claudeConfigPath) {
315
+ await configureClaudeDesktop(system.claudeConfigPath, config);
316
+ // Track config backup for rollback
317
+ const backupPath = findLatestBackup(system.claudeConfigPath);
318
+ if (backupPath) {
319
+ rollbackActions.push(createConfigRollback(backupPath, system.claudeConfigPath));
320
+ }
321
+ }
322
+ else if (!system.claudeConfigPath) {
323
+ printManualConfigInstructions(config);
324
+ }
325
+ // Setup environment variables (tracked for rollback only if modified)
326
+ const envModified = await setupEnvironment(system, config);
327
+ if (envModified && system.shellRcPath) {
328
+ rollbackActions.push(createShellRcRollback(system.shellRcPath));
329
+ }
330
+ // If we get here, setup succeeded - discard rollback actions
331
+ rollbackActions.length = 0;
332
+ printNextSteps(config);
333
+ }
334
+ catch (error) {
335
+ console.error(chalk.red(`\nāŒ Setup failed: ${getErrorMessage(error)}`));
336
+ // Perform rollback if any changes were made
337
+ if (rollbackActions.length > 0) {
338
+ console.log(chalk.yellow("\nšŸ”„ Rolling back changes...\n"));
339
+ // Execute rollback actions in reverse order
340
+ for (const action of rollbackActions.reverse()) {
341
+ await action();
342
+ }
343
+ console.log(chalk.green("\nāœ… Rollback complete. No changes were made.\n"));
344
+ }
345
+ console.log(chalk.gray("\nTroubleshooting:"));
346
+ console.log(chalk.gray(" • Check file permissions"));
347
+ console.log(chalk.gray(" • Ensure Claude Desktop is not running"));
348
+ console.log(chalk.gray(" • Verify disk space is available\n"));
349
+ process.exit(1);
350
+ }
351
+ }
352
+ // Run if executed directly
353
+ if (import.meta.url === `file://${process.argv[1]}`) {
354
+ runSetup();
355
+ }
356
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CLI types for interactive setup
3
+ */
4
+ export interface SetupConfig {
5
+ /** Directory to store Footprint data */
6
+ dataDir: string;
7
+ /** Encryption passphrase */
8
+ passphrase: string;
9
+ /** Auto-configure Claude Desktop */
10
+ autoConfig: boolean;
11
+ /** Skip backup of existing config */
12
+ skipBackup?: boolean;
13
+ }
14
+ export interface SystemInfo {
15
+ /** Operating system platform */
16
+ platform: "darwin" | "linux" | "win32";
17
+ /** Default shell */
18
+ shell: "bash" | "zsh" | "fish" | "powershell";
19
+ /** Path to Claude Desktop config */
20
+ claudeConfigPath: string | null;
21
+ /** User home directory */
22
+ homeDir: string;
23
+ /** Shell RC file path */
24
+ shellRcPath: string | null;
25
+ }
26
+ export interface ClaudeConfig {
27
+ mcpServers?: Record<string, {
28
+ command: string;
29
+ args: string[];
30
+ env?: Record<string, string>;
31
+ }>;
32
+ }
33
+ export interface ValidationResult {
34
+ valid: boolean;
35
+ message?: string;
36
+ score?: number;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC,oBAAoB;IACpB,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;IAC9C,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CACjB,MAAM,EACN;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CACF,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI types for interactive setup
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,19 @@
1
+ import type { ClaudeConfig } from "../types.js";
2
+ /**
3
+ * Read Claude Desktop config file
4
+ */
5
+ export declare function readClaudeConfig(configPath: string): ClaudeConfig;
6
+ /**
7
+ * Write Claude Desktop config file with secure permissions (0o600)
8
+ * CRITICAL: Config contains passphrase, must be owner-only readable
9
+ */
10
+ export declare function writeClaudeConfig(configPath: string, config: ClaudeConfig): void;
11
+ /**
12
+ * Backup existing config file with secure permissions (0o600)
13
+ */
14
+ export declare function backupConfig(configPath: string): string;
15
+ /**
16
+ * Add Footprint to Claude config
17
+ */
18
+ export declare function addFootprintToConfig(config: ClaudeConfig, dataDir: string, passphrase: string): ClaudeConfig;
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0BhD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAcjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,YAAY,CAed"}