Commit Graph

460 Commits

Author SHA1 Message Date
Jeffrey (Dongkyu) Kim 5fb1b7a57f Unblock future GitHub npm publishes with repository metadata
Added matching repository metadata to each publishable workspace package so npm trusted publishing from GitHub Actions can validate the repo/package relationship consistently. This does not solve the first-publish bootstrap for a brand-new package, but it removes a documented follow-up blocker once the package exists and trusted publishing is configured.

Constraint: npm trusted publishing docs require a package repository URL that exactly matches the GitHub repository for GitHub-based publishes
Constraint: Publishable workspace metadata should stay aligned across packages in the monorepo
Rejected: Updating only daiso-product-search | would leave the other publishable workspaces inconsistent under the same release workflow
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep repository metadata aligned on every publishable workspace package.json when the repo moves or renames
Tested: npm run ci
Not-tested: Live npm publish from GitHub Actions
2026-03-27 22:21:07 +09:00
Jeffrey (Dongkyu) Kim 326a707cb6 Keep PR #19 mergeable while preserving both npm package releases
Merged origin/dev into feature/#15 and resolved the shared docs, package script, and skill regression conflicts so the Daiso work and the Blue Ribbon work can ship together. The resolution keeps both publishable workspaces in the dry-run packaging check and aligns install/source docs plus regression coverage with the combined branch state.

Constraint: PR #19 targets dev and GitHub marked it CONFLICTING against origin/dev
Constraint: Release and packaging changes must continue to pass npm run ci after conflict resolution
Rejected: Dropping the Blue Ribbon additions during merge resolution | would lose newer dev branch work
Rejected: Keeping only one workspace in pack:dry-run | would leave the other publishable package unverified
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: If another publishable workspace is added, extend both package.json pack:dry-run and scripts/skill-docs.test.js together
Tested: npm install; npm run ci
Not-tested: GitHub mergeability refresh after push
2026-03-27 22:19:48 +09:00
Jeffrey (Dongkyu) Kim 8c86d54b1f Add local air-quality lookup so k-skill covers location-based dust checks
Issue #17 approved an Air Korea two-API flow with a region fallback, so this change adds a new fine-dust skill, wires it into the repo docs/setup surfaces, and includes a runnable helper plus fixtures/tests for repeatable verification.

Constraint: Must use the approved official Air Korea APIs and secure secret registration flow
Rejected: Use an unofficial air-quality API | issue follow-up explicitly approved the Air Korea two-API flow
Rejected: Require coordinates only | issue discussion required a practical fallback when precise location is unavailable
Confidence: high
Scope-risk: moderate
Directive: Keep the helper and docs aligned with Air Korea endpoint names and fallback order if the official API contract changes
Tested: npm run ci; python3 scripts/fine_dust.py report --station-file scripts/fixtures/fine-dust-stations.json --measurement-file scripts/fixtures/fine-dust-measurements.json --lat 37.5665 --lon 126.9780; python3 scripts/fine_dust.py report --station-file scripts/fixtures/fine-dust-stations.json --measurement-file scripts/fixtures/fine-dust-measurements.json --region-hint '서울 강남구'; python3 scripts/fine_dust.py --help; missing-secret error path without AIR_KOREA_OPEN_API_KEY
Not-tested: Live Air Korea API calls with a real AIR_KOREA_OPEN_API_KEY
2026-03-27 22:06:19 +09:00
Jeffrey (Dongkyu) Kim ffce74a814 Prevent false out-of-stock Daiso helper answers when pickup SKUs exist
lookupStoreProductAvailability previously trusted the first ranked SearchGoods candidate even when that SKU could not be picked up in store. The helper now prefers the first pickup-capable candidate for store-availability lookups, and a regression test locks the mixed-candidate case that previously produced a false zero-stock result.

Constraint: Preserve public searchProducts candidate ordering while fixing helper selection for store pickup checks
Rejected: Force pickupOnly on the helper's internal product search | would hide non-pickup candidates from productCandidates and change the helper surface more broadly than needed
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep helper-side product selection aligned with selStrPkupStck semantics; do not revert to productResult.items[0] without mixed-SKU live verification
Tested: node --test packages/daiso-product-search/test/index.test.js; node --test scripts/skill-docs.test.js; npm test; npm run ci; live smoke on 2026-03-27 for 강남역2호점 / VT 리들샷 100
Not-tested: Additional live mixed-SKU queries beyond the verified VT 리들샷 100 case
2026-03-27 20:27:17 +09:00
Jeffrey (Dongkyu) Kim 8aea595296 Merge pull request #18 from NomaDamas/feature/#16
Feature/#16
2026-03-27 20:13:16 +09:00
Jeffrey (Dongkyu) Kim 6cff0df3d0 Keep Blue Ribbon package docs aligned with the shipped nearby flow
Add a regression that pins the package README to the location-first guidance, 코엑스 alias example, and official Blue Ribbon surfaces, then document the search/zone and restaurants/map flow in the package README so the reusable workspace package stays aligned with the shipped skill behavior.

