@noteplanco/noteplan-mcp 1.1.6 → 1.1.8

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 (98) hide show
  1. package/dist/noteplan/embeddings.d.ts +8 -0
  2. package/dist/noteplan/embeddings.d.ts.map +1 -1
  3. package/dist/noteplan/embeddings.js +3 -3
  4. package/dist/noteplan/embeddings.js.map +1 -1
  5. package/dist/noteplan/file-reader.d.ts +6 -0
  6. package/dist/noteplan/file-reader.d.ts.map +1 -1
  7. package/dist/noteplan/file-reader.js +15 -0
  8. package/dist/noteplan/file-reader.js.map +1 -1
  9. package/dist/noteplan/file-writer.d.ts.map +1 -1
  10. package/dist/noteplan/file-writer.js +86 -17
  11. package/dist/noteplan/file-writer.js.map +1 -1
  12. package/dist/noteplan/file-writer.test.d.ts +2 -0
  13. package/dist/noteplan/file-writer.test.d.ts.map +1 -0
  14. package/dist/noteplan/file-writer.test.js +896 -0
  15. package/dist/noteplan/file-writer.test.js.map +1 -0
  16. package/dist/noteplan/filter-store.d.ts.map +1 -1
  17. package/dist/noteplan/filter-store.js +13 -1
  18. package/dist/noteplan/filter-store.js.map +1 -1
  19. package/dist/noteplan/frontmatter-parser.d.ts +10 -1
  20. package/dist/noteplan/frontmatter-parser.d.ts.map +1 -1
  21. package/dist/noteplan/frontmatter-parser.js +59 -6
  22. package/dist/noteplan/frontmatter-parser.js.map +1 -1
  23. package/dist/noteplan/frontmatter-parser.test.js +576 -1
  24. package/dist/noteplan/frontmatter-parser.test.js.map +1 -1
  25. package/dist/noteplan/markdown-parser.d.ts +6 -1
  26. package/dist/noteplan/markdown-parser.d.ts.map +1 -1
  27. package/dist/noteplan/markdown-parser.js +25 -46
  28. package/dist/noteplan/markdown-parser.js.map +1 -1
  29. package/dist/noteplan/markdown-parser.test.d.ts +2 -0
  30. package/dist/noteplan/markdown-parser.test.d.ts.map +1 -0
  31. package/dist/noteplan/markdown-parser.test.js +690 -0
  32. package/dist/noteplan/markdown-parser.test.js.map +1 -0
  33. package/dist/noteplan/template-docs.d.ts +35 -0
  34. package/dist/noteplan/template-docs.d.ts.map +1 -0
  35. package/dist/noteplan/template-docs.js +184 -0
  36. package/dist/noteplan/template-docs.js.map +1 -0
  37. package/dist/noteplan/unified-store.d.ts +2 -0
  38. package/dist/noteplan/unified-store.d.ts.map +1 -1
  39. package/dist/noteplan/unified-store.js +22 -6
  40. package/dist/noteplan/unified-store.js.map +1 -1
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +661 -241
  43. package/dist/server.js.map +1 -1
  44. package/dist/tools/attachments.d.ts +151 -0
  45. package/dist/tools/attachments.d.ts.map +1 -0
  46. package/dist/tools/attachments.js +421 -0
  47. package/dist/tools/attachments.js.map +1 -0
  48. package/dist/tools/attachments.test.d.ts +2 -0
  49. package/dist/tools/attachments.test.d.ts.map +1 -0
  50. package/dist/tools/attachments.test.js +561 -0
  51. package/dist/tools/attachments.test.js.map +1 -0
  52. package/dist/tools/calendar.d.ts +7 -7
  53. package/dist/tools/notes.d.ts +148 -48
  54. package/dist/tools/notes.d.ts.map +1 -1
  55. package/dist/tools/notes.js +366 -29
  56. package/dist/tools/notes.js.map +1 -1
  57. package/dist/tools/notes.test.d.ts +2 -0
  58. package/dist/tools/notes.test.d.ts.map +1 -0
  59. package/dist/tools/notes.test.js +800 -0
  60. package/dist/tools/notes.test.js.map +1 -0
  61. package/dist/tools/plugins.d.ts.map +1 -1
  62. package/dist/tools/plugins.js +1 -0
  63. package/dist/tools/plugins.js.map +1 -1
  64. package/dist/tools/reminders.d.ts +4 -4
  65. package/dist/tools/search.d.ts +2 -2
  66. package/dist/tools/search.d.ts.map +1 -1
  67. package/dist/tools/search.js +32 -4
  68. package/dist/tools/search.js.map +1 -1
  69. package/dist/tools/tasks.d.ts +10 -10
  70. package/dist/tools/tasks.d.ts.map +1 -1
  71. package/dist/tools/tasks.js +14 -27
  72. package/dist/tools/tasks.js.map +1 -1
  73. package/dist/tools/templates.d.ts +130 -0
  74. package/dist/tools/templates.d.ts.map +1 -0
  75. package/dist/tools/templates.js +217 -0
  76. package/dist/tools/templates.js.map +1 -0
  77. package/dist/tools/templates.test.d.ts +2 -0
  78. package/dist/tools/templates.test.d.ts.map +1 -0
  79. package/dist/tools/templates.test.js +48 -0
  80. package/dist/tools/templates.test.js.map +1 -0
  81. package/dist/tools/ui.d.ts +2 -0
  82. package/dist/tools/ui.d.ts.map +1 -1
  83. package/dist/tools/ui.js +24 -0
  84. package/dist/tools/ui.js.map +1 -1
  85. package/dist/utils/applescript.d.ts.map +1 -1
  86. package/dist/utils/applescript.js +21 -0
  87. package/dist/utils/applescript.js.map +1 -1
  88. package/dist/utils/confirmation-tokens.test.d.ts +2 -0
  89. package/dist/utils/confirmation-tokens.test.d.ts.map +1 -0
  90. package/dist/utils/confirmation-tokens.test.js +159 -0
  91. package/dist/utils/confirmation-tokens.test.js.map +1 -0
  92. package/dist/utils/version.d.ts +3 -0
  93. package/dist/utils/version.d.ts.map +1 -1
  94. package/dist/utils/version.js +71 -23
  95. package/dist/utils/version.js.map +1 -1
  96. package/docs/templates.db.gz +0 -0
  97. package/docs/x-callback-url.md +318 -0
  98. package/package.json +1 -1
