projectionlab-mcp 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/HOW-IT-WORKS.md +2 -2
  2. package/MANUAL-SETUP.md +64 -0
  3. package/README.md +34 -271
  4. package/REFERENCE.md +221 -0
  5. package/SETUP-FOR-AGENTS.md +37 -0
  6. package/dist/bootstrap.js +20 -3
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/bridge.d.ts +2 -0
  9. package/dist/clonePlan.d.ts +9 -0
  10. package/dist/clonePlan.js +15 -14
  11. package/dist/clonePlan.js.map +1 -1
  12. package/dist/config.d.ts +4 -0
  13. package/dist/config.js +41 -6
  14. package/dist/config.js.map +1 -1
  15. package/dist/currentFinances.d.ts +12 -1
  16. package/dist/currentFinances.js +60 -0
  17. package/dist/currentFinances.js.map +1 -1
  18. package/dist/dataModel.d.ts +58 -0
  19. package/dist/dataModel.js +1429 -0
  20. package/dist/dataModel.js.map +1 -0
  21. package/dist/deletePlan.d.ts +17 -0
  22. package/dist/deletePlan.js +72 -0
  23. package/dist/deletePlan.js.map +1 -0
  24. package/dist/diff.d.ts +288 -0
  25. package/dist/diff.js +744 -0
  26. package/dist/diff.js.map +1 -0
  27. package/dist/errors.d.ts +6 -0
  28. package/dist/errors.js +14 -1
  29. package/dist/errors.js.map +1 -1
  30. package/dist/extensionBridge.d.ts +16 -2
  31. package/dist/extensionBridge.js +104 -23
  32. package/dist/extensionBridge.js.map +1 -1
  33. package/dist/index.js +27 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/instructions.d.ts +1 -1
  36. package/dist/instructions.js +3 -2
  37. package/dist/instructions.js.map +1 -1
  38. package/dist/largeOutput.js +25 -0
  39. package/dist/largeOutput.js.map +1 -1
  40. package/dist/logger.js +11 -4
  41. package/dist/logger.js.map +1 -1
  42. package/dist/pathPatch.d.ts +5 -2
  43. package/dist/pathPatch.js +16 -2
  44. package/dist/pathPatch.js.map +1 -1
  45. package/dist/planSettings.d.ts +1 -1
  46. package/dist/planSettings.js +3 -3
  47. package/dist/planSettings.js.map +1 -1
  48. package/dist/plans.d.ts +73 -10
  49. package/dist/plans.js +206 -42
  50. package/dist/plans.js.map +1 -1
  51. package/dist/prompts/index.js +7 -4
  52. package/dist/prompts/index.js.map +1 -1
  53. package/dist/realEstate.d.ts +22 -0
  54. package/dist/realEstate.js +118 -0
  55. package/dist/realEstate.js.map +1 -0
  56. package/dist/redact.d.ts +26 -0
  57. package/dist/redact.js +93 -1
  58. package/dist/redact.js.map +1 -1
  59. package/dist/resources/dataModel.d.ts +3 -0
  60. package/dist/resources/dataModel.js +66 -0
  61. package/dist/resources/dataModel.js.map +1 -0
  62. package/dist/resources/knowledge.js +189 -47
  63. package/dist/resources/knowledge.js.map +1 -1
  64. package/dist/resources/planData.js +3 -1
  65. package/dist/resources/planData.js.map +1 -1
  66. package/dist/resources/summary.js +4 -1
  67. package/dist/resources/summary.js.map +1 -1
  68. package/dist/snapshot.d.ts +21 -0
  69. package/dist/snapshot.js +116 -12
  70. package/dist/snapshot.js.map +1 -1
  71. package/dist/summary.js +19 -6
  72. package/dist/summary.js.map +1 -1
  73. package/dist/tools/clonePlan.js +17 -8
  74. package/dist/tools/clonePlan.js.map +1 -1
  75. package/dist/tools/connection.js +29 -4
  76. package/dist/tools/connection.js.map +1 -1
  77. package/dist/tools/deletePlan.d.ts +4 -0
  78. package/dist/tools/deletePlan.js +103 -0
  79. package/dist/tools/deletePlan.js.map +1 -0
  80. package/dist/tools/diff.d.ts +4 -0
  81. package/dist/tools/diff.js +417 -0
  82. package/dist/tools/diff.js.map +1 -0
  83. package/dist/tools/getCurrentFinances.js +27 -4
  84. package/dist/tools/getCurrentFinances.js.map +1 -1
  85. package/dist/tools/getPlan.js +4 -4
  86. package/dist/tools/getPlan.js.map +1 -1
  87. package/dist/tools/getPlanSection.js +7 -6
  88. package/dist/tools/getPlanSection.js.map +1 -1
  89. package/dist/tools/getPlanSettings.js +10 -6
  90. package/dist/tools/getPlanSettings.js.map +1 -1
  91. package/dist/tools/restore.js +18 -1
  92. package/dist/tools/restore.js.map +1 -1
  93. package/dist/tools/schema.js +28 -4
  94. package/dist/tools/schema.js.map +1 -1
  95. package/dist/tools/snapshots.d.ts +1 -1
  96. package/dist/tools/snapshots.js +53 -6
  97. package/dist/tools/snapshots.js.map +1 -1
  98. package/dist/tools/summary.js +3 -2
  99. package/dist/tools/summary.js.map +1 -1
  100. package/dist/tools/updateAccount.js +9 -7
  101. package/dist/tools/updateAccount.js.map +1 -1
  102. package/dist/tools/updatePlanEvent.js +71 -33
  103. package/dist/tools/updatePlanEvent.js.map +1 -1
  104. package/dist/tools/updatePlanSection.js +17 -32
  105. package/dist/tools/updatePlanSection.js.map +1 -1
  106. package/dist/tools/updatePlanSettings.js +11 -7
  107. package/dist/tools/updatePlanSettings.js.map +1 -1
  108. package/dist/types/projectionlab.d.ts +3 -1
  109. package/dist/types/wire.d.ts +27 -2
  110. package/dist/types/wire.js +6 -2
  111. package/dist/types/wire.js.map +1 -1
  112. package/dist/updateCheck.d.ts +22 -0
  113. package/dist/updateCheck.js +58 -0
  114. package/dist/updateCheck.js.map +1 -0
  115. package/dist/versionCompare.d.ts +5 -0
  116. package/dist/versionCompare.js +33 -0
  117. package/dist/versionCompare.js.map +1 -0
  118. package/dist/versionNotices.d.ts +9 -0
  119. package/dist/versionNotices.js +42 -0
  120. package/dist/versionNotices.js.map +1 -0
  121. package/package.json +6 -3
  122. package/skills/projectionlab/SKILL.md +329 -29
