Skip to content

feat(hangul): import, edit, and export HWP/HWPX - #320

Draft
seonghobae wants to merge 42 commits into
mainfrom
feat/hwp-hwpx-authoring
Draft

feat(hangul): import, edit, and export HWP/HWPX#320
seonghobae wants to merge 42 commits into
mainfrom
feat/hwp-hwpx-authoring

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Closes #319 when this Draft satisfies all applicable exact-head gates and the release freeze permits integration.

Problem and scope

Inkspan needs local HWP/HWPX import, editing, and export without granting the library filesystem, network, credential, service, database, model, tenancy, or deployment authority. The implementation therefore keeps the document engine host-injected and projects only a bounded structural document JSON contract across the public package boundary.

Implemented slice

  • Open HWP/HWPX bytes through a host-owned HangulDocumentEngine.
  • Convert supported paragraphs, headings, text, bold, italic, and strike content into framework-neutral document JSON.
  • Export edited document JSON as HWPX by default or legacy HWP explicitly.
  • Enforce bounded source and output bytes and stable payload-redacted errors.
  • Free host-engine documents through finally paths.
  • Publish the /hangul package surface without requiring consumers to resolve TipTap declaration types.
  • Include the usage guide, ADR, architecture/sequence documentation, package discovery, and regression coverage for the supported boundary.

This slice does not execute macros, scripts, links, or external relationships and does not acquire transport, persistence, authn/authz, tenancy, durable audit, migration, retention, credential, model/provider, or release authority.

Test-first and repair lineage

  • 42bf1638d5e10a9b2d56e6a36866f0ef77bf194d defined the HWP/HWPX authoring contract before the implementation.
  • f49b1a1adcb171d2193c016ed0dea68db9709e86 and 43d48779c2b5e475e5402346fdff88552b582811 introduced the bounded bridge and editable document behavior.
  • c9290106ba222b318907abfb59e140a15d39351d removed unreachable nullish mark fallbacks that alone prevented the repository's 100% branch-coverage gate.
  • c87be1f9ccbc456639ecdb65177cb2fa27e39b85 replaced the emitted @tiptap/core declaration dependency with a framework-neutral structural JSON contract so a strict standalone packed consumer can compile the /hangul subpath.
  • RED — e25a93599d55fe8c34db73eb4ce67413443a72f6: added exact assertions that unsupported caller-controlled block and mark types must not be reflected in diagnostics.
  • GREEN — 8d6e8754fc1db137cea2bb38e0819d271a821a26: changed those two diagnostics to fixed payload-redacted messages while preserving stable error codes.

Current contract

  • Unsupported inline marks fail with UNSUPPORTED_DOCUMENT_MARK and a fixed message.
  • Unsupported block nodes fail with UNSUPPORTED_DOCUMENT_NODE and a fixed message.
  • Neither diagnostic includes the caller-controlled type value.
  • Engine open/create failures, operation failures, invalid format, limits, and cleanup semantics remain stable.
  • The public declaration remains independent of TipTap package declarations.

Exact-head evidence

Current exact head: 8d6e8754fc1db137cea2bb38e0819d271a821a26.

  • CI 31763028607: successful.
  • Security Scan 31763028698: successful.
  • SAST Semgrep 31763028634: successful.
  • OpenCode and Noema required-review workflows: successful on this exact head.
  • Formal reviews: 0.
  • Unresolved inline review threads: 0.
  • Strix Security Scan 31763027808: still in progress and therefore not counted as passing.
  • GitHub reports this Draft mergeable; that is not treated as authorization to integrate.

The live protected base is main@e8109ec2a17de8bd6594487aa12c8c8a93cb2c03. Any later head movement invalidates this exact-head evidence and requires fresh verification.

Integration and release boundary

Keep this PR Draft and unmerged while #118 freezes the protected v0.6.0 release candidate. Do not advance protected main, fabricate tag/release identity, or describe this next-release feature as shipped. Readiness requires the unchanged current head, completion of every applicable required workflow including Strix, zero valid unresolved findings, and release-order authorization.

@coderabbitai

coderabbitai Bot commented Aug 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 47cc0ab3-bf27-4f8d-886b-4a7cdb1ed29d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(hangul): import and edit HWP/HWPX documents

1 participant