Constraint: Follow-up is scoped to issue #16 / PR #18 and must stay within approved docs and regression coverage
Rejected: Leave package README coverage implicit in the skill and feature docs tests | package docs could drift unnoticed
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep packages/blue-ribbon-nearby/README.md aligned with blue-ribbon-nearby/SKILL.md and docs/features/blue-ribbon-nearby.md when official surfaces or landmark aliases change
Tested: node --test scripts/skill-docs.test.js (failed first, then passed); node --test packages/blue-ribbon-nearby/test/index.test.js scripts/skill-docs.test.js; npm ci; npm run ci; live smoke searchNearbyByLocationQuery('광화문', { distanceMeters: 1000, limit: 5 }); live smoke searchNearbyByLocationQuery('코엑스', { distanceMeters: 1000, limit: 5 })
Not-tested: Separate publish automation beyond npm run ci pack:dry-run
2026-03-27 19:58:16 +09:00
Jeffrey (Dongkyu) Kim 6d04a3b402 Keep Daiso online-stock lookups aligned with live product ids
Live smoke on 2026-03-27 exposed two real SearchGoods mismatches: some rows require a separate online/master product identifier for online stock requests, and some live rows use alias keys or placeholder ids that the original fixtures did not cover. This change locks those behaviors with regression tests, normalizes onldPdNo/alias fields from live payloads, falls back from placeholder identifiers like 0 to pdNo, and threads the normalized identifier through the end-to-end availability helper. The public docs now note that product candidates can carry onldPdNo for online-stock follow-ups.

Constraint: Daiso Mall SearchGoods currently mixes legacy and live field names in the same public surface

Constraint: Online stock requests must keep working for both identity and non-identity pdNo/onldPdNo pairs

Rejected: Require callers to read raw MASTER_PD_NO/MAPP_BOX_PD_NO fields | leaks transport details into the public API

Rejected: Treat placeholder ids like 0 as valid online product ids | breaks live stock lookups for otherwise valid candidates

Confidence: high

Scope-risk: narrow

Directive: Keep the live-smoke-backed alias and placeholder-id regression cases when updating Daiso payload fixtures

Tested: node --test scripts/skill-docs.test.js

Tested: node --test packages/daiso-product-search/test/index.test.js

Tested: npm test

Tested: npm run ci

Tested: live smoke against official Daiso Mall endpoints on 2026-03-27

Not-tested: Other Daiso search terms beyond VT 리들샷 100
2026-03-27 19:31:24 +09:00
Jeffrey (Dongkyu) Kim 51b4111572 Restore advertised landmark routing for Blue Ribbon nearby searches
Add explicit COEX landmark alias expansion so documented landmark inputs resolve to the official 삼성동/대치동 zone, back it with regression tests, and align the user-facing docs with the actual runtime behavior.

Constraint: Blue Ribbon only exposes official zone names, not landmark aliases
Rejected: Remove landmark examples from docs | weaker UX than the intended nearby flow
Confidence: high
Scope-risk: narrow
Directive: Keep documented landmark examples synced with alias coverage or official zone names before advertising them
Tested: node --test packages/blue-ribbon-nearby/test/index.test.js
Tested: npm run ci
Tested: live smoke searchNearbyByLocationQuery('광화문', { distanceMeters: 1000, limit: 5 })
Tested: live smoke searchNearbyByLocationQuery('코엑스', { distanceMeters: 1000, limit: 5 })
Not-tested: broader landmark alias catalog beyond documented examples
2026-03-27 19:15:21 +09:00
Jeffrey (Dongkyu) Kim 090c5e5e46 Resolve documented landmark queries against official Blue Ribbon zones
Issue #16 was blocked because the docs promised landmark inputs like
코엑스, but the runtime matcher only understood literal official zone
names. This follow-up adds landmark alias resolution for the documented
inputs, regenerates the workspace lockfile so clean installs succeed,
and locks the new behavior with targeted package tests.

Constraint: Must keep the implementation on feature/#16 / PR #18 and avoid new dependencies
Constraint: Landmark inputs should still resolve to official Blue Ribbon zones rather than inventing unofficial coordinates
Rejected: Remove landmark examples from the docs | the requested UX explicitly includes landmark-style location input
Rejected: Hardcode coordinates for 코엑스 | weakens the official-zone-first contract and future maintainability
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When adding more landmark aliases, map them to official zone names and cover them with runtime tests instead of widening the docs alone
Tested: node --test packages/blue-ribbon-nearby/test/index.test.js
Tested: npm ci
Tested: npm run ci
Tested: live searchNearbyByLocationQuery('코엑스', { distanceMeters: 1000, limit: 5 })
Tested: live searchNearbyByLocationQuery('광화문', { distanceMeters: 1000, limit: 5 })
Not-tested: Additional landmark aliases beyond the documented 코엑스 path
2026-03-27 19:12:54 +09:00
Jeffrey (Dongkyu) Kim 2352856826 Enable official Daiso store stock lookups before visiting a branch
Added a new Daiso skill and reusable workspace package around the
official Daiso Mall store search, product search, and pickup-stock
surfaces. The implementation stays stock-first because the official
surface clearly exposes store inventory but I could not verify any
official aisle/location endpoint for in-store placement.

Constraint: Must rely on official Daiso Mall surfaces before considering scraping
Constraint: Tests-first implementation and full repo CI must stay green
Rejected: Playwright-first scraping flow | official SearchGoods and selStrPkupStck endpoints were sufficient
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: If Daiso exposes an official in-store location endpoint later, extend this package instead of inferring shelf locations
Tested: node --test scripts/skill-docs.test.js
Tested: node --test packages/daiso-product-search/test/index.test.js
Tested: npm test
Tested: npm run ci
Tested: live smoke for searchStores/searchProducts/getStorePickupStock/lookupStoreProductAvailability against Daiso Mall on 2026-03-27
Not-tested: Logged-in-only variants beyond anonymous official search/store/stock surfaces
2026-03-27 18:53:53 +09:00
Jeffrey (Dongkyu) Kim 4121e086eb Make nearby Blue Ribbon searches reusable and location-first
Issue #16 adds a new location-first Blue Ribbon skill, documents that 맛집 requests should route here by default, and ships a reusable npm workspace client over the official Blue Ribbon zone/search surfaces.

