agenthub-multiagent-mcp 1.26.1 → 1.27.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.
@@ -1977,6 +1977,110 @@ export function registerTools() {
1977
1977
  required: ["project_id", "tour_id"],
1978
1978
  },
1979
1979
  },
1980
+ // ── Product Roadmap (add-product-roadmap §1.5) ──
1981
+ {
1982
+ name: "roadmap_get",
1983
+ description: "Read the per-project Product Roadmap. Returns the live view (or the latest snapshot when audience+full is requested via the dashboard share path). Defaults: audience=full (org-member only), format=json. Set format='markdown' for a CommonMark render suitable for emails, brain notes, A2A replies.",
1984
+ inputSchema: {
1985
+ type: "object",
1986
+ properties: {
1987
+ project_id: { type: "string", description: "Project ID" },
1988
+ audience: {
1989
+ type: "string",
1990
+ enum: ["investor", "leadership", "customer", "product"],
1991
+ description: "Audience filter. Omit for the full (unfiltered) view. Phase 1 returns the full view regardless; Phase 3 enforces filtering.",
1992
+ },
1993
+ format: {
1994
+ type: "string",
1995
+ enum: ["json", "markdown"],
1996
+ description: "Output format (default json)",
1997
+ },
1998
+ },
1999
+ required: ["project_id"],
2000
+ },
2001
+ },
2002
+ {
2003
+ name: "roadmap_set_field",
2004
+ description: "Upsert one Product Roadmap field with source='manual'. value is JSON-encoded by the caller (e.g. \"\\\"4.2L\\\"\", \"9\", '{\"caption\":\"Payments\"}'). Sensitive sections (snapshot.finance.*, snapshot.partners.*) require the roadmap_admin role.",
2005
+ inputSchema: {
2006
+ type: "object",
2007
+ properties: {
2008
+ project_id: { type: "string", description: "Project ID" },
2009
+ section: {
2010
+ type: "string",
2011
+ description: "Section id, e.g. 'snapshot.finance', 'shipped', 'timeline', 'commentary.highlights'",
2012
+ },
2013
+ key: {
2014
+ type: "string",
2015
+ description: "Field key within the section (e.g. 'mrr', 'runway_months', an openspec change id, a partner slug). May be empty for singleton sections.",
2016
+ },
2017
+ value: {
2018
+ type: "string",
2019
+ description: "JSON-encoded value. Strings: '\"...\"'. Numbers: '42'. Objects: '{\"k\":\"v\"}'.",
2020
+ },
2021
+ sensitive: {
2022
+ type: "boolean",
2023
+ description: "Mark this entry as sensitive (stripped from customer/public renderers in Phase 3).",
2024
+ },
2025
+ },
2026
+ required: ["project_id", "section", "value"],
2027
+ },
2028
+ },
2029
+ {
2030
+ name: "roadmap_publish_snapshot",
2031
+ description: "Freeze the current roadmap into an immutable snapshot. Returns { id, slug, project_id, audience, created_at }. Phase 3 publishes one snapshot per audience under the same per-day slug; Phase 1 publishes one (audience-agnostic) snapshot per call.",
2032
+ inputSchema: {
2033
+ type: "object",
2034
+ properties: {
2035
+ project_id: { type: "string", description: "Project ID" },
2036
+ audience: {
2037
+ type: "string",
2038
+ enum: ["investor", "leadership", "customer", "product"],
2039
+ description: "Audience to stamp on the snapshot. Omit for full view.",
2040
+ },
2041
+ },
2042
+ required: ["project_id"],
2043
+ },
2044
+ },
2045
+ {
2046
+ name: "roadmap_add_evidence",
2047
+ description: "Attach an evidence row to a roadmap entry (drill-down surface). kind is one of openspec | pr | brain | task | pdf | sheet | url | note. (entry_id, kind, ref) is idempotent — duplicates return the existing row.",
2048
+ inputSchema: {
2049
+ type: "object",
2050
+ properties: {
2051
+ project_id: { type: "string", description: "Project ID" },
2052
+ entry_id: { type: "string", description: "Roadmap entry id (from roadmap_get)" },
2053
+ kind: {
2054
+ type: "string",
2055
+ enum: ["openspec", "pr", "brain", "task", "pdf", "sheet", "url", "note"],
2056
+ },
2057
+ ref: { type: "string", description: "Reference (URL, openspec id, brain knowledge id, etc.)" },
2058
+ label: { type: "string", description: "Optional human label" },
2059
+ sort_order: { type: "number", description: "Optional sort hint" },
2060
+ },
2061
+ required: ["project_id", "entry_id", "kind", "ref"],
2062
+ },
2063
+ },
2064
+ {
2065
+ name: "roadmap_share_to_slack",
2066
+ description: "One-click share: publish a snapshot, mint a public share token, render Slack Block Kit, post to the channel. Returns { snapshot_id, slug, share_token, permalink, delivered }.",
2067
+ inputSchema: {
2068
+ type: "object",
2069
+ properties: {
2070
+ project_id: { type: "string", description: "Project ID" },
2071
+ channel: {
2072
+ type: "string",
2073
+ description: "Slack channel (e.g. #leadership). Empty = notifier default.",
2074
+ },
2075
+ audience: {
2076
+ type: "string",
2077
+ enum: ["investor", "leadership", "customer", "product"],
2078
+ description: "Audience filter applied before render.",
2079
+ },
2080
+ },
2081
+ required: ["project_id"],
2082
+ },
2083
+ },
1980
2084
  // ── Secrets Vault ──
