@witchpot/gmc 0.6.0 → 0.8.0
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.
- package/CHANGELOG.md +58 -0
- package/README.md +3 -0
- package/package.json +2 -2
- package/skill/gmc-analysis/CHANGELOG.md +172 -0
- package/skill/gmc-analysis/SKILL.md +372 -7
- package/skill/gmc-analysis.manifest.json +2 -2
- package/src/args.js +42 -4
- package/src/constants.js +20 -3
- package/src/help.js +208 -1
- package/src/index.js +1 -0
- package/src/requests.js +399 -2
- package/src/requests.test.js +870 -0
- package/src/workflows.js +15 -1
- package/src/workflows.test.js +156 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,64 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the Game Market Copilot CLI will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.8.0 - 2026-09-14
|
|
6
|
+
|
|
7
|
+
For npm users this release lands together with 0.7.0's content, because
|
|
8
|
+
0.7.0 was never published to the registry (npm goes 0.6.0 -> 0.8.0). It also
|
|
9
|
+
requires `@witchpot/gmc-core` 0.2.0, which ships to npm in the same release
|
|
10
|
+
cycle — publish core FIRST, or `gmc showcases history` fails at startup on a
|
|
11
|
+
missing export (see gmc-core's own 0.2.0 changelog entry).
|
|
12
|
+
|
|
13
|
+
- New `--ai-disclosure <disclosed|absent|unconfirmed>` filter on the games
|
|
14
|
+
search/count/aggregate commands (NAK-773), forwarded verbatim and
|
|
15
|
+
case-sensitively as the `aiDisclosure` query param, plus
|
|
16
|
+
`--group-by ai_disclosure` (which cross-tabs with `release_month`). `absent`
|
|
17
|
+
means no disclosure block was observed on the store page, never that a title
|
|
18
|
+
uses no generative AI; `unconfirmed` includes titles never checked.
|
|
19
|
+
- Bundled `gmc-analysis` skill bumped to 0.15.0 with an "AI disclosure state"
|
|
20
|
+
section covering those values and how to report them.
|
|
21
|
+
|
|
22
|
+
- New command `gmc lists resolve <id> --json` (NAK-525): computes (or reuses)
|
|
23
|
+
the materialized resolution a natural-language list definition needs before
|
|
24
|
+
its games can be read. `gmc lists games <id>` answers 409
|
|
25
|
+
RESOLUTION_REQUIRED until it has run. Costs 2 credits every call, including
|
|
26
|
+
on a reuse, and never changes membership.
|
|
27
|
+
- New command `gmc lists materialize <id> --confirm --json` (NAK-525): freezes
|
|
28
|
+
a filter list's current members, so it stops re-evaluating its definition.
|
|
29
|
+
Destructive-adjacent and undone only by discarding the frozen rows, so
|
|
30
|
+
`--confirm` is required and the call is refused without it before anything is
|
|
31
|
+
written or charged. Optional `--expected-revision <n>` is the compare-and-swap
|
|
32
|
+
covering the whole resolve-then-materialize window.
|
|
33
|
+
- `gmc lists games <id>` now forwards `--cursor`. It was previously accepted
|
|
34
|
+
and silently dropped, which walks a resolution-backed list by offset while
|
|
35
|
+
the caller believes it is following the cursor.
|
|
36
|
+
- `--help` documents the version 2 query envelope accepted by
|
|
37
|
+
`gmc lists create --kind filter --filter '<json>'`, including the rule that
|
|
38
|
+
`structured` decides membership and `total_kind` says whether the reported
|
|
39
|
+
total is an exact count.
|
|
40
|
+
|
|
41
|
+
## 0.7.0 - 2026-08-06
|
|
42
|
+
|
|
43
|
+
- New command `gmc games more-like-this --source steam <externalId>
|
|
44
|
+
[--country <de|fr|gb|jp|kr|us>] --json` (NAK-459): the games Steam showed
|
|
45
|
+
in a title's store-page "More Like This" carousel, for one storefront
|
|
46
|
+
country. Omitting `--country` sends no country at all so the server
|
|
47
|
+
applies the shared `us` default; `--country` is validated locally against
|
|
48
|
+
the six collected storefronts before the request goes out.
|
|
49
|
+
- This release carries TWO skill versions' worth of content, because skill
|
|
50
|
+
0.7.0 was never published: skill 0.7.0 (NAK-92 / NAK-240) added the
|
|
51
|
+
showcase fit + history workflows and their directory-link guardrails, and
|
|
52
|
+
skill 0.8.0 (NAK-459) adds the "Steam More Like This neighbours" section.
|
|
53
|
+
Its guardrails: carousel `position` is Steam's display order and never a
|
|
54
|
+
similarity score; `observed_empty` (collected, carousel empty) must be
|
|
55
|
+
told apart from `not_observed` (not collected yet), and neither reported
|
|
56
|
+
as "this game has no similar games"; a stale observation should be dated
|
|
57
|
+
rather than dropped; candidates with `resolved: false` stay in the set as
|
|
58
|
+
unresolved.
|
|
59
|
+
- Agents on the MCP surface get the equivalent `more_like_this` tool (19th
|
|
60
|
+
published tool); the CLI and MCP share one read model, so countries,
|
|
61
|
+
default, bounds, and availability semantics cannot drift between them.
|
|
62
|
+
|
|
5
63
|
## 0.6.0 - 2026-07-17
|
|
6
64
|
|
|
7
65
|
- gmc-analysis skill v0.6.0: new "Product documentation (gmc-docs)"
|
package/README.md
CHANGED
|
@@ -122,6 +122,9 @@ when using output in agent answers.
|
|
|
122
122
|
- `gmc games success-report`
|
|
123
123
|
- `gmc campaigns signals`
|
|
124
124
|
- `gmc games topics`
|
|
125
|
+
- `gmc games language-topics`
|
|
126
|
+
- `gmc games review-history`
|
|
127
|
+
- `gmc games more-like-this`
|
|
125
128
|
- `gmc games compare`
|
|
126
129
|
- `gmc games benchmark`
|
|
127
130
|
- `gmc reviews patterns`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@witchpot/gmc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Command line tools for Game Market Copilot market research.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"node": ">=20.9.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@witchpot/gmc-core": "^0.
|
|
31
|
+
"@witchpot/gmc-core": "^0.2.0"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
34
|
"bin",
|
|
@@ -1,5 +1,177 @@
|
|
|
1
1
|
# gmc-analysis skill changelog
|
|
2
2
|
|
|
3
|
+
## 0.15.0 - 2026-09-14
|
|
4
|
+
|
|
5
|
+
- New "AI disclosure state" section in SKILL.md (NAK-773): the tri-state
|
|
6
|
+
Steam store AI-disclosure read, how to filter on it
|
|
7
|
+
(`--ai-disclosure` / `filter.ai_disclosure`), group by it
|
|
8
|
+
(`--group-by ai_disclosure`, cross-tabs with `release_month`), and read one
|
|
9
|
+
title's state from `detail.aiDisclosure`.
|
|
10
|
+
- Adds the interpretation guardrails as honesty rules: `absent` is an
|
|
11
|
+
observation that no disclosure block was found, never proof a title uses no
|
|
12
|
+
generative AI; `unconfirmed` means not yet successfully observed (it includes
|
|
13
|
+
titles never checked) and must be reported as its own bucket rather than
|
|
14
|
+
folded into `absent`; `observedAt` is the read date, not the release date;
|
|
15
|
+
`aiDisclosure: null` means the read model was unreachable, not "not
|
|
16
|
+
disclosed".
|
|
17
|
+
- Records that `cohort_review_categories` and `compare_as_of` refuse the filter
|
|
18
|
+
outright, so disclosure cohorts are sized with `market_aggregate`.
|
|
19
|
+
|
|
20
|
+
## 0.14.0 - 2026-08-20
|
|
21
|
+
|
|
22
|
+
- New "Query-backed lists (structured plus natural language)" section in
|
|
23
|
+
SKILL.md (NAK-525): documents the version 2 query envelope, the rule that
|
|
24
|
+
`structured` decides membership while `semanticQuery` only orders results
|
|
25
|
+
inside it under the default `rank` mode, and the `total_kind` vocabulary
|
|
26
|
+
(`exact` / `approximate` / `at_least` / `lexical_only` / `clipped`) with the
|
|
27
|
+
honesty rule that anything but `exact` must be reported as approximate.
|
|
28
|
+
- Adds the two new tools to the Game List inventory: `resolve_game_list`
|
|
29
|
+
(non-destructive, answers `RESOLUTION_REQUIRED`, 2 credits every call
|
|
30
|
+
including a reuse) and `materialize_game_list` (freezes membership, requires
|
|
31
|
+
`confirm: true`, 2 credits, never speculative). CLI equivalents:
|
|
32
|
+
`gmc lists resolve <id>` and `gmc lists materialize <id> --confirm`.
|
|
33
|
+
- New sharp edge: `market_aggregate` / `cohort_review_categories` /
|
|
34
|
+
`cohort_evidence` reject a `semanticQuery` list with
|
|
35
|
+
`SEMANTIC_LIST_UNSUPPORTED_FOR_TOOL`, uniformly across `semanticMode`; a
|
|
36
|
+
structured-only v2 envelope behaves exactly like a flat filter.
|
|
37
|
+
- Records `membership`, `definition_revision` and `last_resolved_at` on the
|
|
38
|
+
list read tools, and what a frozen (`snapshot`) list does.
|
|
39
|
+
- Warns that `sort` and `as_of` are refused (not ignored) when reading a
|
|
40
|
+
`semanticQuery` list or a frozen one.
|
|
41
|
+
- Documents the resolve conflict outcomes (`CONFLICT` /
|
|
42
|
+
`definition_revision_mismatch`, `NOT_FOUND`, `SNAPSHOT_IS_FROZEN`) for a list
|
|
43
|
+
edited, deleted or frozen while a resolve is running.
|
|
44
|
+
|
|
45
|
+
## 0.13.0 - 2026-08-20
|
|
46
|
+
|
|
47
|
+
- New "Per-family collection status" section in SKILL.md (NAK-596): documents
|
|
48
|
+
the new MCP-only `game_collection_status` tool — no CLI command yet, same
|
|
49
|
+
deferred posture as `game_language_support` (NAK-571) — agent-surface
|
|
50
|
+
parity for `GET /api/v1/games/:appid/collection-status` (NAK-444).
|
|
51
|
+
- Adds the interpretation guardrails as honesty rules: `unknown` differs from
|
|
52
|
+
`not_collected` in kind, not degree, and must never be restated as
|
|
53
|
+
uncollected; `available: false` and the `collection_status_unavailable`
|
|
54
|
+
warning token are coupled one-for-one; `requestable` states only whether
|
|
55
|
+
requesting analysis routes demand to that family today (only `research`
|
|
56
|
+
is), never a statement about any other family's schedule; the tool is
|
|
57
|
+
read-only and never enqueues collection work; an unknown appid charges the
|
|
58
|
+
weight-1 credit before returning `NOT_FOUND`.
|
|
59
|
+
- MCP-only mapping updated: per-family collection status ->
|
|
60
|
+
`game_collection_status`.
|
|
61
|
+
|
|
62
|
+
## 0.12.0 - 2026-08-12
|
|
63
|
+
|
|
64
|
+
- Adds "Which review count you are looking at" (NAK-531): Steam returns two
|
|
65
|
+
review totals depending on `purchase_type`, and they can differ by orders
|
|
66
|
+
of magnitude. `purchase_type=all` is GMC's headline current total and is
|
|
67
|
+
served by `game_profile` as `detail.reviewCounts`; every plain `reviews`
|
|
68
|
+
field elsewhere stays the narrower `purchase_type=steam` family.
|
|
69
|
+
- Records the honesty rules that go with it: name the family and the
|
|
70
|
+
observation date with any count; `allAvailable: false` means not collected
|
|
71
|
+
rather than zero; compare the families only through
|
|
72
|
+
`steamAtAllObservation`, because the top-level `steam` observation can be
|
|
73
|
+
newer than `all`; derive a positive rate inside one family; never splice
|
|
74
|
+
the families into one series, so a steam history's last point being
|
|
75
|
+
smaller than the all-family headline is not a decline; and neither family
|
|
76
|
+
is sales.
|
|
77
|
+
|
|
78
|
+
## 0.11.0 - 2026-08-10
|
|
79
|
+
|
|
80
|
+
- MCP-only mapping extended with the publisher/developer surface (NAK-383):
|
|
81
|
+
`entity_resolve` (raw Steam publisher/developer string -> stable
|
|
82
|
+
`entityId`) and `entity_profile` (that entity's portfolio, composition,
|
|
83
|
+
release cadence and audience footprint). There is no CLI equivalent yet,
|
|
84
|
+
so the entry states the resolve-then-profile order explicitly rather than
|
|
85
|
+
mapping from a command.
|
|
86
|
+
- Adds the interpretation guardrails as honesty rules: resolve before
|
|
87
|
+
profiling because a game record credits names and one entity commonly has
|
|
88
|
+
several raw spellings, so a name-keyed lookup omits the titles credited to
|
|
89
|
+
the siblings; `resolved: null` means that exact case-sensitive,
|
|
90
|
+
whitespace-significant string is unknown to the master tables and never
|
|
91
|
+
that the entity has no titles; `aggregatesAvailability: not_collected`
|
|
92
|
+
means the aggregates have not been computed yet, so the block is absent
|
|
93
|
+
rather than zero, and never that the studio has published nothing (the
|
|
94
|
+
live `pagination.total` is still the real title count); a null
|
|
95
|
+
`totalFollowers` is not collected rather than zero, and follower counts
|
|
96
|
+
can never be summed across platforms.
|
|
97
|
+
|
|
98
|
+
## 0.10.0 - 2026-08-09
|
|
99
|
+
|
|
100
|
+
- New "Review-count history and the events around it" section in SKILL.md
|
|
101
|
+
(NAK-428): documents `gmc games review-history` (MCP:
|
|
102
|
+
`game_review_history`), and states that it has no flags because the
|
|
103
|
+
endpoint has no query parameters — the full daily series is always
|
|
104
|
+
returned and the agent windows it.
|
|
105
|
+
- Adds the interpretation guardrails as honesty rules: scale by date and
|
|
106
|
+
never by array index because collection has real gaps; the series is
|
|
107
|
+
published-run-only and contamination-filtered at a 2% tolerance, so
|
|
108
|
+
differences are safe to report but the last point can lag the headline
|
|
109
|
+
review count; an empty series is no collected history, not a review count
|
|
110
|
+
of zero; empty `data.events` / `data.discountWindows` are collection
|
|
111
|
+
states, never "no announcements" or "never discounted"; announcements are
|
|
112
|
+
official-feed only and capped at the most recent 1000 items; a discount
|
|
113
|
+
window is an observed >=20%-threshold state, not an exact Steam sale
|
|
114
|
+
period, whose `endDate` is the first below-threshold observation and is
|
|
115
|
+
not part of the window (with gaps in the observations, the actual last
|
|
116
|
+
discounted day cannot be inferred from it) and whose `discountPercent` is
|
|
117
|
+
the opening observation; events support temporal comparison only, never
|
|
118
|
+
causal attribution.
|
|
119
|
+
- MCP-only mapping updated: review-count history with its
|
|
120
|
+
lifecycle/announcement/discount context -> `game_review_history`.
|
|
121
|
+
|
|
122
|
+
## 0.9.0 - 2026-08-08
|
|
123
|
+
|
|
124
|
+
- New "Review topics by review language" section in SKILL.md (NAK-455):
|
|
125
|
+
documents `gmc games language-topics` (MCP: `game_language_topics`), its
|
|
126
|
+
two flags (`--min-reviews` 10-200, `--include-insufficient`), and the
|
|
127
|
+
fact that this is the whole parameter surface because it is the API's.
|
|
128
|
+
- Adds the interpretation guardrails as honesty rules: read
|
|
129
|
+
`data.evidenceState` first and never report `insufficient_evidence` or
|
|
130
|
+
`not_analyzed` as zero; the population is the analyzed subset (about
|
|
131
|
+
2,500 titles), not the Steam catalog; review language is never a country,
|
|
132
|
+
region, market, or culture; observed `counts`/`rates` and sample-expanded
|
|
133
|
+
`estimates` stay separate; name which of the four denominators a
|
|
134
|
+
percentage is over; date every claim with `data.snapshot`; `coverage`
|
|
135
|
+
survives the `reviews.topicLanguages.full` plan lock.
|
|
136
|
+
- MCP-only mapping updated: review topics by review language ->
|
|
137
|
+
`game_language_topics`.
|
|
138
|
+
|
|
139
|
+
## 0.8.0 - 2026-08-06
|
|
140
|
+
|
|
141
|
+
- New "Steam \"More Like This\" neighbours" section in SKILL.md (NAK-459):
|
|
142
|
+
documents `gmc games more-like-this` (MCP: `more_like_this`), the six
|
|
143
|
+
collected storefront countries with the `us` default, and its use as a
|
|
144
|
+
cohort seed that feeds `coverage_check` and the cohort workflows.
|
|
145
|
+
- Adds the interpretation guardrails as honesty rules: `position` is
|
|
146
|
+
Steam's display order and never a similarity score or ranking;
|
|
147
|
+
`observed_empty` (carousel collected and empty) must be told apart from
|
|
148
|
+
`not_observed` (not collected yet), and neither may be reported as "this
|
|
149
|
+
game has no similar games"; `stale: true` means date the claim rather
|
|
150
|
+
than drop it or present it as current; candidates with
|
|
151
|
+
`resolved: false` stay in the set as unresolved rather than being
|
|
152
|
+
silently dropped.
|
|
153
|
+
- MCP-only mapping updated: single-title drill-down now also lists Steam
|
|
154
|
+
store-page neighbours -> `more_like_this`.
|
|
155
|
+
|
|
156
|
+
## 0.7.0 - 2026-07-20
|
|
157
|
+
|
|
158
|
+
- New "Showcase workflows (fit + history)" section in SKILL.md (NAK-92 /
|
|
159
|
+
NAK-240): documents `gmc showcases history` (MCP: `showcase_history`)
|
|
160
|
+
alongside `showcases fit`, and the chain "similar games -> which
|
|
161
|
+
showcases did they attend -> next edition deadline" via the appearance
|
|
162
|
+
rows' `directory.next_edition`. Adds the interpretation guardrails as
|
|
163
|
+
honesty rules: missing `directory` = "not linked", never "never
|
|
164
|
+
participated"; a steam_event source-unavailable warning means
|
|
165
|
+
research-source-only history, never zero participations; absent
|
|
166
|
+
next-edition data means "window unknown", and the submission-close date
|
|
167
|
+
must be checked against today before recommending a submission. Documents
|
|
168
|
+
the transport casing split (CLI camelCase `nextEdition.submissionCloses`
|
|
169
|
+
vs MCP snake_case `next_edition.submission_closes`) and that plan-limited
|
|
170
|
+
responses redact directory links (indeterminate, not "unlinked" —
|
|
171
|
+
check warnings first).
|
|
172
|
+
- MCP-only mapping updated: showcases now map to both `showcase_fit`
|
|
173
|
+
(submission candidates) and `showcase_history` (participation history).
|
|
174
|
+
|
|
3
175
|
## 0.6.0 - 2026-07-17
|
|
4
176
|
|
|
5
177
|
- New "Product documentation (gmc-docs)" section in SKILL.md:
|