The package now parses official zone links, matches user-provided location text or coordinates, and queries the nearby JSON endpoint while filtering to certified ribbon venues only. Repo docs, install guidance, release metadata, and regression coverage were updated together so the new skill can ship cleanly.

Constraint: Must ask the user for current location before nearby search
Constraint: Blue Ribbon nearby calls require browser-like headers and official zone/search parameters
Rejected: Auto-detect user geolocation | violates the issue requirement to ask first
Rejected: Generic web search scraping without a reusable package | weaker reuse and less aligned with official Blue Ribbon surfaces
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Keep certified-ribbon filtering pinned to RIBBON_ONE/TWO/THREE unless the official Blue Ribbon contract changes
Tested: npm run ci; live smoke with searchNearbyByLocationQuery('광화문', { distanceMeters: 1000, limit: 5 })
Not-tested: Ambiguous location strings that require conversational disambiguation beyond current zone heuristics
2026-03-27 18:20:05 +09:00
Jeffrey (Dongkyu) Kim f4b83c56f1 Merge pull request #14 from NomaDamas/feature/#9
Feature/#9
2026-03-27 11:31:12 +09:00
Jeffrey (Dongkyu) Kim 6c2c0d54e3 Keep waiting-list reservations aligned with the selected train
The reserve replay search now auto-includes waiting-list candidates when users opt into --try-waiting, so the stable train_id chosen from search remains resolvable for docs-following flows. A regression test reproduces the prior stale-train failure and locks the corrected behavior.\n\nConstraint: Reserve must keep using the existing train_id replay flow without broad CLI redesign\nRejected: Require users to repeat --include-waiting-list on reserve | contradicts the documented flow and review feedback\nConfidence: high\nScope-risk: narrow\nReversibility: clean\nDirective: Keep --try-waiting and reserve replay search semantics aligned so waiting-list-only trains remain selectable\nTested: python3 -m py_compile scripts/ktx_booking.py; python3 -m unittest discover -s scripts -p test_ktx_booking.py; node --test scripts/skill-docs.test.js; npm run ci; python3 scripts/ktx_booking.py --help; python3 scripts/ktx_booking.py reserve --help; live search/reservations/reserve/cancel/reservations via sops-managed Korail credentials\nNot-tested: Live waiting-list reservation creation (no waiting-list-eligible train appeared in the smoke search output)
2026-03-27 11:26:38 +09:00
Jeffrey (Dongkyu) Kim 04653f761f Prevent KTX reserve retries from drifting to the wrong train
Reserve used to replay search results and trust a fresh ordinal index, which could silently target a different train when sold-out entries disappeared or ordering changed. This change emits a stable train_id from search output, requires reserve to match the exact train identity on replay, and updates docs/tests to lock the safer CLI contract.

Constraint: Korail search results can reorder between search and reserve while the helper still needs to replay the live lookup
Rejected: Keep --train-index as the reserve selector | still allows silent wrong-train bookings when the result set shifts
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If upstream train identity fields change, update the train_id payload and the docs/tests together before changing reserve selection again
Tested: python3 -m py_compile scripts/ktx_booking.py; python3 -m unittest discover -s scripts -p test_ktx_booking.py; node --test scripts/skill-docs.test.js; npm run ci; live search/reservations/reserve/cancel/reservations with sops-managed Korail credentials
Not-tested: Forced live stale-train_id failure against a disappearing train between search and reserve
2026-03-27 11:09:14 +09:00
Jeffrey (Dongkyu) Kim 1a74a74734 Keep the KTX helper docs aligned with the live CLI contract
The feature branch already restored the patched Korail helper, so this follow-up stays narrow: lock the documented helper flags in regression tests and teach both KTX docs surfaces about the search and waiting-list toggles the live CLI already supports.

Constraint: Follow-up had to stay compatible with the shipped scripts/ktx_booking.py parser and existing PR scope
Rejected: Expand README into a full command matrix | duplicates the dedicated KTX docs and skill guide
Confidence: high
Scope-risk: narrow
Directive: When the helper CLI changes, update both KTX docs surfaces and the regression assertions in the same change
Tested: node --test scripts/skill-docs.test.js
Tested: python3 -m py_compile scripts/ktx_booking.py
Tested: npm run ci
Tested: live python3 scripts/ktx_booking.py search/reservations/reserve/cancel via sops-managed Korail credentials
Not-tested: 예약대기 success path on a sold-out train
2026-03-27 10:46:19 +09:00
Jeffrey (Dongkyu) Kim 3f59d1518b Restore live KTX booking flow against Korail's new anti-bot checks
Korail's current mobile endpoints reject the published raw korail2
examples with MACRO ERROR, so this change adds a repo-local
helper that patches Dynapath token/Sid/version behavior and reroutes
KTX docs/tests to the helper-based flow.

Constraint: Must keep credentials in sops-managed secrets and prove the flow with a real reservation
Rejected: Fork and publish a patched korail2 package | broader release surface than this repo needs
Confidence: high
Scope-risk: moderate
Directive: Re-check the helper constants and private korail2 hooks whenever Korail changes its mobile anti-bot flow
Tested: python3 -m py_compile scripts/ktx_booking.py
Tested: npm run ci
Tested: Live search via scripts/ktx_booking.py search 서울 부산 20260328 000000 --include-no-seats --include-waiting-list
Tested: Live reserve/cancel via scripts/ktx_booking.py reserve/cancel/reservations on March 28, 2026 KTX #001
Not-tested: Final payment completion after reservation
2026-03-27 10:33:16 +09:00
Jeffrey (Dongkyu) Kim 15edff9a57 Merge pull request #13 from NomaDamas/feature/#4
Feature/#4
2026-03-27 04:26:46 +09:00
Jeffrey (Dongkyu) Kim 42c753a985 Prevent delivery doc sample formatting drift
The delivery-tracking regression already pinned parsed CJ/ePost values to checked-in fixtures, but it still allowed the published JSON fence text to drift in key order or formatting while preserving the same parsed objects. This follow-up extracts the raw fenced JSON once, keeps parsing layered on top, and asserts both docs match the fixture's pretty-printed text byte-for-byte.

