@knowsuchagency/fulcrum 4.4.4 → 4.4.6

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 (3) hide show
  1. package/bin/fulcrum.js +89 -5
  2. package/package.json +1 -1
  3. package/server/index.js +9592 -8452
package/bin/fulcrum.js CHANGED
@@ -1729,6 +1729,19 @@ class FulcrumClient {
1729
1729
  const query = params.toString() ? `?${params.toString()}` : "";
1730
1730
  return this.fetch(`/api/jobs/${encodeURIComponent(name)}/run${query}`, { method: "POST" });
1731
1731
  }
1732
+ async listTemplates() {
1733
+ const repos = await this.listRepositories();
1734
+ return repos.filter((r3) => r3.isCopierTemplate);
1735
+ }
1736
+ async getTemplateQuestions(source) {
1737
+ return this.fetch(`/api/copier/questions?source=${encodeURIComponent(source)}`);
1738
+ }
1739
+ async createFromTemplate(data) {
1740
+ return this.fetch("/api/copier/create", {
1741
+ method: "POST",
1742
+ body: JSON.stringify(data)
1743
+ });
1744
+ }
1732
1745
  async search(input) {
1733
1746
  const params = new URLSearchParams({ q: input.query });
1734
1747
  if (input.entities?.length)
@@ -43997,6 +44010,27 @@ var init_registry = __esm(() => {
43997
44010
  keywords: ["repository", "repo", "unlink", "project", "disconnect", "detach"],
43998
44011
  defer_loading: true
43999
44012
  },
44013
+ {
44014
+ name: "list_templates",
44015
+ description: "List available Copier project templates",
44016
+ category: "repositories",
44017
+ keywords: ["template", "copier", "scaffold", "boilerplate", "list"],
44018
+ defer_loading: true
44019
+ },
44020
+ {
44021
+ name: "get_template_questions",
44022
+ description: "Get questions/prompts defined by a Copier template",
44023
+ category: "repositories",
44024
+ keywords: ["template", "copier", "questions", "prompts", "answers", "scaffold"],
44025
+ defer_loading: true
44026
+ },
44027
+ {
44028
+ name: "create_from_template",
44029
+ description: "Create a new project from a Copier template",
44030
+ category: "repositories",
44031
+ keywords: ["template", "copier", "create", "scaffold", "project", "boilerplate", "generate"],
44032
+ defer_loading: true
44033
+ },
44000
44034
  {
44001
44035
  name: "list_exec_sessions",
44002
44036
  description: "List active command execution sessions",
@@ -45219,6 +45253,54 @@ var init_repositories = __esm(() => {
45219
45253
  init_utils();
45220
45254
  });
45221
45255
 
45256
+ // cli/src/mcp/tools/copier.ts
45257
+ var registerCopierTools = (server, client) => {
45258
+ server.tool("list_templates", "List available Copier project templates. Returns repositories marked as Copier templates.", {}, async () => {
45259
+ try {
45260
+ const templates = await client.listTemplates();
45261
+ return formatSuccess(templates);
45262
+ } catch (err) {
45263
+ return handleToolError(err);
45264
+ }
45265
+ });
45266
+ server.tool("get_template_questions", "Get the questions/prompts defined by a Copier template. Use this before create_from_template to discover required answers.", {
45267
+ source: exports_external.string().describe("Template source: a repository ID, local path, or git URL")
45268
+ }, async ({ source }) => {
45269
+ try {
45270
+ const result = await client.getTemplateQuestions(source);
45271
+ return formatSuccess(result);
45272
+ } catch (err) {
45273
+ return handleToolError(err);
45274
+ }
45275
+ });
45276
+ server.tool("create_from_template", "Create a new project from a Copier template. Call get_template_questions first to discover required answers.", {
45277
+ templateSource: exports_external.string().describe("Template source: a repository ID, local path, or git URL"),
45278
+ outputPath: exports_external.string().describe("Absolute path where the new project will be created"),
45279
+ projectName: exports_external.string().describe("Name for the new project"),
45280
+ answers: exports_external.record(exports_external.unknown()).describe("Answers to the template questions (from get_template_questions)"),
45281
+ trust: exports_external.optional(exports_external.boolean()).describe("Trust template for unsafe features like tasks and migrations (default: true)"),
45282
+ existingProjectId: exports_external.optional(exports_external.string()).describe("Link to an existing project instead of creating a new one")
45283
+ }, async ({ templateSource, outputPath, projectName, answers, trust, existingProjectId }) => {
45284
+ try {
45285
+ const result = await client.createFromTemplate({
45286
+ templateSource,
45287
+ outputPath,
45288
+ projectName,
45289
+ answers,
45290
+ trust: trust ?? true,
45291
+ existingProjectId
45292
+ });
45293
+ return formatSuccess(result);
45294
+ } catch (err) {
45295
+ return handleToolError(err);
45296
+ }
45297
+ });
45298
+ };
45299
+ var init_copier = __esm(() => {
45300
+ init_zod2();
45301
+ init_utils();
45302
+ });
45303
+
45222
45304
  // cli/src/mcp/tools/notifications.ts
45223
45305
  var registerNotificationTools = (server, client) => {
45224
45306
  server.tool("send_notification", "Send a notification to all enabled notification channels", {
@@ -46689,6 +46771,7 @@ function registerTools(server, client) {
46689
46771
  registerCoreTools(server, client);
46690
46772
  registerTaskTools(server, client);
46691
46773
  registerRepositoryTools(server, client);
46774
+ registerCopierTools(server, client);
46692
46775
  registerNotificationTools(server, client);
46693
46776
  registerExecTools(server, client);
46694
46777
  registerProjectTools(server, client);
@@ -46710,6 +46793,7 @@ var init_tools = __esm(() => {
46710
46793
  init_core5();
46711
46794
  init_tasks();
46712
46795
  init_repositories();
46796
+ init_copier();
46713
46797
  init_notifications();
46714
46798
  init_exec();
46715
46799
  init_projects();
@@ -46744,7 +46828,7 @@ async function runMcpServer(urlOverride, portOverride) {
46744
46828
  const client = new FulcrumClient(urlOverride, portOverride);
46745
46829
  const server = new McpServer({
46746
46830
  name: "fulcrum",
46747
- version: "4.4.4"
46831
+ version: "4.4.6"
46748
46832
  });
46749
46833
  registerTools(server, client);
46750
46834
  const transport = new StdioServerTransport;
@@ -49093,7 +49177,7 @@ var marketplace_default = `{
49093
49177
  "name": "fulcrum",
49094
49178
  "source": "./",
49095
49179
  "description": "Task orchestration for Claude Code",
49096
- "version": "4.4.4",
49180
+ "version": "4.4.6",
49097
49181
  "skills": [
49098
49182
  "./skills/fulcrum"
49099
49183
  ],
@@ -49116,7 +49200,7 @@ var marketplace_default = `{
49116
49200
  var plugin_default = `{
49117
49201
  "name": "fulcrum",
49118
49202
  "description": "Fulcrum task orchestration for Claude Code",
49119
- "version": "4.4.4",
49203
+ "version": "4.4.6",
49120
49204
  "author": {
49121
49205
  "name": "Fulcrum"
49122
49206
  },
@@ -50221,7 +50305,7 @@ function compareVersions(v1, v2) {
50221
50305
  var package_default = {
50222
50306
  name: "@knowsuchagency/fulcrum",
50223
50307
  private: true,
50224
- version: "4.4.4",
50308
+ version: "4.4.6",
50225
50309
  description: "Harness Attention. Orchestrate Agents. Ship.",
50226
50310
  license: "PolyForm-Perimeter-1.0.0",
50227
50311
  type: "module",
@@ -50237,7 +50321,7 @@ var package_default = {
50237
50321
  "db:studio": "drizzle-kit studio"
50238
50322
  },
50239
50323
  dependencies: {
50240
- "@anthropic-ai/claude-agent-sdk": "0.2.49",
50324
+ "@anthropic-ai/claude-agent-sdk": "0.2.50",
50241
50325
  "@atlaskit/pragmatic-drag-and-drop": "^1.7.7",
50242
50326
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0",
50243
50327
  "@azurity/pure-nerd-font": "^3.0.5",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowsuchagency/fulcrum",
3
- "version": "4.4.4",
3
+ "version": "4.4.6",
4
4
  "description": "Harness Attention. Orchestrate Agents. Ship.",
5
5
  "license": "PolyForm-Perimeter-1.0.0",
6
6
  "repository": {