@glie/mcp-polaris 0.6.0 → 0.7.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 (2) hide show
  1. package/dist/index.js +49 -6
  2. package/package.json +15 -4
package/dist/index.js CHANGED
@@ -220,14 +220,19 @@ var TOOLS = [
220
220
  },
221
221
  {
222
222
  name: "polaris.task.create",
223
- description: "Create a task within a milestone. For a marketing CREATIVE (a task in an mkt campaign): channel + format + scheduled_date (the publish day / calendar slot) + platform (if this creative is individually paid).",
223
+ description: "Create a task within a milestone. For a marketing CREATIVE (a task in an mkt campaign): channel + format + scheduled_date (the publish day / calendar slot) + platform (if this creative is individually paid). A CAROUSEL (format=carrossel) also requires `slides` (2..10) \u2014 without it the call is refused, because a carousel with no declared size ships one image.",
224
224
  inputSchema: objSchema({
225
225
  milestone_id: intSchema(),
226
226
  name: strSchema(),
227
227
  description_md: strSchema(),
228
228
  status: strSchema("draft|backlog|dev|test|approval|release (default draft)"),
229
229
  channel: strSchema("mkt: Instagram, TikTok, LinkedIn, \u2026"),
230
- format: strSchema("mkt: post, reel, story, artigo, \u2026"),
230
+ format: strSchema("mkt: post, carrossel, reel, story, artigo, \u2026"),
231
+ slides: intSchema("mkt: REQUIRED when format is a carousel \u2014 how many images the piece has (2..10). " + "It is a contract: the generator delivers exactly this many. Omit for every other format."),
232
+ medium: strSchema("mkt: what the piece IS \u2014 image | video | text. The engine follows it (Codex, Remotion, " + "the writer). A carousel is `image` with slides > 1: only an image has more than one."),
233
+ surface: strSchema("mkt: where it publishes \u2014 feed | stories | reels | shorts | article | newsletter. It is " + "what separates a reel from a story: same medium, same 9:16, different place (and a " + "story is gone in 24h)."),
234
+ aspect: strSchema("mkt: the piece's SHAPE \u2014 1:1 | 4:5 | 9:16 | 16:9 | 2:3. The format says what the piece " + "IS (post, carrossel, reel), this says how it is framed, and they are independent: a " + "carousel can be vertical, a reel can be square. Omit to take the channel's usual one."),
235
+ output_type: strSchema("pr|post|video|email|generic \u2014 the delivery medium. Omit it: the format decides (reel/v\xEDdeo/short \u2192 video). Only pass it to override."),
231
236
  scheduled_date: strSchema("mkt: publish day (ISO date) \u2014 the calendar slot"),
232
237
  platform: strSchema("mkt: ad platform if this creative is individually paid"),
233
238
  asset_url: strSchema("mkt: URL of the produced creative asset (image/video) for the reviewer")
@@ -241,7 +246,8 @@ var TOOLS = [
241
246
  id: intSchema(),
242
247
  name: strSchema(),
243
248
  description_md: strSchema("full markdown brief; replaces the current description"),
244
- asset_url: strSchema("mkt: URL of the produced creative asset (image/video) for the reviewer")
249
+ asset_url: strSchema("mkt: URL of the produced creative asset (image/video) for the reviewer"),
250
+ output_type: strSchema("pr|post|video|email|generic \u2014 fix the delivery medium of a task filed with the wrong one (it routes the worker to the video or the image pipeline).")
245
251
  }, ["id"]),
246
252
  call: async (args) => {
247
253
  const body = {};
@@ -251,6 +257,8 @@ var TOOLS = [
251
257
  body.description_md = args.description_md;
252
258
  if (typeof args.asset_url === "string")
253
259
  body.asset_url = args.asset_url;
260
+ if (typeof args.output_type === "string")
261
+ body.output_type = args.output_type;
254
262
  return (await apiCall("PATCH", `/api/tasks/${args.id}`, body)).body;
255
263
  }
256
264
  },
@@ -262,10 +270,28 @@ var TOOLS = [
262
270
  },
263
271
  {
264
272
  name: "polaris.task.approve",
265
- description: "The human review gate: approve a task in `approval` \u2192 it advances toward release. Human-only. To ship several approval tasks of one milestone together, group them into a stack and use polaris.stack.release instead.",
273
+ description: "The human review gate: approve a dev task in `approval` \u2192 it advances toward release. Human-only. NOT valid for mkt creatives (output_type=post/video/etc.) \u2014 use polaris.task.schedule or polaris.task.mark_published instead. To ship several approval tasks together, group them into a stack and use polaris.stack.release.",
266
274
  inputSchema: objSchema({ id: intSchema() }, ["id"]),
267
275
  call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/approve`)).body
268
276
  },
277
+ {
278
+ name: "polaris.task.schedule",
279
+ description: "Schedule a mkt creative for publication: approval \u2192 agendado. The creative must be bound to an active social account (resolved from its market + channel) and have a publish_at in the future. Its copy is frozen while scheduled \u2014 editing it requires unscheduling first.",
280
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
281
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/schedule`)).body
282
+ },
283
+ {
284
+ name: "polaris.task.unschedule",
285
+ description: "Unschedule a mkt creative: agendado \u2192 approval. Refused once the post is live. The creative returns to approval for edits or re-scheduling.",
286
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
287
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/unschedule`)).body
288
+ },
289
+ {
290
+ name: "polaris.task.mark_published",
291
+ description: "Manually mark a mkt creative as published: approval \u2192 release (bypasses scheduling). Recorded as a manual human action. Use when the post was published outside the scheduler.",
292
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
293
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/mark-published`)).body
294
+ },
269
295
  {
270
296
  name: "polaris.task.dep_add",
271
297
  description: "Add a dependency edge (cycle-checked).",
@@ -529,11 +555,10 @@ var TOOLS = [
529
555
  },
530
556
  {
531
557
  name: "polaris.project.update",
532
- description: "Update a project (human-only): repo_url, description_md, name, status (active|paused|archived), owner_human_id.",
558
+ description: "Update a project (human-only): repo_url, name, status (active|paused|archived), owner_human_id. Brand/context live in the CLAUDE.md \u2014 use polaris.project.claude_md_set.",
533
559
  inputSchema: objSchema({
534
560
  key: strSchema("project key"),
535
561
  name: strSchema(),
536
- description_md: strSchema(),
537
562
  repo_url: strSchema("github.com repo URL"),
538
563
  status: strSchema("active|paused|archived"),
539
564
  owner_human_id: intSchema()
@@ -609,6 +634,24 @@ var TOOLS = [
609
634
  ]),
610
635
  call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/claude-login/code`, { code: args.code })).body
611
636
  },
637
+ {
638
+ name: "polaris.agent.claude_logout",
639
+ description: "Log an agent out of Claude (human-only): deletes its stored credentials and clears the login. Use when claude_login_status is 'expired' to force a clean re-login.",
640
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
641
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/claude-login/logout`)).body
642
+ },
643
+ {
644
+ name: "polaris.agent.codex_login",
645
+ description: "Kick off a generator agent's Codex device-login (human-only). Poll agent.get for codex_login_url, then approve it in the browser \u2014 no code to paste back.",
646
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
647
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/codex-login`)).body
648
+ },
649
+ {
650
+ name: "polaris.agent.codex_logout",
651
+ description: "Log an agent out of Codex (human-only): deletes its stored auth and clears the login. Use when codex_login_status is 'expired' to force a clean re-login.",
652
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
653
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/codex-login/logout`)).body
654
+ },
612
655
  {
613
656
  name: "polaris.milestone.create",
614
657
  description: "Create a milestone. team=dev|mkt; end_date = deadline (ISO date, required). For a marketing CAMPAIGN (team=mkt) these extra fields carry the plan: market (BR/US/EU), cadence (per-channel rules Discovery expands into dated creatives), max_creatives (cap on that expansion), and paid + platforms + budget for a paid campaign.",
package/package.json CHANGED
@@ -1,14 +1,18 @@
1
1
  {
2
2
  "name": "@glie/mcp-polaris",
3
- "version": "0.6.0",
4
- "description": "Model Context Protocol (stdio) server exposing Polaris — glie's ops platform — as native tools in Claude Code and any MCP client.",
3
+ "version": "0.7.0",
4
+ "description": "Model Context Protocol (stdio) server exposing Polaris \u2014 glie's ops platform \u2014 as native tools in Claude Code and any MCP client.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "glie <carlos@glie.ai>",
7
7
  "type": "module",
8
8
  "bin": {
9
9
  "mcp-polaris": "dist/index.js"
10
10
  },
11
- "files": ["dist", "README.md", "LICENSE"],
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
12
16
  "engines": {
13
17
  "node": ">=18"
14
18
  },
@@ -21,7 +25,14 @@
21
25
  "directory": "packages/mcp-polaris"
22
26
  },
23
27
  "homepage": "https://polaris.glie.ai",
24
- "keywords": ["mcp", "model-context-protocol", "claude", "claude-code", "polaris", "glie"],
28
+ "keywords": [
29
+ "mcp",
30
+ "model-context-protocol",
31
+ "claude",
32
+ "claude-code",
33
+ "polaris",
34
+ "glie"
35
+ ],
25
36
  "scripts": {
26
37
  "build": "bun run build.ts",
27
38
  "prepublishOnly": "bun run build.ts"