Constraint: CI must keep using checked-in fixtures instead of live network calls
Constraint: Follow-up should stay scoped to scripts/skill-docs.test.js
Rejected: Duplicate four separate string assertions | nested loops keep the carrier/doc matrix compact with the same coverage
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep delivery-tracking sample JSON blocks sourced from the checked-in fixture text before relaxing formatting assertions
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: python3 /tmp/cj_verify.py
Tested: npx --yes skills add . --list
Not-tested: python3 /tmp/epost_verify.py | service.epost.go.kr timed out with curl exit 28 on 2026-03-27
2026-03-27 04:18:44 +09:00
Jeffrey (Dongkyu) Kim 55542d2f0a Keep delivery doc provenance tied to verified smoke tests
The sample payload fixture already pins the published JSON bodies, but the dated provenance lines remained free text. This adds a tiny checked-in provenance fixture and a regression that requires both delivery-tracking docs to keep the verified date/invoice sentence immediately adjacent to each sample JSON block.

Constraint: Keep the docs regression offline and fixture-backed without adding live network calls to CI
Rejected: Inlining the expected date/invoice literals in the test | harder to keep the docs provenance contract explicit and reusable
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Update the provenance fixture whenever the published smoke-test date or invoice examples change
Tested: node --test scripts/skill-docs.test.js; npm run ci; python3 /tmp/cj_verify.py; npx --yes skills add . --list; architect verification
Not-tested: python3 /tmp/epost_verify.py (service.epost.go.kr timed out with curl exit 28 from this environment)
2026-03-27 04:02:14 +09:00
Jeffrey (Dongkyu) Kim cfa76eccf3 Pin delivery-tracking doc samples to checked fixtures
The review follow-up showed the docs regression only proved that the two
markdown copies matched each other. This change adds a checked-in fixture
for the verified CJ and 우체국 public outputs, then requires both docs to
match that fixture exactly while scanning the full parsed samples for TEL,
phone-like strings, and raw sensitive field names.

Constraint: Must keep CI offline while tying docs to verified smoke-test invoices
Constraint: Existing PR #13 already publishes dated CJ and 우체국 public samples
Rejected: Keep shape-only assertions | shared-but-wrong markdown drift would still pass CI
Confidence: high
Scope-risk: narrow
Directive: Refresh scripts/fixtures/delivery-tracking-public-samples.json only after rerunning live smoke verification for the documented invoices
Tested: node --test scripts/skill-docs.test.js; npm run ci; python3 /tmp/cj_verify.py; npx --yes skills add . --list
Not-tested: python3 /tmp/epost_verify.py (service.epost.go.kr connection timed out repeatedly on 2026-03-27 from this environment)
2026-03-27 03:39:31 +09:00
Jeffrey (Dongkyu) Kim 5543509969 Record fresh verification for the approved delivery docs follow-up
The feature/#4 branch already contains the approved Issue #4 docs/test
changes ahead of dev, so no additional tracked source edit was required.
This empty commit preserves a fresh verification checkpoint and updates the
existing branch/PR exactly as requested without widening the scoped diff.

Constraint: The approved change was already present on feature/#4 before this run
Constraint: User requested a commit/push update on feature/#4 even if no further code diff was needed
Rejected: Add another docs/test change | would widen an already-approved scoped diff
Rejected: Skip committing because the tree was unchanged | conflicts with the explicit branch update requirement
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep future Issue #4 follow-ups scoped to the delivery-tracking docs/test contract unless a new requirement appears
Tested: node --test scripts/skill-docs.test.js; npm run ci; python3 /tmp/cj_verify.py; npx --yes skills add . --list
Not-tested: python3 /tmp/epost_verify.py (official endpoint timed out repeatedly from this environment on 2026-03-27)
2026-03-27 03:25:26 +09:00
Jeffrey (Dongkyu) Kim 21f036e942 Document the verified public tracking outputs explicitly
Add aligned CJ and 우체국 sample public-output blocks to both delivery-tracking docs and extend the docs regression so those examples stay synchronized with the normalized non-PII contract. The new examples are dated live smoke-test captures, giving reviewers and users a concrete expected result without relying on raw carrier fields.

Constraint: feature/#4 already matched dev, so the follow-up needed a small reviewable change to reopen PR work on the same branch
Constraint: Keep verification offline in CI and avoid new runtime dependencies
Rejected: Add live carrier calls to CI | external endpoints are flaky and would make the docs regression nondeterministic
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Refresh both dated sample-output blocks together if the smoke-test invoices ever change their public tracking history
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: python3 /tmp/cj_verify.py
Tested: python3 /tmp/epost_verify.py
Tested: npx --yes skills add . --list
Tested: git diff --check
Not-tested: Automated live carrier verification in CI
2026-03-27 02:44:48 +09:00
Jeffrey (Dongkyu) Kim e9b1326735 Merge pull request #12 from NomaDamas/feature/#4
Feature/#4
2026-03-27 02:07:13 +09:00
Jeffrey (Dongkyu) Kim fed0973979 Pin the delivery examples to exact schema mappings
The current delivery-tracking follow-up already describes a shared
normalized schema, but the regression test still allowed drift in the
actual field expressions. This change upgrades the docs regression to
exact key/value allowlists and aligns the 우체국 feature example with
named summary groups so the published examples stay in sync.

