@extenshi/mcp 0.18.1 → 0.21.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 (47) hide show
  1. package/README.md +4 -2
  2. package/dist/bff.d.ts +10 -0
  3. package/dist/bff.d.ts.map +1 -1
  4. package/dist/bff.js +1 -0
  5. package/dist/bff.js.map +1 -1
  6. package/dist/build-map-store.d.ts +123 -0
  7. package/dist/build-map-store.d.ts.map +1 -0
  8. package/dist/build-map-store.js +347 -0
  9. package/dist/build-map-store.js.map +1 -0
  10. package/dist/build-map-summary.d.ts +29 -0
  11. package/dist/build-map-summary.d.ts.map +1 -0
  12. package/dist/build-map-summary.js +30 -0
  13. package/dist/build-map-summary.js.map +1 -0
  14. package/dist/development-guide.d.ts +39 -22
  15. package/dist/development-guide.d.ts.map +1 -1
  16. package/dist/development-guide.js +32 -2
  17. package/dist/development-guide.js.map +1 -1
  18. package/dist/index.js +4 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/pin-guide-kit.d.ts +94 -0
  21. package/dist/pin-guide-kit.d.ts.map +1 -0
  22. package/dist/pin-guide-kit.js +341 -0
  23. package/dist/pin-guide-kit.js.map +1 -0
  24. package/dist/pin-guide-strings.d.ts +67 -0
  25. package/dist/pin-guide-strings.d.ts.map +1 -0
  26. package/dist/pin-guide-strings.js +349 -0
  27. package/dist/pin-guide-strings.js.map +1 -0
  28. package/dist/pin-guide-tool.d.ts +32 -0
  29. package/dist/pin-guide-tool.d.ts.map +1 -0
  30. package/dist/pin-guide-tool.js +132 -0
  31. package/dist/pin-guide-tool.js.map +1 -0
  32. package/dist/pin-guide.d.ts +102 -0
  33. package/dist/pin-guide.d.ts.map +1 -0
  34. package/dist/pin-guide.js +448 -0
  35. package/dist/pin-guide.js.map +1 -0
  36. package/dist/tools.d.ts +12 -1
  37. package/dist/tools.d.ts.map +1 -1
  38. package/dist/tools.js +141 -21
  39. package/dist/tools.js.map +1 -1
  40. package/dist/uninstall-form-tools.d.ts +1 -0
  41. package/dist/uninstall-form-tools.d.ts.map +1 -1
  42. package/dist/uninstall-form-tools.js +33 -0
  43. package/dist/uninstall-form-tools.js.map +1 -1
  44. package/dist/welcome-agent-brief.d.ts.map +1 -1
  45. package/dist/welcome-agent-brief.js +5 -0
  46. package/dist/welcome-agent-brief.js.map +1 -1
  47. package/package.json +2 -2
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `buildMap` in the local server's create_project and get_project_state answers
3
+ * (plan 2026-11-03-extension-build-map §6.7): whether the author's build map is
4
+ * open, its address, and how offering it went. Read from the same home and the
5
+ * same server record the CLI uses (build-map-store.ts, a copy of the CLI's), so
6
+ * every agent, from any git worktree of the project, sees the one map there is.
7
+ *
8
+ * Local only. The hosted connector has no access to the author's files and
9
+ * registers the tools without `readBuildMap`, so the field is absent there.
10
+ * Reading never starts a server and never writes the state file.
11
+ */
12
+ export type BuildMapSummary = {
13
+ /** A map server for this project answers on this machine. */
14
+ running: boolean;
15
+ /** The page while it runs; `#node=<step>` opens one step. */
16
+ url?: string;
17
+ /** The author has been asked about the map at least once. */
18
+ offered: boolean;
19
+ /** The author's latest answer was no, and no map runs. */
20
+ declined: boolean;
21
+ /** How many times the author answered the offer, yes or no. */
22
+ offers: number;
23
+ /** The project directory whose `.extenshi/` holds the map: the main checkout when the given one is a linked git worktree. */
24
+ home: string;
25
+ /** Why the state file could not be read, when it exists but could not. */
26
+ problem?: string;
27
+ };
28
+ export declare function readBuildMapSummary(dir: string): Promise<BuildMapSummary>;
29
+ //# sourceMappingURL=build-map-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-map-summary.d.ts","sourceRoot":"","sources":["../src/build-map-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,MAAM,eAAe,GAAG;IAC7B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAA;IAChB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAA;IACjB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAA;IACd,6HAA6H;IAC7H,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB/E"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `buildMap` in the local server's create_project and get_project_state answers
3
+ * (plan 2026-11-03-extension-build-map §6.7): whether the author's build map is
4
+ * open, its address, and how offering it went. Read from the same home and the
5
+ * same server record the CLI uses (build-map-store.ts, a copy of the CLI's), so
6
+ * every agent, from any git worktree of the project, sees the one map there is.
7
+ *
8
+ * Local only. The hosted connector has no access to the author's files and
9
+ * registers the tools without `readBuildMap`, so the field is absent there.
10
+ * Reading never starts a server and never writes the state file.
11
+ */
12
+ import { probeServer, readMapState, resolveMapHome } from './build-map-store.js';
13
+ export async function readBuildMapSummary(dir) {
14
+ const where = await resolveMapHome(dir);
15
+ const [read, server] = await Promise.all([readMapState(where.home), probeServer(where.home)]);
16
+ const { offer } = read.state;
17
+ const declinedAt = Date.parse(offer.declinedAt ?? '');
18
+ const acceptedAt = Date.parse(offer.acceptedAt ?? '');
19
+ return {
20
+ running: Boolean(server),
21
+ ...(server ? { url: server.url } : {}),
22
+ offered: offer.count > 0 || Boolean(offer.offeredAt ?? offer.acceptedAt ?? offer.declinedAt),
23
+ // A map the author opened after saying no (acceptedAt later, or a server up now) is not declined.
24
+ declined: !server && Number.isFinite(declinedAt) && !(acceptedAt > declinedAt),
25
+ offers: offer.count,
26
+ home: where.home,
27
+ ...(read.problem ? { problem: read.problem } : {}),
28
+ };
29
+ }
30
+ //# sourceMappingURL=build-map-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-map-summary.js","sourceRoot":"","sources":["../src/build-map-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAmBhF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACpD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;IACrD,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;QAC5F,kGAAkG;QAClG,QAAQ,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9E,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAA;AACF,CAAC"}
@@ -69,9 +69,9 @@ export declare const DEVELOPMENT_SERVICES: readonly [{
69
69
  }, {
70
70
  readonly id: "onboarding";
71
71
  readonly purpose: "Welcome page, pin guide, install instructions and uninstall survey, with verified URLs wired into the extension.";
72
- readonly tools: readonly ["generate_welcome_page_workflow", "get_project_state", "get_install_instructions", "publish_install_instructions", "unpublish_install_instructions", "get_page_translations", "set_page_translations", "list_uninstall_forms", "get_uninstall_form", "update_uninstall_form", "preview_uninstall_form", "find_brand_mentions"];
73
- readonly access: "Free welcome-page specification. Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).";
74
- readonly urls: readonly [string, string, string, string, string, string, string, string];
72
+ readonly tools: readonly ["generate_welcome_page_workflow", "generate_pin_guide", "get_project_state", "get_install_instructions", "publish_install_instructions", "unpublish_install_instructions", "get_page_translations", "set_page_translations", "list_uninstall_forms", "get_uninstall_form", "update_uninstall_form", "preview_uninstall_form", "list_uninstall_responses", "find_brand_mentions"];
73
+ readonly access: "Free welcome-page specification and pin guide kit (generate_pin_guide: offline SVG, CSP-safe HTML and chrome.i18n captions in 11 languages for a welcome page bundled in the extension). Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. Its answers are read with list_uninstall_responses (project.read): newest first, filtered by version and date, with counts by reason and version and the uninstalls that reached the page; the email a person left is returned to an API key only. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).";
74
+ readonly urls: readonly [string, string, string, string, string, string, string, string, string];
75
75
  }, {
76
76
  readonly id: "listing-and-marketing";
77
77
  readonly purpose: "Listing copy, screenshots, landing page, support links and AI discovery assets.";
@@ -93,7 +93,7 @@ export declare const DEVELOPMENT_SERVICES: readonly [{
93
93
  }, {
94
94
  readonly id: "maintenance";
95
95
  readonly purpose: "Listing claims, finding responses, reviews and uninstall feedback, policy updates and ongoing releases.";
96
- readonly tools: readonly ["get_reviews", "get_security", "get_project_state"];
96
+ readonly tools: readonly ["get_reviews", "get_security", "get_project_state", "list_uninstall_responses"];
97
97
  readonly access: "Catalog reads are metered. Ownership, declarations, responses, badges and feedback management live in the cabinet and depend on account access.";
98
98
  readonly urls: readonly [string, string, string, string, string];
99
99
  }, {
@@ -104,7 +104,7 @@ export declare const DEVELOPMENT_SERVICES: readonly [{
104
104
  readonly urls: readonly [string, "https://dojo.extenshi.io/payments"];
105
105
  }];
106
106
  /** Top-level sections of the full guide, selectable via the `sections` parameter. */
107
- export declare const GUIDE_SECTIONS: readonly ["tools", "localActions", "services", "repository", "workflow", "handoff", "storeMedia"];
107
+ export declare const GUIDE_SECTIONS: readonly ["tools", "localActions", "services", "repository", "workflow", "buildMap", "handoff", "storeMedia"];
108
108
  export type GuideSection = (typeof GUIDE_SECTIONS)[number];
109
109
  declare function buildSections(registeredTools: readonly GuideTool[]): {
110
110
  tools: {
@@ -123,85 +123,85 @@ declare function buildSections(registeredTools: readonly GuideTool[]): {
123
123
  docs: string;
124
124
  }[];
125
125
  services: ({
126
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
126
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
127
127
  id: "documentation";
128
128
  purpose: "Capabilities, extension shapes, exact CLI commands and reusable skill packages.";
129
129
  access: "Free reference; no API key. Hosted transport still requires connector sign-in.";
130
130
  urls: readonly [string, string, string];
131
131
  } | {
132
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
132
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
133
133
  id: "account";
134
134
  purpose: "Sign-in, API keys for local tools, credit-pool balances ahead of paid work and where a proposed change (a pending_approval response) stands.";
135
135
  access: "Balance lookup and get_approval are free and require identity; get_approval reads only the signed-in account’s own proposals. Catalog reads and scans use credit pools.";
136
136
  urls: readonly [string, "https://dojo.extenshi.io/api-keys", "https://dojo.extenshi.io/billing"];
137
137
  } | {
138
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
138
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
139
139
  id: "research";
140
140
  purpose: "Demand, competitors, user complaints, permissions and existing security findings.";
141
141
  access: "Identity required. Catalog tools cost 1 read per call; get_security costs 3. Bulk risk: up to 40 per call. Chrome review text is unavailable; its aggregate rating is available.";
142
142
  urls: readonly [string, "https://catalog.extenshi.io"];
143
143
  } | {
144
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
144
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
145
145
  id: "projects";
146
146
  purpose: "Existing projects: selected browser types, manifests, repository binding, saved tool state, hosted URLs and starter files.";
147
147
  access: "Own-project MCP reads are free and require identity. Projects are created in the cabinet or with create_project (idempotent, project.write). Owner decisions (AMO add-on id, license, seller identity, pricing, targets) are proposed by agents and decided only by the owner in the cabinet; release readiness reports undecided ones as blockers. Repository metadata, source/built manifests and scope synchronize through typed revisioned patches. project.write, evidence.write and hosted.write require explicit OAuth consent. Repository metadata does not grant GitHub access. CI evidence (source=ci) is written only by the verified ingest endpoint, which authenticates with a secret from create_ci_ingest_secret. Automated release-readiness access requires a Pro project.";
148
148
  urls: readonly [string, "https://dojo.extenshi.io/projects", "https://dojo.extenshi.io/integrations"];
149
149
  } | {
150
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
150
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
151
151
  id: "manifest";
152
152
  purpose: "Minimum permissions, target browsers and manifest entries, with every referenced file present.";
153
153
  access: "Free template reference; project reads require identity. The cabinet also has a manifest editor.";
154
154
  urls: readonly [string, string];
155
155
  } | {
156
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
156
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
157
157
  id: "localization";
158
158
  purpose: "Translation of the extension’s own messages (local _locales files) and of the text stored on Extenshi: Pay offers, license terms, privacy policy, hosted pages and the landing page.";
159
159
  access: "localize_workflow is a free static reference for the local _locales files only; local CLI validation requires no key or Extenshi credits, and translation uses the developer's own provider. Text stored on Extenshi is listed in get_project_state `localization`: every surface with missing and outdated counts per language and fixWith (its read and write tool); Pay surfaces need pay.read. Offer `features` are entitlement keys and stay untranslated.";
160
160
  urls: readonly [string];
161
161
  } | {
162
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
162
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
163
163
  id: "icons";
164
164
  purpose: "SVG icon design, toolbar-size preview and store-asset export with the local CLI.";
165
165
  access: "Free. Drawing, browser preview and file export happen locally; the cabinet offers its own icon generator subject to availability and credits.";
166
166
  urls: readonly [string, string];
167
167
  } | {
168
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
168
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
169
169
  id: "privacy";
170
170
  purpose: "A policy that reflects actual data practices: generated and exported, or hosted with version history.";
171
171
  access: "Hosted policy tools require an owned Pro project. Version reads spend no credit; AI updates have a per-project daily limit. publish_privacy_policy changes the live page. The browser generator supports export. The English policy (and Pay license terms) is the binding text at the base URL; translated copies for the project’s languages live at <url>/<locale> with a notice linking to the English original — Extenshi translates its template text, the developer translates edited sections and free-text answers with get_legal_translations / set_legal_translations.";
172
172
  urls: readonly [string, string, string];
173
173
  } | {
174
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
174
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
175
175
  id: "onboarding";
176
176
  purpose: "Welcome page, pin guide, install instructions and uninstall survey, with verified URLs wired into the extension.";
177
- access: "Free welcome-page specification. Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).";
178
- urls: readonly [string, string, string, string, string, string, string, string];
177
+ access: "Free welcome-page specification and pin guide kit (generate_pin_guide: offline SVG, CSP-safe HTML and chrome.i18n captions in 11 languages for a welcome page bundled in the extension). Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. Its answers are read with list_uninstall_responses (project.read): newest first, filtered by version and date, with counts by reason and version and the uninstalls that reached the page; the email a person left is returned to an API key only. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).";
178
+ urls: readonly [string, string, string, string, string, string, string, string, string];
179
179
  } | {
180
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
180
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
181
181
  id: "listing-and-marketing";
182
182
  purpose: "Listing copy, screenshots, landing page, support links and AI discovery assets.";
183
183
  access: "The landing-page generator is free and offline: it returns static HTML (CLI: extenshi page generate). Schema v2 (schemaVersion 2) makes it a full homepage: ordered sections (hero, about, features, screenshots, how-it-works, pricing bound to Pay offers by SKU, FAQ with FAQPage JSON-LD, attributed testimonials only, store badges, changelog, links), theme tokens from allowlists, SEO/OG fields, per-locale pages with hreflang, and llms.txt — all declarative, no HTML or JS. draft_landing_page (project.read; CLI: extenshi page draft) builds a v2 form from project state and lists what it could not fill; preview_landing_page (CLI: extenshi page preview) validates and renders exactly what publish would serve, with a path and fix per problem. The same page can be hosted by Extenshi at page.extenshi.io/{code} with publish_landing_page (identity and hosted.write; CLI: extenshi page publish), which also registers it as the project homepage; every publish is a version (list_landing_page_versions / rollback_landing_page; CLI: extenshi page versions / rollback). A custom domain (Pro, one per project; set/verify/get/remove_custom_domain, CLI: extenshi domain add|verify|status|remove) serves the homepage at the domain root after a TXT ownership check and an HTTPS certificate, and switches its canonical and HOMEPAGE_URL; ownership is re-checked every 6 hours and a domain that loses its TXT record is suspended; images there are store screenshots, Dojo uploads or files uploaded with upload_project_media (hosted.write; CLI: extenshi media upload, or page publish --upload-local) to the project's public media store. Store screenshots per locale come from CLI extenshi screenshots and listing artwork from CLI extenshi icon store-assets (formats and sizes: guide section storeMedia). A page hosted elsewhere on HTTPS is registered with upsert_hosted_page (CLI: extenshi page register). The registered homepage feeds HOMEPAGE_URL. Listing copy and store-risk review are covered by CLI generate-listing / review-risk and cabinet tools where enabled. MCP has no listing or SEO execution tool.";
184
184
  urls: readonly [string, string, string, string, string, string];
185
185
  } | {
186
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
186
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
187
187
  id: "verification-and-ci";
188
188
  purpose: "Reproducible per-browser packages, installed smoke tests of the exact package in Chromium, Edge and Firefox, store-risk review, final package scan, and release evidence recorded from those results.";
189
189
  access: "Local CLI, free: `extenshi package <dir> --browser chrome,edge,firefox` writes byte-reproducible zips plus extenshi-packages.json (sha256 per browser; refuses a placeholder Firefox add-on ID; --fix-war expands wildcard web_accessible_resources). `extenshi test smoke <zip|extenshi-packages.json> --browser chromium|edge|firefox --json` installs that exact zip and checks service worker/background start, manifest errors and console errors on popup/options pages (Playwright for Chromium/Edge, any Firefox binary). `extenshi test run <zip|extenshi-packages.json> --browser chromium|edge|firefox [--scenario <file>] --json` runs the scenarios of extenshi.tests.json against that exact zip and prints one extenshi.test-cell result (Firefox runs only open, wait, waitSettle and expectNoConsoleError so far). `extenshi test scenarios draft <package>` presses up to 6 labelled controls per extension page, writes the control inventory to .extenshi/recon.json and evidence-quoted scenarios to extenshi.tests.draft.json; `extenshi test scenarios prompt <package>` prints a brief from which a coding agent writes extenshi.tests.agent.json plus extenshi.tests.agent.md with a mandatory \"Not checked and why\" section; `extenshi test scenarios migrate` turns a scenes.json into extenshi.tests.json. Drafted and agent-written scenarios run as not written by the author (evidence required, no eval or init, destructive-looking controls refused) until the author copies them into extenshi.tests.json. `--evidence` on scan, review-risk, generate-listing, test smoke and screenshots records scan / permissions / listing (per locale) / installed / screenshots (per locale and store) evidence for the project bound with `extenshi project bind` (advisory listing findings stay passed and are listed in the evidence summary); release prepare accepts extenshi-packages.json. Scan requires an API key and spends 1 scan credit. CI: the scaffold writes .github/workflows/extenshi-verify.yml and extenshi-evidence.yml; CI-sourced evidence arrives through `extenshi evidence ingest` with the create_ci_ingest_secret secret.";
190
190
  urls: readonly [string, string, string];
191
191
  } | {
192
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
192
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
193
193
  id: "publishing";
194
194
  purpose: "Store credential validation, submission of the exact tested package to Chrome Web Store, Firefox Add-ons and/or Edge Add-ons, and verification of review status and the public listing.";
195
195
  access: string;
196
196
  urls: readonly [string, string, string, string, string];
197
197
  } | {
198
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
198
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
199
199
  id: "maintenance";
200
200
  purpose: "Listing claims, finding responses, reviews and uninstall feedback, policy updates and ongoing releases.";
201
201
  access: "Catalog reads are metered. Ownership, declarations, responses, badges and feedback management live in the cabinet and depend on account access.";
202
202
  urls: readonly [string, string, string, string, string];
203
203
  } | {
204
- toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
204
+ toolsInThisConnection: ("list_pay_apps" | "create_pay_app" | "get_pay_app" | "get_pay_readiness" | "get_pay_payment_evidence" | "link_pay_app" | "unlink_pay_app" | "archive_pay_app" | "export_pay_data" | "get_pay_seller" | "connect_pay_seller" | "refresh_pay_seller" | "set_pay_seller_profile" | "upsert_pay_offer" | "archive_pay_offer" | "get_pay_offer_translations" | "set_pay_offer_translations" | "set_pay_enabled" | "rotate_pay_key" | "get_development_guide" | "search_docs" | "list_extension_templates" | "get_credit_balance" | "connection_diagnostics" | "get_approval" | "search_extensions" | "get_extension" | "get_reviews" | "get_security" | "get_risk_by_store_ids" | "market_overview" | "list_my_projects" | "create_project" | "get_project_state" | "get_project_scaffold" | "get_decisions" | "propose_decision" | "get_project_workspace" | "import_manifest" | "diff_project_state" | "apply_project_patch" | "record_project_evidence" | "create_ci_ingest_secret" | "upsert_hosted_page" | "verify_hosted_artifact" | "remove_hosted_page" | "list_hosted_pages" | "get_release_readiness" | "localize_workflow" | "get_legal_translations" | "set_legal_translations" | "get_page_translations" | "set_page_translations" | "generate_icon_workflow" | "list_privacy_policy_versions" | "get_privacy_policy_version" | "update_privacy_policy_with_ai" | "publish_privacy_policy" | "generate_welcome_page_workflow" | "generate_pin_guide" | "get_install_instructions" | "publish_install_instructions" | "unpublish_install_instructions" | "list_uninstall_forms" | "get_uninstall_form" | "update_uninstall_form" | "preview_uninstall_form" | "list_uninstall_responses" | "find_brand_mentions" | "generate_landing_page" | "draft_landing_page" | "preview_landing_page" | "publish_landing_page" | "get_landing_page" | "list_landing_page_versions" | "rollback_landing_page" | "unpublish_landing_page" | "get_custom_domain" | "set_custom_domain" | "verify_custom_domain" | "remove_custom_domain" | "upload_project_media" | "scan_extension" | "publish_extension" | "get_license_terms_questionnaire" | "draft_license_terms" | "get_license_terms" | "save_license_terms_draft" | "request_license_terms_publication" | "publish_license_terms" | "verify_license_terms_live" | "rollback_license_terms")[];
205
205
  id: "monetization";
206
206
  purpose: "Optional paid-feature integration: seller setup, offers, checkout, signed entitlements and purchase verification.";
207
207
  access: "Pay applications work independently of development projects. Explicit pay.read/pay.write permission is required; older connections and API keys have no Pay grant. The exceptions are get_license_terms_questionnaire and draft_license_terms: they need only project read access because they return the questions and an unsaved draft built from the answers in the call, not saved answers or Pay state. The saved terms are read with get_license_terms (pay.read) and saved with save_license_terms_draft (pay.write); the seller identity answers stay the owner’s. Publication goes through the owner: request_license_terms_publication returns an approval link, and the owner’s approval can also decide seller.terms. Only a developer key with the separate pay.legal.publish permission publishes directly (publish_license_terms, not on the hosted connector). verify_license_terms_live checks the page, the paywall links and the seller.terms decision; rollback_license_terms brings an earlier version back the same two ways. Readiness (get_pay_readiness) and the actual SDK distribution determine whether integration is possible. The author completes the seller agreement and Stripe KYC in the browser. Checkout is enabled only after offers and profile are configured, and only with explicit authorization. Registration does not prove production deployment or npm publication.";
@@ -242,7 +242,7 @@ declare function buildSections(registeredTools: readonly GuideTool[]): {
242
242
  }, {
243
243
  readonly id: "assets-and-hosted-pages";
244
244
  readonly actions: "Stage 6 — Assets and hosted pages: icon, welcome page, screenshots, pin/install instructions, privacy policy, uninstall feedback, support and landing URLs. A landing page is generated as static HTML and either hosted by Extenshi (page.extenshi.io, or the project's custom domain root) or on any HTTPS origin; it is registered as the project homepage, which sets HOMEPAGE_URL. The homepage is drafted from project state (draft_landing_page), checked with preview_landing_page, published as a version and can be rolled back. An existing Pro policy is updated as a reviewed proposal (proposedMarkdown) and published within the author's authorization. Returned URLs are verified against project state.";
245
- readonly relatedTools: readonly ["generate_icon_workflow", "generate_welcome_page_workflow", "generate_landing_page", "draft_landing_page", "preview_landing_page", "publish_landing_page", "set_custom_domain", "verify_custom_domain", "upload_project_media", "upsert_hosted_page", "list_privacy_policy_versions", "get_privacy_policy_version", "update_privacy_policy_with_ai", "publish_privacy_policy", "get_project_state"];
245
+ readonly relatedTools: readonly ["generate_icon_workflow", "generate_welcome_page_workflow", "generate_pin_guide", "generate_landing_page", "draft_landing_page", "preview_landing_page", "publish_landing_page", "set_custom_domain", "verify_custom_domain", "upload_project_media", "upsert_hosted_page", "list_privacy_policy_versions", "get_privacy_policy_version", "update_privacy_policy_with_ai", "publish_privacy_policy", "get_project_state"];
246
246
  readonly doneWhen: "Assets show the real product; hosted links load and match actual data practices; installation/uninstallation flows work.";
247
247
  }, {
248
248
  readonly id: "localization";
@@ -265,6 +265,23 @@ declare function buildSections(registeredTools: readonly GuideTool[]): {
265
265
  readonly relatedTools: readonly ["get_reviews", "get_security", "get_project_state"];
266
266
  readonly doneWhen: "A handoff records repository/commit, artifacts, URLs, checks, remaining blockers, support owner and follow-up work.";
267
267
  }];
268
+ buildMap: {
269
+ readonly what: "A local page served by @extenshi/cli on 127.0.0.1: the build steps of the extension, from the idea to the live store listing, with the dependencies between them. Each step is done, in progress, waiting on the author, blocked by an unfinished step, or not needed for this extension. Steps waiting on the author (icon choice, approval of listing copy and screenshots, store accounts, submission) are counted in the header and open from there.";
270
+ readonly forTheAuthor: "One page shows what is done, what an agent is working on and where a decision is needed, instead of a long chat; visual choices such as the icon are compared there side by side. The page runs on the author’s machine, reads the project locally and works without an account.";
271
+ readonly commands: {
272
+ readonly open: "npx @extenshi/cli@latest map: starts the map server of the project when none runs and opens the page; with the page already open in a tab, no second tab opens.";
273
+ readonly status: "npx @extenshi/cli@latest map status --json: progress, steps waiting on the author, steps in progress and steps that can start now; starts nothing.";
274
+ readonly decline: "npx @extenshi/cli@latest map decline: records that the author declined the map.";
275
+ readonly stop: "npx @extenshi/cli@latest map stop: stops the server; the next start reuses its port, so open tabs and links keep working.";
276
+ readonly stepLink: "<map url>#node=<step id> opens one step, for example #node=iconConcepts.";
277
+ };
278
+ readonly oneMapPerProject: "A project has exactly one map and one map server, however many agents work on it. The map lives in the main checkout: from a linked git worktree the CLI resolves the same directory in the main working tree, so every agent and every worktree reads the same .extenshi/build-map.json and reaches the same server. Running `map` again, from any terminal, agent or worktree, returns the server already running; simultaneous starts end with one server.";
279
+ readonly progress: "Statuses are derived on every read, not stored: from the project files in the main checkout (manifest and the files it names, icons, builds, packages, the store folder, CI workflows); from the Dojo project the directory is bound to (owner decisions, and release evidence and readiness gates while the map server runs with an API key, refreshed every minute); and from .extenshi/build-map.json, which holds per-step progress, open reviews, the offer record and a log. Work on an agent branch appears once it is in the main checkout. The CLI writes the state file under .extenshi/build-map.lock; per-step progress reports from agents arrive with a later CLI version.";
280
+ readonly offer: "The map is an offer to the author, not a required step. It is offered once, after the extension idea is clear and before the first step that needs the author, in the author’s language and with a plain yes or no; the server starts only after a yes. After a no, the map comes up once more at the first visual choice (usually the icon), and after a second no it is not offered again. The answer is recorded in .extenshi/build-map.json (offer: count, acceptedAt, declinedAt): `map` records a yes and `map decline` a no, so a later agent session reads the answer instead of asking again.";
281
+ readonly withoutTheMap: "Everything also works in chat: previews are linked there and the author answers there. The state file is kept either way, so a map opened later shows the whole history.";
282
+ readonly localServerField: "On the local stdio server, create_project and get_project_state carry buildMap {running, url (while running), offered, declined, offers, home} for projectDir (default: the server’s working directory). The hosted connector has no access to the author’s files and returns no buildMap; there the map opens from a terminal on the author’s machine.";
283
+ readonly docs: `${string}#extenshi-map`;
284
+ };
268
285
  storeMedia: {
269
286
  readonly screenshots: {
270
287
  readonly command: "npx @extenshi/cli@latest screenshots <unpacked-dir|zip> --scenes scenes.json [--locales en,de] [--store chrome,edge,firefox] [--small] [--out store-screenshots] [--json] [--evidence --listing <file> [--evidence-browser chrome,edge,firefox]]";
@@ -1 +1 @@
1
- {"version":3,"file":"development-guide.d.ts","sourceRoot":"","sources":["../src/development-guide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACZ,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,eAAe,CAAC,EAAE,OAAO,CAAA;KACzB,CAAA;CACD;AAKD,eAAO,MAAM,qBAAqB,QAA+B,CAAA;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8PvB,CAAA;AA+HV,qFAAqF;AACrF,eAAO,MAAM,cAAc,mGAQjB,CAAA;AACV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AA2F1D,iBAAS,aAAa,CAAC,eAAe,EAAE,SAAS,SAAS,EAAE;;;cA/erD,MAAM;qBACC,MAAM;qBACN;YACZ,YAAY,CAAC,EAAE,OAAO,CAAA;YACtB,eAAe,CAAC,EAAE,OAAO,CAAA;SACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqiBD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;AAE5D,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,EAAE,CAIlF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,eAAe,EAAE,SAAS,SAAS,EAAE,EACrC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAC3B;IAAE,aAAa,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,GAC5F,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBvB"}
1
+ {"version":3,"file":"development-guide.d.ts","sourceRoot":"","sources":["../src/development-guide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE;QACZ,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,eAAe,CAAC,EAAE,OAAO,CAAA;KACzB,CAAA;CACD;AAKD,eAAO,MAAM,qBAAqB,QAA+B,CAAA;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiQvB,CAAA;AA+JV,qFAAqF;AACrF,eAAO,MAAM,cAAc,+GASjB,CAAA;AACV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AA6F1D,iBAAS,aAAa,CAAC,eAAe,EAAE,SAAS,SAAS,EAAE;;;cArhBrD,MAAM;qBACC,MAAM;qBACN;YACZ,YAAY,CAAC,EAAE,OAAO,CAAA;YACtB,eAAe,CAAC,EAAE,OAAO,CAAA;SACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4kBD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;AAE5D,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,EAAE,CAIlF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,eAAe,EAAE,SAAS,SAAS,EAAE,EACrC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAC3B;IAAE,aAAa,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,GAC5F,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBvB"}
@@ -108,6 +108,7 @@ export const DEVELOPMENT_SERVICES = [
108
108
  purpose: 'Welcome page, pin guide, install instructions and uninstall survey, with verified URLs wired into the extension.',
109
109
  tools: [
110
110
  'generate_welcome_page_workflow',
111
+ 'generate_pin_guide',
111
112
  'get_project_state',
112
113
  'get_install_instructions',
113
114
  'publish_install_instructions',
@@ -118,9 +119,10 @@ export const DEVELOPMENT_SERVICES = [
118
119
  'get_uninstall_form',
119
120
  'update_uninstall_form',
120
121
  'preview_uninstall_form',
122
+ 'list_uninstall_responses',
121
123
  'find_brand_mentions',
122
124
  ],
123
- access: 'Free welcome-page specification. Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).',
125
+ access: 'Free welcome-page specification and pin guide kit (generate_pin_guide: offline SVG, CSP-safe HTML and chrome.i18n captions in 11 languages for a welcome page bundled in the extension). Editing, hosting and responses live in the cabinet where enabled; account/project limits apply. MCP returns specifications and saved state, and publishes the install instructions page (free; hosted.write) — the uninstall form is created and the welcome page is edited in the cabinet. An existing uninstall survey is read, previewed and changed over MCP (list/get/preview_uninstall_form; update_uninstall_form with dryRun, expectedUpdatedAt and an idempotencyKey; hosted.write), keeping its URL and responses; each change is listed for the owner in Dojo. Its answers are read with list_uninstall_responses (project.read): newest first, filtered by version and date, with counts by reason and version and the uninstalls that reached the page; the email a person left is returned to an API key only. After a rename, find_brand_mentions lists every hosted field still holding the old name and the tool that fixes it; get_project_state reports the same on its own in `staleNames`: the project keeps every name it took (Dojo settings, import_manifest), so earlier names are searched without being asked for. The hosted uninstall form, welcome page and install instructions open in the user’s browser language (the generated snippets pass chrome.i18n.getUILanguage() as `hl`) when the project offers it, otherwise in the project’s own language: built-in text is translated by Extenshi (en + 10 languages); the developer’s own text is translated per field with get_page_translations / set_page_translations (identity; hosted.write to save).',
124
126
  urls: [
125
127
  DEVELOPMENT_GUIDE_URL,
126
128
  docs('pin-guide'),
@@ -130,6 +132,7 @@ export const DEVELOPMENT_SERVICES = [
130
132
  toolPage('instruction-generator'),
131
133
  toolPage('install-instructions'),
132
134
  toolPage('uninstall-feedback'),
135
+ toolPage('feedback-form'),
133
136
  ],
134
137
  },
135
138
  {
@@ -188,7 +191,7 @@ export const DEVELOPMENT_SERVICES = [
188
191
  {
189
192
  id: 'maintenance',
190
193
  purpose: 'Listing claims, finding responses, reviews and uninstall feedback, policy updates and ongoing releases.',
191
- tools: ['get_reviews', 'get_security', 'get_project_state'],
194
+ tools: ['get_reviews', 'get_security', 'get_project_state', 'list_uninstall_responses'],
192
195
  access: 'Catalog reads are metered. Ownership, declarations, responses, badges and feedback management live in the cabinet and depend on account access.',
193
196
  urls: [
194
197
  docs('claim-your-extension'),
@@ -284,6 +287,7 @@ const WORKFLOW = [
284
287
  relatedTools: [
285
288
  'generate_icon_workflow',
286
289
  'generate_welcome_page_workflow',
290
+ 'generate_pin_guide',
287
291
  'generate_landing_page',
288
292
  'draft_landing_page',
289
293
  'preview_landing_page',
@@ -338,6 +342,29 @@ const WORKFLOW = [
338
342
  doneWhen: 'A handoff records repository/commit, artifacts, URLs, checks, remaining blockers, support owner and follow-up work.',
339
343
  },
340
344
  ];
345
+ /**
346
+ * The Extension Build Map (internal-docs/plans/2026-11-03-extension-build-map.md
347
+ * §6, §6.7), described as a process like the workflow. The CLI is the
348
+ * implementation (tools/extenshi-cli/src/build-map*.ts); `localServerField` is
349
+ * build-map-summary.ts.
350
+ */
351
+ const BUILD_MAP = {
352
+ what: 'A local page served by @extenshi/cli on 127.0.0.1: the build steps of the extension, from the idea to the live store listing, with the dependencies between them. Each step is done, in progress, waiting on the author, blocked by an unfinished step, or not needed for this extension. Steps waiting on the author (icon choice, approval of listing copy and screenshots, store accounts, submission) are counted in the header and open from there.',
353
+ forTheAuthor: 'One page shows what is done, what an agent is working on and where a decision is needed, instead of a long chat; visual choices such as the icon are compared there side by side. The page runs on the author’s machine, reads the project locally and works without an account.',
354
+ commands: {
355
+ open: 'npx @extenshi/cli@latest map: starts the map server of the project when none runs and opens the page; with the page already open in a tab, no second tab opens.',
356
+ status: 'npx @extenshi/cli@latest map status --json: progress, steps waiting on the author, steps in progress and steps that can start now; starts nothing.',
357
+ decline: 'npx @extenshi/cli@latest map decline: records that the author declined the map.',
358
+ stop: 'npx @extenshi/cli@latest map stop: stops the server; the next start reuses its port, so open tabs and links keep working.',
359
+ stepLink: '<map url>#node=<step id> opens one step, for example #node=iconConcepts.',
360
+ },
361
+ oneMapPerProject: 'A project has exactly one map and one map server, however many agents work on it. The map lives in the main checkout: from a linked git worktree the CLI resolves the same directory in the main working tree, so every agent and every worktree reads the same .extenshi/build-map.json and reaches the same server. Running `map` again, from any terminal, agent or worktree, returns the server already running; simultaneous starts end with one server.',
362
+ progress: 'Statuses are derived on every read, not stored: from the project files in the main checkout (manifest and the files it names, icons, builds, packages, the store folder, CI workflows); from the Dojo project the directory is bound to (owner decisions, and release evidence and readiness gates while the map server runs with an API key, refreshed every minute); and from .extenshi/build-map.json, which holds per-step progress, open reviews, the offer record and a log. Work on an agent branch appears once it is in the main checkout. The CLI writes the state file under .extenshi/build-map.lock; per-step progress reports from agents arrive with a later CLI version.',
363
+ offer: 'The map is an offer to the author, not a required step. It is offered once, after the extension idea is clear and before the first step that needs the author, in the author’s language and with a plain yes or no; the server starts only after a yes. After a no, the map comes up once more at the first visual choice (usually the icon), and after a second no it is not offered again. The answer is recorded in .extenshi/build-map.json (offer: count, acceptedAt, declinedAt): `map` records a yes and `map decline` a no, so a later agent session reads the answer instead of asking again.',
364
+ withoutTheMap: 'Everything also works in chat: previews are linked there and the author answers there. The state file is kept either way, so a map opened later shows the whole history.',
365
+ localServerField: 'On the local stdio server, create_project and get_project_state carry buildMap {running, url (while running), offered, declined, offers, home} for projectDir (default: the server’s working directory). The hosted connector has no access to the author’s files and returns no buildMap; there the map opens from a terminal on the author’s machine.',
366
+ docs: `${docs('cli')}#extenshi-map`,
367
+ };
341
368
  /** Top-level sections of the full guide, selectable via the `sections` parameter. */
342
369
  export const GUIDE_SECTIONS = [
343
370
  'tools',
@@ -345,6 +372,7 @@ export const GUIDE_SECTIONS = [
345
372
  'services',
346
373
  'repository',
347
374
  'workflow',
375
+ 'buildMap',
348
376
  'handoff',
349
377
  'storeMedia',
350
378
  ];
@@ -354,6 +382,7 @@ const SECTION_SUMMARIES = {
354
382
  services: 'Service directory: purpose, related tools, access requirements and URLs per lifecycle area.',
355
383
  repository: 'Git repository recommendation, setup, layout and secret-handling practice.',
356
384
  workflow: 'The nine lifecycle stages with descriptions, related tools and exit criteria.',
385
+ buildMap: 'The build map (npx @extenshi/cli map): one local progress page per project shared by every agent and git worktree, how progress reaches it, and how it is offered to the author.',
357
386
  handoff: 'Items a completed handoff records.',
358
387
  storeMedia: 'Store screenshots per locale (CLI screenshots + scenes.json format), listing artwork sizes per store (CLI icon store-assets) and the public project media store.',
359
388
  };
@@ -455,6 +484,7 @@ function buildSections(registeredTools) {
455
484
  ],
456
485
  },
457
486
  workflow: WORKFLOW,
487
+ buildMap: BUILD_MAP,
458
488
  storeMedia: STORE_MEDIA,
459
489
  handoff: [
460
490
  'scope and acceptance criteria',