@@ -8,6 +8,24 @@ export function escapeAppleScript(str) {
8
8
  .replace(/"/g, '\\"')
9
9
  .replace(/[\x00-\x1f]/g, ' ');
10
10
  }
11
+ const UPDATE_HINT = 'This command may not be supported by your version of NotePlan. ' +
12
+ 'Please update to the latest version: ' +
13
+ 'TestFlight: https://testflight.apple.com/join/fm9q4OjE | ' +
14
+ 'App Store: https://apps.apple.com/app/apple-store/id1505432629';
15
+ /**
16
+ * Patterns in AppleScript stderr that indicate the command is not implemented
17
+ * in the current NotePlan version.
18
+ */
19
+ const NOT_IMPLEMENTED_PATTERNS = [
20
+ /is not handled/i,
21
+ /doesn.t understand/i,
22
+ /not supported/i,
23
+ /can.t continue/i,
24
+ /expected .* but received/i,
25
+ ];
26
+ function isNotImplementedError(stderr) {
27
+ return NOT_IMPLEMENTED_PATTERNS.some((p) => p.test(stderr));
28
+ }
11
29
  export function runAppleScript(script, timeoutMs = APPLESCRIPT_TIMEOUT_MS) {
12
30
  try {
13
31
  return execFileSync('osascript', ['-e', script], {
@@ -21,6 +39,9 @@ export function runAppleScript(script, timeoutMs = APPLESCRIPT_TIMEOUT_MS) {
21
39
  throw new Error('AppleScript timed out');
22
40
  }
23
41
  const stderr = (error.stderr || '').trim();
42
+ if (isNotImplementedError(stderr)) {
43
+ throw new Error(`${stderr}\n\n${UPDATE_HINT}`);
44
+ }
24
45
  throw new Error(stderr || error.message || 'AppleScript execution failed');
25
46
  }
26
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../src/utils/applescript.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAS,GAAG,sBAAsB;IAC/E,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../src/utils/applescript.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,WAAW,GACf,iEAAiE;IACjE,uCAAuC;IACvC,2DAA2D;IAC3D,gEAAgE,CAAC;AAEnE;;;GAGG;AACH,MAAM,wBAAwB,GAAG;IAC/B,iBAAiB;IACjB,qBAAqB;IACrB,gBAAgB;IAChB,iBAAiB;IACjB,2BAA2B;CAC5B,CAAC;AAEF,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAS,GAAG,sBAAsB;IAC/E,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,OAAO,WAAW,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=confirmation-tokens.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-tokens.test.d.ts","sourceRoot":"","sources":["../../src/utils/confirmation-tokens.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { issueConfirmationToken, validateAndConsumeConfirmationToken, } from './confirmation-tokens.js';
3
+ // A UUID v4 regex for validation
4
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
5
+ // ISO 8601 date-time regex (simplified but sufficient)
6
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/;
7
+ // Helper to create a simple context
8
+ function ctx(tool = 'deleteNote', target = '/notes/test.md', action = 'delete') {
9
+ return { tool, target, action };
10
+ }
11
+ describe('issueConfirmationToken', () => {
12
+ beforeEach(() => {
13
+ vi.useFakeTimers();
14
+ });
15
+ afterEach(() => {
16
+ vi.useRealTimers();
17
+ });
18
+ it('returns a UUID token string and an ISO date string', () => {
19
+ const result = issueConfirmationToken(ctx());
20
+ expect(result).toHaveProperty('confirmationToken');
21
+ expect(result).toHaveProperty('confirmationExpiresAt');
22
+ expect(result.confirmationToken).toMatch(UUID_RE);
23
+ expect(result.confirmationExpiresAt).toMatch(ISO_DATE_RE);
24
+ });
25
+ it('returns a unique token on each call', () => {
26
+ const result1 = issueConfirmationToken(ctx());
27
+ const result2 = issueConfirmationToken(ctx());
28
+ expect(result1.confirmationToken).not.toBe(result2.confirmationToken);
29
+ // Consume both so they don't leak into other tests
30
+ validateAndConsumeConfirmationToken(result1.confirmationToken, ctx());
31
+ validateAndConsumeConfirmationToken(result2.confirmationToken, ctx());
32
+ });
33
+ it('defaults to ~10 minutes expiry from now', () => {
34
+ const now = new Date('2025-06-15T12:00:00.000Z');
35
+ vi.setSystemTime(now);
36
+ const result = issueConfirmationToken(ctx());
37
+ const expiresAt = new Date(result.confirmationExpiresAt).getTime();
38
+ const expectedExpiry = now.getTime() + 10 * 60 * 1000;
39
+ expect(expiresAt).toBe(expectedExpiry);
40
+ // Clean up
41
+ validateAndConsumeConfirmationToken(result.confirmationToken, ctx());
42
+ });
43
+ it('respects a custom TTL', () => {
44
+ const now = new Date('2025-06-15T12:00:00.000Z');
45
+ vi.setSystemTime(now);
46
+ const customTtlMs = 30_000; // 30 seconds
47
+ const result = issueConfirmationToken(ctx(), customTtlMs);
48
+ const expiresAt = new Date(result.confirmationExpiresAt).getTime();
49
+ const expectedExpiry = now.getTime() + customTtlMs;
50
+ expect(expiresAt).toBe(expectedExpiry);
51
+ // Clean up
52
+ validateAndConsumeConfirmationToken(result.confirmationToken, ctx());
53
+ });
54
+ });
55
+ describe('validateAndConsumeConfirmationToken', () => {
56
+ beforeEach(() => {
57
+ vi.useFakeTimers();
58
+ });
59
+ afterEach(() => {
60
+ vi.useRealTimers();
61
+ });
62
+ // ── missing ──────────────────────────────────────────────────────
63
+ it('returns reason "missing" for undefined token', () => {
64
+ const result = validateAndConsumeConfirmationToken(undefined, ctx());
65
+ expect(result).toEqual({ ok: false, reason: 'missing' });
66
+ });
67
+ it('returns reason "missing" for null token', () => {
68
+ const result = validateAndConsumeConfirmationToken(null, ctx());
69
+ expect(result).toEqual({ ok: false, reason: 'missing' });
70
+ });
71
+ it('returns reason "missing" for empty string token', () => {
72
+ const result = validateAndConsumeConfirmationToken('', ctx());
73
+ expect(result).toEqual({ ok: false, reason: 'missing' });
74
+ });
75
+ it('returns reason "missing" for whitespace-only string token', () => {
76
+ const result = validateAndConsumeConfirmationToken(' \t\n ', ctx());
77
+ expect(result).toEqual({ ok: false, reason: 'missing' });
78
+ });
79
+ it('returns reason "missing" for a number (non-string) token', () => {
80
+ const result = validateAndConsumeConfirmationToken(42, ctx());
81
+ expect(result).toEqual({ ok: false, reason: 'missing' });
82
+ });
83
+ // ── invalid ──────────────────────────────────────────────────────
84
+ it('returns reason "invalid" for a random UUID that was never issued', () => {
85
+ const result = validateAndConsumeConfirmationToken('aaaaaaaa-bbbb-4ccc-9ddd-eeeeeeeeeeee', ctx());
86
+ expect(result).toEqual({ ok: false, reason: 'invalid' });
87
+ });
88
+ // ── expired ──────────────────────────────────────────────────────
89
+ it('returns a failure reason when token TTL has elapsed', () => {
90
+ vi.setSystemTime(new Date('2025-06-15T12:00:00.000Z'));
91
+ const { confirmationToken } = issueConfirmationToken(ctx(), 1);
92
+ // Advance time past the 1ms TTL
93
+ vi.advanceTimersByTime(2);
94
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx());
95
+ // cleanupExpired runs before the per-token check and removes expired
96
+ // tokens from the store, so the token is already gone by the time
97
+ // the lookup happens. The result is 'invalid' (token not found)
98
+ // rather than 'expired' (token found but past its TTL).
99
+ expect(result.ok).toBe(false);
100
+ expect(result).toHaveProperty('reason');
101
+ // The token must not validate successfully
102
+ expect(result.reason).toMatch(/^(expired|invalid)$/);
103
+ });
104
+ // ── mismatch ─────────────────────────────────────────────────────
105
+ it('returns reason "mismatch" when tool differs', () => {
106
+ const { confirmationToken } = issueConfirmationToken(ctx('deleteNote', '/notes/test.md', 'delete'));
107
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx('moveNote', '/notes/test.md', 'delete'));
108
+ expect(result).toEqual({ ok: false, reason: 'mismatch' });
109
+ });
110
+ it('returns reason "mismatch" when target differs', () => {
111
+ const { confirmationToken } = issueConfirmationToken(ctx('deleteNote', '/notes/alpha.md', 'delete'));
112
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx('deleteNote', '/notes/beta.md', 'delete'));
113
+ expect(result).toEqual({ ok: false, reason: 'mismatch' });
114
+ });
115
+ it('returns reason "mismatch" when action differs', () => {
116
+ const { confirmationToken } = issueConfirmationToken(ctx('deleteNote', '/notes/test.md', 'delete'));
117
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx('deleteNote', '/notes/test.md', 'move'));
118
+ expect(result).toEqual({ ok: false, reason: 'mismatch' });
119
+ });
120
+ // ── success ──────────────────────────────────────────────────────
121
+ it('returns { ok: true } for a valid token with matching context', () => {
122
+ const context = ctx('deleteNote', '/notes/test.md', 'delete');
123
+ const { confirmationToken } = issueConfirmationToken(context);
124
+ const result = validateAndConsumeConfirmationToken(confirmationToken, context);
125
+ expect(result).toEqual({ ok: true });
126
+ });
127
+ // ── consume-once ─────────────────────────────────────────────────
128
+ it('consumes the token on success so a second validation returns "invalid"', () => {
129
+ const context = ctx('deleteNote', '/notes/test.md', 'delete');
130
+ const { confirmationToken } = issueConfirmationToken(context);
131
+ const first = validateAndConsumeConfirmationToken(confirmationToken, context);
132
+ expect(first).toEqual({ ok: true });
133
+ const second = validateAndConsumeConfirmationToken(confirmationToken, context);
134
+ expect(second).toEqual({ ok: false, reason: 'invalid' });
135
+ });
136
+ // ── case-insensitive ─────────────────────────────────────────────
137
+ it('normalizes context case: issuing with mixed case matches lowercase validation', () => {
138
+ const { confirmationToken } = issueConfirmationToken(ctx('DeleteNote', '/Notes/Test.MD', 'DELETE'));
139
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx('deletenote', '/notes/test.md', 'delete'));
140
+ expect(result).toEqual({ ok: true });
141
+ });
142
+ // ── whitespace-tolerant ──────────────────────────────────────────
143
+ it('normalizes context whitespace: issuing with padded strings matches trimmed validation', () => {
144
+ const { confirmationToken } = issueConfirmationToken(ctx(' deleteNote ', ' /notes/test.md ', ' delete '));
145
+ const result = validateAndConsumeConfirmationToken(confirmationToken, ctx('deletenote', '/notes/test.md', 'delete'));
146
+ expect(result).toEqual({ ok: true });
147
+ });
148
+ // ── mismatch consumed ────────────────────────────────────────────
149
+ it('deletes the token after a mismatch so a subsequent validation returns "invalid"', () => {
150
+ const { confirmationToken } = issueConfirmationToken(ctx('deleteNote', '/notes/test.md', 'delete'));
151
+ // First attempt: wrong context -> mismatch
152
+ const mismatch = validateAndConsumeConfirmationToken(confirmationToken, ctx('moveNote', '/notes/other.md', 'move'));
153
+ expect(mismatch).toEqual({ ok: false, reason: 'mismatch' });
154
+ // Second attempt: even with correct context -> invalid (consumed)
155
+ const retry = validateAndConsumeConfirmationToken(confirmationToken, ctx('deleteNote', '/notes/test.md', 'delete'));
156
+ expect(retry).toEqual({ ok: false, reason: 'invalid' });
157
+ });
158
+ });
159
+ //# sourceMappingURL=confirmation-tokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-tokens.test.js","sourceRoot":"","sources":["../../src/utils/confirmation-tokens.test.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,9 @@ export interface NotePlanVersion {
4
4
  source: 'applescript' | 'plist' | 'unknown';