Constraint: Follow-up had to stay docs-first on feature/#4 / PR #12
Constraint: The published CJ and 우체국 examples must remain privacy-safe while sharing one exact schema contract
Rejected: Keep key-only checks in the regression suite | still allows silent expression drift in published examples
Rejected: Refactor the docs examples into separate reusable scripts | too broad for this bounded follow-up
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If the delivery examples change again, update both the printed object mappings and the exact allowlist regression in the same diff
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Not-tested: Live carrier requests were not needed for this schema-lock follow-up because behavior remained documentation-only and prior live verification already covered the transport paths
2026-03-27 02:06:27 +09:00
Jeffrey (Dongkyu) Kim 47cdc09b4a Prevent delivery doc schema drift from reintroducing extra public fields
Tighten the delivery-tracking docs regression so it parses the published
CJ and 우체국 normalized JSON examples and compares them against exact
allowlisted key sets for both the top-level object and each recent-events
entry. This closes the prior presence-only gap without expanding the
follow-up beyond the docs verification surface.

Constraint: Follow-up scope is limited to scripts/skill-docs.test.js and the existing PR #11 branch
Rejected: Add more denylist regexes only | still leaves room for renamed PII-bearing keys to slip into published examples
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep any future published delivery example changes aligned with these exact top-level and recent_events allowlists before widening the public contract
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: python3 normalized CJ official endpoint verification for 1234567890
Tested: python3 우체국 follow-up verification for 1234567890123
Not-tested: No mutated negative fixture was added beyond the published examples already checked by the regression suite
2026-03-27 01:55:51 +09:00
Jeffrey (Dongkyu) Kim 2c7038c817 Merge pull request #11 from NomaDamas/feature/#4
Feature/#4 follow-up
2026-03-27 01:48:47 +09:00
Jeffrey (Dongkyu) Kim 448b008522 Clarify the shared delivery output contract in published docs
The approved issue-4 follow-up was already on the branch, so this pass tightened the regression suite first and then made the shared schema explicit in both delivery-tracking docs. The docs now name the normalized keys directly and state that recent_events is capped at the latest three entries, matching the verified CJ and 우체국 examples.

Constraint: Keep the published examples aligned with the verified carrier flows and the existing normalized output contract

Rejected: Broader refactor of the delivery-tracking examples | unnecessary for this follow-up and would widen review scope

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Keep the docs and regression test aligned whenever the normalized tracking schema changes

Tested: node --test scripts/skill-docs.test.js

Tested: npm run ci

Tested: npx --yes skills add . --list

Tested: Live CJ official flow for 1234567890

Tested: Live 우체국 flow for 1234567890123
2026-03-27 01:29:32 +09:00
Jeffrey (Dongkyu) Kim 65e203a005 Normalize published delivery outputs to one shared contract
The delivery-tracking docs promised one carrier-agnostic result shape,
but the CJ and 우체국 examples had drifted into different schemas.
This updates both published examples and the regression suite to emit
the same normalized fields, include recent_events, and sanitize ePost
TEL fragments observed during live verification.

Constraint: Issue #4 follow-up must keep published examples non-PII and aligned with the documented common-format contract
Rejected: Preserve carrier-specific fields in the published examples | contradicts the carrier-adapter normalization promise and review feedback
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep CJ and ePost published examples on the same normalized schema and strip contact fragments from documented ePost locations
Tested: node --test scripts/skill-docs.test.js; npm run ci; npx --yes skills add . --list; live CJ verification for 1234567890; live ePost verification for 1234567890123; architect verification
Not-tested: Shared runtime adapter implementation outside the published docs/examples
2026-03-27 01:29:32 +09:00
Jeffrey (Dongkyu) Kim 5b104d27e2 Protect published tracking examples from leaking carrier contact data
The CJ official response can embed staff name and phone data in crgNm, so the published skill and feature examples now emit only normalized summary fields. The root docs regression suite also locks the safe output shape so raw CJ event payloads do not creep back into the docs.\n\nConstraint: Official CJ tracking responses may include personal contact data in crgNm\nRejected: Keep a message field with ad-hoc redaction | deleting the field is safer for published examples\nConfidence: high\nScope-risk: narrow\nReversibility: clean\nDirective: Keep carrier doc examples limited to normalized summary fields; do not dump raw tracking payloads without privacy review\nTested: node --test scripts/skill-docs.test.js; npx --yes skills add . --list; npm run ci; CJ official curl+cookie+_csrf verification for 1234567890; 우체국 curl --http1.1 --tls-max 1.2 verification for 1234567890123; lsp_diagnostics scripts/skill-docs.test.js\nNot-tested: Live carrier responses beyond the documented smoke-test invoice numbers
2026-03-27 01:29:32 +09:00
Jeffrey (Dongkyu) Kim 50dcd2fbb8 Merge pull request #10 from NomaDamas/feature/#4
Feature/#4
2026-03-27 00:48:58 +09:00
Jeffrey (Dongkyu) Kim e257ab39a0 Avoid leaking CJ contact details in published tracking examples
The first delivery-tracking draft exposed too much of the raw CJ event payload in the public examples. This follow-up keeps the examples useful for status checks while normalizing them to non-PII fields only, and locks that expectation in the docs regression suite so the raw  field is not reintroduced.

