featuredrop 2.1.0 → 2.3.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.
@@ -4,7 +4,9 @@
4
4
  var promises$1 = require('readline/promises');
5
5
  var promises = require('fs/promises');
6
6
  var path = require('path');
7
+ var os = require('os');
7
8
  var zod = require('zod');
9
+ var posthogNode = require('posthog-node');
8
10
  var moduleApi = require('module');
9
11
 
10
12
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -515,6 +517,35 @@ async function validateFeatureFiles(options = {}) {
515
517
  throw new Error(`Manifest validation failed: ${message}`);
516
518
  }
517
519
  }
520
+ var _client = null;
521
+ function isOptedOut() {
522
+ const optOut = process.env.POSTHOG_OPT_OUT;
523
+ if (optOut && optOut !== "0" && optOut !== "false") return true;
524
+ const env = process.env.NODE_ENV;
525
+ if (env === "development" || env === "test") return true;
526
+ if (process.env.CI) return true;
527
+ return false;
528
+ }
529
+ function getPostHogClient() {
530
+ if (isOptedOut()) return null;
531
+ const apiKey = process.env.POSTHOG_API_KEY;
532
+ if (!apiKey) return null;
533
+ if (!_client) {
534
+ _client = new posthogNode.PostHog(apiKey, {
535
+ host: process.env.POSTHOG_HOST ?? "https://us.i.posthog.com",
536
+ flushAt: 1,
537
+ flushInterval: 0,
538
+ enableExceptionAutocapture: true
539
+ });
540
+ }
541
+ return _client;
542
+ }
543
+ async function shutdownPostHog() {
544
+ if (_client) {
545
+ await _client.shutdown();
546
+ _client = null;
547
+ }
548
+ }
518
549
 
519
550
  // src/cli-utils.ts
