@detergent-software/atk 6.0.0 → 6.1.0-dev.2

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.
Files changed (35) hide show
  1. package/build/commands/drift.d.ts +16 -0
  2. package/build/commands/drift.d.ts.map +1 -0
  3. package/build/commands/drift.js +80 -0
  4. package/build/commands/drift.js.map +1 -0
  5. package/build/commands/index.d.ts.map +1 -1
  6. package/build/commands/index.js +2 -0
  7. package/build/commands/index.js.map +1 -1
  8. package/build/commands/publish.d.ts +2 -1
  9. package/build/commands/publish.d.ts.map +1 -1
  10. package/build/commands/publish.js +71 -5
  11. package/build/commands/publish.js.map +1 -1
  12. package/build/commands/release-notes.d.ts +15 -0
  13. package/build/commands/release-notes.d.ts.map +1 -0
  14. package/build/commands/release-notes.js +68 -0
  15. package/build/commands/release-notes.js.map +1 -0
  16. package/build/components/UpdateBanner.d.ts.map +1 -1
  17. package/build/components/UpdateBanner.js +1 -1
  18. package/build/components/UpdateBanner.js.map +1 -1
  19. package/build/hooks/usePublishState.d.ts +1 -0
  20. package/build/hooks/usePublishState.d.ts.map +1 -1
  21. package/build/hooks/usePublishState.js +5 -4
  22. package/build/hooks/usePublishState.js.map +1 -1
  23. package/build/lib/drift.d.ts +55 -0
  24. package/build/lib/drift.d.ts.map +1 -0
  25. package/build/lib/drift.js +162 -0
  26. package/build/lib/drift.js.map +1 -0
  27. package/build/lib/github.d.ts +5 -0
  28. package/build/lib/github.d.ts.map +1 -1
  29. package/build/lib/github.js +5 -0
  30. package/build/lib/github.js.map +1 -1
  31. package/build/lib/release-notes.d.ts +90 -0
  32. package/build/lib/release-notes.d.ts.map +1 -0
  33. package/build/lib/release-notes.js +102 -0
  34. package/build/lib/release-notes.js.map +1 -0
  35. package/package.json +1 -1