@@ -1,11 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import { buildPlanClone, verifyPlanClone } from "../clonePlan.js";
3
3
  import { config } from "../config.js";
4
+ import { currentFinancesProblems } from "../currentFinances.js";
4
5
  import { ProjectionLabError, errorResult } from "../errors.js";
5
6
  import { log } from "../logger.js";
6
7
  import { assertPlansUnchanged } from "../planVersion.js";
7
8
  import { toJson } from "../json.js";
8
- import { findPlanIndex, getEvents, planNotFoundError, requirePlans, } from "../plans.js";
9
+ import { resolvePlanIndex, getEvents, planNotFoundError, requirePlans, } from "../plans.js";
9
10
  export function registerClonePlanTool(server, bridge, snapshots) {
10
11
  server.registerTool("projectionlab_clone_plan", {
11
12
  title: "Clone Plan",
@@ -13,7 +14,8 @@ export function registerClonePlanTool(server, bridge, snapshots) {
13
14
  "plan is left as it is; the copy is appended. Event ids are kept, as ProjectionLab's own " +
14
15
  "plan duplication does, so references between events, milestones and accounts stay intact. " +
15
16
  "When confirm is false (default), returns a dry-run preview. When confirm is true, " +
16
- "auto-snapshots all plans, appends the copy, and verifies the other plans are unchanged. " +
17
+ "auto-snapshots all plans, appends the copy, and verifies the other plans are " +
18
+ "unchanged and that no Current Finances balance moved. " +
17
19
  "Edit the copy afterwards with projectionlab_update_plan_event or " +
18
20
  "projectionlab_update_plan_settings. projectionlab_rollback on the snapshot removes the copy.",
19
21
  inputSchema: {
@@ -21,7 +23,7 @@ export function registerClonePlanTool(server, bridge, snapshots) {
21
23
  .string()
22
24
  .trim()
23
25
  .min(1)
24
- .describe("Plan to copy: name (case-insensitive, partial match) or exact plan ID"),
26
+ .describe("Plan to copy: name (case-insensitive; a partial match must identify exactly one plan) or exact plan ID"),
25
27
  newName: z
26
28
  .string()
27
29
  .describe("Name for the new plan. Must not match an existing plan name (case-insensitive)."),
@@ -43,7 +45,7 @@ export function registerClonePlanTool(server, bridge, snapshots) {
43
45
  }
44
46
  const data = await bridge.exportData({ fresh: true });
45
47
  const plans = requirePlans(data);
46
- const sourceIndex = findPlanIndex(plans, planIdentifier);
48
+ const sourceIndex = resolvePlanIndex(plans, planIdentifier);
47
49
  if (sourceIndex === -1)
48
50
  throw planNotFoundError(plans, planIdentifier);
49
51
  const source = plans[sourceIndex];
@@ -85,8 +87,17 @@ export function registerClonePlanTool(server, bridge, snapshots) {
85
87
  await bridge.restorePlans([...plans, clone]);
86
88
  const verifyData = await bridge.exportData({ fresh: true });
87
89
  const after = Array.isArray(verifyData.plans) ? verifyData.plans : [];
88
- const problems = verifyPlanClone(plans, after, clone);
90
+ const planProblems = verifyPlanClone(plans, after, clone);
91
+ const financeProblems = currentFinancesProblems(data.today, verifyData.today);
92
+ const problems = [...planProblems, ...financeProblems];
89
93
  const verified = problems.length === 0;
94
+ let message = "Plan copied and verified. Snapshot saved; projectionlab_rollback with this snapshotId removes the copy.";
95
+ if (!verified) {
96
+ message =
97
+ planProblems.length > 0
98
+ ? `Copy sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`
99
+ : "Copy landed, but Current Finances changed while the write was in flight. Cloning a plan does not write Current Finances, so this may be an edit made in ProjectionLab. The snapshot holds plans only, so rolling it back removes the copy and restores nothing else.";
100
+ }
90
101
  return {
91
102
  content: [
92
103
  {
@@ -97,9 +108,7 @@ export function registerClonePlanTool(server, bridge, snapshots) {
97
108
  verified,
98
109
  ...(verified ? {} : { verificationProblems: problems }),
99
110
  snapshotId: snapshot.id,
100
- message: verified
101
- ? "Plan copied and verified. Snapshot saved; projectionlab_rollback with this snapshotId removes the copy."
102
- : `Copy sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`,
111
+ message,
103
112
  }),
104
113
  },
105
114
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"clonePlan.js","sourceRoot":"","sources":["../../src/tools/clonePlan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clonePlan.js","sourceRoot":"","sources":["../../src/tools/clonePlan.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,35 @@
1
1
  import { z } from "zod";
2
+ import { config } from "../config.js";
2
3
  import { errorResult } from "../errors.js";
3
4
  import { toJson } from "../json.js";
5
+ import { updateCheck } from "../updateCheck.js";
6
+ import { versionNotices } from "../versionNotices.js";
7
+ import { VERSION } from "../version.js";
4
8
  export function registerConnectionTool(server, bridge) {
5
9
  server.registerTool("projectionlab_check_connection", {
6
10
  title: "Check Connection",
7
11
  description: "Verify connectivity to ProjectionLab. Checks that the browser is running, " +
8
12
  "the ProjectionLab page is loaded, the Plugin API is accessible, and the API key is valid. " +
13
+ "Also reports writesEnabled, which is false while the server is in read-only mode " +
14
+ "(PL_READ_ONLY is not \"false\") and every write tool, dry runs included, is refused. " +
9
15
  "Call this first in every session, before any other ProjectionLab tool. If any check " +
10
- "fails, read the projectionlab://guide resource and walk the user through the fix.",
16
+ "fails, read the projectionlab://guide resource and walk the user through the fix. " +
17
+ "The result also carries versions (server, executor, latest npm release) and notices: " +
18
+ "plain sentences to relay to the user when a release is out of date.",
11
19
  outputSchema: {
12
20
  browser: z.boolean(),
13
21
  pageLoaded: z.boolean(),
14
22
  apiAvailable: z.boolean(),
15
23
  apiKeyValid: z.boolean(),
24
+ executor: z.string().optional(),
16
25
  errors: z.array(z.string()),
26
+ writesEnabled: z.boolean(),
27
+ versions: z.object({
28
+ server: z.string(),
29
+ executor: z.string().nullable(),
30
+ latest: z.string().nullable(),
31
+ }),
32
+ notices: z.array(z.string()),
17
33
  },
18
34
  annotations: {
19
35
  readOnlyHint: true,
@@ -22,10 +38,19 @@ export function registerConnectionTool(server, bridge) {
22
38
  },
23
39
  }, async () => {
24
40
  try {
25
- const status = await bridge.checkConnection();
41
+ const status = {
42
+ ...(await bridge.checkConnection()),
43
+ writesEnabled: !config.readOnly,
44
+ };
45
+ const versions = {
46
+ server: VERSION,
47
+ executor: status.executor ?? null,
48
+ latest: updateCheck.latest(),
49
+ };
50
+ const result = { ...status, versions, notices: versionNotices(versions) };
26
51
  return {
27
- content: [{ type: "text", text: toJson(status) }],
28
- structuredContent: { ...status },
52
+ content: [{ type: "text", text: toJson(result) }],
53
+ structuredContent: result,
29
54
  };
30
55
  }
31
56
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAc;IAEd,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,4EAA4E;YAC5E,4FAA4F;YAC5F,sFAAsF;YACtF,mFAAmF;QACrF,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;YACpB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;YACvB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;YACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;YACxB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC5B;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE;aACjC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mCAAmC,EACnC;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,mFAAmF;YACnF,kFAAkF;YAClF,uEAAuE;QACzE,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Bridge } from "../bridge.js";
3
+ import type { SnapshotManager } from "../snapshot.js";
4
+ export declare function registerDeletePlanTool(server: McpServer, bridge: Bridge, snapshots: SnapshotManager): void;
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { config } from "../config.js";
3
+ import { selectPlanForDeletion, verifyPlanDeletion, withoutPlan } from "../deletePlan.js";
4
+ import { ProjectionLabError, errorResult } from "../errors.js";
5
+ import { log } from "../logger.js";
6
+ import { assertPlansUnchanged } from "../planVersion.js";
7
+ import { toJson } from "../json.js";
8
+ import { getEvents, requirePlans } from "../plans.js";
9
+ export function registerDeletePlanTool(server, bridge, snapshots) {
10
+ server.registerTool("projectionlab_delete_plan", {
11
+ title: "Delete Plan",
12
+ description: "Permanently removes one plan by exact plan ID; names are never matched, so get the ID " +
13
+ "from projectionlab_describe_schema first. Refuses the last remaining plan. " +
14
+ "When confirm is false (default), returns a dry-run preview. When confirm is true, " +
15
+ "auto-snapshots all plans, writes the remaining plans, and verifies the deleted plan is " +
16
+ "gone while every other plan is unchanged. projectionlab_rollback on the snapshot " +
17
+ "restores the deleted plan.",
18
+ inputSchema: {
19
+ planId: z
20
+ .string()
21
+ .trim()
22
+ .min(1)
23
+ .describe("Exact plan ID only (from projectionlab_describe_schema). Names are not accepted for deletion."),
24
+ confirm: z
25
+ .boolean()
26
+ .default(false)
27
+ .describe("Set to true to execute. Default false returns a dry-run preview."),
28
+ },
29
+ annotations: {
30
+ readOnlyHint: false,
31
+ destructiveHint: true,
32
+ idempotentHint: false,
33
+ openWorldHint: true,
34
+ },
35
+ }, async ({ planId, confirm }) => {
36
+ try {
37
+ if (config.readOnly) {
38
+ throw new ProjectionLabError("READ_ONLY_MODE", "Write operations are disabled (read-only mode; PL_READ_ONLY is not \"false\")", "Ask the user whether to enable writes: set PL_READ_ONLY=false in the MCP host env block or ~/.projectionlab-mcp/.env, then restart the server");
39
+ }
40
+ const data = await bridge.exportData({ fresh: true });
41
+ const plans = requirePlans(data);
42
+ const target = selectPlanForDeletion(plans, planId);
43
+ const preview = {
44
+ plan: { name: target.name, id: target.id },
45
+ planCount: `${plans.length} → ${plans.length - 1}`,
46
+ eventCounts: {
47
+ income: getEvents(target.income).length,
48
+ expenses: getEvents(target.expenses).length,
49
+ accounts: getEvents(target.accounts).length,
50
+ assets: getEvents(target.assets).length,
51
+ milestones: getEvents(target.milestones).length,
52
+ priorities: getEvents(target.priorities).length,
53
+ },
54
+ };
55
+ if (!confirm) {
56
+ return {
57
+ content: [
58
+ {
59
+ type: "text",
60
+ text: toJson({
61
+ dryRun: true,
62
+ operation: "deletePlan",
63
+ ...preview,
64
+ warning: `This will delete plan "${String(target.name)}" and all of its events. Set confirm=true to proceed. The plans are snapshotted first, so projectionlab_rollback can restore the plan.`,
65
+ }),
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ const snapshot = await snapshots.create("deletePlan", ["plans"], {
71
+ plans,
72
+ });
73
+ await assertPlansUnchanged(bridge, plans);
74
+ log.info("deletePlan", `Deleting plan "${String(target.name)}"`);
75
+ await bridge.restorePlans(withoutPlan(plans, String(target.id)));
76
+ const verifyData = await bridge.exportData({ fresh: true });
77
+ const after = Array.isArray(verifyData.plans) ? verifyData.plans : [];
78
+ const problems = verifyPlanDeletion(plans, after, String(target.id));
79
+ const verified = problems.length === 0;
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: toJson({
85
+ success: true,
86
+ ...preview,
87
+ verified,
88
+ ...(verified ? {} : { verificationProblems: problems }),
89
+ snapshotId: snapshot.id,
90
+ message: verified
91
+ ? "Plan deleted and verified. Snapshot saved; projectionlab_rollback with this snapshotId restores the plan."
92
+ : `Delete sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`,
93
+ }),
94
+ },
95
+ ],
96
+ };
97
+ }
98
+ catch (err) {
99
+ return errorResult(err);
100
+ }
101
+ });
102
+ }
103
+ //# sourceMappingURL=deletePlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletePlan.js","sourceRoot":"","sources":["../../src/tools/deletePlan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Bridge } from "../bridge.js";
3
+ import { type SnapshotManager } from "../snapshot.js";
4
+ export declare function registerDiffTool(server: McpServer, bridge: Bridge, snapshots: SnapshotManager): void;