Constraint: Must preserve the verified official CJ flow while removing avoidable personal-contact leakage from the shipped examples
Constraint: Follow-up had to stay docs-first and scoped to the existing feature/#4 PR branch
Rejected: Keep raw CJ payload output and rely on users to ignore  | published examples should not leak names/phone numbers unnecessarily
Rejected: Drop CJ example detail entirely | loses practical verification value for the main carrier path
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Any future CJ example update must continue to avoid printing raw  or other contact-bearing fields in public docs
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: python3 normalized CJ official endpoint verification for 1234567890
Tested: python3 우체국 follow-up verification for 1234567890123
Not-tested: Real non-placeholder customer waybills with different event shapes
2026-03-27 00:48:02 +09:00
Jeffrey (Dongkyu) Kim 3c6a7d2e51 Keep parcel-tracking guidance aligned with the verified carrier flows
The delivery-tracking skill already existed on feature/#4, but the
CJ example still documented a naive Python HTTP path. This follow-up
switches the documented CJ flow to the verified curl+cookie+_csrf
sequence, then tightens the surrounding docs so the shipped scope and
future carrier-extension story stay consistent.

Constraint: CJ tracking-detail rejects naive direct HTTP calls without preserved session state
Constraint: Must keep the existing feature/#4 PR against dev accurate without widening scope
Rejected: Keep the urllib-only CJ example | live smoke test returned 403 and contradicted the docs
Confidence: high
Scope-risk: narrow
Directive: Re-run live carrier smoke tests before changing documented transport steps for CJ or 우체국
Tested: npm run ci; live CJ curl+cookie+_csrf verification for 1234567890; live 우체국 curl verification for 1234567890123
Not-tested: Real non-placeholder customer waybills
2026-03-27 00:35:54 +09:00
Jeffrey (Dongkyu) Kim 4a4ab95541 Make official parcel tracking available without aggregator services
Issue #4 asks for a first-class way to check Korean parcel status from invoice numbers. This change adds a delivery-tracking skill covering CJ대한통운 and 우체국 through their official surfaces, wires it into the repo docs, and locks the carrier-specific endpoint rules with the root regression suite.

Constraint: Must stay docs-first with no new dependencies or bundled carrier client code
Constraint: Official carrier surfaces use different transport shapes (CJ JSON with _csrf, 우체국 HTML/form flow) so the skill must document adapter-specific rules explicitly
Rejected: Use a third-party aggregate tracking site | violates official-surface requirement and weakens long-term maintainability
Rejected: Collapse both carriers into one generic parsing recipe | carrier-specific transport and parsing rules differ too much
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep future carrier additions as explicit carrier adapters with official URLs, length rules, and parsing guidance instead of broadening the current CJ/우체국 snippets into a catch-all flow
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: npx --yes skills add . --list
Tested: python3 CJ official endpoint verification for 1234567890 and 000000000000
Tested: python3 requests verification of the 우체국 landing page plus trace.RetrieveDomRigiTraceList.comm follow-up for 1234567890123
Not-tested: Real customer shipment numbers across more carriers or edge-case invoice formats
2026-03-27 00:30:09 +09:00
Jeffrey (Dongkyu) Kim efbaf079db Merge pull request #8 from NomaDamas/dev
hwp / zipcode / kakaotalk skills
2026-03-27 00:18:52 +09:00
Jeffrey (Dongkyu) Kim ca490a5e6e Harden postcode lookup guidance for flaky shell/runtime conditions
The zipcode-search docs were directionally correct, but they left a few practical failure modes underexplained for real operator use. This update makes the retry order explicit, adds guidance for temp-file based parsing in wrapped shells, and documents the benign curl (23) case when downstream readers close early.

Constraint: Keep the change docs-first without adding runtime code or dependencies
Constraint: The official ePost endpoint remains intermittently flaky, so guidance must focus on stable operator behavior rather than pretending transport is deterministic
Rejected: Replace the docs example with a larger shell wrapper script | too heavy for a small skill-doc improvement
Rejected: Ignore curl (23) and here-doc issues as user error | repeated operator confusion is worth documenting
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If the zipcode-search example changes again, keep the retry order and shell-wrapper caveats aligned between the skill doc, feature doc, and regression test
Tested: node --check scripts/skill-docs.test.js
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: npx --yes skills add . --list
Not-tested: Live ePost requests for this doc-only follow-up
2026-03-26 23:58:01 +09:00
Jeffrey (Dongkyu) Kim baf090e92a Merge pull request #7 from NomaDamas/feature/#3
Feature/#3
2026-03-26 23:18:49 +09:00
Jeffrey (Dongkyu) Kim 71ab824d82 Preserve zipcode-search retry recovery in the published example
The zipcode-search docs and regression suite now stop constraining the curl retry path with an outer Python timeout. The docs instead state that curl owns the transport budget, which matches the blocking review feedback and keeps the regression test aligned with that invariant.

Constraint: Follow-up had to stay on the existing feature/#3 PR branch and keep the documented curl-based flow intact
Constraint: ePost endpoint was timing out from this environment during live verification, so the fix had to be grounded in the reviewed failure mode and local regression evidence
Rejected: Raise timeout=30 to a slightly larger Python cap | still duplicates curl transport budgeting and risks another too-short wrapper limit
Confidence: medium
Scope-risk: narrow
Reversibility: clean
Directive: If the zipcode-search transport example changes again, keep the regression test aligned with whichever layer owns retry/timeout control
Tested: node --test scripts/skill-docs.test.js; npm run ci; npx --yes skills add . --list; repeated python3/curl probes to parcel.epost.go.kr and www.epost.go.kr
Not-tested: Successful live ePost query from this environment on 2026-03-26; current probes timed out with curl exit 28
2026-03-26 23:18:14 +09:00
Jeffrey (Dongkyu) Kim d219fa4465 Keep zipcode-search docs usable through flaky ePost retries
The follow-up narrows the regression test to retry-related transport invariants and updates the zipcode-search examples to document intermittent ePost resets/timeouts while using retry-aware curl flags. The Python example now captures curl output cleanly so successful retries do not leak transient transport noise into the user-facing walkthrough.