520
551
  function computeManifestStats(entries) {
@@ -1281,6 +1312,8 @@ async function run() {
1281
1312
  process.exitCode = 1;
1282
1313
  return;
1283
1314
  }
1315
+ const distinctId = `cli:${os.hostname()}`;
1316
+ const posthog = getPostHogClient();
1284
1317
  try {
1285
1318
  if (args.command === "init") {
1286
1319
  const result = await initFeaturedropProject({
@@ -1292,6 +1325,12 @@ async function run() {
1292
1325
  for (const path of result.created) {
1293
1326
  console.log(`- ${path}`);
1294
1327
  }
1328
+ posthog?.capture({
1329
+ distinctId,
1330
+ event: "cli_init",
1331
+ properties: { format: result.format, files_created: result.created.length }
1332
+ });
1333
+ await shutdownPostHog();
1295
1334
  return;
1296
1335
  }
1297
1336
  if (args.command === "add") {
@@ -1310,6 +1349,18 @@ async function run() {
1310
1349
  showDays: args.showDays
1311
1350
  });
1312
1351
  console.log(`Added feature "${result.entry.id}" -> ${result.path}`);
1352
+ posthog?.capture({
1353
+ distinctId,
1354
+ event: "cli_add_feature",
1355
+ properties: {
1356
+ feature_id: result.entry.id,
1357
+ feature_type: result.entry.type,
1358
+ format: args.format,
1359
+ has_description: Boolean(args.description),
1360
+ has_url: Boolean(args.url)
1361
+ }
1362
+ });
1363
+ await shutdownPostHog();
1313
1364
  return;
1314
1365
  }
1315
1366
  if (args.command === "migrate") {
@@ -1325,6 +1376,12 @@ async function run() {
1325
1376
  outFile: args.outFile
1326
1377
  });
1327
1378
  console.log(`Migrated ${result.entries.length} entries from ${from} -> ${result.outFile}`);
1379
+ posthog?.capture({
1380
+ distinctId,
1381
+ event: "cli_migrate",
1382
+ properties: { source: from, entries_migrated: result.entries.length, out_file: result.outFile }
1383
+ });
1384
+ await shutdownPostHog();
1328
1385
  return;
1329
1386
  }
1330
1387
  if (args.command === "build") {
@@ -1335,6 +1392,12 @@ async function run() {
1335
1392
  cwd: args.cwd
1336
1393
  });
1337
1394
  console.log(`Built ${entries2.length} feature entries -> ${out}`);
1395
+ posthog?.capture({
1396
+ distinctId,
1397
+ event: "cli_build",
1398
+ properties: { entries_built: entries2.length, out_file: out, has_pattern: Boolean(args.pattern) }
1399
+ });
1400
+ await shutdownPostHog();
1338
1401
  return;
1339
1402
  }
1340
1403
  if (args.command === "validate") {
@@ -1343,6 +1406,7 @@ async function run() {
1343
1406
  cwd: args.cwd
1344
1407
  });
1345
1408
  console.log("Feature files valid");
1409
+ await shutdownPostHog();
1346
1410
  return;
1347
1411
  }
1348
1412
  const entries = await buildManifestFromPattern({
@@ -1356,6 +1420,7 @@ async function run() {
1356
1420
  console.log(`By category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`);
1357
1421
  if (stats.newestRelease) console.log(`Newest release: ${stats.newestRelease}`);
1358
1422
  if (stats.oldestRelease) console.log(`Oldest release: ${stats.oldestRelease}`);
1423
+ await shutdownPostHog();
1359
1424
  return;
1360
1425
  }
1361
1426
  if (args.command === "doctor") {
@@ -1366,6 +1431,7 @@ async function run() {
1366
1431
  console.log("");
1367
1432
  console.log(`${report.warnings.length} warning(s), ${report.errors.length} error(s).`);
1368
1433
  if (report.errors.length > 0) process.exitCode = 1;
1434
+ await shutdownPostHog();
1369
1435
  return;
1370
1436
  }
1371
1437
  if (args.command === "generate-rss") {
@@ -1378,6 +1444,12 @@ async function run() {
1378
1444
  await promises.writeFile(path.join(args.cwd ?? process.cwd(), out), `${xml}
1379
1445
  `, "utf8");
1380
1446
  console.log(`Generated RSS feed -> ${out}`);
1447
+ posthog?.capture({
1448
+ distinctId,
1449
+ event: "cli_generate_rss",
1450
+ properties: { entries_count: entries.length, out_file: out }
1451
+ });
1452
+ await shutdownPostHog();
1381
1453
  return;
1382
1454
  }
1383
1455
  if (args.command === "generate-changelog") {
@@ -1385,11 +1457,24 @@ async function run() {
1385
1457
  const markdown = generateMarkdownChangelog(entries);
1386
1458
  await promises.writeFile(path.join(args.cwd ?? process.cwd(), out), markdown, "utf8");
1387
1459
  console.log(`Generated markdown changelog -> ${out}`);
1460
+ posthog?.capture({
1461
+ distinctId,
1462
+ event: "cli_generate_changelog",
1463
+ properties: { entries_count: entries.length, out_file: out }
1464
+ });
1465
+ await shutdownPostHog();
1388
1466
  return;
1389
1467
  }
1390
1468
  } catch (error) {
1391
1469
  const message = error instanceof Error ? error.message : String(error);
1392
1470
  console.error(`featuredrop: ${message}`);
1471
+ posthog?.captureException(error, distinctId, { command: args.command });
1472
+ posthog?.capture({
1473
+ distinctId,
1474
+ event: "cli_error",
1475
+ properties: { command: args.command, error_message: message }
1476
+ });
1477
+ await shutdownPostHog();
1393
1478
  process.exitCode = 1;
1394
1479
  }
1395
1480
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dependencies.ts","../src/schema.ts","../src/changelog-as-code.ts","../src/cli-utils.ts","../src/cli-scaffold.ts","../src/markdown.ts","../src/rss.ts","../src/cli.ts"],"names":["z","readdir","join","stat","readFile","relative","sep","writeFile","isRecord","mkdir","sample","basename","moduleApi","sanitized","decoded","createInterface","entries"],"mappings":"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","file":"featuredrop.cjs","sourcesContent":["import type { FeatureEntry, FeatureManifest } from \"./types\";\n\nfunction getDirectDependencies(feature: FeatureEntry): string[] {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return [];\n const seen = dependsOn.seen ?? [];\n const clicked = dependsOn.clicked ?? [];\n const dismissed = dependsOn.dismissed ?? [];\n const unique = new Set<string>();\n for (const id of [...seen, ...clicked, ...dismissed]) {\n if (id) unique.add(id);\n }\n return Array.from(unique);\n}\n\nexport function resolveDependencyOrder(manifest: FeatureManifest): string[] {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n ordered.push(id);\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n // On cycles, append remaining IDs in original order to keep behavior stable.\n if (ordered.length < manifest.length) {\n const included = new Set(ordered);\n for (const feature of manifest) {\n if (included.has(feature.id)) continue;\n ordered.push(feature.id);\n }\n }\n\n return ordered;\n}\n\nexport function hasDependencyCycle(manifest: FeatureManifest): boolean {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n visited += 1;\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n return visited !== manifest.length;\n}\n\nexport function sortFeaturesByDependencies(features: FeatureEntry[]): FeatureEntry[] {\n if (features.length <= 1) return [...features];\n const order = resolveDependencyOrder(features);\n const rank = new Map(order.map((id, index) => [id, index]));\n return [...features].sort((a, b) => {\n const ra = rank.get(a.id);\n const rb = rank.get(b.id);\n if (ra === undefined || rb === undefined) return 0;\n return ra - rb;\n });\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry, FeatureManifest } from \"./types\";\nimport { z } from \"zod\";\n\nexport interface ValidationIssue {\n path: string;\n message: string;\n code:\n | \"invalid_type\"\n | \"missing_required\"\n | \"invalid_value\"\n | \"invalid_date\"\n | \"duplicate_id\"\n | \"circular_dependency\";\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationIssue[];\n}\n\nexport const featureEntryJsonSchema = {\n type: \"object\",\n required: [\"id\", \"label\", \"releasedAt\", \"showNewUntil\"],\n properties: {\n id: { type: \"string\" },\n label: { type: \"string\" },\n description: { type: \"string\" },\n releasedAt: { type: \"string\", format: \"date-time\" },\n showNewUntil: { type: \"string\", format: \"date-time\" },\n flagKey: { type: \"string\" },\n product: { type: \"string\" },\n url: { type: \"string\" },\n image: { type: \"string\" },\n type: { enum: [\"feature\", \"improvement\", \"fix\", \"breaking\"] },\n priority: { enum: [\"critical\", \"normal\", \"low\"] },\n cta: {\n type: \"object\",\n properties: {\n label: { type: \"string\" },\n url: { type: \"string\" },\n },\n },\n meta: { type: \"object\" },\n },\n} as const;\n\nexport const featureManifestJsonSchema = {\n type: \"array\",\n items: featureEntryJsonSchema,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidDate(value: string): boolean {\n return Number.isFinite(new Date(value).getTime());\n}\n\nconst nonEmptyString = z.string().trim().min(1, \"must be a non-empty string\");\n\nconst isoDateString = nonEmptyString.refine(isValidDate, {\n message: \"must be a valid date\",\n params: { featuredropCode: \"invalid_date\" },\n});\n\nconst dependsOnSchema = z\n .object({\n seen: z.array(z.string()).optional(),\n clicked: z.array(z.string()).optional(),\n dismissed: z.array(z.string()).optional(),\n })\n .optional();\n\nconst ctaSchema = z\n .object({\n label: nonEmptyString,\n url: nonEmptyString,\n })\n .optional();\n\nexport const featureEntrySchema = z\n .object({\n id: nonEmptyString,\n label: nonEmptyString,\n releasedAt: isoDateString,\n showNewUntil: isoDateString,\n description: z.string().optional(),\n flagKey: z.string().optional(),\n product: z.string().optional(),\n url: z.string().optional(),\n image: z.string().optional(),\n type: z.enum([\"feature\", \"improvement\", \"fix\", \"breaking\"]).optional(),\n priority: z.enum([\"critical\", \"normal\", \"low\"]).optional(),\n cta: ctaSchema,\n meta: z.record(z.unknown()).optional(),\n dependsOn: dependsOnSchema,\n })\n .passthrough();\n\nexport const featureManifestSchema = z.array(featureEntrySchema);\n\nfunction toIssuePath(path: Array<string | number>): string {\n if (path.length === 0) return \"$\";\n let output = \"\";\n for (const part of path) {\n if (typeof part === \"number\") output += `[${part}]`;\n else output += output ? `.${part}` : part;\n }\n return output;\n}\n\nfunction mapZodIssue(issue: z.ZodIssue): ValidationIssue {\n const codeParam = (issue as { params?: Record<string, unknown> }).params?.featuredropCode;\n if (codeParam === \"invalid_date\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_date\",\n };\n }\n if (issue.code === \"invalid_type\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: issue.received === \"undefined\" ? \"missing_required\" : \"invalid_type\",\n };\n }\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_value\",\n };\n}\n\nconst UNSAFE_META_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isSafeUrl(value: string): boolean {\n const normalized = value.trim();\n if (!normalized) return false;\n if (/^(\\/|\\.\\/|\\.\\.\\/|\\?|#)/.test(normalized)) return true;\n if (/^https?:\\/\\//i.test(normalized)) return true;\n return false;\n}\n\nfunction findUnsafeMetaPath(value: unknown, path = \"meta\"): string | null {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index++) {\n const nested = findUnsafeMetaPath(value[index], `${path}[${index}]`);\n if (nested) return nested;\n }\n return null;\n }\n\n if (!isRecord(value)) return null;\n for (const [key, nestedValue] of Object.entries(value)) {\n if (UNSAFE_META_KEYS.has(key)) {\n return `${path}.${key}`;\n }\n const nested = findUnsafeMetaPath(nestedValue, `${path}.${key}`);\n if (nested) return nested;\n }\n return null;\n}\n\nfunction validateFeatureEntry(raw: unknown, index: number): { entry?: FeatureEntry; issues: ValidationIssue[] } {\n if (!isRecord(raw)) {\n return {\n issues: [\n {\n path: `[${index}]`,\n message: \"Feature entry must be an object\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const parsed = featureEntrySchema.safeParse(raw);\n if (!parsed.success) {\n return {\n issues: parsed.error.issues.map((issue) => ({\n ...mapZodIssue(issue),\n path: `[${index}]${issue.path.length > 0 ? `.${toIssuePath(issue.path)}` : \"\"}`,\n })),\n };\n }\n\n return {\n issues: [],\n entry: parsed.data as FeatureEntry,\n };\n}\n\nexport function validateManifest(data: unknown): ValidationResult {\n const errors: ValidationIssue[] = [];\n if (!Array.isArray(data)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Manifest must be an array\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n data.forEach((item, index) => {\n const result = validateFeatureEntry(item, index);\n errors.push(...result.issues);\n if (!result.entry) return;\n if (seenIds.has(result.entry.id)) {\n errors.push({\n path: `[${index}].id`,\n message: `Duplicate feature id \"${result.entry.id}\"`,\n code: \"duplicate_id\",\n });\n return;\n }\n seenIds.add(result.entry.id);\n entries.push(result.entry);\n });\n\n if (entries.length > 0 && hasDependencyCycle(entries as FeatureManifest)) {\n errors.push({\n path: \"$\",\n message: \"Circular dependsOn relationship detected\",\n code: \"circular_dependency\",\n });\n }\n\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index];\n if (new Date(entry.showNewUntil).getTime() <= new Date(entry.releasedAt).getTime()) {\n errors.push({\n path: `[${index}].showNewUntil`,\n message: \"showNewUntil must be after releasedAt\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.url && !isSafeUrl(entry.url)) {\n errors.push({\n path: `[${index}].url`,\n message: \"url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.image && !isSafeUrl(entry.image)) {\n errors.push({\n path: `[${index}].image`,\n message: \"image must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.cta?.url && !isSafeUrl(entry.cta.url)) {\n errors.push({\n path: `[${index}].cta.url`,\n message: \"cta.url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n const unsafeMetaPath = findUnsafeMetaPath(entry.meta);\n if (unsafeMetaPath) {\n errors.push({\n path: `[${index}].${unsafeMetaPath}`,\n message: `meta contains unsafe key \"${unsafeMetaPath.split(\".\").pop()}\"`,\n code: \"invalid_value\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { FeatureEntry } from \"./types\";\nimport { validateManifest } from \"./schema\";\n\ninterface ParseResult {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface BuildManifestOptions {\n cwd?: string;\n pattern?: string;\n outFile?: string;\n}\n\nfunction parseScalar(raw: string): unknown {\n const value = raw.trim();\n if (!value) return \"\";\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"null\") return null;\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n if (!inner) return [];\n return inner.split(\",\").map((part) => String(parseScalar(part.trim())));\n }\n return value;\n}\n\nfunction parseFrontmatter(raw: string): Record<string, unknown> {\n const lines = raw.split(/\\r?\\n/);\n const root: Record<string, unknown> = {};\n const stack: Array<{ indent: number; value: Record<string, unknown> | unknown[] }> = [\n { indent: -1, value: root },\n ];\n\n const isArrayContext = (idx: number): boolean => {\n for (let i = idx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n const indent = line.length - line.trimStart().length;\n if (indent <= (lines[idx].length - lines[idx].trimStart().length)) return false;\n return line.trimStart().startsWith(\"- \");\n }\n return false;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {\n stack.pop();\n }\n\n const current = stack[stack.length - 1].value;\n\n if (trimmed.startsWith(\"- \")) {\n if (!Array.isArray(current)) {\n throw new Error(`Invalid frontmatter list at line ${i + 1}`);\n }\n const item = trimmed.slice(2).trim();\n current.push(parseScalar(item));\n continue;\n }\n\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) {\n throw new Error(`Invalid frontmatter line ${i + 1}: ${trimmed}`);\n }\n\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n\n if (Array.isArray(current)) {\n throw new Error(`Unexpected key in list at line ${i + 1}`);\n }\n\n if (!rest) {\n const container: Record<string, unknown> | unknown[] = isArrayContext(i) ? [] : {};\n current[key] = container;\n stack.push({ indent, value: container });\n continue;\n }\n\n current[key] = parseScalar(rest);\n }\n\n return root;\n}\n\nfunction splitFrontmatter(markdown: string): ParseResult {\n const normalized = markdown.replace(/\\r\\n/g, \"\\n\");\n if (!normalized.startsWith(\"---\\n\")) {\n return { frontmatter: {}, body: normalized.trim() };\n }\n\n const end = normalized.indexOf(\"\\n---\\n\", 4);\n if (end === -1) {\n throw new Error(\"Frontmatter block is not closed with ---\");\n }\n\n const fmRaw = normalized.slice(4, end);\n const body = normalized.slice(end + 5).trim();\n return {\n frontmatter: parseFrontmatter(fmRaw),\n body,\n };\n}\n\nfunction asString(value: unknown, field: string, source: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${source}: \"${field}\" must be a non-empty string`);\n }\n return value;\n}\n\nfunction asOptionalObject(value: unknown, field: string, source: string): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${source}: \"${field}\" must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function parseFeatureFile(markdown: string, source = \"feature.md\"): FeatureEntry {\n const { frontmatter, body } = splitFrontmatter(markdown);\n\n const entry: FeatureEntry = {\n id: asString(frontmatter.id, \"id\", source),\n label: asString(frontmatter.label, \"label\", source),\n releasedAt: asString(frontmatter.releasedAt, \"releasedAt\", source),\n showNewUntil: asString(frontmatter.showNewUntil, \"showNewUntil\", source),\n description: body || undefined,\n };\n\n if (frontmatter.sidebarKey !== undefined) entry.sidebarKey = asString(frontmatter.sidebarKey, \"sidebarKey\", source);\n if (frontmatter.category !== undefined) entry.category = asString(frontmatter.category, \"category\", source);\n if (frontmatter.product !== undefined) entry.product = asString(frontmatter.product, \"product\", source);\n if (frontmatter.url !== undefined) entry.url = asString(frontmatter.url, \"url\", source);\n if (frontmatter.flagKey !== undefined) entry.flagKey = asString(frontmatter.flagKey, \"flagKey\", source);\n if (frontmatter.image !== undefined) entry.image = asString(frontmatter.image, \"image\", source);\n if (frontmatter.publishAt !== undefined) entry.publishAt = asString(frontmatter.publishAt, \"publishAt\", source);\n if (frontmatter.version !== undefined) {\n if (typeof frontmatter.version === \"string\" || typeof frontmatter.version === \"object\") {\n entry.version = frontmatter.version as FeatureEntry[\"version\"];\n } else {\n throw new Error(`${source}: \"version\" must be a string or object`);\n }\n }\n if (frontmatter.type !== undefined) {\n const type = asString(frontmatter.type, \"type\", source);\n if (![\"feature\", \"improvement\", \"fix\", \"breaking\"].includes(type)) {\n throw new Error(`${source}: invalid \"type\" value \"${type}\"`);\n }\n entry.type = type as FeatureEntry[\"type\"];\n }\n if (frontmatter.priority !== undefined) {\n const priority = asString(frontmatter.priority, \"priority\", source);\n if (![\"critical\", \"normal\", \"low\"].includes(priority)) {\n throw new Error(`${source}: invalid \"priority\" value \"${priority}\"`);\n }\n entry.priority = priority as FeatureEntry[\"priority\"];\n }\n\n const cta = asOptionalObject(frontmatter.cta, \"cta\", source);\n if (cta) {\n entry.cta = {\n label: asString(cta.label, \"cta.label\", source),\n url: asString(cta.url, \"cta.url\", source),\n };\n }\n\n const audience = asOptionalObject(frontmatter.audience, \"audience\", source);\n if (audience) {\n const parsedAudience: FeatureEntry[\"audience\"] = {};\n for (const field of [\"plan\", \"role\", \"region\"] as const) {\n const value = audience[field];\n if (value !== undefined) {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`${source}: \"audience.${field}\" must be string[]`);\n }\n parsedAudience[field] = value;\n }\n }\n if (audience.custom !== undefined) {\n if (!audience.custom || typeof audience.custom !== \"object\" || Array.isArray(audience.custom)) {\n throw new Error(`${source}: \"audience.custom\" must be an object`);\n }\n parsedAudience.custom = audience.custom as Record<string, unknown>;\n }\n entry.audience = parsedAudience;\n }\n\n return entry;\n}\n\nfunction normalizePattern(pattern: string): { baseDir: string; ext: string } {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\");\n if (normalized.endsWith(\"/**/*.md\")) {\n return {\n baseDir: normalized.slice(0, -\"/**/*.md\".length),\n ext: \".md\",\n };\n }\n throw new Error(`Unsupported pattern \"${pattern}\". Use \"features/**/*.md\" style patterns.`);\n}\n\nasync function collectFiles(dir: string, ext: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(current: string): Promise<void> {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(current, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(ext)) {\n out.push(fullPath);\n }\n }\n }\n await walk(dir);\n return out.sort();\n}\n\nexport async function buildManifestFromPattern(options: BuildManifestOptions = {}): Promise<FeatureEntry[]> {\n const cwd = options.cwd ?? process.cwd();\n const pattern = options.pattern ?? \"features/**/*.md\";\n const { baseDir, ext } = normalizePattern(pattern);\n const baseAbs = join(cwd, baseDir);\n\n const stats = await stat(baseAbs).catch(() => null);\n if (!stats || !stats.isDirectory()) {\n throw new Error(`Pattern base directory does not exist: ${baseDir}`);\n }\n\n const files = await collectFiles(baseAbs, ext);\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const source = relative(cwd, file).split(sep).join(\"/\");\n const entry = parseFeatureFile(content, source);\n if (seenIds.has(entry.id)) {\n throw new Error(`Duplicate feature id \"${entry.id}\" found at ${source}`);\n }\n seenIds.add(entry.id);\n entries.push(entry);\n }\n\n if (options.outFile) {\n const outPath = join(cwd, options.outFile);\n await writeFile(outPath, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n }\n\n return entries;\n}\n\nexport async function validateFeatureFiles(options: BuildManifestOptions = {}): Promise<void> {\n const entries = await buildManifestFromPattern(options);\n const result = validateManifest(entries);\n if (!result.valid) {\n const message = result.errors\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`Manifest validation failed: ${message}`);\n }\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry } from \"./types\";\n\nexport interface ManifestStats {\n total: number;\n byType: Record<string, number>;\n byCategory: Record<string, number>;\n newestRelease: string | null;\n oldestRelease: string | null;\n}\n\nexport function computeManifestStats(entries: FeatureEntry[]): ManifestStats {\n const byType: Record<string, number> = {};\n const byCategory: Record<string, number> = {};\n\n for (const entry of entries) {\n const type = entry.type ?? \"feature\";\n byType[type] = (byType[type] ?? 0) + 1;\n if (entry.category) {\n byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;\n }\n }\n\n const sortedByDate = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n\n return {\n total: entries.length,\n byType,\n byCategory,\n newestRelease: sortedByDate[0]?.releasedAt ?? null,\n oldestRelease: sortedByDate[sortedByDate.length - 1]?.releasedAt ?? null,\n };\n}\n\nexport function generateMarkdownChangelog(entries: FeatureEntry[]): string {\n const sorted = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n const sections = sorted.map((entry) => {\n const lines = [\n `## ${entry.label}`,\n \"\",\n `- **ID**: \\`${entry.id}\\``,\n `- **Released**: ${entry.releasedAt}`,\n ];\n if (entry.type) lines.push(`- **Type**: ${entry.type}`);\n if (entry.category) lines.push(`- **Category**: ${entry.category}`);\n if (entry.showNewUntil) lines.push(`- **Show new until**: ${entry.showNewUntil}`);\n if (entry.cta) lines.push(`- **CTA**: [${entry.cta.label}](${entry.cta.url})`);\n if (entry.description) {\n lines.push(\"\", entry.description.trim());\n }\n return lines.join(\"\\n\");\n });\n\n return `# Generated Changelog\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction isIsoWithTimezone(value: string): boolean {\n if (!value.includes(\"T\")) return false;\n if (!(value.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(value))) return false;\n return Number.isFinite(new Date(value).getTime());\n}\n\nexport interface DoctorReport {\n checks: string[];\n warnings: string[];\n errors: string[];\n}\n\nexport function runDoctor(entries: FeatureEntry[], now: Date = new Date()): DoctorReport {\n const checks: string[] = [];\n const warnings: string[] = [];\n const errors: string[] = [];\n\n checks.push(`Manifest entries loaded: ${entries.length}`);\n\n const ids = new Set<string>();\n let duplicateCount = 0;\n for (const entry of entries) {\n if (ids.has(entry.id)) duplicateCount += 1;\n ids.add(entry.id);\n }\n if (duplicateCount > 0) {\n errors.push(`${duplicateCount} duplicate feature id(s) found`);\n } else {\n checks.push(\"No duplicate IDs\");\n }\n\n let invalidDateCount = 0;\n let reversedDateCount = 0;\n let expiredCount = 0;\n let scheduledCount = 0;\n let missingDescriptionCount = 0;\n\n for (const entry of entries) {\n if (!entry.description?.trim()) missingDescriptionCount += 1;\n if (!isIsoWithTimezone(entry.releasedAt) || !isIsoWithTimezone(entry.showNewUntil)) {\n invalidDateCount += 1;\n continue;\n }\n const released = new Date(entry.releasedAt).getTime();\n const showUntil = new Date(entry.showNewUntil).getTime();\n if (showUntil <= released) reversedDateCount += 1;\n if (showUntil < now.getTime()) expiredCount += 1;\n if (entry.publishAt) {\n const publishMs = new Date(entry.publishAt).getTime();\n if (Number.isFinite(publishMs) && publishMs > now.getTime()) scheduledCount += 1;\n }\n }\n\n if (invalidDateCount > 0) {\n errors.push(`${invalidDateCount} entries have invalid ISO 8601 dates with timezone`);\n } else {\n checks.push(\"All dates are valid ISO 8601 with timezone\");\n }\n\n if (reversedDateCount > 0) {\n errors.push(`${reversedDateCount} entries have showNewUntil before/at releasedAt`);\n }\n\n if (expiredCount > 0) warnings.push(`${expiredCount} entries have showNewUntil in the past`);\n if (scheduledCount > 0) warnings.push(`${scheduledCount} entries have publishAt in the future`);\n\n if (missingDescriptionCount > 0) {\n errors.push(`${missingDescriptionCount} entries have no description`);\n } else {\n checks.push(\"All entries have descriptions\");\n }\n\n if (hasDependencyCycle(entries)) {\n errors.push(\"Circular dependsOn relationship detected\");\n } else {\n checks.push(\"No circular dependencies in dependsOn chains\");\n }\n\n return { checks, warnings, errors };\n}\n","import { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { buildManifestFromPattern } from \"./changelog-as-code\";\nimport { validateManifest } from \"./schema\";\nimport type { FeatureEntry, FeatureType } from \"./types\";\n\nexport type InitFormat = \"markdown\" | \"json\";\n\nexport interface InitProjectOptions {\n cwd?: string;\n format?: InitFormat;\n force?: boolean;\n now?: Date;\n}\n\nexport interface InitProjectResult {\n format: InitFormat;\n created: string[];\n}\n\nexport interface AddFeatureOptions {\n cwd?: string;\n format?: InitFormat;\n id?: string;\n label: string;\n description?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nexport interface AddFeatureResult {\n format: InitFormat;\n path: string;\n entry: FeatureEntry;\n}\n\nexport interface MigrateOptions {\n cwd?: string;\n from: MigrationSource;\n inputFile: string;\n outFile?: string;\n now?: Date;\n}\n\nexport type MigrationSource =\n | \"beamer\"\n | \"headway\"\n | \"announcekit\"\n | \"canny\"\n | \"launchnotes\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n const result = await stat(path).catch(() => null);\n return !!result;\n}\n\nfunction ensureIsoDate(value: string, field: string): string {\n const parsed = new Date(value).getTime();\n if (!Number.isFinite(parsed)) {\n throw new Error(`\"${field}\" must be a valid ISO date string`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction withDays(date: Date, days: number): string {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\nfunction toSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nfunction getPathDate(dateIso: string): string {\n return dateIso.slice(0, 10);\n}\n\nfunction getFrontmatterValue(value: string): string {\n return value.replace(/\\n/g, \" \").trim();\n}\n\nexport function slugifyFeatureId(label: string): string {\n const slug = toSlug(label);\n return slug || \"feature\";\n}\n\nexport function createFeatureEntry(options: AddFeatureOptions, now: Date = new Date()): FeatureEntry {\n const releasedAt = options.releasedAt\n ? ensureIsoDate(options.releasedAt, \"releasedAt\")\n : now.toISOString();\n const showNewUntil = options.showNewUntil\n ? ensureIsoDate(options.showNewUntil, \"showNewUntil\")\n : withDays(new Date(releasedAt), options.showDays ?? 14);\n const id = options.id ? slugifyFeatureId(options.id) : slugifyFeatureId(options.label);\n\n const entry: FeatureEntry = {\n id,\n label: options.label.trim(),\n releasedAt,\n showNewUntil,\n type: options.type ?? \"feature\",\n };\n\n if (options.description?.trim()) entry.description = options.description.trim();\n if (options.category?.trim()) entry.category = options.category.trim();\n if (options.url?.trim()) entry.url = options.url.trim();\n\n return entry;\n}\n\nexport function renderFeatureMarkdown(entry: FeatureEntry): string {\n const lines = [\n \"---\",\n `id: ${getFrontmatterValue(entry.id)}`,\n `label: ${getFrontmatterValue(entry.label)}`,\n `releasedAt: ${entry.releasedAt}`,\n `showNewUntil: ${entry.showNewUntil}`,\n ];\n if (entry.type) lines.push(`type: ${entry.type}`);\n if (entry.category) lines.push(`category: ${getFrontmatterValue(entry.category)}`);\n if (entry.url) lines.push(`url: ${getFrontmatterValue(entry.url)}`);\n lines.push(\"---\", \"\");\n if (entry.description) {\n lines.push(entry.description.trim(), \"\");\n } else {\n lines.push(\"Describe the feature here.\", \"\");\n }\n return `${lines.join(\"\\n\")}`;\n}\n\nfunction getNextAvailablePath(existingNames: ReadonlySet<string>, baseName: string): string {\n if (!existingNames.has(baseName)) return baseName;\n const ext = baseName.endsWith(\".md\") ? \".md\" : \"\";\n const withoutExt = ext ? baseName.slice(0, -ext.length) : baseName;\n let index = 2;\n while (existingNames.has(`${withoutExt}-${index}${ext}`)) {\n index += 1;\n }\n return `${withoutExt}-${index}${ext}`;\n}\n\nasync function detectProjectFormat(cwd: string, explicit?: InitFormat): Promise<InitFormat> {\n if (explicit) return explicit;\n if (await pathExists(join(cwd, \"features\"))) return \"markdown\";\n if (await pathExists(join(cwd, \"features.json\"))) return \"json\";\n return \"markdown\";\n}\n\nexport async function initFeaturedropProject(options: InitProjectOptions = {}): Promise<InitProjectResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = options.format ?? \"markdown\";\n const now = options.now ?? new Date();\n const force = options.force ?? false;\n const created: string[] = [];\n\n if (format === \"markdown\") {\n const featuresDir = join(cwd, \"features\");\n if (await pathExists(featuresDir)) {\n const existing = await readdir(featuresDir).catch(() => []);\n if (existing.length > 0 && !force) {\n throw new Error(\"features/ already exists and is not empty (use --force to overwrite sample files)\");\n }\n }\n await mkdir(featuresDir, { recursive: true });\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Update this file with your first product announcement.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n const sampleName = `${getPathDate(sample.releasedAt)}-${sample.id}.md`;\n const samplePath = join(featuresDir, sampleName);\n await writeFile(samplePath, renderFeatureMarkdown(sample), \"utf8\");\n created.push(\"features/\");\n created.push(`features/${sampleName}`);\n return { format, created };\n }\n\n const manifestPath = join(cwd, \"features.json\");\n if (await pathExists(manifestPath)) {\n if (!force) {\n throw new Error(\"features.json already exists (use --force to overwrite)\");\n }\n }\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Replace this sample entry with your own release notes.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n await writeFile(manifestPath, `${JSON.stringify([sample], null, 2)}\\n`, \"utf8\");\n created.push(\"features.json\");\n return { format, created };\n}\n\nasync function ensureUniqueIdForMarkdown(cwd: string, id: string): Promise<void> {\n const featuresDir = join(cwd, \"features\");\n if (!(await pathExists(featuresDir))) return;\n const entries = await buildManifestFromPattern({ cwd, pattern: \"features/**/*.md\" }).catch(() => []);\n if (entries.some((entry) => entry.id === id)) {\n throw new Error(`Feature id \"${id}\" already exists`);\n }\n}\n\nasync function addFeatureToMarkdown(cwd: string, entry: FeatureEntry): Promise<string> {\n await mkdir(join(cwd, \"features\"), { recursive: true });\n await ensureUniqueIdForMarkdown(cwd, entry.id);\n const existingFiles = new Set(\n (await readdir(join(cwd, \"features\")).catch(() => []))\n .filter((name) => name.endsWith(\".md\")),\n );\n const baseName = `${getPathDate(entry.releasedAt)}-${entry.id}.md`;\n const fileName = getNextAvailablePath(existingFiles, baseName);\n const relPath = `features/${fileName}`;\n await writeFile(join(cwd, relPath), renderFeatureMarkdown(entry), \"utf8\");\n return relPath;\n}\n\nasync function addFeatureToJson(cwd: string, entry: FeatureEntry): Promise<string> {\n const manifestPath = join(cwd, \"features.json\");\n const raw = await readFile(manifestPath, \"utf8\").catch(() => \"[]\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"features.json is not valid JSON\");\n }\n if (!Array.isArray(parsed)) {\n throw new Error(\"features.json must contain an array of feature entries\");\n }\n const existing = parsed as FeatureEntry[];\n if (existing.some((item) => item.id === entry.id)) {\n throw new Error(`Feature id \"${entry.id}\" already exists`);\n }\n const next = [...existing, entry];\n const validation = validateManifest(next);\n if (!validation.valid) {\n throw new Error(`features.json validation failed: ${validation.errors[0]?.message ?? \"unknown error\"}`);\n }\n await writeFile(manifestPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return \"features.json\";\n}\n\nexport async function addFeatureEntry(options: AddFeatureOptions): Promise<AddFeatureResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = await detectProjectFormat(cwd, options.format);\n const entry = createFeatureEntry(options);\n const path = format === \"markdown\"\n ? await addFeatureToMarkdown(cwd, entry)\n : await addFeatureToJson(cwd, entry);\n return { format, path, entry };\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction getMigrationItems(payload: unknown): unknown[] {\n if (Array.isArray(payload)) return payload;\n if (!isRecord(payload)) throw new Error(\"Migration payload must be an array or object\");\n for (const key of [\"posts\", \"items\", \"announcements\", \"entries\"] as const) {\n const value = payload[key];\n if (Array.isArray(value)) return value;\n }\n throw new Error(\"Could not find entries array in migration payload\");\n}\n\nfunction normalizeDate(raw: string | undefined, fallback: Date): string {\n if (!raw) return fallback.toISOString();\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return fallback.toISOString();\n return new Date(parsed).toISOString();\n}\n\nfunction buildFallbackId(prefix: string, index: number): string {\n return `${prefix}-entry-${index + 1}`;\n}\n\ninterface MigrationProfile {\n fallbackPrefix: string;\n labelKeys: readonly string[];\n idKeys: readonly string[];\n dateKeys: readonly string[];\n categoryKeys: readonly string[];\n urlKeys: readonly string[];\n descriptionKeys: readonly string[];\n showUntilKeys: readonly string[];\n}\n\nconst MIGRATION_PROFILES: Record<MigrationSource, MigrationProfile> = {\n beamer: {\n fallbackPrefix: \"beamer\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"uid\", \"slug\", \"postId\", \"post_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"published\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"segment\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"body\", \"html\"],\n showUntilKeys: [\"showNewUntil\", \"show_new_until\", \"newUntil\", \"new_until\"],\n },\n headway: {\n fallbackPrefix: \"headway\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"slug\", \"entryId\", \"entry_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"tag\", \"tags\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"summary\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n announcekit: {\n fallbackPrefix: \"announcekit\",\n labelKeys: [\"title\", \"subject\", \"name\"],\n idKeys: [\"id\", \"post_id\", \"postId\", \"slug\"],\n dateKeys: [\"published_at\", \"publishedAt\", \"created_at\", \"createdAt\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"tab\", \"label\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"html\", \"body\"],\n showUntilKeys: [\"show_new_until\", \"showNewUntil\", \"new_until\"],\n },\n canny: {\n fallbackPrefix: \"canny\",\n labelKeys: [\"title\", \"name\"],\n idKeys: [\"id\", \"postId\", \"post_id\", \"slug\"],\n dateKeys: [\"createdAt\", \"created_at\", \"publishedAt\", \"published_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"boardName\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"details\", \"description\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n launchnotes: {\n fallbackPrefix: \"launchnotes\",\n labelKeys: [\"title\", \"headline\", \"name\"],\n idKeys: [\"id\", \"slug\", \"noteId\", \"note_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"channel\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"body\", \"content\", \"summary\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n};\n\nexport function migrateFromSourcePayload(\n source: MigrationSource,\n payload: unknown,\n now: Date = new Date(),\n): FeatureEntry[] {\n const profile = MIGRATION_PROFILES[source];\n const items = getMigrationItems(payload);\n const usedIds = new Set<string>();\n\n return items\n .map((raw, index) => {\n if (!isRecord(raw)) return null;\n const release = normalizeDate(\n pickString(raw, profile.dateKeys),\n now,\n );\n const label = pickString(raw, profile.labelKeys) ?? `Update ${index + 1}`;\n const idSeed = pickString(raw, profile.idKeys) ?? label;\n let id = slugifyFeatureId(idSeed);\n if (!id) id = buildFallbackId(profile.fallbackPrefix, index);\n while (usedIds.has(id)) {\n id = `${id}-${index + 1}`;\n }\n usedIds.add(id);\n\n const category = pickString(raw, profile.categoryKeys);\n const url = pickString(raw, profile.urlKeys);\n const description = pickString(raw, profile.descriptionKeys);\n const explicitShowUntil = normalizeDate(\n pickString(raw, profile.showUntilKeys),\n new Date(withDays(new Date(release), 30)),\n );\n\n const entry: FeatureEntry = {\n id,\n label,\n releasedAt: release,\n showNewUntil: explicitShowUntil,\n type: \"feature\",\n };\n if (description) entry.description = description;\n if (category) entry.category = category;\n if (url) entry.url = url;\n return entry;\n })\n .filter((value): value is FeatureEntry => !!value);\n}\n\nexport function migrateFromBeamerPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"beamer\", payload, now);\n}\n\nexport function migrateFromHeadwayPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"headway\", payload, now);\n}\n\nexport function migrateFromAnnounceKitPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"announcekit\", payload, now);\n}\n\nexport function migrateFromCannyPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"canny\", payload, now);\n}\n\nexport function migrateFromLaunchNotesPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"launchnotes\", payload, now);\n}\n\nexport async function migrateManifest(options: MigrateOptions): Promise<{ outFile: string; entries: FeatureEntry[] }> {\n const cwd = options.cwd ?? process.cwd();\n const outFile = options.outFile ?? \"featuredrop.manifest.json\";\n const inputPath = join(cwd, options.inputFile);\n const raw = await readFile(inputPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n\n const entries = migrateFromSourcePayload(options.from, payload, options.now ?? new Date());\n await writeFile(join(cwd, outFile), `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n return { outFile: basename(outFile), entries };\n}\n","import * as moduleApi from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire =\n typeof moduleApi.createRequire === \"function\" ? moduleApi.createRequire(import.meta.url) : null;\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n if (!dynamicRequire) return null;\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/&lt;(\\/?)([a-z0-9]+)([^>]*)&gt;/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: ![alt](url)\n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import type { FeatureManifest } from \"./types\";\nimport { parseDescription } from \"./markdown\";\n\nfunction escape(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Generate a simple RSS 2.0 feed from a feature manifest.\n * Titles and descriptions are sanitized via `parseDescription`.\n */\nexport function generateRSS(manifest: FeatureManifest, options?: { title?: string; link?: string; description?: string }): string {\n const title = escape(options?.title ?? \"Featuredrop Changelog\");\n const link = escape(options?.link ?? \"\");\n const desc = escape(options?.description ?? \"Product updates\");\n\n const items = manifest\n .slice()\n .sort((a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime())\n .map((item) => {\n const descriptionHtml = item.description ? parseDescription(item.description) : \"\";\n const itemLink = item.url ? escape(item.url) : \"\";\n return [\n \"<item>\",\n `<title>${escape(item.label)}</title>`,\n itemLink ? `<link>${itemLink}</link>` : \"\",\n `<guid isPermaLink=\\\"false\\\">${escape(item.id)}</guid>`,\n `<pubDate>${new Date(item.releasedAt).toUTCString()}</pubDate>`,\n `<description><![CDATA[${descriptionHtml}]]></description>`,\n \"</item>\",\n ].join(\"\");\n })\n .join(\"\");\n\n return [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<rss version=\\\"2.0\\\">\",\n \"<channel>\",\n `<title>${title}</title>`,\n link ? `<link>${link}</link>` : \"\",\n `<description>${desc}</description>`,\n items,\n \"</channel>\",\n \"</rss>\",\n ].join(\"\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { buildManifestFromPattern, validateFeatureFiles } from \"./changelog-as-code\";\nimport {\n computeManifestStats,\n generateMarkdownChangelog,\n runDoctor,\n} from \"./cli-utils\";\nimport {\n addFeatureEntry,\n initFeaturedropProject,\n migrateManifest,\n type InitFormat,\n type MigrationSource,\n} from \"./cli-scaffold\";\nimport { generateRSS } from \"./rss\";\nimport type { FeatureType } from \"./types\";\n\ninterface ParsedArgs {\n command:\n | \"init\"\n | \"add\"\n | \"migrate\"\n | \"build\"\n | \"validate\"\n | \"stats\"\n | \"doctor\"\n | \"generate-rss\"\n | \"generate-changelog\"\n | \"help\";\n pattern?: string;\n outFile?: string;\n inputFile?: string;\n cwd?: string;\n title?: string;\n link?: string;\n description?: string;\n from?: MigrationSource;\n format?: InitFormat;\n force?: boolean;\n id?: string;\n label?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const [commandRaw, ...rest] = argv;\n const allowed = new Set([\n \"init\",\n \"add\",\n \"migrate\",\n \"build\",\n \"validate\",\n \"stats\",\n \"doctor\",\n \"generate-rss\",\n \"generate-changelog\",\n ]);\n const command = allowed.has(commandRaw) ? (commandRaw as ParsedArgs[\"command\"]) : \"help\";\n const parsed: ParsedArgs = { command };\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--pattern\") parsed.pattern = rest[++i];\n else if (arg === \"--out\") parsed.outFile = rest[++i];\n else if (arg === \"--cwd\") parsed.cwd = rest[++i];\n else if (arg === \"--title\") parsed.title = rest[++i];\n else if (arg === \"--link\") parsed.link = rest[++i];\n else if (arg === \"--description\") parsed.description = rest[++i];\n else if (arg === \"--input\") parsed.inputFile = rest[++i];\n else if (arg === \"--from\") parsed.from = rest[++i] as MigrationSource;\n else if (arg === \"--format\") parsed.format = rest[++i] as InitFormat;\n else if (arg === \"--force\") parsed.force = true;\n else if (arg === \"--id\") parsed.id = rest[++i];\n else if (arg === \"--label\") parsed.label = rest[++i];\n else if (arg === \"--type\") parsed.type = rest[++i] as FeatureType;\n else if (arg === \"--category\") parsed.category = rest[++i];\n else if (arg === \"--url\") parsed.url = rest[++i];\n else if (arg === \"--releasedAt\") parsed.releasedAt = rest[++i];\n else if (arg === \"--showNewUntil\") parsed.showNewUntil = rest[++i];\n else if (arg === \"--show-days\") parsed.showDays = Number(rest[++i]);\n }\n return parsed;\n}\n\nfunction printHelp(): void {\n console.log(\"featuredrop CLI\");\n console.log(\"\");\n console.log(\"Usage:\");\n console.log(\" featuredrop init [--format markdown|json] [--force] [--cwd .]\");\n console.log(\" featuredrop add [--label ...] [--id ...] [--description ...] [--type feature|improvement|fix|breaking] [--category ...] [--url ...] [--releasedAt ...] [--showNewUntil ...] [--show-days 14] [--format markdown|json] [--cwd .]\");\n console.log(\" featuredrop migrate --from beamer|headway|announcekit|canny|launchnotes [--input export.json] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop build [--pattern features/**/*.md] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop validate [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop stats [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop doctor [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop generate-rss [--pattern features/**/*.md] [--out featuredrop.rss.xml] [--title ...] [--link ...] [--description ...] [--cwd .]\");\n console.log(\" featuredrop generate-changelog [--pattern features/**/*.md] [--out CHANGELOG.generated.md] [--cwd .]\");\n}\n\nasync function promptForLabelIfNeeded(label?: string): Promise<string> {\n if (label?.trim()) return label.trim();\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"Missing --label. Provide --label in non-interactive mode.\");\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = (await rl.question(\"Feature label: \")).trim();\n if (!value) throw new Error(\"Feature label is required\");\n return value;\n } finally {\n rl.close();\n }\n}\n\nasync function run(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.command === \"help\") {\n printHelp();\n process.exitCode = 1;\n return;\n }\n\n try {\n if (args.command === \"init\") {\n const result = await initFeaturedropProject({\n cwd: args.cwd,\n format: args.format,\n force: args.force,\n });\n console.log(`Initialized featuredrop project (${result.format})`);\n for (const path of result.created) {\n console.log(`- ${path}`);\n }\n return;\n }\n\n if (args.command === \"add\") {\n const label = await promptForLabelIfNeeded(args.label);\n const result = await addFeatureEntry({\n cwd: args.cwd,\n format: args.format,\n id: args.id,\n label,\n description: args.description,\n type: args.type,\n category: args.category,\n url: args.url,\n releasedAt: args.releasedAt,\n showNewUntil: args.showNewUntil,\n showDays: args.showDays,\n });\n console.log(`Added feature \"${result.entry.id}\" -> ${result.path}`);\n return;\n }\n\n if (args.command === \"migrate\") {\n const from = args.from;\n if (!from) {\n throw new Error('Missing required \"--from\" (beamer|headway|announcekit|canny|launchnotes)');\n }\n const inputFile = args.inputFile ?? `${from}-export.json`;\n const result = await migrateManifest({\n cwd: args.cwd,\n from,\n inputFile,\n outFile: args.outFile,\n });\n console.log(`Migrated ${result.entries.length} entries from ${from} -> ${result.outFile}`);\n return;\n }\n\n if (args.command === \"build\") {\n const out = args.outFile ?? \"featuredrop.manifest.json\";\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n outFile: out,\n cwd: args.cwd,\n });\n console.log(`Built ${entries.length} feature entries -> ${out}`);\n return;\n }\n\n if (args.command === \"validate\") {\n await validateFeatureFiles({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n console.log(\"Feature files valid\");\n return;\n }\n\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n\n if (args.command === \"stats\") {\n const stats = computeManifestStats(entries);\n console.log(`Total entries: ${stats.total}`);\n console.log(`By type: ${Object.entries(stats.byType).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n console.log(`By category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n if (stats.newestRelease) console.log(`Newest release: ${stats.newestRelease}`);\n if (stats.oldestRelease) console.log(`Oldest release: ${stats.oldestRelease}`);\n return;\n }\n\n if (args.command === \"doctor\") {\n const report = runDoctor(entries);\n for (const check of report.checks) console.log(`✓ ${check}`);\n for (const warning of report.warnings) console.log(`⚠ ${warning}`);\n for (const error of report.errors) console.log(`✗ ${error}`);\n console.log(\"\");\n console.log(`${report.warnings.length} warning(s), ${report.errors.length} error(s).`);\n if (report.errors.length > 0) process.exitCode = 1;\n return;\n }\n\n if (args.command === \"generate-rss\") {\n const out = args.outFile ?? \"featuredrop.rss.xml\";\n const xml = generateRSS(entries, {\n title: args.title,\n link: args.link,\n description: args.description,\n });\n await writeFile(join(args.cwd ?? process.cwd(), out), `${xml}\\n`, \"utf8\");\n console.log(`Generated RSS feed -> ${out}`);\n return;\n }\n\n if (args.command === \"generate-changelog\") {\n const out = args.outFile ?? \"CHANGELOG.generated.md\";\n const markdown = generateMarkdownChangelog(entries);\n await writeFile(join(args.cwd ?? process.cwd(), out), markdown, \"utf8\");\n console.log(`Generated markdown changelog -> ${out}`);\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`featuredrop: ${message}`);\n process.exitCode = 1;\n }\n}\n\nvoid run();\n"]}
1
+ {"version":3,"sources":["../src/dependencies.ts","../src/schema.ts","../src/changelog-as-code.ts","../src/posthog-client.ts","../src/cli-utils.ts","../src/cli-scaffold.ts","../src/markdown.ts","../src/rss.ts","../src/cli.ts"],"names":["z","readdir","join","stat","readFile","relative","sep","writeFile","PostHog","isRecord","mkdir","sample","basename","moduleApi","sanitized","decoded","createInterface","hostname","entries"],"mappings":"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","file":"featuredrop.cjs","sourcesContent":["import type { FeatureEntry, FeatureManifest } from \"./types\";\n\nfunction getDirectDependencies(feature: FeatureEntry): string[] {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return [];\n const seen = dependsOn.seen ?? [];\n const clicked = dependsOn.clicked ?? [];\n const dismissed = dependsOn.dismissed ?? [];\n const unique = new Set<string>();\n for (const id of [...seen, ...clicked, ...dismissed]) {\n if (id) unique.add(id);\n }\n return Array.from(unique);\n}\n\nexport function resolveDependencyOrder(manifest: FeatureManifest): string[] {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n ordered.push(id);\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n // On cycles, append remaining IDs in original order to keep behavior stable.\n if (ordered.length < manifest.length) {\n const included = new Set(ordered);\n for (const feature of manifest) {\n if (included.has(feature.id)) continue;\n ordered.push(feature.id);\n }\n }\n\n return ordered;\n}\n\nexport function hasDependencyCycle(manifest: FeatureManifest): boolean {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n visited += 1;\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n return visited !== manifest.length;\n}\n\nexport function sortFeaturesByDependencies(features: FeatureEntry[]): FeatureEntry[] {\n if (features.length <= 1) return [...features];\n const order = resolveDependencyOrder(features);\n const rank = new Map(order.map((id, index) => [id, index]));\n return [...features].sort((a, b) => {\n const ra = rank.get(a.id);\n const rb = rank.get(b.id);\n if (ra === undefined || rb === undefined) return 0;\n return ra - rb;\n });\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry, FeatureManifest } from \"./types\";\nimport { z } from \"zod\";\n\nexport interface ValidationIssue {\n path: string;\n message: string;\n code:\n | \"invalid_type\"\n | \"missing_required\"\n | \"invalid_value\"\n | \"invalid_date\"\n | \"duplicate_id\"\n | \"circular_dependency\";\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationIssue[];\n}\n\nexport const featureEntryJsonSchema = {\n type: \"object\",\n required: [\"id\", \"label\", \"releasedAt\", \"showNewUntil\"],\n properties: {\n id: { type: \"string\" },\n label: { type: \"string\" },\n description: { type: \"string\" },\n releasedAt: { type: \"string\", format: \"date-time\" },\n showNewUntil: { type: \"string\", format: \"date-time\" },\n flagKey: { type: \"string\" },\n product: { type: \"string\" },\n url: { type: \"string\" },\n image: { type: \"string\" },\n type: { enum: [\"feature\", \"improvement\", \"fix\", \"breaking\"] },\n priority: { enum: [\"critical\", \"normal\", \"low\"] },\n cta: {\n type: \"object\",\n properties: {\n label: { type: \"string\" },\n url: { type: \"string\" },\n },\n },\n meta: { type: \"object\" },\n },\n} as const;\n\nexport const featureManifestJsonSchema = {\n type: \"array\",\n items: featureEntryJsonSchema,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidDate(value: string): boolean {\n return Number.isFinite(new Date(value).getTime());\n}\n\nconst nonEmptyString = z.string().trim().min(1, \"must be a non-empty string\");\n\nconst isoDateString = nonEmptyString.refine(isValidDate, {\n message: \"must be a valid date\",\n params: { featuredropCode: \"invalid_date\" },\n});\n\nconst dependsOnSchema = z\n .object({\n seen: z.array(z.string()).optional(),\n clicked: z.array(z.string()).optional(),\n dismissed: z.array(z.string()).optional(),\n })\n .optional();\n\nconst ctaSchema = z\n .object({\n label: nonEmptyString,\n url: nonEmptyString,\n })\n .optional();\n\nexport const featureEntrySchema = z\n .object({\n id: nonEmptyString,\n label: nonEmptyString,\n releasedAt: isoDateString,\n showNewUntil: isoDateString,\n description: z.string().optional(),\n flagKey: z.string().optional(),\n product: z.string().optional(),\n url: z.string().optional(),\n image: z.string().optional(),\n type: z.enum([\"feature\", \"improvement\", \"fix\", \"breaking\"]).optional(),\n priority: z.enum([\"critical\", \"normal\", \"low\"]).optional(),\n cta: ctaSchema,\n meta: z.record(z.unknown()).optional(),\n dependsOn: dependsOnSchema,\n })\n .passthrough();\n\nexport const featureManifestSchema = z.array(featureEntrySchema);\n\nfunction toIssuePath(path: Array<string | number>): string {\n if (path.length === 0) return \"$\";\n let output = \"\";\n for (const part of path) {\n if (typeof part === \"number\") output += `[${part}]`;\n else output += output ? `.${part}` : part;\n }\n return output;\n}\n\nfunction mapZodIssue(issue: z.ZodIssue): ValidationIssue {\n const codeParam = (issue as { params?: Record<string, unknown> }).params?.featuredropCode;\n if (codeParam === \"invalid_date\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_date\",\n };\n }\n if (issue.code === \"invalid_type\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: issue.received === \"undefined\" ? \"missing_required\" : \"invalid_type\",\n };\n }\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_value\",\n };\n}\n\nconst UNSAFE_META_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isSafeUrl(value: string): boolean {\n const normalized = value.trim();\n if (!normalized) return false;\n if (/^(\\/|\\.\\/|\\.\\.\\/|\\?|#)/.test(normalized)) return true;\n if (/^https?:\\/\\//i.test(normalized)) return true;\n return false;\n}\n\nfunction findUnsafeMetaPath(value: unknown, path = \"meta\"): string | null {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index++) {\n const nested = findUnsafeMetaPath(value[index], `${path}[${index}]`);\n if (nested) return nested;\n }\n return null;\n }\n\n if (!isRecord(value)) return null;\n for (const [key, nestedValue] of Object.entries(value)) {\n if (UNSAFE_META_KEYS.has(key)) {\n return `${path}.${key}`;\n }\n const nested = findUnsafeMetaPath(nestedValue, `${path}.${key}`);\n if (nested) return nested;\n }\n return null;\n}\n\nfunction validateFeatureEntry(raw: unknown, index: number): { entry?: FeatureEntry; issues: ValidationIssue[] } {\n if (!isRecord(raw)) {\n return {\n issues: [\n {\n path: `[${index}]`,\n message: \"Feature entry must be an object\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const parsed = featureEntrySchema.safeParse(raw);\n if (!parsed.success) {\n return {\n issues: parsed.error.issues.map((issue) => ({\n ...mapZodIssue(issue),\n path: `[${index}]${issue.path.length > 0 ? `.${toIssuePath(issue.path)}` : \"\"}`,\n })),\n };\n }\n\n return {\n issues: [],\n entry: parsed.data as FeatureEntry,\n };\n}\n\nexport function validateManifest(data: unknown): ValidationResult {\n const errors: ValidationIssue[] = [];\n if (!Array.isArray(data)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Manifest must be an array\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n data.forEach((item, index) => {\n const result = validateFeatureEntry(item, index);\n errors.push(...result.issues);\n if (!result.entry) return;\n if (seenIds.has(result.entry.id)) {\n errors.push({\n path: `[${index}].id`,\n message: `Duplicate feature id \"${result.entry.id}\"`,\n code: \"duplicate_id\",\n });\n return;\n }\n seenIds.add(result.entry.id);\n entries.push(result.entry);\n });\n\n if (entries.length > 0 && hasDependencyCycle(entries as FeatureManifest)) {\n errors.push({\n path: \"$\",\n message: \"Circular dependsOn relationship detected\",\n code: \"circular_dependency\",\n });\n }\n\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index];\n if (new Date(entry.showNewUntil).getTime() <= new Date(entry.releasedAt).getTime()) {\n errors.push({\n path: `[${index}].showNewUntil`,\n message: \"showNewUntil must be after releasedAt\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.url && !isSafeUrl(entry.url)) {\n errors.push({\n path: `[${index}].url`,\n message: \"url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.image && !isSafeUrl(entry.image)) {\n errors.push({\n path: `[${index}].image`,\n message: \"image must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.cta?.url && !isSafeUrl(entry.cta.url)) {\n errors.push({\n path: `[${index}].cta.url`,\n message: \"cta.url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n const unsafeMetaPath = findUnsafeMetaPath(entry.meta);\n if (unsafeMetaPath) {\n errors.push({\n path: `[${index}].${unsafeMetaPath}`,\n message: `meta contains unsafe key \"${unsafeMetaPath.split(\".\").pop()}\"`,\n code: \"invalid_value\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { FeatureEntry } from \"./types\";\nimport { validateManifest } from \"./schema\";\n\ninterface ParseResult {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface BuildManifestOptions {\n cwd?: string;\n pattern?: string;\n outFile?: string;\n}\n\nfunction parseScalar(raw: string): unknown {\n const value = raw.trim();\n if (!value) return \"\";\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"null\") return null;\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n if (!inner) return [];\n return inner.split(\",\").map((part) => String(parseScalar(part.trim())));\n }\n return value;\n}\n\nfunction parseFrontmatter(raw: string): Record<string, unknown> {\n const lines = raw.split(/\\r?\\n/);\n const root: Record<string, unknown> = {};\n const stack: Array<{ indent: number; value: Record<string, unknown> | unknown[] }> = [\n { indent: -1, value: root },\n ];\n\n const isArrayContext = (idx: number): boolean => {\n for (let i = idx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n const indent = line.length - line.trimStart().length;\n if (indent <= (lines[idx].length - lines[idx].trimStart().length)) return false;\n return line.trimStart().startsWith(\"- \");\n }\n return false;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {\n stack.pop();\n }\n\n const current = stack[stack.length - 1].value;\n\n if (trimmed.startsWith(\"- \")) {\n if (!Array.isArray(current)) {\n throw new Error(`Invalid frontmatter list at line ${i + 1}`);\n }\n const item = trimmed.slice(2).trim();\n current.push(parseScalar(item));\n continue;\n }\n\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) {\n throw new Error(`Invalid frontmatter line ${i + 1}: ${trimmed}`);\n }\n\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n\n if (Array.isArray(current)) {\n throw new Error(`Unexpected key in list at line ${i + 1}`);\n }\n\n if (!rest) {\n const container: Record<string, unknown> | unknown[] = isArrayContext(i) ? [] : {};\n current[key] = container;\n stack.push({ indent, value: container });\n continue;\n }\n\n current[key] = parseScalar(rest);\n }\n\n return root;\n}\n\nfunction splitFrontmatter(markdown: string): ParseResult {\n const normalized = markdown.replace(/\\r\\n/g, \"\\n\");\n if (!normalized.startsWith(\"---\\n\")) {\n return { frontmatter: {}, body: normalized.trim() };\n }\n\n const end = normalized.indexOf(\"\\n---\\n\", 4);\n if (end === -1) {\n throw new Error(\"Frontmatter block is not closed with ---\");\n }\n\n const fmRaw = normalized.slice(4, end);\n const body = normalized.slice(end + 5).trim();\n return {\n frontmatter: parseFrontmatter(fmRaw),\n body,\n };\n}\n\nfunction asString(value: unknown, field: string, source: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${source}: \"${field}\" must be a non-empty string`);\n }\n return value;\n}\n\nfunction asOptionalObject(value: unknown, field: string, source: string): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${source}: \"${field}\" must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function parseFeatureFile(markdown: string, source = \"feature.md\"): FeatureEntry {\n const { frontmatter, body } = splitFrontmatter(markdown);\n\n const entry: FeatureEntry = {\n id: asString(frontmatter.id, \"id\", source),\n label: asString(frontmatter.label, \"label\", source),\n releasedAt: asString(frontmatter.releasedAt, \"releasedAt\", source),\n showNewUntil: asString(frontmatter.showNewUntil, \"showNewUntil\", source),\n description: body || undefined,\n };\n\n if (frontmatter.sidebarKey !== undefined) entry.sidebarKey = asString(frontmatter.sidebarKey, \"sidebarKey\", source);\n if (frontmatter.category !== undefined) entry.category = asString(frontmatter.category, \"category\", source);\n if (frontmatter.product !== undefined) entry.product = asString(frontmatter.product, \"product\", source);\n if (frontmatter.url !== undefined) entry.url = asString(frontmatter.url, \"url\", source);\n if (frontmatter.flagKey !== undefined) entry.flagKey = asString(frontmatter.flagKey, \"flagKey\", source);\n if (frontmatter.image !== undefined) entry.image = asString(frontmatter.image, \"image\", source);\n if (frontmatter.publishAt !== undefined) entry.publishAt = asString(frontmatter.publishAt, \"publishAt\", source);\n if (frontmatter.version !== undefined) {\n if (typeof frontmatter.version === \"string\" || typeof frontmatter.version === \"object\") {\n entry.version = frontmatter.version as FeatureEntry[\"version\"];\n } else {\n throw new Error(`${source}: \"version\" must be a string or object`);\n }\n }\n if (frontmatter.type !== undefined) {\n const type = asString(frontmatter.type, \"type\", source);\n if (![\"feature\", \"improvement\", \"fix\", \"breaking\"].includes(type)) {\n throw new Error(`${source}: invalid \"type\" value \"${type}\"`);\n }\n entry.type = type as FeatureEntry[\"type\"];\n }\n if (frontmatter.priority !== undefined) {\n const priority = asString(frontmatter.priority, \"priority\", source);\n if (![\"critical\", \"normal\", \"low\"].includes(priority)) {\n throw new Error(`${source}: invalid \"priority\" value \"${priority}\"`);\n }\n entry.priority = priority as FeatureEntry[\"priority\"];\n }\n\n const cta = asOptionalObject(frontmatter.cta, \"cta\", source);\n if (cta) {\n entry.cta = {\n label: asString(cta.label, \"cta.label\", source),\n url: asString(cta.url, \"cta.url\", source),\n };\n }\n\n const audience = asOptionalObject(frontmatter.audience, \"audience\", source);\n if (audience) {\n const parsedAudience: FeatureEntry[\"audience\"] = {};\n for (const field of [\"plan\", \"role\", \"region\"] as const) {\n const value = audience[field];\n if (value !== undefined) {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`${source}: \"audience.${field}\" must be string[]`);\n }\n parsedAudience[field] = value;\n }\n }\n if (audience.custom !== undefined) {\n if (!audience.custom || typeof audience.custom !== \"object\" || Array.isArray(audience.custom)) {\n throw new Error(`${source}: \"audience.custom\" must be an object`);\n }\n parsedAudience.custom = audience.custom as Record<string, unknown>;\n }\n entry.audience = parsedAudience;\n }\n\n return entry;\n}\n\nfunction normalizePattern(pattern: string): { baseDir: string; ext: string } {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\");\n if (normalized.endsWith(\"/**/*.md\")) {\n return {\n baseDir: normalized.slice(0, -\"/**/*.md\".length),\n ext: \".md\",\n };\n }\n throw new Error(`Unsupported pattern \"${pattern}\". Use \"features/**/*.md\" style patterns.`);\n}\n\nasync function collectFiles(dir: string, ext: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(current: string): Promise<void> {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(current, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(ext)) {\n out.push(fullPath);\n }\n }\n }\n await walk(dir);\n return out.sort();\n}\n\nexport async function buildManifestFromPattern(options: BuildManifestOptions = {}): Promise<FeatureEntry[]> {\n const cwd = options.cwd ?? process.cwd();\n const pattern = options.pattern ?? \"features/**/*.md\";\n const { baseDir, ext } = normalizePattern(pattern);\n const baseAbs = join(cwd, baseDir);\n\n const stats = await stat(baseAbs).catch(() => null);\n if (!stats || !stats.isDirectory()) {\n throw new Error(`Pattern base directory does not exist: ${baseDir}`);\n }\n\n const files = await collectFiles(baseAbs, ext);\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const source = relative(cwd, file).split(sep).join(\"/\");\n const entry = parseFeatureFile(content, source);\n if (seenIds.has(entry.id)) {\n throw new Error(`Duplicate feature id \"${entry.id}\" found at ${source}`);\n }\n seenIds.add(entry.id);\n entries.push(entry);\n }\n\n if (options.outFile) {\n const outPath = join(cwd, options.outFile);\n await writeFile(outPath, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n }\n\n return entries;\n}\n\nexport async function validateFeatureFiles(options: BuildManifestOptions = {}): Promise<void> {\n const entries = await buildManifestFromPattern(options);\n const result = validateManifest(entries);\n if (!result.valid) {\n const message = result.errors\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`Manifest validation failed: ${message}`);\n }\n}\n","import { PostHog } from \"posthog-node\";\n\nlet _client: PostHog | null = null;\n\n/**\n * Returns true when analytics should be suppressed:\n * - POSTHOG_OPT_OUT env var is set (any truthy value)\n * - NODE_ENV is 'development' or 'test'\n * - CI environment detected\n */\nfunction isOptedOut(): boolean {\n const optOut = process.env.POSTHOG_OPT_OUT;\n if (optOut && optOut !== \"0\" && optOut !== \"false\") return true;\n\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"test\") return true;\n\n if (process.env.CI) return true;\n\n return false;\n}\n\n/**\n * Returns a shared PostHog client configured for CLI (short-lived process) use.\n * Events are flushed immediately (flushAt=1, flushInterval=0).\n *\n * Returns null (safely skips analytics) when:\n * - POSTHOG_API_KEY is not set\n * - POSTHOG_OPT_OUT is set to a truthy value\n * - NODE_ENV is 'development' or 'test'\n * - Running in CI\n */\nexport function getPostHogClient(): PostHog | null {\n if (isOptedOut()) return null;\n\n const apiKey = process.env.POSTHOG_API_KEY;\n if (!apiKey) return null;\n\n if (!_client) {\n _client = new PostHog(apiKey, {\n host: process.env.POSTHOG_HOST ?? \"https://us.i.posthog.com\",\n flushAt: 1,\n flushInterval: 0,\n enableExceptionAutocapture: true,\n });\n }\n return _client;\n}\n\n/**\n * Shuts down the PostHog client and flushes any pending events.\n * Call before process exit in CLI contexts.\n */\nexport async function shutdownPostHog(): Promise<void> {\n if (_client) {\n await _client.shutdown();\n _client = null;\n }\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry } from \"./types\";\n\nexport interface ManifestStats {\n total: number;\n byType: Record<string, number>;\n byCategory: Record<string, number>;\n newestRelease: string | null;\n oldestRelease: string | null;\n}\n\nexport function computeManifestStats(entries: FeatureEntry[]): ManifestStats {\n const byType: Record<string, number> = {};\n const byCategory: Record<string, number> = {};\n\n for (const entry of entries) {\n const type = entry.type ?? \"feature\";\n byType[type] = (byType[type] ?? 0) + 1;\n if (entry.category) {\n byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;\n }\n }\n\n const sortedByDate = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n\n return {\n total: entries.length,\n byType,\n byCategory,\n newestRelease: sortedByDate[0]?.releasedAt ?? null,\n oldestRelease: sortedByDate[sortedByDate.length - 1]?.releasedAt ?? null,\n };\n}\n\nexport function generateMarkdownChangelog(entries: FeatureEntry[]): string {\n const sorted = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n const sections = sorted.map((entry) => {\n const lines = [\n `## ${entry.label}`,\n \"\",\n `- **ID**: \\`${entry.id}\\``,\n `- **Released**: ${entry.releasedAt}`,\n ];\n if (entry.type) lines.push(`- **Type**: ${entry.type}`);\n if (entry.category) lines.push(`- **Category**: ${entry.category}`);\n if (entry.showNewUntil) lines.push(`- **Show new until**: ${entry.showNewUntil}`);\n if (entry.cta) lines.push(`- **CTA**: [${entry.cta.label}](${entry.cta.url})`);\n if (entry.description) {\n lines.push(\"\", entry.description.trim());\n }\n return lines.join(\"\\n\");\n });\n\n return `# Generated Changelog\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction isIsoWithTimezone(value: string): boolean {\n if (!value.includes(\"T\")) return false;\n if (!(value.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(value))) return false;\n return Number.isFinite(new Date(value).getTime());\n}\n\nexport interface DoctorReport {\n checks: string[];\n warnings: string[];\n errors: string[];\n}\n\nexport function runDoctor(entries: FeatureEntry[], now: Date = new Date()): DoctorReport {\n const checks: string[] = [];\n const warnings: string[] = [];\n const errors: string[] = [];\n\n checks.push(`Manifest entries loaded: ${entries.length}`);\n\n const ids = new Set<string>();\n let duplicateCount = 0;\n for (const entry of entries) {\n if (ids.has(entry.id)) duplicateCount += 1;\n ids.add(entry.id);\n }\n if (duplicateCount > 0) {\n errors.push(`${duplicateCount} duplicate feature id(s) found`);\n } else {\n checks.push(\"No duplicate IDs\");\n }\n\n let invalidDateCount = 0;\n let reversedDateCount = 0;\n let expiredCount = 0;\n let scheduledCount = 0;\n let missingDescriptionCount = 0;\n\n for (const entry of entries) {\n if (!entry.description?.trim()) missingDescriptionCount += 1;\n if (!isIsoWithTimezone(entry.releasedAt) || !isIsoWithTimezone(entry.showNewUntil)) {\n invalidDateCount += 1;\n continue;\n }\n const released = new Date(entry.releasedAt).getTime();\n const showUntil = new Date(entry.showNewUntil).getTime();\n if (showUntil <= released) reversedDateCount += 1;\n if (showUntil < now.getTime()) expiredCount += 1;\n if (entry.publishAt) {\n const publishMs = new Date(entry.publishAt).getTime();\n if (Number.isFinite(publishMs) && publishMs > now.getTime()) scheduledCount += 1;\n }\n }\n\n if (invalidDateCount > 0) {\n errors.push(`${invalidDateCount} entries have invalid ISO 8601 dates with timezone`);\n } else {\n checks.push(\"All dates are valid ISO 8601 with timezone\");\n }\n\n if (reversedDateCount > 0) {\n errors.push(`${reversedDateCount} entries have showNewUntil before/at releasedAt`);\n }\n\n if (expiredCount > 0) warnings.push(`${expiredCount} entries have showNewUntil in the past`);\n if (scheduledCount > 0) warnings.push(`${scheduledCount} entries have publishAt in the future`);\n\n if (missingDescriptionCount > 0) {\n errors.push(`${missingDescriptionCount} entries have no description`);\n } else {\n checks.push(\"All entries have descriptions\");\n }\n\n if (hasDependencyCycle(entries)) {\n errors.push(\"Circular dependsOn relationship detected\");\n } else {\n checks.push(\"No circular dependencies in dependsOn chains\");\n }\n\n return { checks, warnings, errors };\n}\n","import { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { buildManifestFromPattern } from \"./changelog-as-code\";\nimport { validateManifest } from \"./schema\";\nimport type { FeatureEntry, FeatureType } from \"./types\";\n\nexport type InitFormat = \"markdown\" | \"json\";\n\nexport interface InitProjectOptions {\n cwd?: string;\n format?: InitFormat;\n force?: boolean;\n now?: Date;\n}\n\nexport interface InitProjectResult {\n format: InitFormat;\n created: string[];\n}\n\nexport interface AddFeatureOptions {\n cwd?: string;\n format?: InitFormat;\n id?: string;\n label: string;\n description?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nexport interface AddFeatureResult {\n format: InitFormat;\n path: string;\n entry: FeatureEntry;\n}\n\nexport interface MigrateOptions {\n cwd?: string;\n from: MigrationSource;\n inputFile: string;\n outFile?: string;\n now?: Date;\n}\n\nexport type MigrationSource =\n | \"beamer\"\n | \"headway\"\n | \"announcekit\"\n | \"canny\"\n | \"launchnotes\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n const result = await stat(path).catch(() => null);\n return !!result;\n}\n\nfunction ensureIsoDate(value: string, field: string): string {\n const parsed = new Date(value).getTime();\n if (!Number.isFinite(parsed)) {\n throw new Error(`\"${field}\" must be a valid ISO date string`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction withDays(date: Date, days: number): string {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\nfunction toSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nfunction getPathDate(dateIso: string): string {\n return dateIso.slice(0, 10);\n}\n\nfunction getFrontmatterValue(value: string): string {\n return value.replace(/\\n/g, \" \").trim();\n}\n\nexport function slugifyFeatureId(label: string): string {\n const slug = toSlug(label);\n return slug || \"feature\";\n}\n\nexport function createFeatureEntry(options: AddFeatureOptions, now: Date = new Date()): FeatureEntry {\n const releasedAt = options.releasedAt\n ? ensureIsoDate(options.releasedAt, \"releasedAt\")\n : now.toISOString();\n const showNewUntil = options.showNewUntil\n ? ensureIsoDate(options.showNewUntil, \"showNewUntil\")\n : withDays(new Date(releasedAt), options.showDays ?? 14);\n const id = options.id ? slugifyFeatureId(options.id) : slugifyFeatureId(options.label);\n\n const entry: FeatureEntry = {\n id,\n label: options.label.trim(),\n releasedAt,\n showNewUntil,\n type: options.type ?? \"feature\",\n };\n\n if (options.description?.trim()) entry.description = options.description.trim();\n if (options.category?.trim()) entry.category = options.category.trim();\n if (options.url?.trim()) entry.url = options.url.trim();\n\n return entry;\n}\n\nexport function renderFeatureMarkdown(entry: FeatureEntry): string {\n const lines = [\n \"---\",\n `id: ${getFrontmatterValue(entry.id)}`,\n `label: ${getFrontmatterValue(entry.label)}`,\n `releasedAt: ${entry.releasedAt}`,\n `showNewUntil: ${entry.showNewUntil}`,\n ];\n if (entry.type) lines.push(`type: ${entry.type}`);\n if (entry.category) lines.push(`category: ${getFrontmatterValue(entry.category)}`);\n if (entry.url) lines.push(`url: ${getFrontmatterValue(entry.url)}`);\n lines.push(\"---\", \"\");\n if (entry.description) {\n lines.push(entry.description.trim(), \"\");\n } else {\n lines.push(\"Describe the feature here.\", \"\");\n }\n return `${lines.join(\"\\n\")}`;\n}\n\nfunction getNextAvailablePath(existingNames: ReadonlySet<string>, baseName: string): string {\n if (!existingNames.has(baseName)) return baseName;\n const ext = baseName.endsWith(\".md\") ? \".md\" : \"\";\n const withoutExt = ext ? baseName.slice(0, -ext.length) : baseName;\n let index = 2;\n while (existingNames.has(`${withoutExt}-${index}${ext}`)) {\n index += 1;\n }\n return `${withoutExt}-${index}${ext}`;\n}\n\nasync function detectProjectFormat(cwd: string, explicit?: InitFormat): Promise<InitFormat> {\n if (explicit) return explicit;\n if (await pathExists(join(cwd, \"features\"))) return \"markdown\";\n if (await pathExists(join(cwd, \"features.json\"))) return \"json\";\n return \"markdown\";\n}\n\nexport async function initFeaturedropProject(options: InitProjectOptions = {}): Promise<InitProjectResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = options.format ?? \"markdown\";\n const now = options.now ?? new Date();\n const force = options.force ?? false;\n const created: string[] = [];\n\n if (format === \"markdown\") {\n const featuresDir = join(cwd, \"features\");\n if (await pathExists(featuresDir)) {\n const existing = await readdir(featuresDir).catch(() => []);\n if (existing.length > 0 && !force) {\n throw new Error(\"features/ already exists and is not empty (use --force to overwrite sample files)\");\n }\n }\n await mkdir(featuresDir, { recursive: true });\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Update this file with your first product announcement.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n const sampleName = `${getPathDate(sample.releasedAt)}-${sample.id}.md`;\n const samplePath = join(featuresDir, sampleName);\n await writeFile(samplePath, renderFeatureMarkdown(sample), \"utf8\");\n created.push(\"features/\");\n created.push(`features/${sampleName}`);\n return { format, created };\n }\n\n const manifestPath = join(cwd, \"features.json\");\n if (await pathExists(manifestPath)) {\n if (!force) {\n throw new Error(\"features.json already exists (use --force to overwrite)\");\n }\n }\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Replace this sample entry with your own release notes.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n await writeFile(manifestPath, `${JSON.stringify([sample], null, 2)}\\n`, \"utf8\");\n created.push(\"features.json\");\n return { format, created };\n}\n\nasync function ensureUniqueIdForMarkdown(cwd: string, id: string): Promise<void> {\n const featuresDir = join(cwd, \"features\");\n if (!(await pathExists(featuresDir))) return;\n const entries = await buildManifestFromPattern({ cwd, pattern: \"features/**/*.md\" }).catch(() => []);\n if (entries.some((entry) => entry.id === id)) {\n throw new Error(`Feature id \"${id}\" already exists`);\n }\n}\n\nasync function addFeatureToMarkdown(cwd: string, entry: FeatureEntry): Promise<string> {\n await mkdir(join(cwd, \"features\"), { recursive: true });\n await ensureUniqueIdForMarkdown(cwd, entry.id);\n const existingFiles = new Set(\n (await readdir(join(cwd, \"features\")).catch(() => []))\n .filter((name) => name.endsWith(\".md\")),\n );\n const baseName = `${getPathDate(entry.releasedAt)}-${entry.id}.md`;\n const fileName = getNextAvailablePath(existingFiles, baseName);\n const relPath = `features/${fileName}`;\n await writeFile(join(cwd, relPath), renderFeatureMarkdown(entry), \"utf8\");\n return relPath;\n}\n\nasync function addFeatureToJson(cwd: string, entry: FeatureEntry): Promise<string> {\n const manifestPath = join(cwd, \"features.json\");\n const raw = await readFile(manifestPath, \"utf8\").catch(() => \"[]\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"features.json is not valid JSON\");\n }\n if (!Array.isArray(parsed)) {\n throw new Error(\"features.json must contain an array of feature entries\");\n }\n const existing = parsed as FeatureEntry[];\n if (existing.some((item) => item.id === entry.id)) {\n throw new Error(`Feature id \"${entry.id}\" already exists`);\n }\n const next = [...existing, entry];\n const validation = validateManifest(next);\n if (!validation.valid) {\n throw new Error(`features.json validation failed: ${validation.errors[0]?.message ?? \"unknown error\"}`);\n }\n await writeFile(manifestPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return \"features.json\";\n}\n\nexport async function addFeatureEntry(options: AddFeatureOptions): Promise<AddFeatureResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = await detectProjectFormat(cwd, options.format);\n const entry = createFeatureEntry(options);\n const path = format === \"markdown\"\n ? await addFeatureToMarkdown(cwd, entry)\n : await addFeatureToJson(cwd, entry);\n return { format, path, entry };\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction getMigrationItems(payload: unknown): unknown[] {\n if (Array.isArray(payload)) return payload;\n if (!isRecord(payload)) throw new Error(\"Migration payload must be an array or object\");\n for (const key of [\"posts\", \"items\", \"announcements\", \"entries\"] as const) {\n const value = payload[key];\n if (Array.isArray(value)) return value;\n }\n throw new Error(\"Could not find entries array in migration payload\");\n}\n\nfunction normalizeDate(raw: string | undefined, fallback: Date): string {\n if (!raw) return fallback.toISOString();\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return fallback.toISOString();\n return new Date(parsed).toISOString();\n}\n\nfunction buildFallbackId(prefix: string, index: number): string {\n return `${prefix}-entry-${index + 1}`;\n}\n\ninterface MigrationProfile {\n fallbackPrefix: string;\n labelKeys: readonly string[];\n idKeys: readonly string[];\n dateKeys: readonly string[];\n categoryKeys: readonly string[];\n urlKeys: readonly string[];\n descriptionKeys: readonly string[];\n showUntilKeys: readonly string[];\n}\n\nconst MIGRATION_PROFILES: Record<MigrationSource, MigrationProfile> = {\n beamer: {\n fallbackPrefix: \"beamer\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"uid\", \"slug\", \"postId\", \"post_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"published\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"segment\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"body\", \"html\"],\n showUntilKeys: [\"showNewUntil\", \"show_new_until\", \"newUntil\", \"new_until\"],\n },\n headway: {\n fallbackPrefix: \"headway\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"slug\", \"entryId\", \"entry_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"tag\", \"tags\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"summary\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n announcekit: {\n fallbackPrefix: \"announcekit\",\n labelKeys: [\"title\", \"subject\", \"name\"],\n idKeys: [\"id\", \"post_id\", \"postId\", \"slug\"],\n dateKeys: [\"published_at\", \"publishedAt\", \"created_at\", \"createdAt\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"tab\", \"label\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"html\", \"body\"],\n showUntilKeys: [\"show_new_until\", \"showNewUntil\", \"new_until\"],\n },\n canny: {\n fallbackPrefix: \"canny\",\n labelKeys: [\"title\", \"name\"],\n idKeys: [\"id\", \"postId\", \"post_id\", \"slug\"],\n dateKeys: [\"createdAt\", \"created_at\", \"publishedAt\", \"published_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"boardName\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"details\", \"description\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n launchnotes: {\n fallbackPrefix: \"launchnotes\",\n labelKeys: [\"title\", \"headline\", \"name\"],\n idKeys: [\"id\", \"slug\", \"noteId\", \"note_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"channel\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"body\", \"content\", \"summary\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n};\n\nexport function migrateFromSourcePayload(\n source: MigrationSource,\n payload: unknown,\n now: Date = new Date(),\n): FeatureEntry[] {\n const profile = MIGRATION_PROFILES[source];\n const items = getMigrationItems(payload);\n const usedIds = new Set<string>();\n\n return items\n .map((raw, index) => {\n if (!isRecord(raw)) return null;\n const release = normalizeDate(\n pickString(raw, profile.dateKeys),\n now,\n );\n const label = pickString(raw, profile.labelKeys) ?? `Update ${index + 1}`;\n const idSeed = pickString(raw, profile.idKeys) ?? label;\n let id = slugifyFeatureId(idSeed);\n if (!id) id = buildFallbackId(profile.fallbackPrefix, index);\n while (usedIds.has(id)) {\n id = `${id}-${index + 1}`;\n }\n usedIds.add(id);\n\n const category = pickString(raw, profile.categoryKeys);\n const url = pickString(raw, profile.urlKeys);\n const description = pickString(raw, profile.descriptionKeys);\n const explicitShowUntil = normalizeDate(\n pickString(raw, profile.showUntilKeys),\n new Date(withDays(new Date(release), 30)),\n );\n\n const entry: FeatureEntry = {\n id,\n label,\n releasedAt: release,\n showNewUntil: explicitShowUntil,\n type: \"feature\",\n };\n if (description) entry.description = description;\n if (category) entry.category = category;\n if (url) entry.url = url;\n return entry;\n })\n .filter((value): value is FeatureEntry => !!value);\n}\n\nexport function migrateFromBeamerPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"beamer\", payload, now);\n}\n\nexport function migrateFromHeadwayPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"headway\", payload, now);\n}\n\nexport function migrateFromAnnounceKitPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"announcekit\", payload, now);\n}\n\nexport function migrateFromCannyPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"canny\", payload, now);\n}\n\nexport function migrateFromLaunchNotesPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"launchnotes\", payload, now);\n}\n\nexport async function migrateManifest(options: MigrateOptions): Promise<{ outFile: string; entries: FeatureEntry[] }> {\n const cwd = options.cwd ?? process.cwd();\n const outFile = options.outFile ?? \"featuredrop.manifest.json\";\n const inputPath = join(cwd, options.inputFile);\n const raw = await readFile(inputPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n\n const entries = migrateFromSourcePayload(options.from, payload, options.now ?? new Date());\n await writeFile(join(cwd, outFile), `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n return { outFile: basename(outFile), entries };\n}\n","import * as moduleApi from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire =\n typeof moduleApi.createRequire === \"function\" ? moduleApi.createRequire(import.meta.url) : null;\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n if (!dynamicRequire) return null;\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/&lt;(\\/?)([a-z0-9]+)([^>]*)&gt;/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: ![alt](url)\n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import type { FeatureManifest } from \"./types\";\nimport { parseDescription } from \"./markdown\";\n\nfunction escape(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Generate a simple RSS 2.0 feed from a feature manifest.\n * Titles and descriptions are sanitized via `parseDescription`.\n */\nexport function generateRSS(manifest: FeatureManifest, options?: { title?: string; link?: string; description?: string }): string {\n const title = escape(options?.title ?? \"Featuredrop Changelog\");\n const link = escape(options?.link ?? \"\");\n const desc = escape(options?.description ?? \"Product updates\");\n\n const items = manifest\n .slice()\n .sort((a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime())\n .map((item) => {\n const descriptionHtml = item.description ? parseDescription(item.description) : \"\";\n const itemLink = item.url ? escape(item.url) : \"\";\n return [\n \"<item>\",\n `<title>${escape(item.label)}</title>`,\n itemLink ? `<link>${itemLink}</link>` : \"\",\n `<guid isPermaLink=\\\"false\\\">${escape(item.id)}</guid>`,\n `<pubDate>${new Date(item.releasedAt).toUTCString()}</pubDate>`,\n `<description><![CDATA[${descriptionHtml}]]></description>`,\n \"</item>\",\n ].join(\"\");\n })\n .join(\"\");\n\n return [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<rss version=\\\"2.0\\\">\",\n \"<channel>\",\n `<title>${title}</title>`,\n link ? `<link>${link}</link>` : \"\",\n `<description>${desc}</description>`,\n items,\n \"</channel>\",\n \"</rss>\",\n ].join(\"\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { hostname } from \"node:os\";\nimport { buildManifestFromPattern, validateFeatureFiles } from \"./changelog-as-code\";\nimport { getPostHogClient, shutdownPostHog } from \"./posthog-client\";\nimport {\n computeManifestStats,\n generateMarkdownChangelog,\n runDoctor,\n} from \"./cli-utils\";\nimport {\n addFeatureEntry,\n initFeaturedropProject,\n migrateManifest,\n type InitFormat,\n type MigrationSource,\n} from \"./cli-scaffold\";\nimport { generateRSS } from \"./rss\";\nimport type { FeatureType } from \"./types\";\n\ninterface ParsedArgs {\n command:\n | \"init\"\n | \"add\"\n | \"migrate\"\n | \"build\"\n | \"validate\"\n | \"stats\"\n | \"doctor\"\n | \"generate-rss\"\n | \"generate-changelog\"\n | \"help\";\n pattern?: string;\n outFile?: string;\n inputFile?: string;\n cwd?: string;\n title?: string;\n link?: string;\n description?: string;\n from?: MigrationSource;\n format?: InitFormat;\n force?: boolean;\n id?: string;\n label?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const [commandRaw, ...rest] = argv;\n const allowed = new Set([\n \"init\",\n \"add\",\n \"migrate\",\n \"build\",\n \"validate\",\n \"stats\",\n \"doctor\",\n \"generate-rss\",\n \"generate-changelog\",\n ]);\n const command = allowed.has(commandRaw) ? (commandRaw as ParsedArgs[\"command\"]) : \"help\";\n const parsed: ParsedArgs = { command };\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--pattern\") parsed.pattern = rest[++i];\n else if (arg === \"--out\") parsed.outFile = rest[++i];\n else if (arg === \"--cwd\") parsed.cwd = rest[++i];\n else if (arg === \"--title\") parsed.title = rest[++i];\n else if (arg === \"--link\") parsed.link = rest[++i];\n else if (arg === \"--description\") parsed.description = rest[++i];\n else if (arg === \"--input\") parsed.inputFile = rest[++i];\n else if (arg === \"--from\") parsed.from = rest[++i] as MigrationSource;\n else if (arg === \"--format\") parsed.format = rest[++i] as InitFormat;\n else if (arg === \"--force\") parsed.force = true;\n else if (arg === \"--id\") parsed.id = rest[++i];\n else if (arg === \"--label\") parsed.label = rest[++i];\n else if (arg === \"--type\") parsed.type = rest[++i] as FeatureType;\n else if (arg === \"--category\") parsed.category = rest[++i];\n else if (arg === \"--url\") parsed.url = rest[++i];\n else if (arg === \"--releasedAt\") parsed.releasedAt = rest[++i];\n else if (arg === \"--showNewUntil\") parsed.showNewUntil = rest[++i];\n else if (arg === \"--show-days\") parsed.showDays = Number(rest[++i]);\n }\n return parsed;\n}\n\nfunction printHelp(): void {\n console.log(\"featuredrop CLI\");\n console.log(\"\");\n console.log(\"Usage:\");\n console.log(\" featuredrop init [--format markdown|json] [--force] [--cwd .]\");\n console.log(\" featuredrop add [--label ...] [--id ...] [--description ...] [--type feature|improvement|fix|breaking] [--category ...] [--url ...] [--releasedAt ...] [--showNewUntil ...] [--show-days 14] [--format markdown|json] [--cwd .]\");\n console.log(\" featuredrop migrate --from beamer|headway|announcekit|canny|launchnotes [--input export.json] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop build [--pattern features/**/*.md] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop validate [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop stats [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop doctor [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop generate-rss [--pattern features/**/*.md] [--out featuredrop.rss.xml] [--title ...] [--link ...] [--description ...] [--cwd .]\");\n console.log(\" featuredrop generate-changelog [--pattern features/**/*.md] [--out CHANGELOG.generated.md] [--cwd .]\");\n}\n\nasync function promptForLabelIfNeeded(label?: string): Promise<string> {\n if (label?.trim()) return label.trim();\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"Missing --label. Provide --label in non-interactive mode.\");\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = (await rl.question(\"Feature label: \")).trim();\n if (!value) throw new Error(\"Feature label is required\");\n return value;\n } finally {\n rl.close();\n }\n}\n\nasync function run(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.command === \"help\") {\n printHelp();\n process.exitCode = 1;\n return;\n }\n\n // Use hostname-based distinct ID for anonymous CLI telemetry\n const distinctId = `cli:${hostname()}`;\n const posthog = getPostHogClient();\n\n try {\n if (args.command === \"init\") {\n const result = await initFeaturedropProject({\n cwd: args.cwd,\n format: args.format,\n force: args.force,\n });\n console.log(`Initialized featuredrop project (${result.format})`);\n for (const path of result.created) {\n console.log(`- ${path}`);\n }\n posthog?.capture({\n distinctId,\n event: \"cli_init\",\n properties: { format: result.format, files_created: result.created.length },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"add\") {\n const label = await promptForLabelIfNeeded(args.label);\n const result = await addFeatureEntry({\n cwd: args.cwd,\n format: args.format,\n id: args.id,\n label,\n description: args.description,\n type: args.type,\n category: args.category,\n url: args.url,\n releasedAt: args.releasedAt,\n showNewUntil: args.showNewUntil,\n showDays: args.showDays,\n });\n console.log(`Added feature \"${result.entry.id}\" -> ${result.path}`);\n posthog?.capture({\n distinctId,\n event: \"cli_add_feature\",\n properties: {\n feature_id: result.entry.id,\n feature_type: result.entry.type,\n format: args.format,\n has_description: Boolean(args.description),\n has_url: Boolean(args.url),\n },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"migrate\") {\n const from = args.from;\n if (!from) {\n throw new Error('Missing required \"--from\" (beamer|headway|announcekit|canny|launchnotes)');\n }\n const inputFile = args.inputFile ?? `${from}-export.json`;\n const result = await migrateManifest({\n cwd: args.cwd,\n from,\n inputFile,\n outFile: args.outFile,\n });\n console.log(`Migrated ${result.entries.length} entries from ${from} -> ${result.outFile}`);\n posthog?.capture({\n distinctId,\n event: \"cli_migrate\",\n properties: { source: from, entries_migrated: result.entries.length, out_file: result.outFile },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"build\") {\n const out = args.outFile ?? \"featuredrop.manifest.json\";\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n outFile: out,\n cwd: args.cwd,\n });\n console.log(`Built ${entries.length} feature entries -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_build\",\n properties: { entries_built: entries.length, out_file: out, has_pattern: Boolean(args.pattern) },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"validate\") {\n await validateFeatureFiles({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n console.log(\"Feature files valid\");\n await shutdownPostHog();\n return;\n }\n\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n\n if (args.command === \"stats\") {\n const stats = computeManifestStats(entries);\n console.log(`Total entries: ${stats.total}`);\n console.log(`By type: ${Object.entries(stats.byType).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n console.log(`By category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n if (stats.newestRelease) console.log(`Newest release: ${stats.newestRelease}`);\n if (stats.oldestRelease) console.log(`Oldest release: ${stats.oldestRelease}`);\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"doctor\") {\n const report = runDoctor(entries);\n for (const check of report.checks) console.log(`✓ ${check}`);\n for (const warning of report.warnings) console.log(`⚠ ${warning}`);\n for (const error of report.errors) console.log(`✗ ${error}`);\n console.log(\"\");\n console.log(`${report.warnings.length} warning(s), ${report.errors.length} error(s).`);\n if (report.errors.length > 0) process.exitCode = 1;\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-rss\") {\n const out = args.outFile ?? \"featuredrop.rss.xml\";\n const xml = generateRSS(entries, {\n title: args.title,\n link: args.link,\n description: args.description,\n });\n await writeFile(join(args.cwd ?? process.cwd(), out), `${xml}\\n`, \"utf8\");\n console.log(`Generated RSS feed -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_rss\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-changelog\") {\n const out = args.outFile ?? \"CHANGELOG.generated.md\";\n const markdown = generateMarkdownChangelog(entries);\n await writeFile(join(args.cwd ?? process.cwd(), out), markdown, \"utf8\");\n console.log(`Generated markdown changelog -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_changelog\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`featuredrop: ${message}`);\n posthog?.captureException(error, distinctId, { command: args.command });\n posthog?.capture({\n distinctId,\n event: \"cli_error\",\n properties: { command: args.command, error_message: message },\n });\n await shutdownPostHog();\n process.exitCode = 1;\n }\n}\n\nvoid run();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "featuredrop",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Lightweight feature discovery system. Show 'New' badges that auto-expire.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -353,5 +353,8 @@
353
353
  "typescript": "^5.7.0",
354
354
  "vitest": "^2.1.0",
355
355
  "vitest-axe": "^0.1.0"
356
+ },
357
+ "dependencies": {
358
+ "posthog-node": "^5.26.0"
356
359
  }
357
360
  }