@@ -0,0 +1,102 @@
1
+ import { eq as semverEq, gt as semverGt, prerelease as semverPrerelease, rcompare as semverRcompare, valid as semverValid, } from 'semver';
2
+ import { getGitHubToken } from './auth.js';
3
+ import { fetchWithRetry } from './fetch-retry.js';
4
+ import { buildGitHubHeaders, DEFAULT_CLI_REPO, httpErrorMessage } from './github.js';
5
+ import { CLI_VERSION, isPreRelease } from './version.js';
6
+ /** Default number of releases shown in list mode before `--all` is needed. */
7
+ export const DEFAULT_RELEASE_LIMIT = 15;
8
+ const RELEASES_URL = `https://api.github.com/repos/${DEFAULT_CLI_REPO}/releases?per_page=100`;
9
+ /**
10
+ * Fetch GitHub Releases for the CLI repo and return release notes for browsing.
11
+ *
12
+ * Without a `version`, returns the release history (newest-first), channel-filtered
13
+ * and capped at a limit, with each entry flagged for whether it is the installed
14
+ * version or newer than it. With a `version`, returns that single release's notes
15
+ * (pre-releases included, regardless of channel).
16
+ *
17
+ * Channel selection mirrors the update banner: pre-release builds include `-dev.N`
18
+ * pre-releases by default, stable builds show stable releases only — overridable
19
+ * via `includePrerelease`.
20
+ *
21
+ * Unlike the silent update banner, auth and network failures propagate so the
22
+ * command can surface them via `ErrorView`.
23
+ */
24
+ export async function getReleaseNotes(options = {}, progress) {
25
+ progress?.('Authenticating...');
26
+ const token = await getGitHubToken();
27
+ progress?.('Fetching releases...');
28
+ const response = await fetchWithRetry(RELEASES_URL, { headers: buildGitHubHeaders(token) });
29
+ if (!response.ok) {
30
+ throw new Error(httpErrorMessage(response.status, 'CLI releases'));
31
+ }
32
+ const raw = (await response.json());
33
+ // A specific version lookup ignores the channel filter so you can always read
34
+ // the notes for any published version (including pre-releases).
35
+ if (options.version) {
36
+ const requested = normalizeTag(options.version) ?? options.version;
37
+ const release = selectReleaseNotes(raw, CLI_VERSION, true).find((r) => semverEq(r.version, requested));
38
+ return release
39
+ ? { currentVersion: CLI_VERSION, outcome: 'single', release }
40
+ : { currentVersion: CLI_VERSION, outcome: 'not-found', requestedVersion: requested };
41
+ }
42
+ const includePrerelease = options.includePrerelease ?? isPreRelease();
43
+ const all = selectReleaseNotes(raw, CLI_VERSION, includePrerelease);
44
+ if (all.length === 0) {
45
+ return { currentVersion: CLI_VERSION, outcome: 'empty' };
46
+ }
47
+ const limit = options.all ? all.length : (options.limit ?? DEFAULT_RELEASE_LIMIT);
48
+ return {
49
+ currentVersion: CLI_VERSION,
50
+ latestVersion: all[0].version,
51
+ outcome: 'list',
52
+ releases: all.slice(0, limit),
53
+ total: all.length,
54
+ };
55
+ }
56
+ /**
57
+ * Pure selection logic: from raw GitHub releases, return valid releases ordered
58
+ * newest-first, optionally including pre-releases, with each entry flagged for
59
+ * whether it is the installed version or newer than it. Exported separately so
60
+ * channel filtering, version comparison, and flagging are unit-testable without
61
+ * any network access.
62
+ *
63
+ * - Tags are normalized by stripping a leading `v`; entries that aren't valid
64
+ * semver are skipped.
65
+ * - A release's channel is `dev` when GitHub's `prerelease` flag is set OR the
66
+ * version carries a semver pre-release component; otherwise `latest`.
67
+ * - When `includePrerelease` is false, `dev` releases are dropped.
68
+ */
69
+ export function selectReleaseNotes(raw, currentVersion, includePrerelease) {
70
+ const notes = [];
71
+ for (const entry of raw) {
72
+ const version = normalizeTag(entry.tag_name);
73
+ if (!version || !semverValid(version)) {
74
+ continue;
75
+ }
76
+ const prerelease = entry.prerelease === true;
77
+ const channel = prerelease || semverPrerelease(version) !== null ? 'dev' : 'latest';
78
+ if (!includePrerelease && channel === 'dev') {
79
+ continue;
80
+ }
81
+ notes.push({
82
+ body: entry.body ?? '',
83
+ channel,
84
+ installed: semverValid(currentVersion) ? semverEq(version, currentVersion) : false,
85
+ newer: semverValid(currentVersion) ? semverGt(version, currentVersion) : false,
86
+ prerelease,
87
+ publishedAt: entry.published_at ?? null,
88
+ version,
89
+ });
90
+ }
91
+ notes.sort((a, b) => semverRcompare(a.version, b.version));
92
+ return notes;
93
+ }
94
+ /** Strip a single leading `v` from a release tag, returning undefined when empty. */
95
+ function normalizeTag(tagName) {
96
+ if (!tagName)
97
+ return undefined;
98
+ const trimmed = tagName.trim();
99
+ const stripped = trimmed.startsWith('v') ? trimmed.slice(1) : trimmed;
100
+ return stripped.length > 0 ? stripped : undefined;
101
+ }
102
+ //# sourceMappingURL=release-notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-notes.js","sourceRoot":"","sources":["../../src/lib/release-notes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@detergent-software/atk",
3
- "version": "6.0.0",
3
+ "version": "6.1.0-dev.2",
4
4
  "description": "Agentic Tool Kit — CLI for managing AI coding tool assets.",
5
5
  "type": "module",
6
6
  "bin": {