Constraint: Review feedback required a docs-first fix on the existing feature/#3 PR branch
Constraint: The ePost endpoint intermittently resets/times out even when the retry path eventually succeeds
Rejected: Revert to urllib example | modern local runs were less reliable than curl with HTTP/1.1 + TLS 1.2
Rejected: Leave curl stderr streaming during retries | transient reset logs made successful examples look flaky
Confidence: high
Scope-risk: narrow
Directive: Keep the retry flags and official ePost extraction fields aligned between the skill doc, feature doc, and root regression test
Tested: node --test scripts/skill-docs.test.js; npm run ci; npx --yes skills add . --list; live docs example query for 세종대로 209 (3 runs)
Not-tested: Alternate address keywords beyond 세종대로 209
2026-03-26 23:18:05 +09:00
Jeffrey (Dongkyu) Kim 2053bca68f Keep postcode docs executable in modern clients
Broaden the root regression suite to cover the roadmap/source/feature-doc surface and replace the fragile urllib example with a curl-backed, timeout-bounded snippet that matches the verified live query path.

Constraint: The ePost endpoint resets the shipped urllib transport on current local python3 toolchains
Constraint: Must keep the fix doc-only with no new dependencies
Rejected: Keep urllib and add a warning only | the published example would still fail as written
Confidence: high
Scope-risk: narrow
Directive: If the ePost markup or transport requirements change, update both docs and scripts/skill-docs.test.js together
Tested: node --test scripts/skill-docs.test.js
Tested: npx --yes skills add . --list
Tested: python3 /tmp/zipcode_live_check.py
Tested: npm run ci
Not-tested: Alternative HTTP clients beyond the curl-backed path
2026-03-26 23:17:45 +09:00
Jeffrey (Dongkyu) Kim c4f9a32c51 Make postcode lookup available as a first-class k-skill
Issue #3 asks for a low-friction way to turn a known Korean address into a postal code. This change adds a dedicated zipcode-search skill, wires it into repo docs, and protects the new discovery/documentation surface with a root-level regression test that now runs under npm test/ci.

Constraint: Must use the official ePost postal search page and avoid new dependencies
Rejected: Data.go.kr key-based postal API | unnecessary setup for a simple lookup skill
Confidence: high
Scope-risk: narrow
Directive: Keep the zipcode-search extraction logic aligned with the official ePost HTML fields unless a more stable public API replaces it
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: npx --yes skills add . --list
Tested: python3 live query against the ePost endpoint for 세종대로 209
Not-tested: Broader address variants beyond the verified ePost query example
2026-03-26 23:15:54 +09:00
Jeffrey (Dongkyu) Kim a6567b77fe Merge pull request #6 from NomaDamas/feature/#2
Feature/#2
2026-03-26 23:13:56 +09:00
Jeffrey (Dongkyu) Kim fbc44b795b Document safe macOS KakaoTalk skill usage
Add the new kakaotalk-mac skill as a docs-first capability with regression coverage, repository discoverability, and clear macOS permission/install guidance built around kakaocli. The change keeps the repo docs-only while making the feature installable and reviewable through existing skill validation paths.

Constraint: This repo ships skill definitions and docs, not KakaoTalk automation binaries
Constraint: Guidance must stay macOS-specific and require explicit confirmation before sending to other people
Rejected: Add executable integration code in this repo | issue scope is docs-only skill packaging
Rejected: Document unofficial non-macOS workarounds | upstream tool is macOS-only and issue explicitly targets Mac
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep future updates aligned with upstream kakaocli commands and macOS permission requirements before broadening this skill
Tested: node --test scripts/skill-docs.test.js
Tested: npm run ci
Tested: npx --yes skills add . --list
Tested: Architect review approval on working tree
Not-tested: Live kakaocli execution against a local KakaoTalk installation on macOS
2026-03-26 23:12:42 +09:00
Jeffrey (Dongkyu) Kim ed92a858fa Merge pull request #5 from NomaDamas/feature/#1
Feature/#1
2026-03-26 13:38:41 +09:00
Jeffrey (Dongkyu) Kim 60eef129db Keep HWP image-file fallback guidance aligned across docs
The approved HWP doc fix was already present on feature/#1, but the
skill-level guidance still lacked the verified `--images-dir` fallback
that the feature guide documented for separate image files. Add a
regression first to lock that expectation, then mirror the CLI-backed
fallback in `hwp/SKILL.md` so future edits cannot drift.

Constraint: Follow-up had to stay on PR #5 / branch `feature/#1` and remain documentation-only
Constraint: `hwpjs to-markdown --help` is the source of truth for `--include-images` and `--images-dir`
Rejected: Leave the fallback only in `docs/features/hwp.md` | the skill doc would still diverge from the verified workflow
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep `hwp/SKILL.md`, `docs/features/hwp.md`, and `scripts/skill-docs.test.js` aligned with the live `hwpjs to-markdown --help` surface
Tested: node --test scripts/skill-docs.test.js
Tested: npx --yes @ohah/hwpjs to-markdown --help
Tested: npm test
Tested: npm run ci
Tested: npx --yes skills add . --list
Not-tested: End-to-end conversion against a real `.hwp` fixture in this repository
2026-03-26 13:10:52 +09:00
Jeffrey (Dongkyu) Kim 48b8d8153e Clarify HWP markdown verification in the feature guide
The feature guide already documented `--include-images`, but it did not
spell out the verification rule as clearly as the skill doc. Add a
feature-level verification checklist and tighten the regression test so
repo docs stay aligned with the actual `hwpjs` inline-image behavior.

