#!/usr/bin/env python3 """Generated OfficeCLI script for product-roadmap-h1-2026.pptx""" import json, subprocess, tempfile, os FILE = "product-roadmap-h1-2026.pptx" def batch(commands): with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f: json.dump(commands, f) f.flush() result = subprocess.run( ["officecli", "batch", FILE, "--input", f.name], capture_output=True, text=True ) os.unlink(f.name) if result.returncode != 0: print(result.stderr or result.stdout) raise RuntimeError(f"Batch failed: {result.returncode}") print(result.stdout, end="") subprocess.run(["officecli", "create", FILE], check=True) # Turn 1: rm-01-slides-add batch(json.loads('[\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n },\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n },\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n },\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n },\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n },\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "layout": "blank",\n "background": "FFF5EB",\n "transition": "fade"\n }\n }\n]')) # Turn 2: rm-02-slide1-title batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!bg-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "1.0cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!bottom-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "18.1cm",\n "width": "33.87cm",\n "height": "0.9cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!title-accent",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "5.0cm",\n "width": "0.5cm",\n "height": "5.5cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!main-title",\n "text": "Product Roadmap\\n\\u2014 H1 2026",\n "fill": "none",\n "line": "none",\n "x": "3.5cm",\n "y": "4.8cm",\n "width": "27cm",\n "height": "6cm",\n "font": "Calibri",\n "size": "44",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!presenter-name",\n "text": "Jordan Mills",\n "fill": "none",\n "line": "none",\n "x": "3.5cm",\n "y": "11.5cm",\n "width": "20cm",\n "height": "1.5cm",\n "font": "Calibri",\n "size": "20",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[1]",\n "type": "shape",\n "props": {\n "name": "!!date-label",\n "text": "All-Hands \\u00b7 April 11, 2026",\n "fill": "none",\n "line": "none",\n "x": "3.5cm",\n "y": "13.0cm",\n "width": "20cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n }\n]')) # Turn 3: rm-03-slide2-shipped batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!top-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!slide-label",\n "text": "01",\n "fill": "none",\n "line": "none",\n "x": "29.0cm",\n "y": "0.9cm",\n "width": "3.5cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "18",\n "bold": "true",\n "color": "E8725A",\n "align": "right",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!headline",\n "text": "What We Shipped",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "1.5cm",\n "width": "28cm",\n "height": "2.2cm",\n "font": "Calibri",\n "size": "36",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "3.8cm",\n "width": "4.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!sub-label",\n "text": "Q1 2026 Highlights",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "4.1cm",\n "width": "20cm",\n "height": "1.1cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[2]",\n "type": "shape",\n "props": {\n "name": "!!bullets",\n "text": "Launched v2.0 of the core platform \\u2014 40% faster load times\\nShipped self-serve onboarding flow (reduced CS tickets by 30%)\\nRolled out real-time collaboration to all paid tiers\\nDelivered new analytics dashboard with export support\\nCompleted full SOC 2 Type II audit",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "5.4cm",\n "width": "28cm",\n "height": "10cm",\n "font": "Calibri",\n "size": "18",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "6"\n }\n }\n]')) # Turn 4: rm-04-slide3-inprogress batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!top-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!slide-label",\n "text": "02",\n "fill": "none",\n "line": "none",\n "x": "29.0cm",\n "y": "0.9cm",\n "width": "3.5cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "18",\n "bold": "true",\n "color": "E8725A",\n "align": "right",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!headline",\n "text": "In Progress Right Now",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "1.5cm",\n "width": "28cm",\n "height": "2.2cm",\n "font": "Calibri",\n "size": "36",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "3.8cm",\n "width": "4.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!sub-label",\n "text": "Active work \\u2014 targeting Q2 delivery",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "4.1cm",\n "width": "25cm",\n "height": "1.1cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[3]",\n "type": "shape",\n "props": {\n "name": "!!bullets",\n "text": "Mobile app redesign \\u2014 Beta in testing with 200 users\\nAI-assisted search powered by LLM embeddings (60% complete)\\nEnterprise SSO / SAML support \\u2014 engineering underway\\nRefactored permissions model for org-level access control\\nNotification center overhaul \\u2014 design finalized, dev in sprint",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "5.4cm",\n "width": "28cm",\n "height": "10cm",\n "font": "Calibri",\n "size": "18",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "6"\n }\n }\n]')) # Turn 5: rm-05-slide4-q2 batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!top-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!slide-label",\n "text": "03",\n "fill": "none",\n "line": "none",\n "x": "29.0cm",\n "y": "0.9cm",\n "width": "3.5cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "18",\n "bold": "true",\n "color": "E8725A",\n "align": "right",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!headline",\n "text": "Q2 Priorities",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "1.5cm",\n "width": "28cm",\n "height": "2.2cm",\n "font": "Calibri",\n "size": "36",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "3.8cm",\n "width": "4.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!sub-label",\n "text": "April \\u2013 June 2026",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "4.1cm",\n "width": "20cm",\n "height": "1.1cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[4]",\n "type": "shape",\n "props": {\n "name": "!!bullets",\n "text": "GA launch of mobile app redesign\\nShip AI-assisted search to all users\\nEnterprise tier GA \\u2014 SSO, SAML, advanced audit logs\\nIntegrations marketplace: Slack, Jira, Salesforce connectors\\nIn-app usage analytics for customer admins",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "5.4cm",\n "width": "28cm",\n "height": "10cm",\n "font": "Calibri",\n "size": "18",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "6"\n }\n }\n]')) # Turn 6: rm-06-slide5-q3 batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!top-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!slide-label",\n "text": "04",\n "fill": "none",\n "line": "none",\n "x": "29.0cm",\n "y": "0.9cm",\n "width": "3.5cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "18",\n "bold": "true",\n "color": "E8725A",\n "align": "right",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!headline",\n "text": "Q3 Priorities",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "1.5cm",\n "width": "28cm",\n "height": "2.2cm",\n "font": "Calibri",\n "size": "36",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "3.8cm",\n "width": "4.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!sub-label",\n "text": "July \\u2013 September 2026",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "4.1cm",\n "width": "20cm",\n "height": "1.1cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[5]",\n "type": "shape",\n "props": {\n "name": "!!bullets",\n "text": "Advanced reporting suite \\u2014 custom dashboards and scheduled exports\\nAPI v3 public release with improved rate limits and webhooks\\nAutomation builder \\u2014 no-code workflow triggers\\nExpanded data residency options (EU, APAC)\\nCustomer portal for self-serve billing, plans, and seat management",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "5.4cm",\n "width": "28cm",\n "height": "10cm",\n "font": "Calibri",\n "size": "18",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "6"\n }\n }\n]')) # Turn 7: rm-07-slide6-risks-ask batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!top-bar-left",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "16.5cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!top-bar-right",\n "preset": "rect",\n "fill": "2D2D2D",\n "line": "none",\n "x": "16.87cm",\n "y": "0cm",\n "width": "17.0cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!left-panel-bg",\n "preset": "rect",\n "fill": "FDEEE4",\n "line": "none",\n "x": "0cm",\n "y": "0.7cm",\n "width": "16.5cm",\n "height": "18.3cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!left-headline",\n "text": "Risks & Watch Items",\n "fill": "none",\n "line": "none",\n "x": "1.2cm",\n "y": "1.5cm",\n "width": "14cm",\n "height": "2.0cm",\n "font": "Calibri",\n "size": "26",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!left-divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "1.2cm",\n "y": "3.6cm",\n "width": "3.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!left-bullets",\n "text": "Mobile launch timeline tight \\u2014 dependency on iOS review\\nAI search infra costs may exceed Q2 budget estimate\\nEnterprise deals blocked pending SOC 2 certificate delivery\\nKey backend engineer on leave in May\\nCompetitor launching similar automation features in Q2",\n "fill": "none",\n "line": "none",\n "x": "1.2cm",\n "y": "4.1cm",\n "width": "14.5cm",\n "height": "12cm",\n "font": "Calibri",\n "size": "16",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "5"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!right-headline",\n "text": "What We Need From You",\n "fill": "none",\n "line": "none",\n "x": "18.0cm",\n "y": "1.5cm",\n "width": "14cm",\n "height": "2.0cm",\n "font": "Calibri",\n "size": "26",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!right-divider",\n "preset": "rect",\n "fill": "2D2D2D",\n "line": "none",\n "x": "18.0cm",\n "y": "3.6cm",\n "width": "3.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[6]",\n "type": "shape",\n "props": {\n "name": "!!right-bullets",\n "text": "Approve headcount: 2 additional engineers for Q3 automation work\\nAlign on Enterprise GA date \\u2014 need exec sign-off by April 18\\nChampion AI search rollout internally before external announcement\\nHelp unblock the SOC 2 certificate handoff with Legal\\nShare roadmap externally \\u2014 we need your customer intros for beta",\n "fill": "none",\n "line": "none",\n "x": "18.0cm",\n "y": "4.1cm",\n "width": "14.5cm",\n "height": "12cm",\n "font": "Calibri",\n "size": "16",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "5"\n }\n }\n]')) # Turn 8: rm-08-slide-how-we-prioritize batch(json.loads('[\n {\n "op": "add",\n "parent": "/",\n "type": "slide",\n "props": {\n "background": "FFF8F0"\n }\n }\n]')) # Turn 9: rm-09-slide-prioritize-content batch(json.loads('[\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!top-bar",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "0cm",\n "y": "0cm",\n "width": "33.87cm",\n "height": "0.7cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!slide-label",\n "text": "00",\n "fill": "none",\n "line": "none",\n "x": "29.0cm",\n "y": "0.9cm",\n "width": "3.5cm",\n "height": "1.2cm",\n "font": "Calibri",\n "size": "18",\n "bold": "true",\n "color": "E8725A",\n "align": "right",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!headline",\n "text": "How We Prioritize",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "1.5cm",\n "width": "28cm",\n "height": "2.2cm",\n "font": "Calibri",\n "size": "36",\n "bold": "true",\n "color": "2D2D2D",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!divider",\n "preset": "rect",\n "fill": "E8725A",\n "line": "none",\n "x": "2.5cm",\n "y": "3.8cm",\n "width": "4.0cm",\n "height": "0.2cm"\n }\n },\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!sub-label",\n "text": "Our Prioritization Framework",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "4.1cm",\n "width": "20cm",\n "height": "1.1cm",\n "font": "Calibri",\n "size": "14",\n "bold": "false",\n "color": "E8725A",\n "align": "left",\n "valign": "center"\n }\n },\n {\n "op": "add",\n "parent": "/slide[7]",\n "type": "shape",\n "props": {\n "name": "!!bullets",\n "text": "Customer impact first \\u2014 we score every initiative by reach, urgency, and direct revenue or retention value before committing engineering time\\nStrategic alignment \\u2014 work must map to at least one of our three pillars: growth, reliability, or ecosystem expansion\\nCapacity-weighted sequencing \\u2014 we size work against realistic team bandwidth and sequence by dependency order to avoid blocking downstream efforts",\n "fill": "none",\n "line": "none",\n "x": "2.5cm",\n "y": "5.4cm",\n "width": "28cm",\n "height": "10cm",\n "font": "Calibri",\n "size": "18",\n "bold": "false",\n "color": "2D2D2D",\n "align": "left",\n "valign": "top",\n "list": "bullet",\n "spaceBefore": "6"\n }\n }\n]')) # Turn 10: rm-10-move-slide-to-pos2 batch(json.loads('[\n {\n "op": "move",\n "path": "/slide[7]",\n "index": 1\n }\n]')) subprocess.run(["officecli", "validate", FILE], check=True) print(f"\nDone: {FILE}")

AltStyle によって変換されたページ (->オリジナル) /