5
5
  }
6
6
  export declare const MIN_BUILD_ADVANCED_FEATURES = 1300;
7
+ export declare const MIN_BUILD_RENDER_TEMPLATE = 1400;
8
+ export declare const MIN_BUILD_EMBED_TEXT = 1490;
9
+ export declare const MIN_BUILD_CREATE_BACKUP = 1492;
7
10
  export declare function getNotePlanVersion(forceRefresh?: boolean): NotePlanVersion;
8
11
  export declare function isAdvancedFeaturesAvailable(forceRefresh?: boolean): boolean;
9
12
  export declare function upgradeMessage(feature: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;CAC7C;AAGD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAmEhD,wBAAgB,kBAAkB,CAAC,YAAY,UAAQ,GAAG,eAAe,CAUxE;AAED,wBAAgB,2BAA2B,CAAC,YAAY,UAAQ,GAAG,OAAO,CAGzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;CAC7C;AAGD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAGhD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAG9C,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAGzC,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA6G5C,wBAAgB,kBAAkB,CAAC,YAAY,UAAQ,GAAG,eAAe,CAUxE;AAED,wBAAgB,2BAA2B,CAAC,YAAY,UAAQ,GAAG,OAAO,CAGzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C"}
@@ -4,45 +4,93 @@ import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  // Placeholder — set to the first build that ships themes/plugins/ui/space-writes
6
6
  export const MIN_BUILD_ADVANCED_FEATURES = 1300;
7
+ // Build that ships the renderTemplate AppleScript command
8
+ export const MIN_BUILD_RENDER_TEMPLATE = 1400;
9
+ // Build that ships the embedText AppleScript command
10
+ export const MIN_BUILD_EMBED_TEXT = 1490;
11
+ // Build that ships the createBackup AppleScript command
12
+ export const MIN_BUILD_CREATE_BACKUP = 1492;
7
13
  const CACHE_TTL_MS = 60_000;
8
14
  let cachedVersion = null;
9
15
  let cachedAt = 0;
16
+ // AppleScript may resolve the app by CFBundleName or by .app filename depending on macOS version.
17
+ // MAS installs can use the store marketing name as the .app folder name, so we try multiple names.
18
+ const APPLESCRIPT_APP_NAMES = [
19
+ 'NotePlan',
20
+ 'NotePlan 3',
21
+ 'NotePlan - To-Do List & Notes',
22
+ ];
10
23
  function detectViaAppleScript() {
11
- try {
12
- // Check if NotePlan is running first to avoid launching it as a side effect
13
- const isRunning = execFileSync('osascript', ['-e', 'application "NotePlan" is running'], {
14
- encoding: 'utf-8',
15
- stdio: ['pipe', 'pipe', 'pipe'],
16
- timeout: 3_000,
17
- }).trim();
18
- if (isRunning !== 'true')
19
- return null;
20
- const raw = execFileSync('osascript', ['-e', 'tell application "NotePlan" to getVersion'], {
21
- encoding: 'utf-8',
22
- stdio: ['pipe', 'pipe', 'pipe'],
23
- timeout: 5_000,
24
- }).trim();
25
- const parsed = JSON.parse(raw);
26
- if (typeof parsed.version === 'string' && typeof parsed.build === 'number') {
27
- return { version: parsed.version, build: parsed.build, source: 'applescript' };
24
+ for (const appName of APPLESCRIPT_APP_NAMES) {
25
+ try {
26
+ const isRunning = execFileSync('osascript', ['-e', `application "${appName}" is running`], {
27
+ encoding: 'utf-8',
28
+ stdio: ['pipe', 'pipe', 'pipe'],
29
+ timeout: 3_000,
30
+ }).trim();
31
+ if (isRunning !== 'true')
32
+ continue;
33
+ const raw = execFileSync('osascript', ['-e', `tell application "${appName}" to getVersion`], {
34
+ encoding: 'utf-8',
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
+ timeout: 5_000,
37
+ }).trim();
38
+ const parsed = JSON.parse(raw);
39
+ if (typeof parsed.version === 'string' && typeof parsed.build === 'number') {
40
+ return { version: parsed.version, build: parsed.build, source: 'applescript' };
41
+ }
42
+ }
43
+ catch (err) {
44
+ const msg = err instanceof Error ? err.message : String(err);
45
+ console.error(`[noteplan-mcp] AppleScript detection failed for "${appName}": ${msg}`);
46
+ if (msg.includes('not allowed') || msg.includes('permission') || msg.includes('1743') || msg.includes('assistive')) {
47
+ console.error('[noteplan-mcp] Hint: The parent app (e.g. Claude Desktop, Terminal) may need Automation permission for NotePlan. Check System Settings > Privacy & Security > Automation.');
48
+ return null; // Permission issue — no point trying other names
49
+ }
28
50
  }
29
51
  }
30
- catch {
31
- // App not running or command not available
32
- }
52
+ console.error('[noteplan-mcp] AppleScript: NotePlan not found running under any known name.');
33
53
  return null;
34
54
  }
35
55
  const KNOWN_APP_PATHS = [
36
56
  '/Applications/NotePlan 3.app',
37
57
  '/Applications/NotePlan.app',
58
+ '/Applications/NotePlan - To-Do List & Notes.app',
38
59
  path.join(process.env.HOME ?? '', 'Applications/NotePlan 3.app'),
39
60
  path.join(process.env.HOME ?? '', 'Applications/NotePlan.app'),
61
+ path.join(process.env.HOME ?? '', 'Applications/NotePlan - To-Do List & Notes.app'),
40
62
  // Setapp
41
63
  '/Applications/Setapp/NotePlan 3.app',
42
64
  '/Applications/Setapp/NotePlan.app',
43
65
  ];
44
66
  function detectViaPlist() {
45
- for (const appPath of KNOWN_APP_PATHS) {
67
+ // First try hardcoded known paths
68
+ const result = readVersionFromAppPath(KNOWN_APP_PATHS);
69
+ if (result)
70
+ return result;
71
+ // Fallback: use mdfind (Spotlight) to locate the app bundle dynamically
72
+ console.error(`[noteplan-mcp] Plist: app not found at known paths, trying mdfind...`);
73
+ try {
74
+ const mdfindResult = execFileSync('mdfind', ['kMDItemCFBundleIdentifier == "co.noteplan.NotePlan3" || kMDItemCFBundleIdentifier == "co.noteplan.NotePlan-setapp" || kMDItemCFBundleIdentifier == "co.noteplan.NotePlan"'], {
75
+ encoding: 'utf-8',
76
+ stdio: ['pipe', 'pipe', 'pipe'],
77
+ timeout: 5_000,
78
+ }).trim();
79
+ if (mdfindResult) {
80
+ const discoveredPaths = mdfindResult.split('\n').filter(Boolean);
81
+ console.error(`[noteplan-mcp] mdfind discovered: ${discoveredPaths.join(', ')}`);
82
+ const found = readVersionFromAppPath(discoveredPaths);
83
+ if (found)
84
+ return found;
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.error(`[noteplan-mcp] mdfind fallback failed: ${err instanceof Error ? err.message : String(err)}`);
89
+ }
90
+ return null;
91
+ }
92
+ function readVersionFromAppPath(appPaths) {
93
+ for (const appPath of appPaths) {
46
94
  const plistPath = path.join(appPath, 'Contents/Info.plist');
47
95
  if (!fs.existsSync(plistPath))
48
96
  continue;
@@ -62,8 +110,8 @@ function detectViaPlist() {
62
110
  return { version, build, source: 'plist' };
63
111
  }
64
112
  }
65
- catch {
66
- // plist read failed for this path, try next
113
+ catch (err) {
114
+ console.error(`[noteplan-mcp] Plist read failed for ${appPath}: ${err instanceof Error ? err.message : String(err)}`);
67
115
  }
68
116
  }
69
117
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
Binary file