Constraint: `hwpjs to-markdown --include-images` embeds images as base64 data URIs instead of writing sidecar files
Rejected: Leave verification guidance only in `hwp/SKILL.md` | feature docs could drift without their own regression coverage
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep the feature-guide verification text aligned with `npx --yes @ohah/hwpjs to-markdown --help` if the CLI flag behavior changes
Tested: node --test scripts/skill-docs.test.js; npx --yes @ohah/hwpjs to-markdown --help; npm test; npm run ci; npx --yes skills add . --list
Not-tested: End-to-end conversion against a real `.hwp` fixture
2026-03-26 12:34:34 +09:00
Jeffrey (Dongkyu) Kim b864be65e0 Keep HWP markdown verification aligned with actual inline-image behavior
The follow-up review found that the HWP skill docs described
`hwpjs to-markdown --include-images` as if it generated image
paths/files, while the actual CLI help says the flag embeds images
as base64 data URIs. This update corrects the verification wording
in the skill docs, mirrors the same note in the feature guide, and
adds regression coverage so the docs stay aligned with the verified
CLI behavior.

Constraint: Follow-up must stay on PR #5 / branch `feature/#1` and keep the existing HWP feature wiring intact
Constraint: Root regression coverage should lock the reviewed documentation behavior before future edits
Rejected: Switch the docs to `--images-dir` examples instead | would change the documented workflow instead of fixing the reviewed mismatch
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If `hwpjs` changes `--include-images` semantics, update both `hwp/SKILL.md` and `docs/features/hwp.md` and keep `scripts/skill-docs.test.js` in sync
Tested: `node --test scripts/skill-docs.test.js`
Tested: `npx --yes @ohah/hwpjs to-markdown --help`
Tested: `npm test`
Tested: `npm run ci`
Tested: `npx --yes skills add . --list`
Not-tested: End-to-end HWP conversion with a fixture document in this repository (no sample `.hwp` fixture was added)
2026-03-26 11:49:26 +09:00
Jeffrey (Dongkyu) Kim 50175f1596 Document an environment-aware HWP workflow for Korean document tasks
Issue #1 adds a new hwp skill that routes routine conversion work to @ohah/hwpjs and reserves hwp-mcp for Windows environments with Hangul installed and direct-control needs. The repo docs and root verification now cover the new skill so it remains visible in listings and regressions catch missing documentation.

Constraint: The repository is documentation-first for skills, so the change needed tested docs rather than a new runtime package

Constraint: No new dependencies were allowed for the repo implementation

Rejected: Adding a bundled HWP runtime wrapper package | issue scope only required the installable skill and guidance

Rejected: Defaulting to hwp-mcp on Windows without explicit Hangul availability | too risky for unsupported environments

Confidence: high

Scope-risk: narrow

Directive: Keep conversion/extraction guidance biased toward @ohah/hwpjs unless direct Hangul automation is explicitly available

Tested: npm test

Tested: npm run ci

Tested: npx --yes skills add . --list

Not-tested: Live conversion against a sample .hwp file using @ohah/hwpjs

Not-tested: Windows-only hwp-mcp control against a locally installed Hangul application
2026-03-26 11:00:57 +09:00
Jeffrey (Dongkyu) Kim b6c353c172 Clarify the supported setup flow for installed skills
Document the intended post-install path around k-skill-setup, add opt-in guidance for update checks and GitHub starring, and mark KTX booking as currently unavailable so users do not assume it is production-ready.

Constraint: Setup guidance must avoid automatic persistent changes or GitHub side effects without explicit user consent
Constraint: Repository docs should steer users toward the actual skills install surface rather than `.codex`
Rejected: Keep per-skill install branching as the default path | it obscures the intended full-bundle install flow
Rejected: Auto-star the repository from the setup skill | violates explicit-consent expectations
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep install docs, setup docs, and k-skill-setup instructions aligned whenever the installer workflow changes
Tested: npm run ci; rg verification of README KTX availability notice
Not-tested: Manual execution of cron/schtasks examples and `gh repo star` flow
2026-03-26 00:50:23 +09:00
Jeffrey (Dongkyu) Kim 720964cf49 Prepare k-skill for packaged releases and broader skill discovery
This snapshots the current repository updates as a coherent release-prep
baseline: workspace/package scaffolding, release automation docs and
workflows, refreshed skill/setup documentation, roadmap expansion, and
the README thumbnail polish.

Constraint: Node packages in this repo must use npm workspaces and Changesets for releases
Constraint: Python release automation stays scaffold-only until a real package exists
Rejected: Split the current work into multiple commits | user asked to commit the current changes together
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Keep release docs, workflows, and package metadata aligned when adding future packages
Tested: npm run ci
Not-tested: GitHub Actions execution on remote after push
2026-03-25 23:57:53 +09:00
Jeffrey (Dongkyu) Kim ec41ff08dc Correct the documented kbo-game call pattern
The published kbo-game package does not match the README example, so the KBO skill docs now show the API shape that actually works in practice. The examples use the exported getGame function and convert YYYY-MM-DD inputs into Date objects before calling it.

Constraint: Must document the currently published kbo-game@0.0.2 behavior without adding new dependencies
Rejected: Keep the upstream README example | local reproduction shows it throws at runtime
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Re-verify the package exports before changing these examples if kbo-game releases a new version
Tested: Local npm install of kbo-game; reproduced getGameInfo failure; verified getGame(new Date(...)) success; npm run ci
Not-tested: Future kbo-game releases with different exports or argument contracts
2026-03-25 22:54:55 +09:00