vibecodeagent 0.0.0-stage → 0.1.65

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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -2
  3. package/THIRD-PARTY-NOTICES.txt +1427 -0
  4. package/dist/agen.js +138920 -0
  5. package/dist/bin.js +1245 -0
  6. package/dist/daemon.js +163701 -0
  7. package/dist/node_modules/node-ensure/index.js +10 -0
  8. package/dist/node_modules/node-ensure/package.json +31 -0
  9. package/dist/node_modules/pdf-parse/lib/pdf-parse.js +102 -0
  10. package/dist/node_modules/pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js +18538 -0
  11. package/dist/node_modules/pdf-parse/lib/pdf.js/v1.10.100/build/pdf.worker.js +45507 -0
  12. package/dist/node_modules/pdf-parse/package.json +49 -0
  13. package/dist/node_modules/sql.js/dist/sql-wasm.js +186 -0
  14. package/dist/node_modules/sql.js/dist/sql-wasm.wasm +0 -0
  15. package/dist/node_modules/sql.js/package.json +58 -0
  16. package/dist/resources/skills/builtin/.gitkeep +0 -0
  17. package/dist/resources/skills/builtin/NOTICE.md +35 -0
  18. package/dist/resources/skills/builtin/README.md +74 -0
  19. package/dist/resources/skills/builtin/backend-engineering/SKILL.md +102 -0
  20. package/dist/resources/skills/builtin/backend-engineering/references/api-contracts.md +320 -0
  21. package/dist/resources/skills/builtin/backend-engineering/references/auth-and-secrets.md +268 -0
  22. package/dist/resources/skills/builtin/backend-engineering/references/concurrency-and-jobs.md +386 -0
  23. package/dist/resources/skills/builtin/backend-engineering/references/data-modelling.md +367 -0
  24. package/dist/resources/skills/builtin/backend-engineering/references/deploy-and-config.md +228 -0
  25. package/dist/resources/skills/builtin/backend-engineering/references/migrations.md +320 -0
  26. package/dist/resources/skills/builtin/backend-engineering/references/observability.md +301 -0
  27. package/dist/resources/skills/builtin/backend-engineering/references/plan-template.md +152 -0
  28. package/dist/resources/skills/builtin/backend-engineering/references/review-audit.md +213 -0
  29. package/dist/resources/skills/builtin/backend-engineering/references/security.md +251 -0
  30. package/dist/resources/skills/builtin/backend-engineering/references/stack-go.md +238 -0
  31. package/dist/resources/skills/builtin/backend-engineering/references/stack-node.md +274 -0
  32. package/dist/resources/skills/builtin/backend-engineering/references/stack-python.md +296 -0
  33. package/dist/resources/skills/builtin/backend-engineering/references/testing-and-perf.md +298 -0
  34. package/dist/resources/skills/builtin/backend-engineering/references/validation-and-errors.md +266 -0
  35. package/dist/resources/skills/builtin/dasar-vibecode/SKILL.md +312 -0
  36. package/dist/resources/skills/builtin/excel-maker/SKILL.md +71 -0
  37. package/dist/resources/skills/builtin/frontend-design/SKILL.md +131 -0
  38. package/dist/resources/skills/builtin/frontend-design/data/app-interface.csv +33 -0
  39. package/dist/resources/skills/builtin/frontend-design/data/catalog-summary.json +78 -0
  40. package/dist/resources/skills/builtin/frontend-design/data/charts.csv +26 -0
  41. package/dist/resources/skills/builtin/frontend-design/data/colors.csv +193 -0
  42. package/dist/resources/skills/builtin/frontend-design/data/data-provenance.json +1348 -0
  43. package/dist/resources/skills/builtin/frontend-design/data/google-font-licenses.json +20185 -0
  44. package/dist/resources/skills/builtin/frontend-design/data/google-fonts.csv +1935 -0
  45. package/dist/resources/skills/builtin/frontend-design/data/icons.csv +106 -0
  46. package/dist/resources/skills/builtin/frontend-design/data/landing.csv +35 -0
  47. package/dist/resources/skills/builtin/frontend-design/data/motion.csv +18 -0
  48. package/dist/resources/skills/builtin/frontend-design/data/phosphor-icons-upstream.json +32582 -0
  49. package/dist/resources/skills/builtin/frontend-design/data/products.csv +193 -0
  50. package/dist/resources/skills/builtin/frontend-design/data/react-performance.csv +45 -0
  51. package/dist/resources/skills/builtin/frontend-design/data/stacks/angular.csv +51 -0
  52. package/dist/resources/skills/builtin/frontend-design/data/stacks/astro.csv +54 -0
  53. package/dist/resources/skills/builtin/frontend-design/data/stacks/avalonia.csv +57 -0
  54. package/dist/resources/skills/builtin/frontend-design/data/stacks/flutter.csv +53 -0
  55. package/dist/resources/skills/builtin/frontend-design/data/stacks/html-tailwind.csv +60 -0
  56. package/dist/resources/skills/builtin/frontend-design/data/stacks/javafx.csv +76 -0
  57. package/dist/resources/skills/builtin/frontend-design/data/stacks/jetpack-compose.csv +53 -0
  58. package/dist/resources/skills/builtin/frontend-design/data/stacks/laravel.csv +51 -0
  59. package/dist/resources/skills/builtin/frontend-design/data/stacks/nextjs.csv +62 -0
  60. package/dist/resources/skills/builtin/frontend-design/data/stacks/nuxt-ui.csv +71 -0
  61. package/dist/resources/skills/builtin/frontend-design/data/stacks/nuxtjs.csv +68 -0
  62. package/dist/resources/skills/builtin/frontend-design/data/stacks/react-native.csv +52 -0
  63. package/dist/resources/skills/builtin/frontend-design/data/stacks/react.csv +62 -0
  64. package/dist/resources/skills/builtin/frontend-design/data/stacks/shadcn.csv +69 -0
  65. package/dist/resources/skills/builtin/frontend-design/data/stacks/svelte.csv +56 -0
  66. package/dist/resources/skills/builtin/frontend-design/data/stacks/swiftui.csv +51 -0
  67. package/dist/resources/skills/builtin/frontend-design/data/stacks/threejs.csv +54 -0
  68. package/dist/resources/skills/builtin/frontend-design/data/stacks/uno.csv +60 -0
  69. package/dist/resources/skills/builtin/frontend-design/data/stacks/uwp.csv +56 -0
  70. package/dist/resources/skills/builtin/frontend-design/data/stacks/vue.csv +50 -0
  71. package/dist/resources/skills/builtin/frontend-design/data/stacks/winui.csv +60 -0
  72. package/dist/resources/skills/builtin/frontend-design/data/stacks/wpf.csv +57 -0
  73. package/dist/resources/skills/builtin/frontend-design/data/styles.csv +89 -0
  74. package/dist/resources/skills/builtin/frontend-design/data/typography.csv +75 -0
  75. package/dist/resources/skills/builtin/frontend-design/data/ui-reasoning.csv +193 -0
  76. package/dist/resources/skills/builtin/frontend-design/data/ux-guidelines.csv +120 -0
  77. package/dist/resources/skills/builtin/frontend-design/references/animation-patterns.md +705 -0
  78. package/dist/resources/skills/builtin/frontend-design/references/app-polish.md +117 -0
  79. package/dist/resources/skills/builtin/frontend-design/references/apple-fluid.md +278 -0
  80. package/dist/resources/skills/builtin/frontend-design/references/art-direction.md +280 -0
  81. package/dist/resources/skills/builtin/frontend-design/references/case-studies.md +599 -0
  82. package/dist/resources/skills/builtin/frontend-design/references/craft.md +128 -0
  83. package/dist/resources/skills/builtin/frontend-design/references/expo.md +251 -0
  84. package/dist/resources/skills/builtin/frontend-design/references/layout-systems.md +533 -0
  85. package/dist/resources/skills/builtin/frontend-design/references/libraries.md +72 -0
  86. package/dist/resources/skills/builtin/frontend-design/references/motion.md +222 -0
  87. package/dist/resources/skills/builtin/frontend-design/references/picker.md +197 -0
  88. package/dist/resources/skills/builtin/frontend-design/references/plan-template.md +73 -0
  89. package/dist/resources/skills/builtin/frontend-design/references/prototype.md +85 -0
  90. package/dist/resources/skills/builtin/frontend-design/references/recipes-expo.md +385 -0
  91. package/dist/resources/skills/builtin/frontend-design/references/recipes-web.md +421 -0
  92. package/dist/resources/skills/builtin/frontend-design/references/review-audit.md +107 -0
  93. package/dist/resources/skills/builtin/frontend-design/references/sonner.md +143 -0
  94. package/dist/resources/skills/builtin/frontend-design/references/technical-stack.md +543 -0
  95. package/dist/resources/skills/builtin/frontend-design/references/theming.md +60 -0
  96. package/dist/resources/skills/builtin/frontend-design/references/typography.md +393 -0
  97. package/dist/resources/skills/builtin/frontend-design/references/ux-rules.md +256 -0
  98. package/dist/resources/skills/builtin/frontend-design/references/vocabulary.md +169 -0
  99. package/dist/resources/skills/builtin/frontend-design/scripts/core.py +993 -0
  100. package/dist/resources/skills/builtin/frontend-design/scripts/design_system.py +1643 -0
  101. package/dist/resources/skills/builtin/frontend-design/scripts/reasoning_contract.py +123 -0
  102. package/dist/resources/skills/builtin/frontend-design/scripts/search.py +171 -0
  103. package/dist/resources/skills/builtin/frontend-design/scripts/validate_data.py +1091 -0
  104. package/dist/resources/skills/builtin/kerja-agentik/SKILL.md +117 -0
  105. package/dist/resources/skills/builtin/pdf-maker/SKILL.md +51 -0
  106. package/dist/resources/skills/builtin/tinjau-keamanan/SKILL.md +53 -0
  107. package/dist/resources/skills/builtin/word-maker/SKILL.md +58 -0
  108. package/dist/resources/skills/builtin/write-swift/SKILL.md +388 -0
  109. package/package.json +35 -4
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: kerja-agentik
3
+ description: Use on every task from start to finish — the agentic working loop. Write code, then actually run and test it before claiming anything; debug to the root cause, not the symptom; and when information is missing or uncertain, verify with `WebSearch` or the codebase instead of inventing it.
4
+ ---
5
+
6
+ # Working agentically
7
+
8
+ Two disciplines separate an agent from an autocomplete: it **runs what it
9
+ writes**, and it **checks what it claims**. Everything below is one of those two.
10
+
11
+ ## The loop: write → run → test → fix
12
+
13
+ Code that has never executed is a draft, no matter how confident it reads.
14
+
15
+ 1. **Plan first when the task has more than one step.** Use `TodoWrite`, one
16
+ item per independently verifiable outcome — not "improve X" but "X passes
17
+ test Y". Mark items done only when verified, never when written.
18
+ 2. **Write the smallest piece that can be executed**, then execute it with
19
+ `Bash` — the real command, the real output. Building the whole feature
20
+ before the first run means the first error arrives with ten suspects.
21
+ 3. **Test it, and prove the test can fail.** Break the code on purpose and
22
+ watch the test go red, then restore it and watch green. A test that passes
23
+ on its first run has proven nothing — it may be asserting something that was
24
+ never in doubt. Every bug you fix gets a test: the receipt of the fix.
25
+ 4. **Test the contract, not the mechanism.** Assert what a caller can observe —
26
+ return values, thrown errors, files written. And pair every upper bound with
27
+ a lower one: `length < 10` passes when the length is zero.
28
+ 5. **Re-run the full relevant suite before saying done.** Your change passing
29
+ its own test while breaking a neighbour's is the most common last-minute lie.
30
+
31
+ ## When it fails: debug to the root, not the symptom
32
+
33
+ A patch that makes the symptom disappear without explaining it moves the bug
34
+ somewhere less visible.
35
+
36
+ - Reproduce first — a command or input that fails **every time**. Without it
37
+ you cannot tell a fix from a coincidence. "Fails only sometimes" is itself a
38
+ clue: suspect ordering, caching, clocks, leftover state.
39
+ - Narrow by halving, not by reading: simplest input? fails before or after this
40
+ line (log it, do not assume)? does the previous commit fail?
41
+ - Ask "why" until the answer stops moving: crash → value is `undefined` → field
42
+ optional → caller never sets it → **two call sites disagree about the
43
+ shape**. That last one is the bug; fixing the crash alone leaves it alive.
44
+ - Read the actual error message, all of it. The line you skimmed past usually
45
+ names the file and the reason.
46
+
47
+ ## Claims need evidence
48
+
49
+ - "Done" means: this command was run, this was its exit code, these tests are
50
+ green — and you cite them. If you wrote code but did not run it, say exactly
51
+ that: "written, not yet run".
52
+ - Report failures verbatim. A test that fails is a finding to show, not to
53
+ smooth over. Saying "everything works" when one thing does not costs more
54
+ trust than the failure itself.
55
+ - Numbers beat adjectives: "startup 1.2s → 0.4s" can be re-checked; "much
56
+ faster" cannot.
57
+
58
+ ## When you do not know: look it up, do not make it up
59
+
60
+ An invented API costs the user a debugging session and their trust. An honest
61
+ lookup costs one tool call. Recognise the moment before the hallucination:
62
+
63
+ - **About this codebase** — a function you have not opened, a config key you
64
+ half-remember: `Grep` and `Read` the actual files. Memory of a codebase is a
65
+ hypothesis; the file is the truth.
66
+ - **About a library or API** — a method signature, an option name, behaviour
67
+ that differs between versions: check the version actually installed
68
+ (lockfile, `node_modules`) first, then `WebSearch` for that exact version
69
+ and `WebFetch` the documentation page. Quote what you found, with the URL.
70
+ - **An unfamiliar error message** — `WebSearch` it verbatim, in quotes, before
71
+ theorising about it.
72
+ - **Anything recent** — releases, deprecations, pricing, news, or anything
73
+ after your training data: `WebSearch`, always. Your memory of the current
74
+ state of the world is guaranteed stale.
75
+
76
+ Never invent a function signature, config key, CLI flag, URL, or version
77
+ number. Confidence is not a source.
78
+
79
+ And when the search fails or the tool is unavailable: **say "I could not
80
+ verify this"** and mark the assumption clearly. An answer with a named gap is
81
+ useful; a guess dressed as an answer is a trap you set for the user.
82
+
83
+ ### Researching, not just looking up
84
+
85
+ One query answers one fact. Anything carrying a "why", a version, a comparison,
86
+ or a date needs a sweep — and a sweep is three or four queries in a single
87
+ `WebSearch` call, not three calls and not one query.
88
+
89
+ **Vary the angle, not the wording.** Rephrasing the same idea hits the same part
90
+ of the index three times and buys nothing. Genuinely different angles: the exact
91
+ error string in quotes; the official term the vendor uses; the words a frustrated
92
+ user would type; the negative case ("X not working after Y"); the question dated
93
+ ("X 2026"). Send them together.
94
+
95
+ **Cross-check before you commit.** One source is a claim; two independent sources
96
+ are a fact. Prefer primary sources — the vendor's changelog, the RFC, the
97
+ repository — over anyone summarising them. Results name the indexes that found
98
+ them: a URL two independent indexes returned is a stronger signal than one. When
99
+ results carry dates, the newest wins for anything that changes (versions, prices,
100
+ APIs) and loses for anything that does not (concepts, history).
101
+
102
+ **When sources contradict each other, say so.** Do not quietly pick the one you
103
+ prefer. Name both, name their dates, and name the one you are acting on and why —
104
+ usually the more recent, more official, or more specific. A contradiction you
105
+ report is useful; one you hide becomes the user's bug.
106
+
107
+ **Stop when the next query stops changing your answer.** Two sources agreeing is
108
+ enough; a third confirming the same thing is a wasted call. Stop also when the
109
+ sweep keeps returning the same few pages — the index has told you what it has,
110
+ and the next step is `WebFetch` on the best of them, not another query.
111
+
112
+ **Read the coverage line.** It says which indexes answered and which did not.
113
+ Thin coverage means your search was narrow or an index was down — it is not
114
+ evidence that the answer does not exist. Widen the angles or fetch a page
115
+ directly. And if a search fails outright, that is a tooling failure, not a
116
+ finding: fall back to the rule above and say you could not verify it. Never let a
117
+ failed search turn into a confident guess.
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: pdf-maker
3
+ description: Use when the user wants a PDF — a printable report, invoice, certificate, handout, or any document that must look identical on every device — or asks to export Markdown or HTML to PDF. Covers DokumenTulis's Chromium rendering, raw HTML with CSS for layout and page breaks, and checking PDFs with DokumenValidasi.
4
+ ---
5
+
6
+ # PDF documents
7
+
8
+ `DokumenTulis` renders PDFs with Chromium's full layout engine on A4 pages: real fonts, tables, code blocks and page breaks. Never try to produce a PDF with Write or a shell script — the result will not open.
9
+
10
+ ## The call
11
+
12
+ ```
13
+ DokumenTulis { "path": "out/invoice-0042.pdf", "isi": "# Invoice 0042\n\n..." }
14
+ ```
15
+
16
+ Relative paths resolve against the session's working directory.
17
+
18
+ ## Markdown or HTML?
19
+
20
+ **Markdown** (the default) covers most documents: headings, paragraphs, bold, italic, links, bulleted and numbered lists, block quotes, tables and code blocks, styled by a clean built-in print stylesheet. Prefer it.
21
+
22
+ **`"html": true`** when layout matters — invoices, certificates, letterheads, multi-column pages. You write a complete HTML document and control everything with CSS:
23
+
24
+ - page size and margins: `@page { size: A4; margin: 18mm 16mm; }`
25
+ - page breaks: `<div style="break-after: page"></div>`, and `break-inside: avoid` on table rows or cards that must not split
26
+ - landscape pages: `@page { size: A4 landscape; }`
27
+ - images: embed them as `data:` URIs; remote URLs are not guaranteed to load
28
+ - fonts: use common system font stacks; web fonts are not guaranteed to load
29
+
30
+ Scripts do not run to build the page — lay it out with HTML and CSS only.
31
+
32
+ ## Writing a good PDF
33
+
34
+ 1. Decide the page structure before writing: title block, sections, tables, totals.
35
+ 2. Keep tables narrow enough for a portrait page, or switch the page to landscape.
36
+ 3. Put totals and key figures where a printed page will show them, not after a page break.
37
+ 4. Write in the user's language.
38
+
39
+ ## After writing
40
+
41
+ The result ends with a validation verdict, including the page count and how much text the pages contain:
42
+
43
+ - `Validated: it opens cleanly (N page(s), M characters of text)` — done. The PDF is attached to your reply automatically.
44
+ - A warning that pages have **no extractable text** means the content came out as images; search and copy-paste will not work. That is expected only for image-only documents.
45
+ - `VALIDATION FAILED` — fix the input and write it again in the same turn.
46
+
47
+ For a PDF made any other way, or one a user says is broken, run `DokumenValidasi` on it. It detects truncated files, missing headers, unparseable structure, password protection, and pages without a text layer.
48
+
49
+ ## Limits
50
+
51
+ Filling in or editing an existing PDF is not supported: `Read` extracts its text, and a new PDF can be rebuilt from that text with `DokumenTulis`. Say this plainly rather than promising an in-place edit.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: tinjau-keamanan
3
+ description: Use when reviewing unfamiliar or inherited code for security problems, checking a script before running it, or investigating something that looks suspicious. Runs SecurityScan, then judges its findings instead of repeating them — the scanner is deliberately noisy and proves nothing on its own.
4
+ ---
5
+
6
+ # Reviewing code for security problems
7
+
8
+ `SecurityScan` matches patterns against text. It does not run code, does not
9
+ follow data flow, and cannot tell a deliberate use from an attack. Your job is
10
+ the part it cannot do: deciding which matches mean something.
11
+
12
+ ## The order that matters
13
+
14
+ 1. **Scan first, read second.** Run `SecurityScan` on the directory in question
15
+ before opening files. It tells you where to look, which is faster than
16
+ reading in the order the file tree happens to be in.
17
+ 2. **Open every finding you report.** A finding is a line number and a pattern
18
+ name; it is not a conclusion. Read the surrounding code before you describe
19
+ it to the user.
20
+ 3. **Say what you did not check.** The scan skips `node_modules`, `.git`, and
21
+ build output, and stops at a file limit on large trees. If the report says it
22
+ stopped early, that is part of your answer.
23
+
24
+ ## Judging findings
25
+
26
+ Most matches in ordinary code are benign. These are the questions that separate
27
+ them:
28
+
29
+ - **Where does the input come from?** `exec` on a hard-coded string is a build
30
+ script. `exec` on something that arrived over the network is a hole.
31
+ - **Is the credential real?** A pattern that looks like a key in a test fixture
32
+ or an example file is not a leak. One in a committed `.env` is.
33
+ - **Does it persist?** Code that writes to LaunchAgents, crontab, shell rc
34
+ files, or Registry Run keys survives a reboot. That deserves a sentence of its
35
+ own in your report, even when it looks intentional.
36
+ - **Is it obfuscated?** Base64 blobs and long escape sequences in source that is
37
+ otherwise readable are worth explaining, not skipping.
38
+
39
+ ## What NEVER to say
40
+
41
+ Never tell the user code is safe because the scan came back `safe`. It means no
42
+ known pattern matched. Those are different sentences, and the difference is the
43
+ entire value of this skill: a user who believes the first one stops looking.
44
+
45
+ If you found nothing, say what you scanned, what you skipped, and that nothing
46
+ matched — then say what a human should still look at by hand.
47
+
48
+ ## When NOT to use this
49
+
50
+ - Auditing dependencies. That is `npm audit` and supply-chain tooling, not
51
+ pattern matching over minified files.
52
+ - Code you wrote in this session. You already know what is in it; read the diff.
53
+ - As a gate before shipping. It is a reading aid, not an approval.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: word-maker
3
+ description: Use when the user wants a Word document (.docx) — a report, letter, proposal, CV, meeting minutes, handout, or notes turned into a file they can open and edit in Word or Google Docs. Covers choosing DOCX over PDF, the Markdown DokumenTulis renders, tables and numbered lists, and checking the result.
4
+ ---
5
+
6
+ # Word documents (.docx)
7
+
8
+ A .docx is a ZIP package of XML parts. It cannot be produced by writing text into a file, and Write refuses to try. The only reliable path in VibeCode is `DokumenTulis`, which generates the package from Markdown and validates it after writing.
9
+
10
+ ## DOCX or PDF?
11
+
12
+ - **DOCX** when the reader will *edit* it: drafts, templates, letters someone will sign, reports a team will comment on.
13
+ - **PDF** when it must *look the same everywhere* or be printed: invoices, certificates, final handouts. Use the `pdf-maker` skill.
14
+ - If the user did not say, ask once, or pick DOCX for drafts and PDF for finished deliverables and say which you chose.
15
+
16
+ ## The call
17
+
18
+ ```
19
+ DokumenTulis { "path": "reports/q3-summary.docx", "isi": "# Q3 Summary\n\n..." }
20
+ ```
21
+
22
+ Relative paths resolve against the session's working directory. Write the whole document in one call; there is no append mode.
23
+
24
+ ## What the Markdown becomes
25
+
26
+ | Markdown | In Word |
27
+ |---|---|
28
+ | `#` to `######` | Heading 1-6 (they appear in Word's navigation pane) |
29
+ | blank-line separated text | paragraphs |
30
+ | `**bold**`, `*italic*`, `` `code` `` | bold, italic, Consolas runs |
31
+ | `- item` / `1. item` | bulleted / numbered list; indent two spaces per level |
32
+ | `> quote` | indented italic paragraph |
33
+ | `| a | b |` tables | real Word tables, header row shaded and bold |
34
+ | fenced code blocks | shaded Consolas lines |
35
+ | `[text](url)` | "text (url)" |
36
+
37
+ Not supported: images, headers and footers, page numbers, columns, tracked changes, custom fonts or colours. If the user needs those, say so plainly — or produce a PDF with `html: true`, where CSS controls the layout.
38
+
39
+ ## Writing a good document
40
+
41
+ 1. Outline first: title, 3-7 sections, and what each section must say.
42
+ 2. One `#` title, `##` sections, `###` sub-sections. Do not skip levels.
43
+ 3. Keep paragraphs short. Use numbered lists for steps and procedures, bullets for unordered points.
44
+ 4. Tables for comparisons and figures. Keep them to about six columns; wider tables wrap badly in portrait pages. Every row should have the same number of cells.
45
+ 5. Write in the user's language, including headings and table headers.
46
+
47
+ ## After writing
48
+
49
+ The result line ends with a validation verdict:
50
+
51
+ - `Validated: it opens cleanly (N paragraph(s), M table(s))` — done. The document is attached to your reply automatically, so the user can save it anywhere.
52
+ - `VALIDATION FAILED` — the file is broken. Read the listed problems, fix the input, and write it again in the same turn. Never hand a failed file to the user.
53
+
54
+ For a .docx created any other way (a Python script, a converter, a file the user sent that "won't open"), run `DokumenValidasi` on it, then hand it over with `Lampirkan`.
55
+
56
+ ## Editing an existing .docx
57
+
58
+ `Read` extracts the text of a .docx; it does not give you the original XML. To change a document, rebuild it with `DokumenTulis` from the extracted content plus the edits, save it under a new name unless the user asked to overwrite, and tell the user that formatting the original had beyond the list above (fonts, images, headers) is not carried over.