Files
boocode/openspec/changes/license-debt-mit/tasks.md
indifferentketchup a8bfde8f8d feat: relicense AGPL-3.0 → MIT (v2.7.0)
Clear the 3 Unsloth-Studio-derived AGPL files and flip LICENSE + 5
package.json from AGPL-3.0-only to MIT.

- html-to-md.ts → MIT node-html-markdown (parse5 dropped)
- llama-args-validator.ts → clean-room (flag denylist = facts)
- tool-call-parser.ts → delete dead Unsloth-ported code; keep
  extractToolCallBlocks/stripToolMarkup byte-identical (no behavior change)
- LICENSE → MIT (Copyright (c) 2026 indifferentketchup); 5 package.json → MIT;
  AGPL SPDX headers removed; README License section; license-mit guard test
- roadmap License-debt batch marked shipped; openspec/changes/license-debt-mit

Decouples the relicense from the native-parsing retirement (the ported parser
was dead code). Server suite 519 passing; build + coder typecheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 08:16:03 +00:00

2.8 KiB

Tasks — relicense AGPL-3.0 → MIT

Four units. A/B/C are disjoint files (parallelizable); D is the join (runs after A/B/C). The shared node-html-markdown dependency swap + pnpm install is done before A so the parallel agents don't race on apps/server/package.json.

Pre: dependency swap (done by coordinator)

  • Add node-html-markdown to apps/server/package.json dependencies; remove parse5 (only html-to-md consumed it).
  • pnpm install.

A — html-to-md → node-html-markdown

  • Replace apps/server/src/services/web/html-to-md.ts with a thin MIT wrapper exporting htmlToMarkdown(sourceHtml: string): string over NodeHtmlMarkdown.translate.
  • Drop the AGPL/Unsloth SPDX header.
  • Update html-to-md.test.ts to the new library's output (structure-level .toContain where whitespace differs; output feeds an LLM so exact format is not load-bearing).
  • Keep web/index.ts re-export and web_fetch.ts untouched.

B — llama-args-validator → clean-room

  • Rewrite apps/server/src/services/inference/llama-args-validator.ts: re-derive the managed-flag denylist from the public llama-server README; keep the BooCode shadowing-flag logic. Same exports (validateExtraArgs, isManagedFlag, stripShadowingFlags, StripOptions).
  • Drop the AGPL/Unsloth SPDX header.
  • Keep llama-args-validator.test.ts green (it pins the contract).

C — tool-call-parser → minimal clean (relicense-only)

  • Delete dead Unsloth-ported exports: parseToolCallsFromText, scanBalancedBraces, OpenAiToolCall, hasToolSignal, and the unused nudge constants (DUPLICATE_CALL_NUDGE, TOOL_ERROR_NUDGE, TOOL_ERROR_PREFIXES, BUDGET_EXHAUSTED_NUDGE).
  • Keep extractToolCallBlocks + streaming helpers + stripToolMarkup (re-derive its strip regexes from qwen's wire format). Drop the AGPL/Unsloth SPDX header.
  • Remove the now-dead tests from tool-call-parser.test.ts; keep streaming/strip tests.
  • Verify stream-phase.ts (extractToolCallBlocks) + tool-phase.ts / error-handler.ts (stripToolMarkup) still compile.

D — license flip (join)

  • LICENSE: replace AGPL-3.0 text with MIT, Copyright (c) 2026 indifferentketchup.
  • Flip "license" to "MIT" in all 5 package.json (root, server, web, coder, booterm).
  • Confirm no SPDX-License-Identifier: AGPL header survives in the 3 files.
  • Roadmap License-debt batch: planned → shipped (note the decoupled-from-parser-retirement approach). Add a ## License section to README.md (MIT).
  • Optional guard test: assert no AGPL SPDX header in apps/** and all 5 package.json are MIT.

Verify

  • pnpm -C apps/server test
  • pnpm -C apps/server build
  • root npx tsc --noEmit