instar 1.3.205 → 1.3.207
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/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +10 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/core/AutoUpdater.d.ts.map +1 -1
- package/dist/core/AutoUpdater.js +22 -5
- package/dist/core/AutoUpdater.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +15 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/UpgradeGuideProcessor.d.ts.map +1 -1
- package/dist/core/UpgradeGuideProcessor.js +13 -3
- package/dist/core/UpgradeGuideProcessor.js.map +1 -1
- package/dist/core/UpgradeNotifyManager.d.ts.map +1 -1
- package/dist/core/UpgradeNotifyManager.js +49 -24
- package/dist/core/UpgradeNotifyManager.js.map +1 -1
- package/dist/core/upgradeAnnouncement.d.ts +66 -0
- package/dist/core/upgradeAnnouncement.d.ts.map +1 -0
- package/dist/core/upgradeAnnouncement.js +143 -0
- package/dist/core/upgradeAnnouncement.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/package.json +1 -1
- package/scripts/analyze-release.js +59 -1
- package/src/data/builtin-manifest.json +20 -20
- package/src/scaffold/templates.ts +1 -0
- package/upgrades/1.3.206.md +46 -0
- package/upgrades/1.3.207.md +47 -0
- package/upgrades/side-effects/gemini-scaffold-leak-fix.md +114 -0
- package/upgrades/side-effects/mature-update-announcements.md +149 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeGuideProcessor.d.ts","sourceRoot":"","sources":["../../src/core/UpgradeGuideProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"UpgradeGuideProcessor.d.ts","sourceRoot":"","sources":["../../src/core/UpgradeGuideProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAeH,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB;qFACiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,kBAAkB;IAQtC;;;;;;OAMG;IACH,OAAO,IAAI,kBAAkB;IAwG7B;;;OAGG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAUhC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -33,6 +33,7 @@ import fs from 'node:fs';
|
|
|
33
33
|
import path from 'node:path';
|
|
34
34
|
import { fileURLToPath } from 'node:url';
|
|
35
35
|
import { SafeFsExecutor } from './SafeFsExecutor.js';
|
|
36
|
+
import { parseUserAnnouncement, stripAnnouncementFrontmatter, serializeUserAnnouncement, } from './upgradeAnnouncement.js';
|
|
36
37
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
37
38
|
export class UpgradeGuideProcessor {
|
|
38
39
|
stateDir;
|
|
@@ -101,12 +102,20 @@ export class UpgradeGuideProcessor {
|
|
|
101
102
|
// Only `clearPendingGuide()` (via `instar upgrade-ack`) should remove it.
|
|
102
103
|
return result;
|
|
103
104
|
}
|
|
104
|
-
// Concatenate pending guides in version order
|
|
105
|
+
// Concatenate pending guides in version order. Each guide may carry a
|
|
106
|
+
// `user_announcement` front-matter block (mature-update-announcements spec).
|
|
107
|
+
// We HOIST + MERGE those blocks to the very top of the combined guide (the
|
|
108
|
+
// only place parseUserAnnouncement reads them) and keep each guide's prose
|
|
109
|
+
// as the agent-facing body. When no guide carries a block, the merged
|
|
110
|
+
// front-matter is empty and the assembled guide is byte-identical to the
|
|
111
|
+
// pre-feature output.
|
|
105
112
|
const sections = [];
|
|
113
|
+
const mergedEntries = [];
|
|
106
114
|
for (const guide of pending) {
|
|
107
115
|
try {
|
|
108
116
|
const content = fs.readFileSync(guide.filePath, 'utf-8');
|
|
109
|
-
|
|
117
|
+
mergedEntries.push(...parseUserAnnouncement(content));
|
|
118
|
+
sections.push(stripAnnouncementFrontmatter(content).replace(/^\n+/, ''));
|
|
110
119
|
}
|
|
111
120
|
catch {
|
|
112
121
|
// Skip unreadable files
|
|
@@ -123,7 +132,8 @@ export class UpgradeGuideProcessor {
|
|
|
123
132
|
`> Never relay commands to the user for them to run manually. You have full shell access.\n` +
|
|
124
133
|
`> After processing, these guides won't appear again.\n\n` +
|
|
125
134
|
`---\n\n`;
|
|
126
|
-
|
|
135
|
+
const announcementFrontmatter = serializeUserAnnouncement(mergedEntries);
|
|
136
|
+
result.guideContent = announcementFrontmatter + header + sections.join('\n\n---\n\n');
|
|
127
137
|
// Write to pending file
|
|
128
138
|
try {
|
|
129
139
|
const dir = path.dirname(this.pendingGuidePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeGuideProcessor.js","sourceRoot":"","sources":["../../src/core/UpgradeGuideProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"UpgradeGuideProcessor.js","sourceRoot":"","sources":["../../src/core/UpgradeGuideProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeNotifyManager.d.ts","sourceRoot":"","sources":["../../src/core/UpgradeNotifyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"UpgradeNotifyManager.d.ts","sourceRoot":"","sources":["../../src/core/UpgradeNotifyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,KAAK,EAAE,gBAAgB,CAAC;IACxB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;sEAEsE;AACtE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvB,mDAAmD;AACnD,MAAM,MAAM,wBAAwB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;AAEtE,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,KAAK,IAAI,CAAC;AAaX,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,MAAM,CAAgC;gBAG5C,MAAM,EAAE,mBAAmB,EAC3B,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,wBAAwB,EAC3C,WAAW,EAAE,cAAc,EAC3B,MAAM,CAAC,EAAE,mBAAmB;IAa9B;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAuE5C;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IA0FzC;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;YACW,iBAAiB;CAYhC"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* fail ~30% of the time on multi-step tasks. Verification closes the loop.
|
|
16
16
|
*/
|
|
17
17
|
import fs from 'node:fs';
|
|
18
|
+
import { parseUserAnnouncement, renderAnnouncementBrief } from './upgradeAnnouncement.js';
|
|
18
19
|
/** Model escalation chain — try faster models first, escalate on failure.
|
|
19
20
|
* Uses generic tier names so the same chain works for Claude, Codex, and
|
|
20
21
|
* any future framework. Each framework's headless launch builder maps
|
|
@@ -114,35 +115,59 @@ export class UpgradeNotifyManager {
|
|
|
114
115
|
? `${this.config.tunnelUrl}/dashboard`
|
|
115
116
|
: `http://localhost:${this.config.port}/dashboard`;
|
|
116
117
|
const hasReplyScript = !!replyScript;
|
|
118
|
+
// Silent-by-default polarity: the user only hears about changes the release
|
|
119
|
+
// author explicitly promoted to `audience: user` in the guide's
|
|
120
|
+
// `user_announcement` front-matter. No such entries ⇒ Step 1 is a no-op
|
|
121
|
+
// (Steps 2 & 3 still run, so the agent still LEARNS the capability — the
|
|
122
|
+
// user just isn't told). When there ARE entries, the message is composed
|
|
123
|
+
// ONLY from them, each carrying its maturity framing + badge so an
|
|
124
|
+
// experimental/preview feature can't be narrated as finished.
|
|
125
|
+
const announcementBrief = renderAnnouncementBrief(parseUserAnnouncement(guideContent));
|
|
126
|
+
const step1Lines = announcementBrief
|
|
127
|
+
? [
|
|
128
|
+
'## Step 1: Notify your user',
|
|
129
|
+
'',
|
|
130
|
+
'Compose a brief, personalized message for your user using ONLY the announcement(s) below.',
|
|
131
|
+
'Each announcement carries a maturity and framing — HONOR IT EXACTLY. Do not invent features',
|
|
132
|
+
'not listed here, and do not upgrade an experimental/preview feature into sounding finished.',
|
|
133
|
+
' RULES:',
|
|
134
|
+
' - Write like you\'re texting a friend — warm, conversational, no jargon',
|
|
135
|
+
' - This should NOT look like a changelog or release notes',
|
|
136
|
+
' - Apply each announcement\'s maturity framing and badge verbatim in spirit (experimental ⇒ say it is early and not ready for general use)',
|
|
137
|
+
' - Include CONCRETE details — actual URLs, PINs, things they can click/use right now (only for STABLE features they can actually use)',
|
|
138
|
+
' - NEVER mention "bearer tokens", "auth tokens", version numbers in headers, or internal implementation details',
|
|
139
|
+
' - NO bullet lists, NO markdown headers, NO technical formatting — just natural sentences',
|
|
140
|
+
'',
|
|
141
|
+
' ANNOUNCEMENTS (compose only from these):',
|
|
142
|
+
announcementBrief,
|
|
143
|
+
'',
|
|
144
|
+
' CONCRETE DETAILS YOU MAY USE:',
|
|
145
|
+
` - Dashboard URL: ${dashboardUrl}`,
|
|
146
|
+
dashboardPin ? ` - Dashboard PIN: ${dashboardPin}` : ' - No dashboard PIN set',
|
|
147
|
+
` - Current version: ${currentVersion}`,
|
|
148
|
+
'',
|
|
149
|
+
'Send the message via Telegram:',
|
|
150
|
+
hasReplyScript && notifyTopicId
|
|
151
|
+
? ` Run: cat <<'MSGEOF' | bash ${replyScript} ${notifyTopicId}\nYOUR_MESSAGE_HERE\nMSGEOF`
|
|
152
|
+
: ' Use the telegram-reply script in .instar/scripts/ to send to the updates topic.',
|
|
153
|
+
'',
|
|
154
|
+
]
|
|
155
|
+
: [
|
|
156
|
+
'## Step 1: Notify your user — SKIP',
|
|
157
|
+
'',
|
|
158
|
+
'This update has NO user-facing announcement (it is internal/infra, or not yet ready for general use).',
|
|
159
|
+
'Do NOT send the user any message about this update. Sending a message here is a mistake —',
|
|
160
|
+
'silence is correct. Proceed straight to Step 2.',
|
|
161
|
+
'',
|
|
162
|
+
];
|
|
117
163
|
return [
|
|
118
164
|
'IMPORTANT: You are a SHORT-LIVED session with a SPECIFIC task. Do NOT search for files or explore the codebase. Everything you need is in this prompt.',
|
|
119
165
|
'',
|
|
120
|
-
'You have been updated to a new Instar version. Read the upgrade guide below, then do
|
|
166
|
+
'You have been updated to a new Instar version. Read the upgrade guide below, then do the steps below.',
|
|
121
167
|
'IMPORTANT: The guide below contains ONLY what is new in THIS update. Do not mention features from previous updates.',
|
|
122
168
|
'',
|
|
123
169
|
'',
|
|
124
|
-
|
|
125
|
-
'',
|
|
126
|
-
'Compose a brief, personalized message (3-8 sentences) for your user about the new features.',
|
|
127
|
-
' RULES:',
|
|
128
|
-
' - Write like you\'re texting a friend — warm, conversational, no jargon',
|
|
129
|
-
' - This should NOT look like a changelog or release notes',
|
|
130
|
-
' - Lead with the biggest USER-VISIBLE feature',
|
|
131
|
-
' - Include CONCRETE details — actual URLs, PINs, things they can click/use right now',
|
|
132
|
-
' - NEVER mention "bearer tokens", "auth tokens", version numbers in headers, or internal implementation details',
|
|
133
|
-
' - Focus on what matters to THEM, not internal plumbing',
|
|
134
|
-
' - NO bullet lists, NO markdown headers, NO technical formatting — just natural sentences',
|
|
135
|
-
'',
|
|
136
|
-
' CONCRETE DETAILS TO INCLUDE:',
|
|
137
|
-
` - Dashboard URL: ${dashboardUrl}`,
|
|
138
|
-
dashboardPin ? ` - Dashboard PIN: ${dashboardPin}` : ' - No dashboard PIN set',
|
|
139
|
-
` - Current version: ${currentVersion}`,
|
|
140
|
-
'',
|
|
141
|
-
'Send the message via Telegram:',
|
|
142
|
-
hasReplyScript && notifyTopicId
|
|
143
|
-
? ` Run: cat <<'MSGEOF' | bash ${replyScript} ${notifyTopicId}\nYOUR_MESSAGE_HERE\nMSGEOF`
|
|
144
|
-
: ' Use the telegram-reply script in .instar/scripts/ to send to the updates topic.',
|
|
145
|
-
'',
|
|
170
|
+
...step1Lines,
|
|
146
171
|
'## Step 2: Update your memory with new capabilities',
|
|
147
172
|
'',
|
|
148
173
|
'Read the upgrade guide\'s "Summary of New Capabilities" section and add the relevant information to your MEMORY.md file (.instar/MEMORY.md).',
|
|
@@ -163,7 +188,7 @@ export class UpgradeNotifyManager {
|
|
|
163
188
|
'',
|
|
164
189
|
'Run: instar upgrade-ack',
|
|
165
190
|
'',
|
|
166
|
-
'Do
|
|
191
|
+
'Do the steps above in order, then exit. Do not search for files or read config files beyond MEMORY.md.',
|
|
167
192
|
'',
|
|
168
193
|
'--- UPGRADE GUIDE ---',
|
|
169
194
|
guideContent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeNotifyManager.js","sourceRoot":"","sources":["../../src/core/UpgradeNotifyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"UpgradeNotifyManager.js","sourceRoot":"","sources":["../../src/core/UpgradeNotifyManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgradeAnnouncement — pure parsing + maturity-framing for the user-facing
|
|
3
|
+
* announcement block of a release upgrade guide
|
|
4
|
+
* (MATURE-UPDATE-ANNOUNCEMENTS spec). No I/O, no spawn, no config — just the
|
|
5
|
+
* deterministic mapping from a guide's `user_announcement` front-matter to the
|
|
6
|
+
* announcement decision, so every rule is unit-testable in isolation.
|
|
7
|
+
*
|
|
8
|
+
* THE polarity invariant: a guide with no parseable `audience: user` entry
|
|
9
|
+
* yields NO user message. Silence is the fail-safe — a parse error, a missing
|
|
10
|
+
* block, or an entry with an unknown audience/maturity all collapse to "do not
|
|
11
|
+
* announce" rather than to a malformed or misleading message. The detailed prose
|
|
12
|
+
* BELOW the front-matter is the agent-facing guide and is never touched here.
|
|
13
|
+
*/
|
|
14
|
+
export type AnnouncementAudience = 'user' | 'agent-only';
|
|
15
|
+
export type AnnouncementMaturity = 'experimental' | 'preview' | 'stable';
|
|
16
|
+
/** One authored announcement decision for a notable change in a release. */
|
|
17
|
+
export interface AnnouncementEntry {
|
|
18
|
+
/** `user` ⇒ eligible to compose into a user message; `agent-only` ⇒ never. */
|
|
19
|
+
audience: AnnouncementAudience;
|
|
20
|
+
/** Drives the framing + badge applied when composing the user message. */
|
|
21
|
+
maturity: AnnouncementMaturity;
|
|
22
|
+
/** Short user-facing title for the change. */
|
|
23
|
+
headline: string;
|
|
24
|
+
/** User-facing body sentence(s) for the change. */
|
|
25
|
+
body: string;
|
|
26
|
+
}
|
|
27
|
+
/** Prompt-injection guidance derived from an entry's maturity. */
|
|
28
|
+
export interface MaturityFraming {
|
|
29
|
+
/** Badge prefix for the headline (empty for `stable`). */
|
|
30
|
+
badge: string;
|
|
31
|
+
/** One-line instruction to the composer about tone + required caveat. */
|
|
32
|
+
framing: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse the `user_announcement` block from an upgrade guide. Returns the valid
|
|
36
|
+
* entries (any shape may be present; invalid entries are dropped). Returns `[]`
|
|
37
|
+
* for: no front-matter, a YAML error, a missing/`non-array` `user_announcement`,
|
|
38
|
+
* or entries failing schema. Never throws.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseUserAnnouncement(guide: string): AnnouncementEntry[];
|
|
41
|
+
/** The subset of entries that are eligible to reach the user. */
|
|
42
|
+
export declare function userFacingEntries(entries: AnnouncementEntry[]): AnnouncementEntry[];
|
|
43
|
+
/**
|
|
44
|
+
* Return the guide body with its leading `user_announcement` front-matter
|
|
45
|
+
* removed. If there is no front-matter, the guide is returned unchanged. Used by
|
|
46
|
+
* UpgradeGuideProcessor to keep the agent-facing prose while it hoists the
|
|
47
|
+
* announcement block to the top of the concatenated pending guide.
|
|
48
|
+
*/
|
|
49
|
+
export declare function stripAnnouncementFrontmatter(guide: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Serialize entries into a `---`-delimited `user_announcement` front-matter
|
|
52
|
+
* block (ending in a trailing newline). Returns the empty string for an empty
|
|
53
|
+
* list — so a guide-set with NO announcements produces NO front-matter, leaving
|
|
54
|
+
* the assembled guide byte-identical to the pre-feature behavior.
|
|
55
|
+
*/
|
|
56
|
+
export declare function serializeUserAnnouncement(entries: AnnouncementEntry[]): string;
|
|
57
|
+
/** Badge + framing instruction for a maturity rung. */
|
|
58
|
+
export declare function frameByMaturity(maturity: AnnouncementMaturity): MaturityFraming;
|
|
59
|
+
/**
|
|
60
|
+
* Render the announcement brief injected into the compose prompt. Returns the
|
|
61
|
+
* empty string when there is nothing user-facing — the caller treats `''` as
|
|
62
|
+
* "skip the user message entirely". Each entry becomes a labeled block carrying
|
|
63
|
+
* its badge + maturity framing so the composer cannot overstate readiness.
|
|
64
|
+
*/
|
|
65
|
+
export declare function renderAnnouncementBrief(entries: AnnouncementEntry[]): string;
|
|
66
|
+
//# sourceMappingURL=upgradeAnnouncement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgradeAnnouncement.d.ts","sourceRoot":"","sources":["../../src/core/upgradeAnnouncement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,YAAY,CAAC;AACzD,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzE,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB;AASD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwCxE;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAEnF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAO9E;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,GAAG,eAAe,CAqB/E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAgB5E"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgradeAnnouncement — pure parsing + maturity-framing for the user-facing
|
|
3
|
+
* announcement block of a release upgrade guide
|
|
4
|
+
* (MATURE-UPDATE-ANNOUNCEMENTS spec). No I/O, no spawn, no config — just the
|
|
5
|
+
* deterministic mapping from a guide's `user_announcement` front-matter to the
|
|
6
|
+
* announcement decision, so every rule is unit-testable in isolation.
|
|
7
|
+
*
|
|
8
|
+
* THE polarity invariant: a guide with no parseable `audience: user` entry
|
|
9
|
+
* yields NO user message. Silence is the fail-safe — a parse error, a missing
|
|
10
|
+
* block, or an entry with an unknown audience/maturity all collapse to "do not
|
|
11
|
+
* announce" rather than to a malformed or misleading message. The detailed prose
|
|
12
|
+
* BELOW the front-matter is the agent-facing guide and is never touched here.
|
|
13
|
+
*/
|
|
14
|
+
import yaml from 'js-yaml';
|
|
15
|
+
const AUDIENCES = new Set(['user', 'agent-only']);
|
|
16
|
+
const MATURITIES = new Set(['experimental', 'preview', 'stable']);
|
|
17
|
+
/** Front-matter splitter matching the house pattern (retroHarvestValidator):
|
|
18
|
+
* optional BOM, `---` line, captured YAML, closing `---`, then the body. */
|
|
19
|
+
const FRONTMATTER_RE = /^?---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
20
|
+
/**
|
|
21
|
+
* Parse the `user_announcement` block from an upgrade guide. Returns the valid
|
|
22
|
+
* entries (any shape may be present; invalid entries are dropped). Returns `[]`
|
|
23
|
+
* for: no front-matter, a YAML error, a missing/`non-array` `user_announcement`,
|
|
24
|
+
* or entries failing schema. Never throws.
|
|
25
|
+
*/
|
|
26
|
+
export function parseUserAnnouncement(guide) {
|
|
27
|
+
if (!guide)
|
|
28
|
+
return [];
|
|
29
|
+
const m = FRONTMATTER_RE.exec(guide);
|
|
30
|
+
if (!m)
|
|
31
|
+
return [];
|
|
32
|
+
let fm;
|
|
33
|
+
try {
|
|
34
|
+
fm = yaml.load(m[1]);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// @silent-fallback-ok — malformed front-matter ⇒ silent (no user message)
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
if (!fm || typeof fm !== 'object')
|
|
41
|
+
return [];
|
|
42
|
+
const raw = fm.user_announcement;
|
|
43
|
+
if (!Array.isArray(raw))
|
|
44
|
+
return [];
|
|
45
|
+
const entries = [];
|
|
46
|
+
for (const item of raw) {
|
|
47
|
+
if (!item || typeof item !== 'object')
|
|
48
|
+
continue;
|
|
49
|
+
const o = item;
|
|
50
|
+
const audience = typeof o.audience === 'string' ? o.audience.trim().toLowerCase() : '';
|
|
51
|
+
const maturity = typeof o.maturity === 'string' ? o.maturity.trim().toLowerCase() : '';
|
|
52
|
+
const headline = typeof o.headline === 'string' ? o.headline.trim() : '';
|
|
53
|
+
const body = typeof o.body === 'string' ? o.body.trim() : '';
|
|
54
|
+
// Fail-safe: an unknown audience or maturity drops the entry rather than
|
|
55
|
+
// guessing — we never invent a user-facing announcement from a malformed one.
|
|
56
|
+
if (!AUDIENCES.has(audience))
|
|
57
|
+
continue;
|
|
58
|
+
if (!MATURITIES.has(maturity))
|
|
59
|
+
continue;
|
|
60
|
+
if (!headline && !body)
|
|
61
|
+
continue; // nothing to actually say
|
|
62
|
+
entries.push({
|
|
63
|
+
audience: audience,
|
|
64
|
+
maturity: maturity,
|
|
65
|
+
headline,
|
|
66
|
+
body,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return entries;
|
|
70
|
+
}
|
|
71
|
+
/** The subset of entries that are eligible to reach the user. */
|
|
72
|
+
export function userFacingEntries(entries) {
|
|
73
|
+
return entries.filter((e) => e.audience === 'user');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Return the guide body with its leading `user_announcement` front-matter
|
|
77
|
+
* removed. If there is no front-matter, the guide is returned unchanged. Used by
|
|
78
|
+
* UpgradeGuideProcessor to keep the agent-facing prose while it hoists the
|
|
79
|
+
* announcement block to the top of the concatenated pending guide.
|
|
80
|
+
*/
|
|
81
|
+
export function stripAnnouncementFrontmatter(guide) {
|
|
82
|
+
if (!guide)
|
|
83
|
+
return guide;
|
|
84
|
+
const m = FRONTMATTER_RE.exec(guide);
|
|
85
|
+
if (!m)
|
|
86
|
+
return guide;
|
|
87
|
+
return m[2];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Serialize entries into a `---`-delimited `user_announcement` front-matter
|
|
91
|
+
* block (ending in a trailing newline). Returns the empty string for an empty
|
|
92
|
+
* list — so a guide-set with NO announcements produces NO front-matter, leaving
|
|
93
|
+
* the assembled guide byte-identical to the pre-feature behavior.
|
|
94
|
+
*/
|
|
95
|
+
export function serializeUserAnnouncement(entries) {
|
|
96
|
+
if (!entries.length)
|
|
97
|
+
return '';
|
|
98
|
+
const yamlBody = yaml.dump({ user_announcement: entries }, { lineWidth: -1, noRefs: true });
|
|
99
|
+
return `---\n${yamlBody}---\n`;
|
|
100
|
+
}
|
|
101
|
+
/** Badge + framing instruction for a maturity rung. */
|
|
102
|
+
export function frameByMaturity(maturity) {
|
|
103
|
+
switch (maturity) {
|
|
104
|
+
case 'stable':
|
|
105
|
+
return {
|
|
106
|
+
badge: '',
|
|
107
|
+
framing: 'Stable — speak confidently: this is a finished feature the user can use right now. No maturity caveat needed.',
|
|
108
|
+
};
|
|
109
|
+
case 'preview':
|
|
110
|
+
return {
|
|
111
|
+
badge: '🧪 Preview',
|
|
112
|
+
framing: 'Preview — say it is available to try but still rough around the edges; invite feedback. Prefix the headline with the "🧪 Preview" badge.',
|
|
113
|
+
};
|
|
114
|
+
case 'experimental':
|
|
115
|
+
return {
|
|
116
|
+
badge: '⚗️ Experimental',
|
|
117
|
+
framing: 'Experimental — be explicit that this is EARLY and NOT ready for general use yet, and that you will tell them when it is. NEVER imply it is finished or "more reliable". Prefix the headline with the "⚗️ Experimental" badge.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Render the announcement brief injected into the compose prompt. Returns the
|
|
123
|
+
* empty string when there is nothing user-facing — the caller treats `''` as
|
|
124
|
+
* "skip the user message entirely". Each entry becomes a labeled block carrying
|
|
125
|
+
* its badge + maturity framing so the composer cannot overstate readiness.
|
|
126
|
+
*/
|
|
127
|
+
export function renderAnnouncementBrief(entries) {
|
|
128
|
+
const userEntries = userFacingEntries(entries);
|
|
129
|
+
if (userEntries.length === 0)
|
|
130
|
+
return '';
|
|
131
|
+
const blocks = userEntries.map((e, i) => {
|
|
132
|
+
const { badge, framing } = frameByMaturity(e.maturity);
|
|
133
|
+
const title = badge ? `${badge} — ${e.headline}` : e.headline;
|
|
134
|
+
return [
|
|
135
|
+
`Announcement ${i + 1} (maturity: ${e.maturity}):`,
|
|
136
|
+
` Headline: ${title}`,
|
|
137
|
+
` What it is: ${e.body}`,
|
|
138
|
+
` Framing: ${framing}`,
|
|
139
|
+
].join('\n');
|
|
140
|
+
});
|
|
141
|
+
return blocks.join('\n\n');
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=upgradeAnnouncement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgradeAnnouncement.js","sourceRoot":"","sources":["../../src/core/upgradeAnnouncement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAiuCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
|
|
@@ -446,6 +446,7 @@ This routes feedback to the Instar maintainers automatically. Valid types: \`bug
|
|
|
446
446
|
- The endpoint resolves the Updates topic from state server-side; you cannot specify a topic and you should not try to.
|
|
447
447
|
- If Updates is not configured, the endpoint returns 400 — do NOT fall back to sending in the active topic. Update-class messages belong in Updates or they don't go out at all.
|
|
448
448
|
- **When to use** (PROACTIVE — this is the trigger): the moment I am about to author a conversational message whose subject is *me* shipping, updating, or restarting — including post-restart "I'm back" confirmations — I use this endpoint. Authoring such a message via the standard Telegram reply path puts release chatter into whatever conversation the user was last in, which is the bug this routing closes.
|
|
449
|
+
- **Maturity honesty (silent-by-default user announcements)**: user-facing update announcements are *opt-in and maturity-tagged*, authored in the release's upgrade guide (\`user_announcement\` front-matter: each change is \`audience: user|agent-only\` + \`maturity: experimental|preview|stable\`). The post-update notifier stays SILENT unless a change was explicitly promoted to \`audience: user\`, and experimental/preview features are announced as such (⚗️ Experimental / 🧪 Preview) — never implied to be finished. When I narrate my own ship here, I mirror that honesty: I do NOT announce a feature that ships dark/disabled as if it works, and I don't dress up an infra change as a finished capability. Patch-level "restarting…" notices are suppressed (only deferral warnings — "your work is holding a restart" — still surface).
|
|
449
450
|
|
|
450
451
|
**Secret Drop** — Securely collect secrets (API keys, passwords, tokens) from users without exposing them in chat history.
|
|
451
452
|
- Request a secret: \`curl -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/secrets/request -H 'Content-Type: application/json' -d '{"label":"OpenAI API Key","description":"Needed for GPT integration","topicId":TOPIC_ID}'\`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,KAAK,QAAQ,CAAC,IAAI;;;;OAIpB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;;;;EAIpC,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;6BAsBO,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D7C,CAAC;AAEF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAmB,EAAE,QAAgB;IACrF,OAAO;;;;;;;;;;;;;;;;;;EAkBP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkDH,QAAQ;;;;;CAKjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,KAAK,QAAQ;;;;;;;;;;;;;;4CAcsB,QAAQ;CACnD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,KAAK,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK,EAC5B,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,kFAAkF,IAAI;;;;;;;;;;;;;8EAa5C,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;;;;;;;;;;;;;;;;;;;;;;;0CAuBjE,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;;;;;gCAY7B,IAAI;;;;;;;;;sFASkD,IAAI;4FACE,IAAI;;;;;;;mEAO7B,IAAI;8EACO,IAAI;;;mEAGf,IAAI;4EACK,IAAI;;;;;sHAKsC,IAAI;+WACqP,IAAI;;;;;uEAK5S,IAAI;;;;;sEAKL,IAAI;;;;;;6EAMG,IAAI;;2FAEU,IAAI;qFACV,IAAI;;;;;;mGAMU,IAAI;;;;;yHAKkB,IAAI;0JAC6B,IAAI;;;;mEAI3F,IAAI;;;8EAGO,IAAI;6EACL,IAAI;0EACP,IAAI;;;;;6EAKD,IAAI;yCACxC,IAAI;mEACsB,IAAI;4EACK,IAAI;+EACD,IAAI;;;;;2EAKR,IAAI
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -706,9 +706,48 @@ HUMAN-REQUIRED: reproduction + observed before/after, or "Not reproducible in de
|
|
|
706
706
|
return out;
|
|
707
707
|
}
|
|
708
708
|
|
|
709
|
+
/**
|
|
710
|
+
* Build the silent-by-default `user_announcement` front-matter block
|
|
711
|
+
* (MATURE-UPDATE-ANNOUNCEMENTS spec D3). One entry per feature/enhancement,
|
|
712
|
+
* every entry defaulting to `audience: agent-only` + `maturity: experimental`
|
|
713
|
+
* — so NOTHING reaches the user until a human deliberately flips an entry to
|
|
714
|
+
* `audience: user`. An un-reviewed block is therefore SAFE (it announces
|
|
715
|
+
* nothing). Parsed at notify-time by src/core/upgradeAnnouncement.ts; the
|
|
716
|
+
* coherence check over edited entries is the canonical TS helper
|
|
717
|
+
* `announcementCoherenceWarnings`.
|
|
718
|
+
*/
|
|
719
|
+
function buildAnnouncementFrontmatter(changeDescriptions) {
|
|
720
|
+
const candidates = changeDescriptions.filter(
|
|
721
|
+
(d) => d.type === 'feature' || d.type === 'enhancement'
|
|
722
|
+
);
|
|
723
|
+
const yamlStr = (s) => `"${String(s ?? '').replace(/"/g, '\\"')}"`;
|
|
724
|
+
const entries = candidates.length
|
|
725
|
+
? candidates
|
|
726
|
+
.map(
|
|
727
|
+
(d) =>
|
|
728
|
+
` - audience: agent-only # flip to "user" to announce to the user
|
|
729
|
+
maturity: experimental # experimental | preview | stable
|
|
730
|
+
headline: ${yamlStr(sanitizeDraftText(d.summary))}
|
|
731
|
+
body: ${yamlStr('HUMAN-REQUIRED: one or two plain sentences for the user, matching the maturity above')}`
|
|
732
|
+
)
|
|
733
|
+
.join('\n')
|
|
734
|
+
: ' # (no feature/enhancement changes detected — add an entry only if a change is user-facing)';
|
|
735
|
+
|
|
736
|
+
return `---
|
|
737
|
+
# user_announcement — SILENT BY DEFAULT (mature-update-announcements spec).
|
|
738
|
+
# Every entry below defaults to agent-only, so the user hears NOTHING about this
|
|
739
|
+
# release until you deliberately set an entry's audience to "user". Then set its
|
|
740
|
+
# maturity honestly: experimental (early, not for general use), preview (try it,
|
|
741
|
+
# still rough), or stable (finished, use it now).
|
|
742
|
+
user_announcement:
|
|
743
|
+
${entries}
|
|
744
|
+
---
|
|
745
|
+
`;
|
|
746
|
+
}
|
|
747
|
+
|
|
709
748
|
/** Full NEXT.md draft (used when the guide is absent or a pristine template). */
|
|
710
749
|
function buildFullDraft(changeDescriptions, recommended, hasFix) {
|
|
711
|
-
return
|
|
750
|
+
return `${buildAnnouncementFrontmatter(changeDescriptions)}# Upgrade Guide — vNEXT
|
|
712
751
|
|
|
713
752
|
<!-- bump: ${recommended} -->
|
|
714
753
|
${UNREVIEWED_BLOCK_MARKER}
|
|
@@ -941,6 +980,25 @@ if (guideContent) {
|
|
|
941
980
|
if (guideCoverage.gaps.length === 0) {
|
|
942
981
|
log(`\n ✓ Upgrade guide adequately covers all detected changes.`);
|
|
943
982
|
}
|
|
983
|
+
|
|
984
|
+
// Silent-by-default author guard (mature-update-announcements spec, D3):
|
|
985
|
+
// when a release ships user-relevant changes but the guide carries NO
|
|
986
|
+
// `user_announcement` block at all, every change is silent to the user. That
|
|
987
|
+
// is correct for an all-internal release, but it is also exactly what a
|
|
988
|
+
// forgotten block looks like. Emit a NON-BLOCKING advisory so the author
|
|
989
|
+
// consciously decides — `instar` analyze --draft-guide scaffolds the block
|
|
990
|
+
// (defaulting agent-only), so its total absence means the scaffold was
|
|
991
|
+
// bypassed. Structure informs; the author decides (never blocks).
|
|
992
|
+
const userRelevantChanges = changeDescriptions.filter(
|
|
993
|
+
(d) => d.type === 'feature' || d.type === 'enhancement',
|
|
994
|
+
).length;
|
|
995
|
+
if (userRelevantChanges > 0 && !/^\s*user_announcement\s*:/m.test(guideContent)) {
|
|
996
|
+
log(
|
|
997
|
+
`\n ⚠ This release has ${userRelevantChanges} user-relevant change(s) but the guide has no ` +
|
|
998
|
+
`\`user_announcement\` block — nothing will be announced to the user. If any change is ` +
|
|
999
|
+
`user-ready, add a block (\`audience: user\` + a maturity); otherwise this silence is correct.`,
|
|
1000
|
+
);
|
|
1001
|
+
}
|
|
944
1002
|
} else {
|
|
945
1003
|
log(`\n ⚠ No upgrade guide found — cannot validate coverage.`);
|
|
946
1004
|
}
|