OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Office installation required.
This report presents the forensic synthetic code analysis of iOfficeAI/OfficeCLI, a C# project with 16,634 GitHub stars. SynthScan v2.0 examined 387,412 lines of code across 1005 source files, recording 3535 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 18.6 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3535 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/excel/shapes.py | 61 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 63 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 77 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 79 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 93 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 95 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 110 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 112 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 129 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 131 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 158 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/shapes.py | 160 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 32 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 34 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 46 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 48 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 72 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 74 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 93 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 95 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 115 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 117 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 133 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/data-validation.sh | 135 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/slicers.py | 48 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/slicers.py | 51 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/slicers.py | 80 | # ========================================================================== | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 93 | # ========================================================================== | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 103 | # ========================================================================== | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 105 | # ========================================================================== | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 107 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/slicers.py | 120 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/slicers.py | 130 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/slicers.py | 142 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | examples/excel/slicers.py | 151 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 162 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 170 | # ========================================================================== | COMMENT |
| MEDIUM⚡ | examples/excel/slicers.py | 176 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 156 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 158 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 187 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 189 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 205 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 207 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 242 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 244 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 263 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/charts.py | 270 | # ====================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 29 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 31 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 63 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 65 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 95 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 97 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 114 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 116 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 142 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 144 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 171 | # ========================================================================== | COMMENT |
| MEDIUM | examples/excel/cell-formatting.sh | 173 | # ========================================================================== | COMMENT |
| 1688 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/python/officecli.py | 221 | break | COMMENT |
| LOW | sdk/python/officecli.py | 381 | # liveness probe (ping the -ping pipe + verify the served path), not a | COMMENT |
| LOW | sdk/python/officecli.py | 401 | req["Args"] = {k: str(v) for k, v in args.items() if v is not None} | COMMENT |
| LOW | sdk/python/officecli.py | 481 | resident, so call this only when you want to check liveness yourself.""" | COMMENT |
| LOW | sdk/node/index.js | 341 | } | COMMENT |
| LOW | examples/excel/data-validation.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/slicers.py | 81 | # The slicer SOURCE — a PivotTable. Slicers anchor to this pivot's cache | COMMENT |
| LOW | examples/excel/slicers.py | 101 | "name": "SalesPivot", "style": "PivotStyleMedium9"}}) | COMMENT |
| LOW | examples/excel/slicers.py | 121 | print("\n--- Slicer: Region ---") | COMMENT |
| LOW | examples/excel/slicers.py | 141 | # pivots), columnCount=3 (wide grid) | COMMENT |
| LOW | examples/excel/cell-formatting.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/pivot-tables.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/conditional-formatting.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/sparklines.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/shapes.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/slicers.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/workbook-settings.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/sheet-settings.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/pivot-tables.py | 141 | # -------------------------------------------------------------------------- | COMMENT |
| LOW | examples/excel/pivot-tables.py | 181 | # --prop source=Sheet1!A1:J51 \ | COMMENT |
| LOW | examples/excel/pivot-tables.py | 201 | layout="outline", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 241 | # officecli add pivot-tables.xlsx "/4-Channel Analysis" --type pivottable \ | COMMENT |
| LOW | examples/excel/pivot-tables.py | 261 | grandtotals="both", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 301 | # Sheet: 6-Compact 3-Level | COMMENT |
| LOW | examples/excel/pivot-tables.py | 361 | sort="asc", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 421 | name="Top5Products", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 461 | COMMENT | |
| LOW | examples/excel/pivot-tables.py | 501 | # --prop 'values=Sales:count,Quantity:min,Quantity:product,Sales:countNums' \ | COMMENT |
| LOW | examples/excel/pivot-tables.py | 521 | grandtotals="both", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 561 | # officecli add pivot-tables.xlsx "/14-Statistical" --type pivottable \ | COMMENT |
| LOW | examples/excel/pivot-tables.py | 581 | cols="Quarter", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 621 | layout="outline", | COMMENT |
| LOW | examples/excel/pivot-tables.py | 661 | layout="tabular", | COMMENT |
| LOW | examples/excel/charts/charts-basic.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-column.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-boxwhisker.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-histogram.py | 141 | # A single giant chart using EVERY histogram knob at once: | COMMENT |
| LOW | examples/excel/charts/charts-histogram.py | 181 | x="0", y="0", width="27", height="38"), | COMMENT |
| LOW | examples/excel/charts/charts-histogram.py | 241 | overflowBin="95", **LAB, | COMMENT |
| LOW | examples/excel/charts/charts-histogram.py | 321 | # | COMMENT |
| LOW | examples/excel/charts/charts-histogram.py | 481 | # ====================================================================== | COMMENT |
| LOW | examples/excel/charts/charts-combo.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-extended.py | 301 | # Chart 1: Pareto — defect analysis, raw counts auto-sorted + cumul% overlay | COMMENT |
| LOW | examples/excel/charts/charts-extended.py | 341 | COMMENT | |
| LOW | examples/excel/charts/charts-waterfall.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-line.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-bar.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-bubble.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-scatter.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-histogram.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-pie.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-advanced.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-radar.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-area.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-stock.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/excel/charts/charts-extended.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/word/textbox.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/word/numbering.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/word/document-formatting.sh | 1 | #!/bin/bash | COMMENT |
| LOW | examples/word/pictures.sh | 1 | #!/bin/bash | COMMENT |
| 1545 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/officecli/Core/Chart/ChartHelper.Setter.cs | 3543 | /// dataLabels=… spec. Mirrors the inline scaffold in case "labelpos". | COMMENT |
| MEDIUM | src/officecli/Core/Chart/ChartHelper.Setter.cs | 3570 | /// DataLabels' DefaultRunProperties, creating the TextProperties scaffold | COMMENT |
| MEDIUM | src/officecli/Core/Chart/ChartExStyleBuilder.cs | 103 | // schema-compliant scaffold below. | COMMENT |
| MEDIUM | src/officecli/Core/Chart/ChartExStyleBuilder.cs | 154 | /// visually coherent; the rest get the generic 4-ref scaffold. | COMMENT |
| MEDIUM | src/officecli/Core/Chart/ChartExStyleBuilder.cs | 222 | // Generic 4-ref scaffold — the smallest schema-valid form per | COMMENT |
| MEDIUM⚡ | src/officecli/Handlers/PowerPointHandler.cs | 1439 | // rId-collision guard. The blank scaffold ships a fixed set of | COMMENT |
| MEDIUM⚡ | src/officecli/Handlers/PowerPointHandler.cs | 1442 | // that range (e.g. rId5 = master bg image, but the scaffold already | COMMENT |
| MEDIUM⚡ | src/officecli/Handlers/PowerPointHandler.cs | 1447 | // by re-homing the colliding scaffold relationship onto a fresh id. | COMMENT |
| MEDIUM⚡ | src/officecli/Handlers/PowerPointHandler.cs | 1448 | // For a scaffold-leftover SlideLayoutPart we additionally patch the | COMMENT |
| MEDIUM⚡ | src/officecli/Handlers/PowerPointHandler.cs | 1456 | // Re-home the colliding scaffold relationship onto a fresh, | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 1617 | // The blank scaffold's master ships rId1..rId5 as slideLayout | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 1619 | // with a scaffold layout. Re-home the colliding part onto a fresh | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 1776 | // re-home a non-part relationship). Part collision (scaffold layout | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 2042 | // decks give each master its own theme; the blank scaffold + | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 2126 | // currently occupies it onto a fresh id. The blank scaffold ships a master | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 2130 | // r:embed dangles. For a scaffold SlideLayoutPart occupant we also repoint | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 2290 | // (dump replay: prune scaffold + grow from source) and a later reload — | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 2410 | /// scaffold's shared theme (wrong colours for every styleRef on its slides). | COMMENT |
| MEDIUM | src/officecli/Handlers/Excel/ExcelBatchEmitter.cs | 10 | // CONSISTENCY(emit-X-mirror): scaffold mirrors WordBatchEmitter.cs / | COMMENT |
| MEDIUM | src/officecli/Handlers/Pptx/PptxBatchEmitter.cs | 12 | // CONSISTENCY(emit-X-mirror): scaffold mirrors WordBatchEmitter.cs — same | COMMENT |
| MEDIUM | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 79 | // The blank scaffold shares ONE theme part (/ppt/theme/theme1.xml) | COMMENT |
| MEDIUM | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 83 | // masters 2..N (which the scaffold doesn't provide). This keeps the | COMMENT |
| MEDIUM | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 95 | // blank scaffold's theme has no such images, so a pinned source rId is | COMMENT |
| MEDIUM⚡ | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 244 | // master1's theme is the shared /ppt/theme/theme1.xml that the scaffold | COMMENT |
| MEDIUM⚡ | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 247 | // the presentation<->master1 sharing. Masters 2..N have no scaffold theme, | COMMENT |
| MEDIUM⚡ | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 255 | // ThemePart is DISTINCT from the presentation's, the shared-scaffold | COMMENT |
| MEDIUM⚡ | …/officecli/Handlers/Pptx/PptxBatchEmitter.Resources.cs | 257 | // detaches the scaffold share first, restoring the source topology. | COMMENT |
| MEDIUM | …li/Handlers/Pptx/PowerPointHandler.HtmlPreview.Text.cs | 302 | // Scoping (regression guardrails): apply ONLY to body/content-family | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | schemas/help/pptx/slide.json | 112 | { "element": "placeholder", "pathSegment": "placeholder", "cardinality": "0..n" } | CODE |
| LOW | schemas/help/pptx/placeholder.json | 4 | "element": "placeholder", | CODE |
| LOW | schemas/help/docx/sdt.json | 139 | "placeholder": { | CODE |
| LOW | examples/excel/workbook-settings.py | 64 | wb(**{"extended.company": "Acme Corp", "extended.manager": "Dana Lead", | CODE |
| LOW | examples/excel/workbook-settings.sh | 39 | officecli set "$FILE" / --prop extended.company="Acme Corp" \ | CODE |
| LOW | examples/excel/workbook-settings.md | 44 | officecli set file.xlsx / --prop extended.company="Acme Corp" \ | CODE |
| LOW | examples/word/document-formatting.sh | 28 | officecli set "$FILE" / --prop extended.company="Acme Corp" \ | CODE |
| LOW | examples/word/document-formatting.md | 41 | officecli set file.docx / --prop extended.company="Acme Corp" \ | CODE |
| LOW⚡ | examples/word/document-formatting.py | 85 | "extended.company": "Acme Corp", | CODE |
| LOW | examples/ppt/presentation-settings.py | 54 | pres(**{"extended.company": "Acme Corp", "extended.manager": "Dana Lead", | CODE |
| LOW | examples/ppt/presentation-settings.md | 48 | officecli set file.pptx / --prop extended.company="Acme Corp" \ | CODE |
| LOW | examples/ppt/presentation-settings.sh | 30 | officecli set "$FILE" / --prop extended.company="Acme Corp" \ | CODE |
| LOW | examples/ppt/shapes/shapes-typography.py | 32 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW | examples/ppt/shapes/shapes-typography.py | 32 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW | examples/ppt/shapes/shapes-effects.py | 39 | LONGTEXT = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do " | CODE |
| LOW | examples/ppt/shapes/shapes-effects.py | 39 | LONGTEXT = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do " | CODE |
| LOW | examples/ppt/shapes/shapes-typography.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW | examples/ppt/shapes/shapes-typography.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW⚡ | examples/ppt/shapes/shapes-typography.sh | 16 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW⚡ | examples/ppt/shapes/shapes-typography.sh | 16 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW⚡ | examples/ppt/shapes/shapes-effects.sh | 46 | LONGTEXT='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore | CODE |
| LOW⚡ | examples/ppt/shapes/shapes-effects.sh | 46 | LONGTEXT='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore | CODE |
| LOW | examples/ppt/shapes/shapes-effects.md | 28 | LONGTEXT='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore | CODE |
| LOW | examples/ppt/shapes/shapes-effects.md | 28 | LONGTEXT='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-basic.sh | 26 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-basic.sh | 26 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW | examples/ppt/textboxes/textboxes-basic.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW | examples/ppt/textboxes/textboxes-basic.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.py | 37 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.py | 37 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.py | 148 | text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet.", | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.py | 148 | text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet.", | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-basic.py | 61 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-basic.py | 61 | LOREM = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.sh | 20 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.sh | 20 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.sh | 128 | --prop text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet." \ | CODE |
| LOW⚡ | examples/ppt/textboxes/textboxes-advanced.sh | 128 | --prop text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet." \ | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.md | 28 | LOREM='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum vestibulum.' | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.md | 133 | --prop text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet." \ | CODE |
| LOW | examples/ppt/textboxes/textboxes-advanced.md | 133 | --prop text="[lang=fr-FR at paragraph level] Lorem ipsum dolor sit amet." \ | CODE |
| LOW | …ppt/reference/styles/dark--architectural-plan/build.sh | 180 | a '/slide[1]' --prop text="Lorem ipsum dolor sit amet, consectetur adipiscing\nelit, sed do eiusmod tempor incididunt ut | CODE |
| LOW | …ppt/reference/styles/dark--architectural-plan/build.sh | 180 | a '/slide[1]' --prop text="Lorem ipsum dolor sit amet, consectetur adipiscing\nelit, sed do eiusmod tempor incididunt ut | CODE |
| LOW | src/officecli/Handlers/PowerPointHandler.cs | 4477 | var segIsPlaceholder = m.Groups[3].Value == "placeholder"; | CODE |
| LOW | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3652 | // "###-####" → "555-1234", SSN "000-00-0000" → "123-45-6789". An integer-only | COMMENT |
| LOW | …officecli/Handlers/Pptx/PowerPointHandler.Mutations.cs | 489 | if (elementType == "placeholder") | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Add.cs | 77 | "placeholder" or "ph" => AddPlaceholder(parentPath, index, properties), | CODE |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.Shape.cs | 419 | Element: "placeholder", | CODE |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.Shape.cs | 447 | Type = "placeholder", | CODE |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.Shape.cs | 826 | case "placeholder": | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 957 | node.Type = "placeholder"; | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 1385 | else if (elementType == "placeholder") | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 1663 | or "table" or "chart" or "placeholder" or "notes" | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 2275 | if (parsed.ElementType == "placeholder") | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 2298 | node.Type = "placeholder"; | CODE |
| LOW | src/officecli/Handlers/Pptx/PowerPointHandler.Query.cs | 2337 | lNode.Type = "placeholder"; | CODE |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.cs | 625 | // id with the slide's Query("placeholder") result. | COMMENT |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.cs | 634 | foreach (var ph in ppt.Query("placeholder")) | CODE |
| LOW | src/officecli/Handlers/Pptx/PptxBatchEmitter.cs | 718 | case "placeholder": | CODE |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/officecli/ResidentServer.cs | 949 | var node = System.Text.Json.Nodes.JsonNode.Parse(envelopeJson); | CODE |
| CRITICAL | src/officecli/CommandBuilder.Plugins.cs | 177 | ["manifest"] = System.Text.Json.Nodes.JsonNode.Parse(rawManifest), | CODE |
| CRITICAL | …/officecli/Handlers/Excel/ExcelHandler.Helpers.Node.cs | 942 | try { arr = System.Text.Json.Nodes.JsonNode.Parse(runsJson) as System.Text.Json.Nodes.JsonArray; } | CODE |
| CRITICAL | src/officecli/Handlers/Word/WordHandler.Selector.cs | 195 | ? para.ParagraphProperties.NumberingProperties.NumberingId.Val.Value.ToString() : null, | CODE |
| CRITICAL | src/officecli/Handlers/Word/WordHandler.Selector.cs | 197 | ? para.ParagraphProperties.NumberingProperties.NumberingLevelReference.Val.Value.ToString() : null, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install.sh | 113 | # Step 1: Try downloading (mirror first, github fallback) | COMMENT |
| LOW | install.sh | 157 | # Step 2: Fallback to local files | COMMENT |
| LOW | install.sh | 180 | # Step 3: Install | COMMENT |
| LOW | install.sh | 235 | # Step 4: Install AI agent skills (first install only) | COMMENT |
| LOW | examples/ppt/video.py | 101 | # Step 1: Generate video and cover | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 40 | ### Step 1: Understand the topic and suggest model direction | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 57 | ### Step 2: Search for models (agent-driven) | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 99 | ### Step 3: Present candidates to user for confirmation | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 132 | ### Step 4: Download the confirmed model | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 154 | ### Step 5: When user says "anything" / "you decide" / "just make a demo" | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 170 | ### Step 6: When user wants to find models themselves | COMMENT |
| LOW | skills/morph-ppt-3d/SKILL.md | 198 | ### Step 7: When user gives keywords and asks agent to search | COMMENT |
| LOW | src/officecli/CommandBuilder.cs | 367 | // Step 1: does a resident own this file? Probe via the -ping pipe, | STRING |
| LOW | src/officecli/CommandBuilder.cs | 400 | // Step 2: resident is confirmed alive — wait for our turn in the main | STRING |
| LOW | src/officecli/Core/UpdateChecker.cs | 312 | // Step 1: cheap size sanity check. A self-contained .NET | COMMENT |
| LOW⚡ | src/officecli/Core/UpdateChecker.cs | 332 | // Step 2: ensure the file is executable (Unix). Externally- | COMMENT |
| LOW⚡ | src/officecli/Core/UpdateChecker.cs | 339 | // Step 3: smoke test — see RunVersionVerify for rationale (shebang | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3587 | // Step 1: Replace h:mm and h:m patterns → mark minutes as placeholder | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3593 | // Step 2: Convert remaining m/mm to M/MM (month) | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3596 | // Step 3: Restore minute placeholders | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3598 | // Step 4: Other conversions | COMMENT |
| LOW | …fficecli/Handlers/Pptx/PowerPointHandler.Animations.cs | 327 | // Step 1: Build the Transition element using SDK (for correct child XML generation) | COMMENT |
| LOW | …cecli/Handlers/Word/WordHandler.Helpers.FindReplace.cs | 530 | // Step 1: Replace text in affected runs (same logic as old ReplaceInParagraph) | COMMENT |
| LOW | …cecli/Handlers/Word/WordHandler.Helpers.FindReplace.cs | 587 | // Step 2: If format props, split at the replaced text position and apply | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install.sh | 113 | # Step 1: Try downloading (mirror first, github fallback) | COMMENT |
| LOW | install.sh | 157 | # Step 2: Fallback to local files | COMMENT |
| LOW | install.sh | 180 | # Step 3: Install | COMMENT |
| LOW | install.sh | 235 | # Step 4: Install AI agent skills (first install only) | COMMENT |
| LOW | examples/ppt/video.py | 101 | # Step 1: Generate video and cover | COMMENT |
| LOW | src/officecli/CommandBuilder.cs | 367 | // Step 1: does a resident own this file? Probe via the -ping pipe, | STRING |
| LOW | src/officecli/CommandBuilder.cs | 400 | // Step 2: resident is confirmed alive — wait for our turn in the main | STRING |
| LOW | src/officecli/Core/UpdateChecker.cs | 312 | // Step 1: cheap size sanity check. A self-contained .NET | COMMENT |
| LOW⚡ | src/officecli/Core/UpdateChecker.cs | 332 | // Step 2: ensure the file is executable (Unix). Externally- | COMMENT |
| LOW⚡ | src/officecli/Core/UpdateChecker.cs | 339 | // Step 3: smoke test — see RunVersionVerify for rationale (shebang | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3587 | // Step 1: Replace h:mm and h:m patterns → mark minutes as placeholder | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3593 | // Step 2: Convert remaining m/mm to M/MM (month) | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3596 | // Step 3: Restore minute placeholders | COMMENT |
| LOW⚡ | …c/officecli/Handlers/Excel/ExcelHandler.HtmlPreview.cs | 3598 | // Step 4: Other conversions | COMMENT |
| LOW | …fficecli/Handlers/Pptx/PowerPointHandler.Animations.cs | 327 | // Step 1: Build the Transition element using SDK (for correct child XML generation) | COMMENT |
| LOW | …cecli/Handlers/Word/WordHandler.Helpers.FindReplace.cs | 530 | // Step 1: Replace text in affected runs (same logic as old ReplaceInParagraph) | COMMENT |
| LOW | …cecli/Handlers/Word/WordHandler.Helpers.FindReplace.cs | 587 | // Step 2: If format props, split at the replaced text position and apply | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/officecli/Core/PivotTableHelper.Parse.cs | 324 | // robust even if the source headers were renamed between Get and | COMMENT |
| MEDIUM | src/officecli/Core/Chart/ChartHelper.Reader.cs | 681 | // plot-area border/fill as VERBATIM <c:spPr> OuterXml (same robust | COMMENT |
| MEDIUM | src/officecli/Handlers/PowerPointHandler.cs | 764 | // Writing content at creation time is URI-agnostic and robust. | COMMENT |
| MEDIUM | …/officecli/Handlers/Excel/ExcelHandler.Set.Workbook.cs | 271 | // it" so the clear is robust even when the implied lock came from a | COMMENT |
| MEDIUM | src/officecli/Handlers/Word/WordHandler.Navigation.cs | 940 | // key) — robust against paragraphs living in tables/headers without needing a | COMMENT |
| MEDIUM | src/officecli/Handlers/Word/WordHandler.Navigation.cs | 3247 | // attribute text so the check is robust regardless of how the | COMMENT |
| MEDIUM | …icecli/Handlers/Word/WordHandler.HtmlPreview.Shapes.cs | 538 | // Absolutely-positioned overlay: write the declared px dimensions (from | COMMENT |
| MEDIUM | …/officecli/Handlers/Word/WordBatchEmitter.Resources.cs | 2910 | // seed <w:p> instead is robust to tcPr presence. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | examples/word/pictures.py | 0 | ship one `add` item over the pipe; return the parsed envelope. | STRING |
| HIGH | examples/ppt/pictures/pictures-basic.py | 0 | ship one `add` item over the pipe; return the parsed envelope. | STRING |
| HIGH | examples/ppt/ole/ole-embed.py | 0 | ship one `add` item over the pipe; return the parsed envelope. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/excel/charts/charts-column.sh | 13 | # Usage: | COMMENT |
| LOW | examples/excel/charts/charts-line.sh | 13 | # Usage: | COMMENT |
| LOW⚡ | examples/excel/charts/charts-histogram.sh | 19 | # Usage: | COMMENT |
| LOW | examples/excel/charts/charts-advanced.sh | 9 | # Usage: | COMMENT |
| LOW | examples/excel/charts/charts-extended.sh | 9 | # Usage: | COMMENT |
| LOW | examples/word/charts.sh | 21 | # Usage: | COMMENT |
| LOW | examples/ppt/charts/charts-combo.sh | 17 | # Usage: | COMMENT |
| LOW | examples/ppt/charts/charts-scatter.sh | 16 | # Usage: | COMMENT |
| LOW | examples/ppt/charts/charts-pie.sh | 15 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/excel/shapes.py | 174 | except Exception: | CODE |
| LOW⚡ | examples/excel/cell-formatting.py | 247 | except Exception: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 64 | except Exception: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 256 | except Exception as e: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 276 | except Exception as e: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 336 | except Exception as e: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 396 | except Exception as e: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.sh | 174 | except Exception as e: | CODE |
| LOW | skills/morph-ppt/reference/morph-helpers.sh | 270 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …h-ppt/reference/styles/light--minimal-product/build.sh | 264 | # For brevity, I'll create placeholder shapes that can be shown/hidden | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | sdk/python/officecli.py | 600 | sh = f"(curl -fsSL {_INSTALL_SH_MIRROR} 2>/dev/null || curl -fsSL {_INSTALL_SH_GITHUB}) | bash" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/morph-ppt/reference/morph-helpers.sh | 153 | # Check if this shape has previous slide's content prefix | COMMENT |
| LOW | skills/morph-ppt/reference/morph-helpers.sh | 155 | # Check if it's NOT ghosted (x != 36cm) | COMMENT |
| LOW | skills/morph-ppt/reference/morph-helpers.sh | 254 | # Check if text and position are identical | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/morph-ppt/reference/morph-helpers.py | 211 | CODE | |
| LOW | skills/morph-ppt/reference/morph-helpers.py | 401 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/python/officecli.py | 611 | __all__ = ["open", "create", "install", "Document", "OfficeCliError"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/ppt/charts/charts-advanced.py | 40 | CODE |