1981
2085
  {
1982
2086
  name: "secret_set",
@@ -3787,6 +3891,72 @@ export async function handleToolCall(name, args, client, context) {
3787
3891
  const projectId = args.project_id;
3788
3892
  return client.del(`/projects/${projectId}/features/tours/${args.tour_id}`);
3789
3893
  }
3894
+ // ── Product Roadmap (add-product-roadmap §1.5) ──
3895
+ case "roadmap_get": {
3896
+ const projectId = args.project_id;
3897
+ if (!projectId)
3898
+ throw new Error("project_id is required");
3899
+ const audience = args.audience || "";
3900
+ const format = (args.format || "json").toLowerCase();
3901
+ const query = new URLSearchParams();
3902
+ if (format)
3903
+ query.set("format", format);
3904
+ if (audience)
3905
+ query.set("audience", audience);
3906
+ const suffix = query.toString() ? `?${query.toString()}` : "";
3907
+ return client.get(`/projects/${projectId}/roadmap${suffix}`);
3908
+ }
3909
+ case "roadmap_set_field": {
3910
+ const projectId = args.project_id;
3911
+ if (!projectId)
3912
+ throw new Error("project_id is required");
3913
+ const section = args.section;
3914
+ if (!section)
3915
+ throw new Error("section is required");
3916
+ const body = {
3917
+ section,
3918
+ key: args.key || "",
3919
+ value: args.value ?? "",
3920
+ };
3921
+ if (args.sensitive !== undefined)
3922
+ body.sensitive = !!args.sensitive;
3923
+ return client.put(`/projects/${projectId}/roadmap/entries`, body);
3924
+ }
3925
+ case "roadmap_publish_snapshot": {
3926
+ const projectId = args.project_id;
3927
+ if (!projectId)
3928
+ throw new Error("project_id is required");
3929
+ const body = {};
3930
+ if (args.audience)
3931
+ body.audience = args.audience;
3932
+ return client.post(`/projects/${projectId}/roadmap/snapshots`, body);
3933
+ }
3934
+ case "roadmap_add_evidence": {
3935
+ const projectId = args.project_id;
3936
+ const entryId = args.entry_id;
3937
+ if (!projectId || !entryId)
3938
+ throw new Error("project_id and entry_id are required");
3939
+ const body = {
3940
+ kind: args.kind,
3941
+ ref: args.ref,
3942
+ };
3943
+ if (args.label !== undefined)
3944
+ body.label = args.label;
3945
+ if (args.sort_order !== undefined)
3946
+ body.sort_order = args.sort_order;
3947
+ return client.post(`/projects/${projectId}/roadmap/entries/${entryId}/evidence`, body);
3948
+ }
3949
+ case "roadmap_share_to_slack": {
3950
+ const projectId = args.project_id;
3951
+ if (!projectId)
3952
+ throw new Error("project_id is required");
3953
+ const body = {};
3954
+ if (args.channel !== undefined)
3955
+ body.channel = args.channel;
3956
+ if (args.audience !== undefined)
3957
+ body.audience = args.audience;
3958
+ return client.post(`/projects/${projectId}/roadmap/share/slack`, body);
3959
+ }
3790
3960
  // ── Capabilities (add-agent-capabilities Phase 2 §2.3) ──
3791
3961
  case "capability_list": {
3792
3962
  if (!agentId) {