@dollhousemcp/mcp-server 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +54 -9
  2. package/dist/config/updateConfig.d.ts +84 -0
  3. package/dist/config/updateConfig.d.ts.map +1 -0
  4. package/dist/config/updateConfig.js +148 -0
  5. package/dist/generated/version.d.ts +9 -0
  6. package/dist/generated/version.d.ts.map +1 -0
  7. package/dist/generated/version.js +9 -0
  8. package/dist/index.d.ts +6 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +34 -6
  11. package/dist/portfolio/DefaultElementProvider.d.ts +78 -0
  12. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -0
  13. package/dist/portfolio/DefaultElementProvider.js +398 -0
  14. package/dist/portfolio/PortfolioManager.d.ts +7 -0
  15. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  16. package/dist/portfolio/PortfolioManager.js +44 -3
  17. package/dist/security/commandValidator.d.ts.map +1 -1
  18. package/dist/security/commandValidator.js +5 -2
  19. package/dist/security/securityMonitor.d.ts +2 -1
  20. package/dist/security/securityMonitor.d.ts.map +1 -1
  21. package/dist/security/securityMonitor.js +1 -1
  22. package/dist/server/tools/UpdateTools.d.ts.map +1 -1
  23. package/dist/server/tools/UpdateTools.js +22 -1
  24. package/dist/server/types.d.ts +1 -0
  25. package/dist/server/types.d.ts.map +1 -1
  26. package/dist/server/types.js +1 -1
  27. package/dist/update/BackupManager.d.ts +17 -0
  28. package/dist/update/BackupManager.d.ts.map +1 -1
  29. package/dist/update/BackupManager.js +112 -3
  30. package/dist/update/UpdateManager.d.ts +19 -0
  31. package/dist/update/UpdateManager.d.ts.map +1 -1
  32. package/dist/update/UpdateManager.js +485 -15
  33. package/dist/update/VersionManager.d.ts +1 -1
  34. package/dist/update/VersionManager.d.ts.map +1 -1
  35. package/dist/update/VersionManager.js +62 -15
  36. package/dist/utils/fileOperations.d.ts +83 -0
  37. package/dist/utils/fileOperations.d.ts.map +1 -0
  38. package/dist/utils/fileOperations.js +291 -0
  39. package/dist/utils/installation.d.ts +30 -0
  40. package/dist/utils/installation.d.ts.map +1 -0
  41. package/dist/utils/installation.js +160 -0
  42. package/package.json +3 -1
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Installation detection utilities
3
+ * Determines whether the application is running from npm or git installation
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { logger } from './logger.js';
9
+ import { UpdateConfigManager } from '../config/updateConfig.js';
10
+ export class InstallationDetector {
11
+ static cachedType = null;
12
+ // Maximum directory levels to search upward for .git directory
13
+ static get MAX_SEARCH_DEPTH() {
14
+ return UpdateConfigManager.getInstance().getMaxSearchDepth();
15
+ }
16
+ /**
17
+ * Detect the installation type (npm global, git clone, or unknown)
18
+ */
19
+ static getInstallationType() {
20
+ // Return cached result if available
21
+ if (this.cachedType !== null) {
22
+ return this.cachedType;
23
+ }
24
+ try {
25
+ // Get the directory where this file is located
26
+ const currentFileUrl = import.meta.url;
27
+ const currentFilePath = fileURLToPath(currentFileUrl);
28
+ let currentDir = path.dirname(currentFilePath);
29
+ // Resolve symlinks to get the real path
30
+ try {
31
+ currentDir = fs.realpathSync(currentDir);
32
+ }
33
+ catch (error) {
34
+ // If realpath fails, continue with original path
35
+ logger.debug('[InstallationDetector] Could not resolve real path, using original');
36
+ }
37
+ // Check if we're in a node_modules directory (npm installation)
38
+ // Use path separator to ensure we match the exact package name
39
+ const npmPattern = path.sep + path.join('node_modules', '@dollhousemcp', 'mcp-server') + path.sep;
40
+ if (currentDir.includes(npmPattern)) {
41
+ logger.debug('[InstallationDetector] Detected npm installation');
42
+ this.cachedType = 'npm';
43
+ return 'npm';
44
+ }
45
+ // Check for .git directory (git installation)
46
+ // Search up from current directory
47
+ let searchDir = currentDir;
48
+ for (let i = 0; i < this.MAX_SEARCH_DEPTH; i++) {
49
+ const gitDir = path.join(searchDir, '.git');
50
+ try {
51
+ if (fs.existsSync(gitDir) && fs.statSync(gitDir).isDirectory()) {
52
+ logger.debug('[InstallationDetector] Detected git installation');
53
+ this.cachedType = 'git';
54
+ return 'git';
55
+ }
56
+ }
57
+ catch (error) {
58
+ // Ignore errors and continue searching
59
+ }
60
+ const parentDir = path.dirname(searchDir);
61
+ if (parentDir === searchDir) {
62
+ // Reached root directory
63
+ break;
64
+ }
65
+ searchDir = parentDir;
66
+ }
67
+ logger.warn('[InstallationDetector] Could not determine installation type');
68
+ this.cachedType = 'unknown';
69
+ return 'unknown';
70
+ }
71
+ catch (error) {
72
+ logger.error('[InstallationDetector] Error detecting installation type:', error);
73
+ this.cachedType = 'unknown';
74
+ return 'unknown';
75
+ }
76
+ }
77
+ /**
78
+ * Get the npm global installation path if running from npm
79
+ */
80
+ static getNpmGlobalPath() {
81
+ if (this.getInstallationType() !== 'npm') {
82
+ return null;
83
+ }
84
+ try {
85
+ const currentFileUrl = import.meta.url;
86
+ const currentFilePath = fileURLToPath(currentFileUrl);
87
+ let currentDir = path.dirname(currentFilePath);
88
+ // Find the root of the npm package
89
+ while (currentDir.includes('node_modules/@dollhousemcp/mcp-server')) {
90
+ const packageJsonPath = path.join(currentDir, 'package.json');
91
+ if (fs.existsSync(packageJsonPath)) {
92
+ return currentDir;
93
+ }
94
+ const parentDir = path.dirname(currentDir);
95
+ if (parentDir === currentDir)
96
+ break;
97
+ currentDir = parentDir;
98
+ }
99
+ }
100
+ catch (error) {
101
+ logger.error('[InstallationDetector] Error finding npm global path:', error);
102
+ }
103
+ return null;
104
+ }
105
+ /**
106
+ * Get the git repository root path if running from git
107
+ */
108
+ static getGitRepositoryPath() {
109
+ if (this.getInstallationType() !== 'git') {
110
+ return null;
111
+ }
112
+ try {
113
+ const currentFileUrl = import.meta.url;
114
+ const currentFilePath = fileURLToPath(currentFileUrl);
115
+ let currentDir = path.dirname(currentFilePath);
116
+ // Search up for .git directory
117
+ for (let i = 0; i < 10; i++) {
118
+ const gitDir = path.join(currentDir, '.git');
119
+ if (fs.existsSync(gitDir) && fs.statSync(gitDir).isDirectory()) {
120
+ return currentDir;
121
+ }
122
+ const parentDir = path.dirname(currentDir);
123
+ if (parentDir === currentDir)
124
+ break;
125
+ currentDir = parentDir;
126
+ }
127
+ }
128
+ catch (error) {
129
+ logger.error('[InstallationDetector] Error finding git repository path:', error);
130
+ }
131
+ return null;
132
+ }
133
+ /**
134
+ * Get a human-readable description of the installation
135
+ */
136
+ static getInstallationDescription() {
137
+ const type = this.getInstallationType();
138
+ switch (type) {
139
+ case 'npm':
140
+ const npmPath = this.getNpmGlobalPath();
141
+ return npmPath
142
+ ? `npm global installation at ${npmPath}`
143
+ : 'npm global installation';
144
+ case 'git':
145
+ const gitPath = this.getGitRepositoryPath();
146
+ return gitPath
147
+ ? `git installation at ${gitPath}`
148
+ : 'git installation';
149
+ default:
150
+ return 'unknown installation type';
151
+ }
152
+ }
153
+ /**
154
+ * Clear the cached installation type (mainly for testing)
155
+ */
156
+ static clearCache() {
157
+ this.cachedType = null;
158
+ }
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2luc3RhbGxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQUMsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFMUQsK0RBQStEO0lBQ3ZELE1BQU0sS0FBSyxnQkFBZ0I7UUFDakMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxtQkFBbUI7UUFDeEIsb0NBQW9DO1FBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILCtDQUErQztZQUMvQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUvQyx3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDO2dCQUNILFVBQVUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7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Q0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLElBQUksU0FBUyxLQUFLLFVBQVU7b0JBQUUsTUFBTTtnQkFDcEMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQywwQkFBMEI7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFeEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxPQUFPO29CQUNaLENBQUMsQ0FBQyw4QkFBOEIsT0FBTyxFQUFFO29CQUN6QyxDQUFDLENBQUMseUJBQXlCLENBQUM7WUFFaEMsS0FBSyxLQUFLO2dCQUNSLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLE9BQU87b0JBQ1osQ0FBQyxDQUFDLHVCQUF1QixPQUFPLEVBQUU7b0JBQ2xDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztZQUV6QjtnQkFDRSxPQUFPLDJCQUEyQixDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsVUFBVTtRQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGxhdGlvbiBkZXRlY3Rpb24gdXRpbGl0aWVzXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgZnJvbSBucG0gb3IgZ2l0IGluc3RhbGxhdGlvblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVwZGF0ZUNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcvdXBkYXRlQ29uZmlnLmpzJztcblxuZXhwb3J0IHR5cGUgSW5zdGFsbGF0aW9uVHlwZSA9ICducG0nIHwgJ2dpdCcgfCAndW5rbm93bic7XG5cbmV4cG9ydCBjbGFzcyBJbnN0YWxsYXRpb25EZXRlY3RvciB7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZFR5cGU6IEluc3RhbGxhdGlvblR5cGUgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIE1heGltdW0gZGlyZWN0b3J5IGxldmVscyB0byBzZWFyY2ggdXB3YXJkIGZvciAuZ2l0IGRpcmVjdG9yeVxuICBwcml2YXRlIHN0YXRpYyBnZXQgTUFYX1NFQVJDSF9ERVBUSCgpOiBudW1iZXIge1xuICAgIHJldHVybiBVcGRhdGVDb25maWdNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TWF4U2VhcmNoRGVwdGgoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgaW5zdGFsbGF0aW9uIHR5cGUgKG5wbSBnbG9iYWwsIGdpdCBjbG9uZSwgb3IgdW5rbm93bilcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YWxsYXRpb25UeXBlKCk6IEluc3RhbGxhdGlvblR5cGUge1xuICAgIC8vIFJldHVybiBjYWNoZWQgcmVzdWx0IGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmNhY2hlZFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFR5cGU7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGlzIGZpbGUgaXMgbG9jYXRlZFxuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlc29sdmUgc3ltbGlua3MgdG8gZ2V0IHRoZSByZWFsIHBhdGhcbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnREaXIgPSBmcy5yZWFscGF0aFN5bmMoY3VycmVudERpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiByZWFscGF0aCBmYWlscywgY29udGludWUgd2l0aCBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBDb3VsZCBub3QgcmVzb2x2ZSByZWFsIHBhdGgsIHVzaW5nIG9yaWdpbmFsJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSAobnBtIGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFVzZSBwYXRoIHNlcGFyYXRvciB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIGV4YWN0IHBhY2thZ2UgbmFtZVxuICAgICAgY29uc3QgbnBtUGF0dGVybiA9IHBhdGguc2VwICsgcGF0aC5qb2luKCdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJykgKyBwYXRoLnNlcDtcbiAgICAgIGlmIChjdXJyZW50RGlyLmluY2x1ZGVzKG5wbVBhdHRlcm4pKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBEZXRlY3RlZCBucG0gaW5zdGFsbGF0aW9uJyk7XG4gICAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICducG0nO1xuICAgICAgICByZXR1cm4gJ25wbSc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciAuZ2l0IGRpcmVjdG9yeSAoZ2l0IGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFNlYXJjaCB1cCBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5XG4gICAgICBsZXQgc2VhcmNoRGlyID0gY3VycmVudERpcjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5NQVhfU0VBUkNIX0RFUFRIOyBpKyspIHtcbiAgICAgICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHNlYXJjaERpciwgJy5naXQnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhnaXREaXIpICYmIGZzLnN0YXRTeW5jKGdpdERpcikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIERldGVjdGVkIGdpdCBpbnN0YWxsYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICdnaXQnO1xuICAgICAgICAgICAgcmV0dXJuICdnaXQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGFuZCBjb250aW51ZSBzZWFyY2hpbmdcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKHNlYXJjaERpcik7XG4gICAgICAgIGlmIChwYXJlbnREaXIgPT09IHNlYXJjaERpcikge1xuICAgICAgICAgIC8vIFJlYWNoZWQgcm9vdCBkaXJlY3RvcnlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzZWFyY2hEaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGF0aW9uIHR5cGUnKTtcbiAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICd1bmtub3duJztcbiAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBkZXRlY3RpbmcgaW5zdGFsbGF0aW9uIHR5cGU6JywgZXJyb3IpO1xuICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ3Vua25vd24nO1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5wbSBnbG9iYWwgaW5zdGFsbGF0aW9uIHBhdGggaWYgcnVubmluZyBmcm9tIG5wbVxuICAgKi9cbiAgc3RhdGljIGdldE5wbUdsb2JhbFBhdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpICE9PSAnbnBtJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVVybCA9IGltcG9ydC5tZXRhLnVybDtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGZpbGVVUkxUb1BhdGgoY3VycmVudEZpbGVVcmwpO1xuICAgICAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudEZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgcm9vdCBvZiB0aGUgbnBtIHBhY2thZ2VcbiAgICAgIHdoaWxlIChjdXJyZW50RGlyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJykpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gY3VycmVudERpcikgYnJlYWs7XG4gICAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBmaW5kaW5nIG5wbSBnbG9iYWwgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBnaXQgcmVwb3NpdG9yeSByb290IHBhdGggaWYgcnVubmluZyBmcm9tIGdpdFxuICAgKi9cbiAgc3RhdGljIGdldEdpdFJlcG9zaXRvcnlQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdldEluc3RhbGxhdGlvblR5cGUoKSAhPT0gJ2dpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNlYXJjaCB1cCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgJy5naXQnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSAmJiBmcy5zdGF0U3luYyhnaXREaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGZpbmRpbmcgZ2l0IHJlcG9zaXRvcnkgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGluc3RhbGxhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbGxhdGlvbkRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpO1xuICAgIFxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbnBtJzpcbiAgICAgICAgY29uc3QgbnBtUGF0aCA9IHRoaXMuZ2V0TnBtR2xvYmFsUGF0aCgpO1xuICAgICAgICByZXR1cm4gbnBtUGF0aCBcbiAgICAgICAgICA/IGBucG0gZ2xvYmFsIGluc3RhbGxhdGlvbiBhdCAke25wbVBhdGh9YFxuICAgICAgICAgIDogJ25wbSBnbG9iYWwgaW5zdGFsbGF0aW9uJztcbiAgICAgICAgICBcbiAgICAgIGNhc2UgJ2dpdCc6XG4gICAgICAgIGNvbnN0IGdpdFBhdGggPSB0aGlzLmdldEdpdFJlcG9zaXRvcnlQYXRoKCk7XG4gICAgICAgIHJldHVybiBnaXRQYXRoXG4gICAgICAgICAgPyBgZ2l0IGluc3RhbGxhdGlvbiBhdCAke2dpdFBhdGh9YFxuICAgICAgICAgIDogJ2dpdCBpbnN0YWxsYXRpb24nO1xuICAgICAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd1bmtub3duIGluc3RhbGxhdGlvbiB0eXBlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVkIGluc3RhbGxhdGlvbiB0eXBlIChtYWlubHkgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZFR5cGUgPSBudWxsO1xuICB9XG59Il19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,12 +9,14 @@
9
9
  "mcp-server": "dist/index.js"
10
10
  },
11
11
  "scripts": {
12
+ "prebuild": "node scripts/generate-version.js",
12
13
  "build": "tsc",
13
14
  "start": "node dist/index.js",
14
15
  "dev": "tsx watch src/index.ts",
15
16
  "clean": "rm -rf dist",
16
17
  "rebuild": "npm run clean && npm run build",
17
18
  "setup": "npm install && npm run build",
19
+ "prepublishOnly": "BUILD_TYPE=npm npm run build",
18
20
  "update:check": "echo 'Use check_for_updates MCP tool for interactive update checking'",
19
21
  "update:pull": "git pull origin main && npm install && npm run build",
20
22
  "update:backup": "cp -r . .backup-$(date +%s)",