From b0ea7601b714105ae7b55d820ebfd4005eca4cc7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:40:16 +0900 Subject: [PATCH 01/12] test(opencode): require NVIDIA NIM-only local config --- tests/unit/opencode-config.test.mjs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 tests/unit/opencode-config.test.mjs diff --git a/tests/unit/opencode-config.test.mjs b/tests/unit/opencode-config.test.mjs new file mode 100644 index 00000000..2db34ae3 --- /dev/null +++ b/tests/unit/opencode-config.test.mjs @@ -0,0 +1,24 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import test from 'node:test'; + +const config = JSON.parse(readFileSync(new URL('../../opencode.jsonc', import.meta.url), 'utf8')); + +test('OpenCode development config uses only NVIDIA NIM with the scoped process binding', () => { + assert.equal(config.model, 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5'); + assert.equal(config.small_model, 'nvidia-nim/meta/llama-3.3-70b-instruct'); + assert.deepEqual(config.enabled_providers, ['nvidia-nim']); + + const provider = config.provider?.['nvidia-nim']; + assert.ok(provider, 'NVIDIA NIM provider must be configured'); + assert.equal(provider.options?.baseURL, 'https://integrate.api.nvidia.com/v1'); + assert.equal(provider.options?.apiKey, '{env:NVIDIA_API_KEY}'); + assert.ok(provider.models?.['nvidia/llama-3.3-nemotron-super-49b-v1.5']); + assert.ok(provider.models?.['meta/llama-3.3-70b-instruct']); + assert.ok(provider.models?.['mistralai/codestral-22b-instruct-v0.1']); + + const serialized = JSON.stringify(config); + assert.doesNotMatch(serialized, /github-models/i); + assert.doesNotMatch(serialized, /STRIX_GITHUB_MODELS_TOKEN/); + assert.doesNotMatch(serialized, /COPILOT_GITHUB_TOKEN/); +}); From 4b2421e9a2571b16065ca488d97185e011c5edb2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:40:31 +0900 Subject: [PATCH 02/12] test(opencode): execute NIM config regression in unit suite --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93430c55..9e23143e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "coverage": "npm run test:coverage", "server": "node server/server.mjs", "test:api": "node tests/api/auth-secret.test.mjs && node tests/api/smoke.mjs && node tests/api/ratelimit.test.mjs && node tests/api/attachment-status.test.mjs && node tests/api/session-revocation.test.mjs", - "test:unit": "node tests/unit/analytics.test.mjs && node tests/unit/cpm.test.mjs && node tests/unit/baseline-compare.test.mjs && node tests/unit/workload.test.mjs && node tests/unit/cost-evm.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && node tests/unit/dep-types.test.mjs && node tests/unit/weekly-report.test.mjs && node tests/unit/clearfolio.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/sprint-stats.test.mjs && node tests/unit/burndown.test.mjs && node tests/unit/pm-analysis.test.mjs && node tests/unit/cloud-sync-security.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/coverage-script-contract.test.mjs", + "test:unit": "node tests/unit/opencode-config.test.mjs && node tests/unit/analytics.test.mjs && node tests/unit/cpm.test.mjs && node tests/unit/baseline-compare.test.mjs && node tests/unit/workload.test.mjs && node tests/unit/cost-evm.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && node tests/unit/dep-types.test.mjs && node tests/unit/weekly-report.test.mjs && node tests/unit/clearfolio.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/sprint-stats.test.mjs && node tests/unit/burndown.test.mjs && node tests/unit/pm-analysis.test.mjs && node tests/unit/cloud-sync-security.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/coverage-script-contract.test.mjs", "test:coverage": "c8 --all --include=app.js --include=cloud-sync.js --include=scripts/ci/static_coverage_evidence.mjs --include=server/attachment_status.mjs --include=server/app.mjs --include=server/auth.mjs --include=server/clearfolio.mjs --include=server/orchestrator.mjs --reporter=json --reporter=json-summary npm run test:coverage:cases", "test:coverage:cases": "node tests/unit/coverage-script-contract.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && npm run test:api", "test:e2e": "playwright test", From 6f8fbf592d1b80d58e14942d1d16d10755b6735d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:41:01 +0900 Subject: [PATCH 03/12] test(opencode): require live hosted NIM fallback set --- tests/unit/opencode-config.test.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/opencode-config.test.mjs b/tests/unit/opencode-config.test.mjs index 2db34ae3..91384559 100644 --- a/tests/unit/opencode-config.test.mjs +++ b/tests/unit/opencode-config.test.mjs @@ -4,7 +4,7 @@ import test from 'node:test'; const config = JSON.parse(readFileSync(new URL('../../opencode.jsonc', import.meta.url), 'utf8')); -test('OpenCode development config uses only NVIDIA NIM with the scoped process binding', () => { +test('OpenCode development config uses only currently hosted NVIDIA NIM candidates', () => { assert.equal(config.model, 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5'); assert.equal(config.small_model, 'nvidia-nim/meta/llama-3.3-70b-instruct'); assert.deepEqual(config.enabled_providers, ['nvidia-nim']); @@ -15,7 +15,7 @@ test('OpenCode development config uses only NVIDIA NIM with the scoped process b assert.equal(provider.options?.apiKey, '{env:NVIDIA_API_KEY}'); assert.ok(provider.models?.['nvidia/llama-3.3-nemotron-super-49b-v1.5']); assert.ok(provider.models?.['meta/llama-3.3-70b-instruct']); - assert.ok(provider.models?.['mistralai/codestral-22b-instruct-v0.1']); + assert.ok(provider.models?.['mistralai/mixtral-8x7b-instruct-v0.1']); const serialized = JSON.stringify(config); assert.doesNotMatch(serialized, /github-models/i); From 15f80bf4413baa81712c4c474f4bf28a2ecbd30e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:41:17 +0900 Subject: [PATCH 04/12] fix(opencode): use NVIDIA NIM-only local development config --- opencode.jsonc | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/opencode.jsonc b/opencode.jsonc index a5ab3396..dda98ee0 100644 --- a/opencode.jsonc +++ b/opencode.jsonc @@ -1,8 +1,8 @@ { "$schema": "https://opencode.ai/config.json", - "model": "github-models/openai/gpt-5", - "small_model": "github-models/deepseek/deepseek-v3-0324", - "enabled_providers": ["github-models"], + "model": "nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5", + "small_model": "nvidia-nim/meta/llama-3.3-70b-instruct", + "enabled_providers": ["nvidia-nim"], "mcp": { "codegraph": { "type": "local", @@ -37,37 +37,36 @@ } }, "provider": { - "github-models": { + "nvidia-nim": { "npm": "@ai-sdk/openai-compatible", - "name": "GitHub Models", + "name": "NVIDIA NIM", "options": { - "baseURL": "https://models.github.ai/inference", - "apiKey": "{env:STRIX_GITHUB_MODELS_TOKEN}" + "baseURL": "https://integrate.api.nvidia.com/v1", + "apiKey": "{env:NVIDIA_API_KEY}" }, "models": { - "openai/gpt-5": { - "name": "OpenAI GPT-5", + "nvidia/llama-3.3-nemotron-super-49b-v1.5": { + "name": "NVIDIA Llama 3.3 Nemotron Super 49B v1.5", "tool_call": true, "reasoning": true, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 65536 } }, - "deepseek/deepseek-r1-0528": { - "name": "DeepSeek R1 0528", + "meta/llama-3.3-70b-instruct": { + "name": "Meta Llama 3.3 70B Instruct (NIM)", "tool_call": true, - "reasoning": true, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 } }, - "deepseek/deepseek-v3-0324": { - "name": "DeepSeek V3 0324", + "mistralai/mixtral-8x7b-instruct-v0.1": { + "name": "Mixtral 8x7B Instruct v0.1 (NIM)", "tool_call": true, "limit": { - "context": 128000, + "context": 32768, "output": 4096 } } From 2bb47e2f998200daed34bf06e1e5faf0e32065c0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:41:39 +0900 Subject: [PATCH 05/12] docs(opencode): keep local NIM config behind central workflow ownership --- AGENTS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 7a5b65ac..d1613bb0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,6 +23,12 @@ - OpenCode Review, Strix Security Scan, and PR Review Merge Scheduler are organization-level required workflows from `ContextualWisdomLab/.github`. Do not copy them into this repository. +- ScopeWeave's repository-local `opencode.jsonc` is development configuration, + not a replacement for the organization review workflow. It uses NVIDIA NIM + only and reads the process-local `NVIDIA_API_KEY` binding. Organization CI + owns secret injection and maps the organization `NVIDIA_NIM_API_KEY` secret + into that process binding; do not add a repository-local OpenCode workflow or + restore GitHub Models/COPILOT credentials to this configuration. - Keep companion SCA workflows development-only; do not add runtime dependencies. - If GitHub CLI output emits Projects(classic) deprecation warnings, From aa4a018d2514ee3a2d97ee8bf4fdb63d34d0ced6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:42:02 +0900 Subject: [PATCH 06/12] docs(changelog): record NIM-only OpenCode development config --- CHANGELOG.md | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc41a659..19cd2cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Switched the repository-local OpenCode development configuration from GitHub + Models to a NVIDIA NIM-only candidate set while preserving organization-level + review-workflow ownership in `ContextualWisdomLab/.github`. - Accepted XML whitespace before exact Microsoft Project element delimiters while preserving the linear, regex-free import scanner and rejecting attributes, longer names, non-XML whitespace, nested unmatched blocks, and @@ -77,17 +80,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 blocker for this static app. ## [1.0.0] - 2026-04-20 - - -### Added - -- Initial ScopeWeave Planner release with tree-table editing, - cumulative metrics, CSV import/export, and Gantt modal. -- `wbs.json` seed loading plus browser autosave and optional file sync. -- Playwright E2E coverage for add/edit hierarchy flows, delete - confirmation, subtree drag-and-drop, and JSON sync shape. -- GitHub Pages deployment workflow and operator documentation. - -## [1.0.1] - 2026-06-25 -### 성능 개선 (Performance) -- 드래그 앤 드롭 동작 중 `dragover` 이벤트에서 발생하는 O(N) 작업 리스트 검색 성능 병목 문제를, O(1) 해시맵(Map) 기반의 캐싱 조회 로직으로 개선하여 큰 크기의 WBS 리스트에서의 버벅임 현상을 해결했습니다. From 559a77d79edda381221e39c1e3a501ca115d74b2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:45:03 +0900 Subject: [PATCH 07/12] test(opencode): use hosted 8B NIM model for small tasks --- tests/unit/opencode-config.test.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/opencode-config.test.mjs b/tests/unit/opencode-config.test.mjs index 91384559..8bb07d1e 100644 --- a/tests/unit/opencode-config.test.mjs +++ b/tests/unit/opencode-config.test.mjs @@ -6,7 +6,7 @@ const config = JSON.parse(readFileSync(new URL('../../opencode.jsonc', import.me test('OpenCode development config uses only currently hosted NVIDIA NIM candidates', () => { assert.equal(config.model, 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5'); - assert.equal(config.small_model, 'nvidia-nim/meta/llama-3.3-70b-instruct'); + assert.equal(config.small_model, 'nvidia-nim/meta/llama-3.1-8b-instruct'); assert.deepEqual(config.enabled_providers, ['nvidia-nim']); const provider = config.provider?.['nvidia-nim']; @@ -14,8 +14,8 @@ test('OpenCode development config uses only currently hosted NVIDIA NIM candidat assert.equal(provider.options?.baseURL, 'https://integrate.api.nvidia.com/v1'); assert.equal(provider.options?.apiKey, '{env:NVIDIA_API_KEY}'); assert.ok(provider.models?.['nvidia/llama-3.3-nemotron-super-49b-v1.5']); + assert.ok(provider.models?.['meta/llama-3.1-8b-instruct']); assert.ok(provider.models?.['meta/llama-3.3-70b-instruct']); - assert.ok(provider.models?.['mistralai/mixtral-8x7b-instruct-v0.1']); const serialized = JSON.stringify(config); assert.doesNotMatch(serialized, /github-models/i); From f3bf4bb9c8f53dcb5796728bf89a3f2677368a95 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:46:18 +0900 Subject: [PATCH 08/12] fix(opencode): use hosted 8B NIM model for small tasks --- opencode.jsonc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/opencode.jsonc b/opencode.jsonc index dda98ee0..69de1322 100644 --- a/opencode.jsonc +++ b/opencode.jsonc @@ -1,7 +1,7 @@ { "$schema": "https://opencode.ai/config.json", "model": "nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5", - "small_model": "nvidia-nim/meta/llama-3.3-70b-instruct", + "small_model": "nvidia-nim/meta/llama-3.1-8b-instruct", "enabled_providers": ["nvidia-nim"], "mcp": { "codegraph": { @@ -54,20 +54,20 @@ "output": 65536 } }, - "meta/llama-3.3-70b-instruct": { - "name": "Meta Llama 3.3 70B Instruct (NIM)", + "meta/llama-3.1-8b-instruct": { + "name": "Meta Llama 3.1 8B Instruct (NIM)", "tool_call": true, "limit": { "context": 131072, - "output": 8192 + "output": 4096 } }, - "mistralai/mixtral-8x7b-instruct-v0.1": { - "name": "Mixtral 8x7B Instruct v0.1 (NIM)", + "meta/llama-3.3-70b-instruct": { + "name": "Meta Llama 3.3 70B Instruct (NIM)", "tool_call": true, "limit": { - "context": 32768, - "output": 4096 + "context": 131072, + "output": 8192 } } } From def2dfbc99f13af78beafa0d715d17673ed60969 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 01:47:49 +0900 Subject: [PATCH 09/12] fix(changelog): preserve existing release history --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19cd2cbb..a3157923 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,3 +80,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 blocker for this static app. ## [1.0.0] - 2026-04-20 + + +### Added + +- Initial ScopeWeave Planner release with tree-table editing, + cumulative metrics, CSV import/export, and Gantt modal. +- `wbs.json` seed loading plus browser autosave and optional file sync. +- Playwright E2E coverage for add/edit hierarchy flows, delete + confirmation, subtree drag-and-drop, and JSON sync shape. +- GitHub Pages deployment workflow and operator documentation. + +## [1.0.1] - 2026-06-25 +### 성능 개선 (Performance) +- 드래그 앤 드롭 동작 중 `dragover` 이벤트에서 발생하는 O(N) 작업 리스트 검색 성능 병목 문제를, O(1) 해시맵(Map) 기반의 캐싱 조회 로직으로 개선하여 큰 크기의 WBS 리스트에서의 버벅임 현상을 해결했습니다. From 15c01dfcfbc0ca7cd6e0db4ed5278ad685b3e15e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 16 Aug 2026 16:53:15 +0000 Subject: [PATCH 10/12] fix(opencode): cap 70B NIM output at provider max_tokens Keep the published 1.0.0/1.0.1 changelog notes locked and align the optional 70B candidate with NVIDIA NIM's documented 1-4096 max_tokens range so OpenCode cannot request an over-limit completion. Co-authored-by: Seongho Bae --- CHANGELOG.md | 2 +- opencode.jsonc | 2 +- package.json | 2 +- tests/unit/changelog-release-notes.test.mjs | 12 ++++++++++++ tests/unit/opencode-config.test.mjs | 5 +++++ 5 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 tests/unit/changelog-release-notes.test.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index a3157923..89dc1b2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,7 +54,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Switched the repository-local OpenCode development configuration from GitHub - Models to a NVIDIA NIM-only candidate set while preserving organization-level + Models to an NVIDIA NIM-only candidate set while preserving organization-level review-workflow ownership in `ContextualWisdomLab/.github`. - Accepted XML whitespace before exact Microsoft Project element delimiters while preserving the linear, regex-free import scanner and rejecting diff --git a/opencode.jsonc b/opencode.jsonc index 69de1322..a3cb617b 100644 --- a/opencode.jsonc +++ b/opencode.jsonc @@ -67,7 +67,7 @@ "tool_call": true, "limit": { "context": 131072, - "output": 8192 + "output": 4096 } } } diff --git a/package.json b/package.json index 9e23143e..ef65e778 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "coverage": "npm run test:coverage", "server": "node server/server.mjs", "test:api": "node tests/api/auth-secret.test.mjs && node tests/api/smoke.mjs && node tests/api/ratelimit.test.mjs && node tests/api/attachment-status.test.mjs && node tests/api/session-revocation.test.mjs", - "test:unit": "node tests/unit/opencode-config.test.mjs && node tests/unit/analytics.test.mjs && node tests/unit/cpm.test.mjs && node tests/unit/baseline-compare.test.mjs && node tests/unit/workload.test.mjs && node tests/unit/cost-evm.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && node tests/unit/dep-types.test.mjs && node tests/unit/weekly-report.test.mjs && node tests/unit/clearfolio.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/sprint-stats.test.mjs && node tests/unit/burndown.test.mjs && node tests/unit/pm-analysis.test.mjs && node tests/unit/cloud-sync-security.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/coverage-script-contract.test.mjs", + "test:unit": "node tests/unit/opencode-config.test.mjs && node tests/unit/changelog-release-notes.test.mjs && node tests/unit/analytics.test.mjs && node tests/unit/cpm.test.mjs && node tests/unit/baseline-compare.test.mjs && node tests/unit/workload.test.mjs && node tests/unit/cost-evm.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && node tests/unit/dep-types.test.mjs && node tests/unit/weekly-report.test.mjs && node tests/unit/clearfolio.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/sprint-stats.test.mjs && node tests/unit/burndown.test.mjs && node tests/unit/pm-analysis.test.mjs && node tests/unit/cloud-sync-security.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/coverage-script-contract.test.mjs", "test:coverage": "c8 --all --include=app.js --include=cloud-sync.js --include=scripts/ci/static_coverage_evidence.mjs --include=server/attachment_status.mjs --include=server/app.mjs --include=server/auth.mjs --include=server/clearfolio.mjs --include=server/orchestrator.mjs --reporter=json --reporter=json-summary npm run test:coverage:cases", "test:coverage:cases": "node tests/unit/coverage-script-contract.test.mjs && node tests/unit/attachment-status.test.mjs && node tests/unit/clearfolio-status-signal.test.mjs && node tests/unit/clearfolio-adapter-mock-hmac.test.mjs && node tests/unit/orchestrator.test.mjs && node tests/unit/orchestrator-coverage.test.mjs && node tests/unit/msproject.test.mjs && node tests/unit/auth-password.test.mjs && node tests/unit/editor-unsaved.test.mjs && node tests/unit/static-coverage-evidence.test.mjs && npm run test:api", "test:e2e": "playwright test", diff --git a/tests/unit/changelog-release-notes.test.mjs b/tests/unit/changelog-release-notes.test.mjs new file mode 100644 index 00000000..d886f3e1 --- /dev/null +++ b/tests/unit/changelog-release-notes.test.mjs @@ -0,0 +1,12 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import test from 'node:test'; + +const changelog = readFileSync(new URL('../../CHANGELOG.md', import.meta.url), 'utf8'); + +test('released changelog versions keep their published notes', () => { + assert.match(changelog, /## \[1\.0\.0\] - 2026-04-20/); + assert.match(changelog, /Initial ScopeWeave Planner release with tree-table editing/); + assert.match(changelog, /## \[1\.0\.1\] - 2026-06-25/); + assert.match(changelog, /O\(1\) 해시맵\(Map\) 기반의 캐싱 조회 로직/); +}); diff --git a/tests/unit/opencode-config.test.mjs b/tests/unit/opencode-config.test.mjs index 8bb07d1e..6b391486 100644 --- a/tests/unit/opencode-config.test.mjs +++ b/tests/unit/opencode-config.test.mjs @@ -16,6 +16,11 @@ test('OpenCode development config uses only currently hosted NVIDIA NIM candidat assert.ok(provider.models?.['nvidia/llama-3.3-nemotron-super-49b-v1.5']); assert.ok(provider.models?.['meta/llama-3.1-8b-instruct']); assert.ok(provider.models?.['meta/llama-3.3-70b-instruct']); + assert.equal( + provider.models['meta/llama-3.3-70b-instruct'].limit?.output, + 4096, + '70B output must stay within the NVIDIA NIM max_tokens range of 1-4096', + ); const serialized = JSON.stringify(config); assert.doesNotMatch(serialized, /github-models/i); From 2bdd2159664636a0d9c5c5b64c230ae2e6696716 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 17 Aug 2026 17:23:11 +0000 Subject: [PATCH 11/12] test(opencode): lock org NVIDIA_NIM_API_KEY mapping in AGENTS.md Keep the local OpenCode binding as NVIDIA_API_KEY and assert that AGENTS.md still documents the organization secret injection split. Co-authored-by: Seongho Bae --- tests/unit/opencode-config.test.mjs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/unit/opencode-config.test.mjs b/tests/unit/opencode-config.test.mjs index 6b391486..f95ff46f 100644 --- a/tests/unit/opencode-config.test.mjs +++ b/tests/unit/opencode-config.test.mjs @@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs'; import test from 'node:test'; const config = JSON.parse(readFileSync(new URL('../../opencode.jsonc', import.meta.url), 'utf8')); +const agents = readFileSync(new URL('../../AGENTS.md', import.meta.url), 'utf8'); test('OpenCode development config uses only currently hosted NVIDIA NIM candidates', () => { assert.equal(config.model, 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5'); @@ -27,3 +28,14 @@ test('OpenCode development config uses only currently hosted NVIDIA NIM candidat assert.doesNotMatch(serialized, /STRIX_GITHUB_MODELS_TOKEN/); assert.doesNotMatch(serialized, /COPILOT_GITHUB_TOKEN/); }); + +test('AGENTS.md keeps the local NVIDIA_API_KEY binding separate from the org NIM secret', () => { + assert.match(agents, /NVIDIA_API_KEY/); + assert.match(agents, /NVIDIA_NIM_API_KEY/); + assert.match( + agents, + /maps the organization `NVIDIA_NIM_API_KEY` secret/, + 'org CI must map NVIDIA_NIM_API_KEY into the process-local NVIDIA_API_KEY binding', + ); + assert.doesNotMatch(agents, /COPILOT_GITHUB_TOKEN/); +}); From c8eb58a86410c4f0d6e3be575a13d82d77826dba Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 17 Aug 2026 18:42:32 +0000 Subject: [PATCH 12/12] ci: retrigger CodeQL after GitHub API 503 flake Analyze (python) failed during CodeQL init with GitHub HTTP 503, not a source finding. Retrigger exact-head default-setup checks after API and Actions recovered. Co-authored-by: Seongho Bae