@hasna/instructions 0.4.17 → 0.4.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -10371,6 +10371,21 @@ function canonicalFingerprintValue(value) {
10371
10371
  }
10372
10372
  return value;
10373
10373
  }
10374
+ function ruleAttestation(rule) {
10375
+ const metadata = rule.metadata ?? {};
10376
+ const read = (key) => {
10377
+ const value = metadata[key];
10378
+ return typeof value === "string" ? value : null;
10379
+ };
10380
+ const applied = metadata["payloadFloorApplied"];
10381
+ return {
10382
+ contentSha256: sha2563(rule.content ?? ""),
10383
+ payloadFloorApplied: typeof applied === "boolean" ? applied : null,
10384
+ flooredFromRulesVersion: read("flooredFromRulesVersion"),
10385
+ flooredFromPayloadSha256: read("flooredFromPayloadSha256"),
10386
+ payloadIntegrity: read("payloadIntegrity")
10387
+ };
10388
+ }
10374
10389
  function sourceFingerprint(source) {
10375
10390
  return {
10376
10391
  id: source.id,
@@ -10469,6 +10484,35 @@ function applyAgentOperatingRulesFloor(source, content) {
10469
10484
  metadata: { ...source.metadata ?? {}, ...payload.metadata, ...floored }
10470
10485
  };
10471
10486
  }
10487
+ function applyAgentOperatingRulesFloorToRule(source, rule, content) {
10488
+ const unchanged = { content, metadata: rule.metadata ?? null };
10489
+ if (!claimsAgentOperatingRulesPolicy(source, content))
10490
+ return unchanged;
10491
+ const payload = resolveAgentOperatingRulesPayload(content);
10492
+ if (payload.content === content) {
10493
+ return {
10494
+ content,
10495
+ metadata: { ...rule.metadata ?? {}, payloadIntegrity: payload.integrity }
10496
+ };
10497
+ }
10498
+ const floored = {
10499
+ payloadFloorApplied: true,
10500
+ flooredFromRulesVersion: parseAgentOperatingRulesVersion(content),
10501
+ flooredFromPayloadSha256: sha2563(content)
10502
+ };
10503
+ return {
10504
+ content: payload.content,
10505
+ metadata: { ...rule.metadata ?? {}, ...payload.metadata, ...floored }
10506
+ };
10507
+ }
10508
+ function skippedSource(source, reason) {
10509
+ return {
10510
+ id: source.id,
10511
+ label: source.resolvedLabel,
10512
+ targetProviders: source.targetProviders ?? [],
10513
+ reason
10514
+ };
10515
+ }
10472
10516
  function normalizeSources(sources, tool, allowEmptySources) {
10473
10517
  const normalized = sources.map((source, index) => {
10474
10518
  if (!source.id.trim())
@@ -10493,27 +10537,73 @@ function normalizeSources(sources, tool, allowEmptySources) {
10493
10537
  }
10494
10538
  return normalized2;
10495
10539
  });
10496
- const ordered = deduplicateSemanticPolicySources(normalized).sort((a, b) => SESSION_LAYER_RANK[a.resolvedLayer] - SESSION_LAYER_RANK[b.resolvedLayer] || a.resolvedOrder - b.resolvedOrder || a.id.localeCompare(b.id));
10540
+ const deduplicated = deduplicateSemanticPolicySources(normalized);
10541
+ const ordered = deduplicated.selected.sort((a, b) => SESSION_LAYER_RANK[a.resolvedLayer] - SESSION_LAYER_RANK[b.resolvedLayer] || a.resolvedOrder - b.resolvedOrder || a.id.localeCompare(b.id));
10497
10542
  rejectDuplicateSourceSlugs(ordered);
10498
10543
  rejectDuplicateRulePaths(ordered);
10499
- return ordered;
10544
+ return { sources: ordered, skipped: deduplicated.skipped };
10545
+ }
10546
+ function semanticPolicyIntegrity(body) {
10547
+ return sha2563(body) === AGENT_OPERATING_RULES_PAYLOAD_SHA256 ? "pinned-digest" : "unverified-self-declared";
10548
+ }
10549
+ function semanticPolicyDeclaration(source) {
10550
+ const normalize = (value) => value.replace(/\r\n/g, `
10551
+ `).trim();
10552
+ const sentinel = source.content.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
10553
+ if (sentinel) {
10554
+ return {
10555
+ version: sentinel[1],
10556
+ normalizedContent: normalize(source.content),
10557
+ integrity: semanticPolicyIntegrity(source.content)
10558
+ };
10559
+ }
10560
+ for (const rule of source.resolvedRules) {
10561
+ const body = rule.content ?? "";
10562
+ if (!claimsAgentOperatingRulesPolicy(source, body))
10563
+ continue;
10564
+ const ruleSentinel = body.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
10565
+ if (!ruleSentinel)
10566
+ continue;
10567
+ return {
10568
+ version: ruleSentinel[1],
10569
+ normalizedContent: normalize(body),
10570
+ integrity: semanticPolicyIntegrity(body)
10571
+ };
10572
+ }
10573
+ return null;
10574
+ }
10575
+ function withoutSemanticPolicyPayloads(source) {
10576
+ const content = AGENT_OPERATING_RULES_SENTINEL_PATTERN.test(source.content) ? "" : source.content;
10577
+ const resolvedRules = source.resolvedRules.filter((rule) => {
10578
+ const body = rule.content ?? "";
10579
+ return !(AGENT_OPERATING_RULES_SENTINEL_PATTERN.test(body) && claimsAgentOperatingRulesPolicy(source, body));
10580
+ });
10581
+ const hasPathReferences = (source.sourcePaths ?? []).length > 0;
10582
+ if (!content.trim() && resolvedRules.length === 0 && !hasPathReferences)
10583
+ return null;
10584
+ return { ...source, content, resolvedRules };
10500
10585
  }
10501
10586
  function deduplicateSemanticPolicySources(sources) {
10502
10587
  const selected = [];
10588
+ const skipped = [];
10503
10589
  const policySources = new Map;
10590
+ const collapseReason = (winner, key, partial, displacesVerified) => `superseded by "${winner.id}": sources declaring the semantic policy ${key} collapse to one so a single instruction home cannot carry two rule-set versions` + (partial ? "; only the policy payload was removed and this source's other instructions still render" : "") + (displacesVerified ? "; WARNING the surviving payload is unverified-self-declared and displaced a digest-verified one on its own version claim" : "");
10591
+ const discard = (loser, winner, key, displacesVerified) => {
10592
+ const remainder = withoutSemanticPolicyPayloads(loser);
10593
+ skipped.push(skippedSource(loser, collapseReason(winner, key, remainder !== null, displacesVerified)));
10594
+ return remainder;
10595
+ };
10504
10596
  for (const source of sources) {
10505
- const sentinel = source.content.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
10506
- if (!sentinel) {
10597
+ const declaration = semanticPolicyDeclaration(source);
10598
+ if (!declaration) {
10507
10599
  selected.push(source);
10508
10600
  continue;
10509
10601
  }
10510
- const version = sentinel[1];
10602
+ const { version, normalizedContent, integrity } = declaration;
10511
10603
  const key = AGENT_OPERATING_RULES_SEMANTIC_POLICY_KEY;
10512
- const normalizedContent = source.content.replace(/\r\n/g, `
10513
- `).trim();
10514
10604
  const existing = policySources.get(key);
10515
10605
  if (!existing) {
10516
- policySources.set(key, { index: selected.length, version, normalizedContent });
10606
+ policySources.set(key, { index: selected.length, version, normalizedContent, integrity });
10517
10607
  selected.push(source);
10518
10608
  continue;
10519
10609
  }
@@ -10523,23 +10613,30 @@ function deduplicateSemanticPolicySources(sources) {
10523
10613
  }
10524
10614
  const current = selected[existing.index];
10525
10615
  const priorityOrder = semanticPolicySourcePriority(source) - semanticPolicySourcePriority(current);
10526
- if (priorityOrder < 0)
10527
- continue;
10528
- if (priorityOrder === 0 && versionOrder <= 0)
10616
+ const displacesVerified = existing.integrity === "pinned-digest" && integrity === "unverified-self-declared";
10617
+ const arrivingWins = priorityOrder > 0 || priorityOrder === 0 && versionOrder > 0;
10618
+ if (!arrivingWins) {
10619
+ const remainder2 = discard(source, current, key, false);
10620
+ if (remainder2)
10621
+ selected.push(remainder2);
10529
10622
  continue;
10623
+ }
10624
+ const remainder = discard(current, source, key, displacesVerified);
10530
10625
  selected[existing.index] = {
10531
10626
  ...source,
10532
10627
  resolvedOrder: current.resolvedOrder
10533
10628
  };
10534
- policySources.set(key, { index: existing.index, version, normalizedContent });
10629
+ if (remainder)
10630
+ selected.push(remainder);
10631
+ policySources.set(key, { index: existing.index, version, normalizedContent, integrity });
10535
10632
  }
10536
- return selected;
10633
+ return { selected, skipped };
10537
10634
  }
10538
10635
  function semanticPolicySourcePriority(source) {
10539
10636
  let priority = 0;
10540
10637
  if (source.nonOverridable)
10541
10638
  priority += 4;
10542
- if (source.id === GLOBAL_AGENT_RULES_STANDARD_SLUG)
10639
+ if (source.id === GLOBAL_AGENT_RULES_STANDARD_SLUG || source.id === AGENT_OPERATING_RULES_SOURCE_ID)
10543
10640
  priority += 2;
10544
10641
  if (source.metadata?.["role"] === AGENT_OPERATING_RULES_ROLE)
10545
10642
  priority += 1;
@@ -10579,9 +10676,12 @@ function composeSources(sources) {
10579
10676
  start = i;
10580
10677
  }
10581
10678
  if (start < 0)
10582
- return sources;
10583
- const protectedSources = sources.slice(0, start).filter((source) => source.nonOverridable);
10584
- return [...protectedSources, ...sources.slice(start)];
10679
+ return { sources, skipped: [] };
10680
+ const earlier = sources.slice(0, start);
10681
+ const protectedSources = earlier.filter((source) => source.nonOverridable);
10682
+ const replacer = sources[start];
10683
+ const skipped = earlier.filter((source) => !source.nonOverridable).map((source) => skippedSource(source, `superseded by "${replacer.id}": a replace-merge source discards earlier overridable instruction layers`));
10684
+ return { sources: [...protectedSources, ...sources.slice(start)], skipped };
10585
10685
  }
10586
10686
  function sectionForSource(source) {
10587
10687
  const parts = [
@@ -10956,7 +11056,14 @@ function planSessionRender(input) {
10956
11056
  const targetOwner = resolveSessionTargetOwnership(input, { targetHome, targetKind });
10957
11057
  const blocked = blockers.length > 0;
10958
11058
  const allowEmptySources = input.allowEmptySources === true;
10959
- const orderedSources = composeSources(normalizeSources(input.sources, input.tool, allowEmptySources));
11059
+ const normalized = normalizeSources(input.sources, input.tool, allowEmptySources);
11060
+ const composed = composeSources(normalized.sources);
11061
+ const orderedSources = composed.sources;
11062
+ const skippedSources = [
11063
+ ...input.skippedSources ?? [],
11064
+ ...normalized.skipped,
11065
+ ...composed.skipped
11066
+ ];
10960
11067
  if (orderedSources.length === 0 && !allowEmptySources) {
10961
11068
  throw new Error("Session render has no instruction sources. Pass --allow-empty-sources only for explicit empty renders.");
10962
11069
  }
@@ -10964,7 +11071,8 @@ function planSessionRender(input) {
10964
11071
  const env = adapter.envVar && !blocked ? { [adapter.envVar]: targetHome } : {};
10965
11072
  const warnings = [
10966
11073
  ...orderedSources.length === 0 ? ["No instruction sources were provided."] : [],
10967
- ...blockers
11074
+ ...blockers,
11075
+ ...skippedSources.map((entry) => `Instruction source "${entry.id}" was not rendered: ${entry.reason}`)
10968
11076
  ];
10969
11077
  if (input.providerConfig && input.tool !== "opencode") {
10970
11078
  throw new Error("Provider base config is supported only for OpenCode session renders.");
@@ -11028,7 +11136,8 @@ function planSessionRender(input) {
11028
11136
  label: rule.resolvedLabel,
11029
11137
  path: rule.resolvedPath,
11030
11138
  globs: rule.globs ?? [],
11031
- hash: rule.hash ?? null
11139
+ hash: rule.hash ?? null,
11140
+ ...ruleAttestation(rule)
11032
11141
  })),
11033
11142
  renderedPayloadSha256: sha2563(source.content),
11034
11143
  provenance: source.provenance ?? null,
@@ -11036,7 +11145,7 @@ function planSessionRender(input) {
11036
11145
  })),
11037
11146
  ...projectContext ? [projectContext.source] : []
11038
11147
  ],
11039
- skippedSources: input.skippedSources ?? [],
11148
+ skippedSources,
11040
11149
  files: files.map((file) => ({
11041
11150
  path: file.path,
11042
11151
  relativePath: file.relativePath,
@@ -11149,7 +11258,8 @@ function normalizeInstructionRules(source, tool) {
11149
11258
  return (source.rules ?? []).map((rule) => {
11150
11259
  if (!rule.id.trim())
11151
11260
  throw new Error(`Instruction rule id is required for source ${source.id}.`);
11152
- const content = filterProviderOnlyBlocks(rule.content ?? "", tool);
11261
+ const floored = applyAgentOperatingRulesFloorToRule(source, rule, rule.content ?? "");
11262
+ const content = filterProviderOnlyBlocks(floored.content, tool);
11153
11263
  if (!content.trim() && !rule.path)
11154
11264
  throw new Error(`Instruction rule content or path is required for rule ${rule.id}.`);
11155
11265
  const resolvedPath = normalizeRulePath(rule.path ?? `${slug(rule.id)}.md`);
@@ -11160,6 +11270,7 @@ function normalizeInstructionRules(source, tool) {
11160
11270
  return {
11161
11271
  ...rule,
11162
11272
  content,
11273
+ metadata: floored.metadata,
11163
11274
  normalizedId: slug(rule.id),
11164
11275
  resolvedLabel: rule.label ?? rule.id,
11165
11276
  resolvedPath
@@ -13958,6 +14069,8 @@ function applySessionRenderUnlocked(plan, options, coordination) {
13958
14069
  manifestPath,
13959
14070
  snapshotPath: null,
13960
14071
  env: plan.env,
14072
+ warnings: plan.warnings,
14073
+ skippedSources: plan.manifest.skippedSources,
13961
14074
  files: results,
13962
14075
  conflicts,
13963
14076
  drift
@@ -13998,6 +14111,8 @@ function applySessionRenderUnlocked(plan, options, coordination) {
13998
14111
  manifestPath,
13999
14112
  snapshotPath,
14000
14113
  env: plan.env,
14114
+ warnings: plan.warnings,
14115
+ skippedSources: plan.manifest.skippedSources,
14001
14116
  files: results,
14002
14117
  conflicts,
14003
14118
  drift
@@ -14765,6 +14880,37 @@ function sha2564(content) {
14765
14880
  // src/cli/index.tsx
14766
14881
  init_session_render();
14767
14882
 
14883
+ // src/lib/global-source-coverage.ts
14884
+ var GLOBAL_SOURCE_SLUG_PREFIX = "global-";
14885
+ var RETIRED_GLOBAL_SOURCE_TAG = "retired-global-source";
14886
+ function expectedGlobalSourceSlugs(registryConfigs) {
14887
+ return registryConfigs.filter((c) => c.slug.startsWith(GLOBAL_SOURCE_SLUG_PREFIX)).filter((c) => !(c.tags ?? []).includes(RETIRED_GLOBAL_SOURCE_TAG)).map((c) => c.slug).sort();
14888
+ }
14889
+ function accountedGlobalSourceSlugs(manifest) {
14890
+ return [...manifest.sources, ...manifest.skippedSources].map((source) => source.id).filter((id) => id.startsWith(GLOBAL_SOURCE_SLUG_PREFIX));
14891
+ }
14892
+ function computeGlobalSourceCoverage(registryConfigs, configuredSlugs) {
14893
+ const expected = expectedGlobalSourceSlugs(registryConfigs);
14894
+ const expectedSet = new Set(expected);
14895
+ const configuredSet = new Set(configuredSlugs);
14896
+ const missing = expected.filter((slug2) => !configuredSet.has(slug2));
14897
+ const unexpected = [...configuredSet].filter((slug2) => slug2.startsWith(GLOBAL_SOURCE_SLUG_PREFIX) && !expectedSet.has(slug2)).sort();
14898
+ return {
14899
+ expectedSlugs: expected,
14900
+ configuredSlugs: [...configuredSet].sort(),
14901
+ missingSlugs: missing,
14902
+ unexpectedSlugs: unexpected,
14903
+ complete: missing.length === 0
14904
+ };
14905
+ }
14906
+ function formatGlobalSourceCoverageWarnings(result) {
14907
+ if (result.complete)
14908
+ return [];
14909
+ return [
14910
+ `Global source coverage: ${result.expectedSlugs.length - result.missingSlugs.length}/${result.expectedSlugs.length} registered global-* sources are in this render. Missing: ${result.missingSlugs.join(", ")}`
14911
+ ];
14912
+ }
14913
+
14768
14914
  // src/lib/platform-profiles.ts
14769
14915
  init_config_store();
14770
14916
 
@@ -15431,6 +15577,11 @@ async function collectSessionSources(opts, tool, store) {
15431
15577
  }
15432
15578
  return sources.map((source) => replaceIds.has(source.id) ? { ...source, merge: "replace" } : source);
15433
15579
  }
15580
+ async function checkGlobalSourceCoverage(plan, store) {
15581
+ const registryConfigs = await store.listConfigs({});
15582
+ const configuredSlugs = accountedGlobalSourceSlugs(plan.manifest);
15583
+ return computeGlobalSourceCoverage(registryConfigs, configuredSlugs);
15584
+ }
15434
15585
  function stripSessionFileContent(file) {
15435
15586
  const { content: _content, ...rest } = file;
15436
15587
  return rest;
@@ -15594,6 +15745,28 @@ program.command("show <id>").alias("inspect").description("Show a config's conte
15594
15745
  process.exit(1);
15595
15746
  }
15596
15747
  });
15748
+ program.command("tag <id>").description("Add or remove tags on a stored config (metadata-only; content/target_path untouched)").option("--add <tag>", "tag to add; repeatable", collectOption, []).option("--remove <tag>", "tag to remove; repeatable", collectOption, []).option("--json", "output the updated config as JSON").action(async (id, opts) => {
15749
+ const add = opts.add;
15750
+ const remove = opts.remove;
15751
+ if (add.length === 0 && remove.length === 0) {
15752
+ console.error(chalk.red("Pass at least one --add <tag> or --remove <tag>."));
15753
+ process.exit(1);
15754
+ }
15755
+ const store = resolveConfigStore();
15756
+ const config = await store.getConfig(id);
15757
+ const tagSet = new Set(config.tags);
15758
+ for (const t of add)
15759
+ tagSet.add(t);
15760
+ for (const t of remove)
15761
+ tagSet.delete(t);
15762
+ const nextTags = [...tagSet].sort();
15763
+ const updated = await store.updateConfig(config.id, { tags: nextTags });
15764
+ if (opts.json) {
15765
+ printJson(updated);
15766
+ return;
15767
+ }
15768
+ console.log(chalk.green("\u2713") + ` Tags on ${chalk.bold(updated.name)} ${chalk.dim(`(${updated.slug})`)}: ${nextTags.join(", ") || chalk.dim("(none)")}`);
15769
+ });
15597
15770
  program.command("add <path>").description("Ingest a file into the config DB").option("-n, --name <name>", "config name (defaults to filename)").option("-c, --category <cat>", "category override").option("-a, --agent <agent>", "agent override").option("-k, --kind <kind>", "kind: file|reference", "file").option("--template", "mark as template (has {{VAR}} placeholders)").option("--update", "if a config already owns this path, update that row in place instead of refusing").action(async (filePath, opts) => {
15598
15771
  const abs = resolve8(filePath);
15599
15772
  if (!existsSync16(abs)) {
@@ -16089,14 +16262,15 @@ projectContextCmd.command("apply").description("Atomically write project context
16089
16262
  }
16090
16263
  });
16091
16264
  var sessionCmd = program.command("session").description("Plan and apply session-scoped agent instruction files");
16092
- sessionCmd.command("plan").description("Produce a dry-run render plan for profile-scoped instruction injection").requiredOption("--tool <tool>", `target tool (${SESSION_RENDER_TOOLS.join("|")})`).requiredOption("--profile <profile>", "account/profile name that owns the rendered instruction home").option("--target-home <path>", "override generated profile-scoped target home").option("--project-root <path>", "repository root for project-scoped adapters such as Cursor").option("--session-id <id>", "session id to include in the manifest").option("--source <layer:id=path>", `instruction source file; layers: ${SESSION_SOURCE_LAYER_HELP}`, collectOption, []).option("--config <layer:id-or-slug>", "stored config source by id/slug; repeatable; layer aliases match --source", collectOption, []).option("--identity-export <path>", "OpenIdentities configs instruction export JSON; repeatable", collectOption, []).option("--replace-source <id>", "source id that replaces earlier layers instead of appending", collectOption, []).option("--codewith-native-imports", "select the gated Codewith native @ import adapter").option("--allow-empty-sources", "allow an explicit empty render plan").option("--json", "output dry-run JSON").action(async (opts) => {
16265
+ sessionCmd.command("plan").description("Produce a dry-run render plan for profile-scoped instruction injection").requiredOption("--tool <tool>", `target tool (${SESSION_RENDER_TOOLS.join("|")})`).requiredOption("--profile <profile>", "account/profile name that owns the rendered instruction home").option("--target-home <path>", "override generated profile-scoped target home").option("--project-root <path>", "repository root for project-scoped adapters such as Cursor").option("--session-id <id>", "session id to include in the manifest").option("--source <layer:id=path>", `instruction source file; layers: ${SESSION_SOURCE_LAYER_HELP}`, collectOption, []).option("--config <layer:id-or-slug>", "stored config source by id/slug; repeatable; layer aliases match --source", collectOption, []).option("--identity-export <path>", "OpenIdentities configs instruction export JSON; repeatable", collectOption, []).option("--replace-source <id>", "source id that replaces earlier layers instead of appending", collectOption, []).option("--codewith-native-imports", "select the gated Codewith native @ import adapter").option("--allow-empty-sources", "allow an explicit empty render plan").option("--check-global-coverage", "warn (non-fatal) when a registered, non-retired global-* source is absent from this render's --config list; expected is read fresh from the registry, independent of this plan (todos 102d6d0a)").option("--json", "output dry-run JSON").action(async (opts) => {
16093
16266
  try {
16094
16267
  const tool = opts.tool;
16095
16268
  if (!SESSION_RENDER_TOOLS.includes(tool)) {
16096
16269
  console.error(chalk.red(`Unsupported tool: ${opts.tool}`));
16097
16270
  process.exit(1);
16098
16271
  }
16099
- const sources = await collectSessionSources(opts, tool, resolveConfigStore());
16272
+ const store = resolveConfigStore();
16273
+ const sources = await collectSessionSources(opts, tool, store);
16100
16274
  const plan = planSessionRender({
16101
16275
  tool,
16102
16276
  profile: opts.profile,
@@ -16107,8 +16281,12 @@ sessionCmd.command("plan").description("Produce a dry-run render plan for profil
16107
16281
  allowEmptySources: opts.allowEmptySources,
16108
16282
  sources
16109
16283
  });
16284
+ const globalCoverage = opts.checkGlobalCoverage ? await checkGlobalSourceCoverage(plan, store) : null;
16110
16285
  if (opts.json) {
16111
- printJson(planJsonForOutput(plan));
16286
+ printJson({
16287
+ ...planJsonForOutput(plan),
16288
+ ...globalCoverage ? { globalSourceCoverage: globalCoverage } : {}
16289
+ });
16112
16290
  return;
16113
16291
  }
16114
16292
  console.log(chalk.bold(`${plan.tool} session render plan`) + chalk.dim(` (${plan.adapter.mode})`));
@@ -16128,20 +16306,27 @@ sessionCmd.command("plan").description("Produce a dry-run render plan for profil
16128
16306
  for (const warning of plan.warnings)
16129
16307
  console.log(chalk.yellow(`warning: ${warning}`));
16130
16308
  }
16309
+ if (globalCoverage) {
16310
+ for (const warning of formatGlobalSourceCoverageWarnings(globalCoverage))
16311
+ console.log(chalk.yellow(`warning: ${warning}`));
16312
+ if (globalCoverage.complete)
16313
+ console.log(chalk.dim(`global source coverage: ${globalCoverage.expectedSlugs.length}/${globalCoverage.expectedSlugs.length} complete`));
16314
+ }
16131
16315
  console.log(chalk.dim("Dry run only. No files were written."));
16132
16316
  } catch (e) {
16133
16317
  console.error(chalk.red(formatCliError(e)));
16134
16318
  process.exit(1);
16135
16319
  }
16136
16320
  });
16137
- sessionCmd.command("apply").description("Write a session render plan to its managed target home or explicit project root").requiredOption("--tool <tool>", `target tool (${SESSION_RENDER_TOOLS.join("|")})`).requiredOption("--profile <profile>", "account/profile name that owns the rendered instruction home").option("--target-home <path>", "override generated profile-scoped target home").option("--project-root <path>", "repository root for project-scoped adapters such as Cursor").option("--session-id <id>", "session id to include in the manifest").option("--source <layer:id=path>", `instruction source file; layers: ${SESSION_SOURCE_LAYER_HELP}`, collectOption, []).option("--config <layer:id-or-slug>", "stored config source by id/slug; repeatable; layer aliases match --source", collectOption, []).option("--identity-export <path>", "OpenIdentities configs instruction export JSON; repeatable", collectOption, []).option("--replace-source <id>", "source id that replaces earlier layers instead of appending", collectOption, []).option("--codewith-native-imports", "select the gated Codewith native @ import adapter").option("--allow-empty-sources", "allow an explicit empty render").option("--dry-run", "preview writes and conflicts without writing").option("--force", "overwrite existing unmanaged files").option("--json", "output apply JSON").action(async (opts) => {
16321
+ sessionCmd.command("apply").description("Write a session render plan to its managed target home or explicit project root").requiredOption("--tool <tool>", `target tool (${SESSION_RENDER_TOOLS.join("|")})`).requiredOption("--profile <profile>", "account/profile name that owns the rendered instruction home").option("--target-home <path>", "override generated profile-scoped target home").option("--project-root <path>", "repository root for project-scoped adapters such as Cursor").option("--session-id <id>", "session id to include in the manifest").option("--source <layer:id=path>", `instruction source file; layers: ${SESSION_SOURCE_LAYER_HELP}`, collectOption, []).option("--config <layer:id-or-slug>", "stored config source by id/slug; repeatable; layer aliases match --source", collectOption, []).option("--identity-export <path>", "OpenIdentities configs instruction export JSON; repeatable", collectOption, []).option("--replace-source <id>", "source id that replaces earlier layers instead of appending", collectOption, []).option("--codewith-native-imports", "select the gated Codewith native @ import adapter").option("--allow-empty-sources", "allow an explicit empty render").option("--check-global-coverage", "warn (non-fatal) when a registered, non-retired global-* source is absent from this render's --config list; expected is read fresh from the registry, independent of this plan (todos 102d6d0a)").option("--dry-run", "preview writes and conflicts without writing").option("--force", "overwrite existing unmanaged files").option("--json", "output apply JSON").action(async (opts) => {
16138
16322
  try {
16139
16323
  const tool = opts.tool;
16140
16324
  if (!SESSION_RENDER_TOOLS.includes(tool)) {
16141
16325
  console.error(chalk.red(`Unsupported tool: ${opts.tool}`));
16142
16326
  process.exit(1);
16143
16327
  }
16144
- const sources = await collectSessionSources(opts, tool, resolveConfigStore());
16328
+ const store = resolveConfigStore();
16329
+ const sources = await collectSessionSources(opts, tool, store);
16145
16330
  const plan = planSessionRender({
16146
16331
  tool,
16147
16332
  profile: opts.profile,
@@ -16152,9 +16337,13 @@ sessionCmd.command("apply").description("Write a session render plan to its mana
16152
16337
  allowEmptySources: opts.allowEmptySources,
16153
16338
  sources
16154
16339
  });
16340
+ const globalCoverage = opts.checkGlobalCoverage ? await checkGlobalSourceCoverage(plan, store) : null;
16155
16341
  const result = applySessionRender(plan, { dryRun: opts.dryRun, force: opts.force });
16156
16342
  if (opts.json) {
16157
- printJson(result);
16343
+ printJson({
16344
+ ...result,
16345
+ ...globalCoverage ? { globalSourceCoverage: globalCoverage } : {}
16346
+ });
16158
16347
  if (result.conflicts.length > 0)
16159
16348
  process.exitCode = 1;
16160
16349
  return;
@@ -16177,6 +16366,16 @@ sessionCmd.command("apply").description("Write a session render plan to its mana
16177
16366
  if (file.reason)
16178
16367
  console.log(chalk.dim(` ${file.reason}`));
16179
16368
  }
16369
+ if (result.warnings.length > 0) {
16370
+ for (const warning of result.warnings)
16371
+ console.log(chalk.yellow(`warning: ${warning}`));
16372
+ }
16373
+ if (globalCoverage) {
16374
+ for (const warning of formatGlobalSourceCoverageWarnings(globalCoverage))
16375
+ console.log(chalk.yellow(`warning: ${warning}`));
16376
+ if (globalCoverage.complete)
16377
+ console.log(chalk.dim(`global source coverage: ${globalCoverage.expectedSlugs.length}/${globalCoverage.expectedSlugs.length} complete`));
16378
+ }
16180
16379
  if (result.conflicts.length > 0) {
16181
16380
  console.error(chalk.red(`Conflicts: ${result.conflicts.length}. Re-run with --force to overwrite unmanaged files.`));
16182
16381
  process.exitCode = 1;
package/dist/index.js CHANGED
@@ -8442,6 +8442,21 @@ function canonicalFingerprintValue(value) {
8442
8442
  }
8443
8443
  return value;
8444
8444
  }
8445
+ function ruleAttestation(rule) {
8446
+ const metadata = rule.metadata ?? {};
8447
+ const read = (key) => {
8448
+ const value = metadata[key];
8449
+ return typeof value === "string" ? value : null;
8450
+ };
8451
+ const applied = metadata["payloadFloorApplied"];
8452
+ return {
8453
+ contentSha256: sha2563(rule.content ?? ""),
8454
+ payloadFloorApplied: typeof applied === "boolean" ? applied : null,
8455
+ flooredFromRulesVersion: read("flooredFromRulesVersion"),
8456
+ flooredFromPayloadSha256: read("flooredFromPayloadSha256"),
8457
+ payloadIntegrity: read("payloadIntegrity")
8458
+ };
8459
+ }
8445
8460
  function sourceFingerprint(source) {
8446
8461
  return {
8447
8462
  id: source.id,
@@ -8540,6 +8555,35 @@ function applyAgentOperatingRulesFloor(source, content) {
8540
8555
  metadata: { ...source.metadata ?? {}, ...payload.metadata, ...floored }
8541
8556
  };
8542
8557
  }
8558
+ function applyAgentOperatingRulesFloorToRule(source, rule, content) {
8559
+ const unchanged = { content, metadata: rule.metadata ?? null };
8560
+ if (!claimsAgentOperatingRulesPolicy(source, content))
8561
+ return unchanged;
8562
+ const payload = resolveAgentOperatingRulesPayload(content);
8563
+ if (payload.content === content) {
8564
+ return {
8565
+ content,
8566
+ metadata: { ...rule.metadata ?? {}, payloadIntegrity: payload.integrity }
8567
+ };
8568
+ }
8569
+ const floored = {
8570
+ payloadFloorApplied: true,
8571
+ flooredFromRulesVersion: parseAgentOperatingRulesVersion(content),
8572
+ flooredFromPayloadSha256: sha2563(content)
8573
+ };
8574
+ return {
8575
+ content: payload.content,
8576
+ metadata: { ...rule.metadata ?? {}, ...payload.metadata, ...floored }
8577
+ };
8578
+ }
8579
+ function skippedSource(source, reason) {
8580
+ return {
8581
+ id: source.id,
8582
+ label: source.resolvedLabel,
8583
+ targetProviders: source.targetProviders ?? [],
8584
+ reason
8585
+ };
8586
+ }
8543
8587
  function normalizeSources(sources, tool, allowEmptySources) {
8544
8588
  const normalized = sources.map((source, index) => {
8545
8589
  if (!source.id.trim())
@@ -8564,27 +8608,73 @@ function normalizeSources(sources, tool, allowEmptySources) {
8564
8608
  }
8565
8609
  return normalized2;
8566
8610
  });
8567
- const ordered = deduplicateSemanticPolicySources(normalized).sort((a, b) => SESSION_LAYER_RANK[a.resolvedLayer] - SESSION_LAYER_RANK[b.resolvedLayer] || a.resolvedOrder - b.resolvedOrder || a.id.localeCompare(b.id));
8611
+ const deduplicated = deduplicateSemanticPolicySources(normalized);
8612
+ const ordered = deduplicated.selected.sort((a, b) => SESSION_LAYER_RANK[a.resolvedLayer] - SESSION_LAYER_RANK[b.resolvedLayer] || a.resolvedOrder - b.resolvedOrder || a.id.localeCompare(b.id));
8568
8613
  rejectDuplicateSourceSlugs(ordered);
8569
8614
  rejectDuplicateRulePaths(ordered);
8570
- return ordered;
8615
+ return { sources: ordered, skipped: deduplicated.skipped };
8616
+ }
8617
+ function semanticPolicyIntegrity(body) {
8618
+ return sha2563(body) === AGENT_OPERATING_RULES_PAYLOAD_SHA256 ? "pinned-digest" : "unverified-self-declared";
8619
+ }
8620
+ function semanticPolicyDeclaration(source) {
8621
+ const normalize = (value) => value.replace(/\r\n/g, `
8622
+ `).trim();
8623
+ const sentinel = source.content.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
8624
+ if (sentinel) {
8625
+ return {
8626
+ version: sentinel[1],
8627
+ normalizedContent: normalize(source.content),
8628
+ integrity: semanticPolicyIntegrity(source.content)
8629
+ };
8630
+ }
8631
+ for (const rule of source.resolvedRules) {
8632
+ const body = rule.content ?? "";
8633
+ if (!claimsAgentOperatingRulesPolicy(source, body))
8634
+ continue;
8635
+ const ruleSentinel = body.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
8636
+ if (!ruleSentinel)
8637
+ continue;
8638
+ return {
8639
+ version: ruleSentinel[1],
8640
+ normalizedContent: normalize(body),
8641
+ integrity: semanticPolicyIntegrity(body)
8642
+ };
8643
+ }
8644
+ return null;
8645
+ }
8646
+ function withoutSemanticPolicyPayloads(source) {
8647
+ const content = AGENT_OPERATING_RULES_SENTINEL_PATTERN.test(source.content) ? "" : source.content;
8648
+ const resolvedRules = source.resolvedRules.filter((rule) => {
8649
+ const body = rule.content ?? "";
8650
+ return !(AGENT_OPERATING_RULES_SENTINEL_PATTERN.test(body) && claimsAgentOperatingRulesPolicy(source, body));
8651
+ });
8652
+ const hasPathReferences = (source.sourcePaths ?? []).length > 0;
8653
+ if (!content.trim() && resolvedRules.length === 0 && !hasPathReferences)
8654
+ return null;
8655
+ return { ...source, content, resolvedRules };
8571
8656
  }
8572
8657
  function deduplicateSemanticPolicySources(sources) {
8573
8658
  const selected = [];
8659
+ const skipped = [];
8574
8660
  const policySources = new Map;
8661
+ const collapseReason = (winner, key, partial, displacesVerified) => `superseded by "${winner.id}": sources declaring the semantic policy ${key} collapse to one so a single instruction home cannot carry two rule-set versions` + (partial ? "; only the policy payload was removed and this source's other instructions still render" : "") + (displacesVerified ? "; WARNING the surviving payload is unverified-self-declared and displaced a digest-verified one on its own version claim" : "");
8662
+ const discard = (loser, winner, key, displacesVerified) => {
8663
+ const remainder = withoutSemanticPolicyPayloads(loser);
8664
+ skipped.push(skippedSource(loser, collapseReason(winner, key, remainder !== null, displacesVerified)));
8665
+ return remainder;
8666
+ };
8575
8667
  for (const source of sources) {
8576
- const sentinel = source.content.match(AGENT_OPERATING_RULES_SENTINEL_PATTERN);
8577
- if (!sentinel) {
8668
+ const declaration = semanticPolicyDeclaration(source);
8669
+ if (!declaration) {
8578
8670
  selected.push(source);
8579
8671
  continue;
8580
8672
  }
8581
- const version = sentinel[1];
8673
+ const { version, normalizedContent, integrity } = declaration;
8582
8674
  const key = AGENT_OPERATING_RULES_SEMANTIC_POLICY_KEY;
8583
- const normalizedContent = source.content.replace(/\r\n/g, `
8584
- `).trim();
8585
8675
  const existing = policySources.get(key);
8586
8676
  if (!existing) {
8587
- policySources.set(key, { index: selected.length, version, normalizedContent });
8677
+ policySources.set(key, { index: selected.length, version, normalizedContent, integrity });
8588
8678
  selected.push(source);
8589
8679
  continue;
8590
8680
  }
@@ -8594,23 +8684,30 @@ function deduplicateSemanticPolicySources(sources) {
8594
8684
  }
8595
8685
  const current = selected[existing.index];
8596
8686
  const priorityOrder = semanticPolicySourcePriority(source) - semanticPolicySourcePriority(current);
8597
- if (priorityOrder < 0)
8598
- continue;
8599
- if (priorityOrder === 0 && versionOrder <= 0)
8687
+ const displacesVerified = existing.integrity === "pinned-digest" && integrity === "unverified-self-declared";
8688
+ const arrivingWins = priorityOrder > 0 || priorityOrder === 0 && versionOrder > 0;
8689
+ if (!arrivingWins) {
8690
+ const remainder2 = discard(source, current, key, false);
8691
+ if (remainder2)
8692
+ selected.push(remainder2);
8600
8693
  continue;
8694
+ }
8695
+ const remainder = discard(current, source, key, displacesVerified);
8601
8696
  selected[existing.index] = {
8602
8697
  ...source,
8603
8698
  resolvedOrder: current.resolvedOrder
8604
8699
  };
8605
- policySources.set(key, { index: existing.index, version, normalizedContent });
8700
+ if (remainder)
8701
+ selected.push(remainder);
8702
+ policySources.set(key, { index: existing.index, version, normalizedContent, integrity });
8606
8703
  }
8607
- return selected;
8704
+ return { selected, skipped };
8608
8705
  }
8609
8706
  function semanticPolicySourcePriority(source) {
8610
8707
  let priority = 0;
8611
8708
  if (source.nonOverridable)
8612
8709
  priority += 4;
8613
- if (source.id === GLOBAL_AGENT_RULES_STANDARD_SLUG)
8710
+ if (source.id === GLOBAL_AGENT_RULES_STANDARD_SLUG || source.id === AGENT_OPERATING_RULES_SOURCE_ID)
8614
8711
  priority += 2;
8615
8712
  if (source.metadata?.["role"] === AGENT_OPERATING_RULES_ROLE)
8616
8713
  priority += 1;
@@ -8650,9 +8747,12 @@ function composeSources(sources) {
8650
8747
  start = i;
8651
8748
  }
8652
8749
  if (start < 0)
8653
- return sources;
8654
- const protectedSources = sources.slice(0, start).filter((source) => source.nonOverridable);
8655
- return [...protectedSources, ...sources.slice(start)];
8750
+ return { sources, skipped: [] };
8751
+ const earlier = sources.slice(0, start);
8752
+ const protectedSources = earlier.filter((source) => source.nonOverridable);
8753
+ const replacer = sources[start];
8754
+ const skipped = earlier.filter((source) => !source.nonOverridable).map((source) => skippedSource(source, `superseded by "${replacer.id}": a replace-merge source discards earlier overridable instruction layers`));
8755
+ return { sources: [...protectedSources, ...sources.slice(start)], skipped };
8656
8756
  }
8657
8757
  function sectionForSource(source) {
8658
8758
  const parts = [
@@ -9027,7 +9127,14 @@ function planSessionRender(input) {
9027
9127
  const targetOwner = resolveSessionTargetOwnership(input, { targetHome, targetKind });
9028
9128
  const blocked = blockers.length > 0;
9029
9129
  const allowEmptySources = input.allowEmptySources === true;
9030
- const orderedSources = composeSources(normalizeSources(input.sources, input.tool, allowEmptySources));
9130
+ const normalized = normalizeSources(input.sources, input.tool, allowEmptySources);
9131
+ const composed = composeSources(normalized.sources);
9132
+ const orderedSources = composed.sources;
9133
+ const skippedSources = [
9134
+ ...input.skippedSources ?? [],
9135
+ ...normalized.skipped,
9136
+ ...composed.skipped
9137
+ ];
9031
9138
  if (orderedSources.length === 0 && !allowEmptySources) {
9032
9139
  throw new Error("Session render has no instruction sources. Pass --allow-empty-sources only for explicit empty renders.");
9033
9140
  }
@@ -9035,7 +9142,8 @@ function planSessionRender(input) {
9035
9142
  const env = adapter.envVar && !blocked ? { [adapter.envVar]: targetHome } : {};
9036
9143
  const warnings = [
9037
9144
  ...orderedSources.length === 0 ? ["No instruction sources were provided."] : [],
9038
- ...blockers
9145
+ ...blockers,
9146
+ ...skippedSources.map((entry) => `Instruction source "${entry.id}" was not rendered: ${entry.reason}`)
9039
9147
  ];
9040
9148
  if (input.providerConfig && input.tool !== "opencode") {
9041
9149
  throw new Error("Provider base config is supported only for OpenCode session renders.");
@@ -9099,7 +9207,8 @@ function planSessionRender(input) {
9099
9207
  label: rule.resolvedLabel,
9100
9208
  path: rule.resolvedPath,
9101
9209
  globs: rule.globs ?? [],
9102
- hash: rule.hash ?? null
9210
+ hash: rule.hash ?? null,
9211
+ ...ruleAttestation(rule)
9103
9212
  })),
9104
9213
  renderedPayloadSha256: sha2563(source.content),
9105
9214
  provenance: source.provenance ?? null,
@@ -9107,7 +9216,7 @@ function planSessionRender(input) {
9107
9216
  })),
9108
9217
  ...projectContext ? [projectContext.source] : []
9109
9218
  ],
9110
- skippedSources: input.skippedSources ?? [],
9219
+ skippedSources,
9111
9220
  files: files.map((file) => ({
9112
9221
  path: file.path,
9113
9222
  relativePath: file.relativePath,
@@ -9321,7 +9430,8 @@ function normalizeInstructionRules(source, tool) {
9321
9430
  return (source.rules ?? []).map((rule) => {
9322
9431
  if (!rule.id.trim())
9323
9432
  throw new Error(`Instruction rule id is required for source ${source.id}.`);
9324
- const content = filterProviderOnlyBlocks(rule.content ?? "", tool);
9433
+ const floored = applyAgentOperatingRulesFloorToRule(source, rule, rule.content ?? "");
9434
+ const content = filterProviderOnlyBlocks(floored.content, tool);
9325
9435
  if (!content.trim() && !rule.path)
9326
9436
  throw new Error(`Instruction rule content or path is required for rule ${rule.id}.`);
9327
9437
  const resolvedPath = normalizeRulePath(rule.path ?? `${slug(rule.id)}.md`);
@@ -9332,6 +9442,7 @@ function normalizeInstructionRules(source, tool) {
9332
9442
  return {
9333
9443
  ...rule,
9334
9444
  content,
9445
+ metadata: floored.metadata,
9335
9446
  normalizedId: slug(rule.id),
9336
9447
  resolvedLabel: rule.label ?? rule.id,
9337
9448
  resolvedPath
@@ -10327,6 +10438,8 @@ function applySessionRenderUnlocked(plan, options, coordination) {
10327
10438
  manifestPath,
10328
10439
  snapshotPath: null,
10329
10440
  env: plan.env,
10441
+ warnings: plan.warnings,
10442
+ skippedSources: plan.manifest.skippedSources,
10330
10443
  files: results,
10331
10444
  conflicts,
10332
10445
  drift
@@ -10367,6 +10480,8 @@ function applySessionRenderUnlocked(plan, options, coordination) {
10367
10480
  manifestPath,
10368
10481
  snapshotPath,
10369
10482
  env: plan.env,
10483
+ warnings: plan.warnings,
10484
+ skippedSources: plan.manifest.skippedSources,
10370
10485
  files: results,
10371
10486
  conflicts,
10372
10487
  drift
@@ -127,7 +127,17 @@ export declare function compareAgentOperatingRulesVersions(left: string, right:
127
127
  * ties on priority in `deduplicateSemanticPolicySources` and then WINS on version,
128
128
  * EVICTING the genuine baseline from the same render; the collapse happens before
129
129
  * `rejectDuplicateSourceSlugs` runs, so the duplicate-slug guard never sees the
130
- * collision. Nothing in these bytes distinguishes a genuine future rules version from
130
+ * collision. That eviction was REACHABLE and is now narrowed, not closed: the managed
131
+ * source id `hasna-agent-operating-rules` earns precedence in
132
+ * `semanticPolicySourcePriority` alongside the managed slug, so the canonical source no
133
+ * longer merely ties with any export that sets `nonOverridable`, and an eviction by an
134
+ * unverified payload is reported in `skippedSources` and in `warnings` instead of
135
+ * passing as a routine collapse. An export that also mimics a canonical id still ties
136
+ * and still wins on version. Ordering by `payloadIntegrity` instead was tried and
137
+ * rejected: the pinned digest describes the EMBEDDED snapshot, so preferring it would
138
+ * freeze a home carrying that snapshot beside a newly published rules document — the
139
+ * same downgrade this floor exists to prevent, arriving by the selection path.
140
+ * Nothing in these bytes distinguishes a genuine future rules version from
131
141
  * an inflated one. Rejecting
132
142
  * above-baseline versions was considered and deliberately NOT done: the canonical
133
143
  * rules document ships from `@hasna/identities`, which legitimately runs ahead of the
@@ -138,15 +148,24 @@ export declare function compareAgentOperatingRulesVersions(left: string, right:
138
148
  * channel), not a comparison. Until then the choice is recorded rather than hidden:
139
149
  * every payload carries `payloadIntegrity`, which is `unverified-self-declared`
140
150
  * whenever bytes were accepted on their version claim alone.
141
- * 2. This function guards only the payloads routed through it, and the render pipeline
142
- * routes exactly one field: `source.content`. `normalizeSources` floors that, so a
143
- * claiming source is covered whether it came from the config store, an identity export,
144
- * or a file. `source.rules[].content` is NOT floored `normalizeInstructionRules` only
145
- * filters provider blocks, `normalizeIdentityRules` copies rule bodies straight out of
146
- * export JSON, and `deduplicateSemanticPolicySources` inspects only `source.content`.
147
- * So a sentinel carried inside a RULE is neither floored nor deduped nor attested, on
148
- * the same untrusted export transport this floor otherwise defends. That predates this
149
- * guard and is tracked as a follow-up; do not read the choke point as covering it.
151
+ * 2. This function guards only the payloads routed through it. The render pipeline routes
152
+ * BOTH `source.content` and `source.rules[].content`: `normalizeSources` floors the
153
+ * first and `normalizeInstructionRules` floors the second through
154
+ * `applyAgentOperatingRulesFloorToRule`, both before provider filtering, and
155
+ * `deduplicateSemanticPolicySources` reads a declaration from either field. A claiming
156
+ * source or rule is therefore covered whether it came from the config store, an
157
+ * identity export, or a file.
158
+ *
159
+ * The rule half was NOT covered until hasna/instructions#54, and this note used to say
160
+ * so in present tense. Until then a sentinel carried inside a RULE was neither floored
161
+ * nor deduped nor attested on the same untrusted export transport this floor otherwise
162
+ * defends, so an export installed a below-baseline NON-OVERRIDABLE rules document by
163
+ * putting it in `rules[]` instead of `content`.
164
+ *
165
+ * What remains uncovered is narrower and is stated so the choke point is not read as
166
+ * total: an unprivileged rule that merely QUOTES the rules mid-body is deliberately not
167
+ * floored (the F2 false positive), and a rule under a privileged parent IS floored even
168
+ * when it only quotes them.
150
169
  *
151
170
  * The attestation is also PER-RENDER, not durable: a repair is recorded in the manifest
152
171
  * of the render that performed it, so fleet-wide auditing needs those manifests
@@ -1 +1 @@
1
- {"version":3,"file":"global-agent-rules-standard.d.ts","sourceRoot":"","sources":["../../src/lib/global-agent-rules-standard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE/E,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAE9E,eAAO,MAAM,mCAAmC,EAAG,mCAA4C,CAAC;AAChG,eAAO,MAAM,+BAA+B,EAAG,6BAAsC,CAAC;AACtF,yFAAyF;AACzF,eAAO,MAAM,0BAA0B,EAAG,uBAAgC,CAAC;AAC3E,eAAO,MAAM,6BAA6B,EAAG,OAAgB,CAAC;AAC9D,eAAO,MAAM,wCAAwC,EAAG,YAAqB,CAAC;AAC9E,eAAO,MAAM,8BAA8B,EAAG,8CAAuD,CAAC;AACtG;;;;;GAKG;AACH,eAAO,MAAM,yCAAyC,EAAG,6BAAsC,CAAC;AAChG,6FAA6F;AAC7F,eAAO,MAAM,sCAAsC,QAA2E,CAAC;AAC/H;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,QAAsG,CAAC;AACzJ,eAAO,MAAM,oCAAoC,EAAG,kEAA2E,CAAC;AAChI,eAAO,MAAM,oCAAoC,oEAAuC,CAAC;AACzF,eAAO,MAAM,0CAA0C,EAAG,kEAA2E,CAAC;AACtI,eAAO,MAAM,2CAA2C,EAAG,2DAAoE,CAAC;AAEhI,eAAO,MAAM,8BAA8B;;;;CAIjC,CAAC;AAEX,eAAO,MAAM,iCAAiC;;;;;;;CAOpC,CAAC;AAEX,eAAO,MAAM,gCAAgC;;;;;;;;;;;;CAYnC,CAAC;AAEX,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;CAejC,CAAC;AAEX,eAAO,MAAM,0BAA0B,8ZAA8Z,CAAC;AAEtc,eAAO,MAAM,mCAAmC,QA+B7B,CAAC;AAEpB,iFAAiF;AACjF,MAAM,MAAM,gCAAgC,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,MAAM,mCAAmC,GAAG,eAAe,GAAG,0BAA0B,CAAC;AAE/F,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gCAAgC,CAAC;IACzC,iFAAiF;IACjF,uBAAuB,EAAE,OAAO,CAAC;IACjC,gFAAgF;IAChF,SAAS,EAAE,mCAAmC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,2EAA2E;AAC3E,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEjG;AAED,qDAAqD;AACrD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtF;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,0BAA0B,CA0E5B;AAwBD;;;;;;GAMG;AACH,wBAAsB,oCAAoC,CAAC,KAAK,GAAE,WAAkC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrH"}
1
+ {"version":3,"file":"global-agent-rules-standard.d.ts","sourceRoot":"","sources":["../../src/lib/global-agent-rules-standard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE/E,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAE9E,eAAO,MAAM,mCAAmC,EAAG,mCAA4C,CAAC;AAChG,eAAO,MAAM,+BAA+B,EAAG,6BAAsC,CAAC;AACtF,yFAAyF;AACzF,eAAO,MAAM,0BAA0B,EAAG,uBAAgC,CAAC;AAC3E,eAAO,MAAM,6BAA6B,EAAG,OAAgB,CAAC;AAC9D,eAAO,MAAM,wCAAwC,EAAG,YAAqB,CAAC;AAC9E,eAAO,MAAM,8BAA8B,EAAG,8CAAuD,CAAC;AACtG;;;;;GAKG;AACH,eAAO,MAAM,yCAAyC,EAAG,6BAAsC,CAAC;AAChG,6FAA6F;AAC7F,eAAO,MAAM,sCAAsC,QAA2E,CAAC;AAC/H;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,QAAsG,CAAC;AACzJ,eAAO,MAAM,oCAAoC,EAAG,kEAA2E,CAAC;AAChI,eAAO,MAAM,oCAAoC,oEAAuC,CAAC;AACzF,eAAO,MAAM,0CAA0C,EAAG,kEAA2E,CAAC;AACtI,eAAO,MAAM,2CAA2C,EAAG,2DAAoE,CAAC;AAEhI,eAAO,MAAM,8BAA8B;;;;CAIjC,CAAC;AAEX,eAAO,MAAM,iCAAiC;;;;;;;CAOpC,CAAC;AAEX,eAAO,MAAM,gCAAgC;;;;;;;;;;;;CAYnC,CAAC;AAEX,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;CAejC,CAAC;AAEX,eAAO,MAAM,0BAA0B,8ZAA8Z,CAAC;AAEtc,eAAO,MAAM,mCAAmC,QA+B7B,CAAC;AAEpB,iFAAiF;AACjF,MAAM,MAAM,gCAAgC,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,MAAM,mCAAmC,GAAG,eAAe,GAAG,0BAA0B,CAAC;AAE/F,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gCAAgC,CAAC;IACzC,iFAAiF;IACjF,uBAAuB,EAAE,OAAO,CAAC;IACjC,gFAAgF;IAChF,SAAS,EAAE,mCAAmC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,2EAA2E;AAC3E,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEjG;AAED,qDAAqD;AACrD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtF;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,0BAA0B,CA0E5B;AAwBD;;;;;;GAMG;AACH,wBAAsB,oCAAoC,CAAC,KAAK,GAAE,WAAkC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrH"}
@@ -0,0 +1,41 @@
1
+ export declare const GLOBAL_SOURCE_SLUG_PREFIX = "global-";
2
+ export declare const RETIRED_GLOBAL_SOURCE_TAG = "retired-global-source";
3
+ export interface GlobalSourceCoverageConfig {
4
+ slug: string;
5
+ category: string;
6
+ tags?: string[] | null;
7
+ }
8
+ /** The set of global sources that SHOULD be present in any render that claims
9
+ * global coverage: registered, slug-prefixed `global-`, and not tagged retired. */
10
+ export declare function expectedGlobalSourceSlugs(registryConfigs: readonly GlobalSourceCoverageConfig[]): string[];
11
+ export interface GlobalSourceCoverageResult {
12
+ /** Registered, active global sources — the independent "should exist" side. */
13
+ expectedSlugs: string[];
14
+ /** Slugs actually present on the render plan/manifest being audited. */
15
+ configuredSlugs: string[];
16
+ /** Expected but absent from the render — the actual defect this exists to catch. */
17
+ missingSlugs: string[];
18
+ /** Present on the render but not a currently-expected global source (renamed,
19
+ * retired since the render was built, or simply not a `global-*` slug at all —
20
+ * informational only, never blocking). */
21
+ unexpectedSlugs: string[];
22
+ /** True only when every expected slug is present. */
23
+ complete: boolean;
24
+ }
25
+ export interface GlobalSourceCoverageManifest {
26
+ sources: readonly {
27
+ id: string;
28
+ }[];
29
+ skippedSources: readonly {
30
+ id: string;
31
+ }[];
32
+ }
33
+ /** Global config ids the caller supplied to a render, whether they survived
34
+ * composition or were deliberately reported as skipped. A skipped source was
35
+ * configured and accounted for; treating it as absent recreates the exact
36
+ * false-positive this coverage check exists to distinguish from a real gap. */
37
+ export declare function accountedGlobalSourceSlugs(manifest: GlobalSourceCoverageManifest): string[];
38
+ export declare function computeGlobalSourceCoverage(registryConfigs: readonly GlobalSourceCoverageConfig[], configuredSlugs: Iterable<string>): GlobalSourceCoverageResult;
39
+ /** Human-readable warning lines for CLI/manifest output. Empty array means clean. */
40
+ export declare function formatGlobalSourceCoverageWarnings(result: GlobalSourceCoverageResult): string[];
41
+ //# sourceMappingURL=global-source-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-source-coverage.d.ts","sourceRoot":"","sources":["../../src/lib/global-source-coverage.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,yBAAyB,YAAY,CAAC;AA0BnD,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACxB;AAED;mFACmF;AACnF,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,SAAS,0BAA0B,EAAE,GACrD,MAAM,EAAE,CAMV;AAED,MAAM,WAAW,0BAA0B;IACzC,+EAA+E;IAC/E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,wEAAwE;IACxE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oFAAoF;IACpF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;8CAE0C;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnC,cAAc,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3C;AAED;;;+EAG+E;AAC/E,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,4BAA4B,GACrC,MAAM,EAAE,CAIV;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,SAAS,0BAA0B,EAAE,EACtD,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,GAChC,0BAA0B,CAe5B;AAED,qFAAqF;AACrF,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAK/F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global-source-coverage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-source-coverage.test.d.ts","sourceRoot":"","sources":["../../src/lib/global-source-coverage.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import { type SessionRenderFileRole, type SessionRenderPlan } from "./session-render.js";
1
+ import { type SessionRenderFileRole, type SessionRenderPlan, type SessionSkippedSource } from "./session-render.js";
2
2
  export type SessionApplyAction = "create" | "update" | "delete" | "unchanged" | "conflict";
3
3
  export interface SessionApplyFileResult {
4
4
  path: string;
@@ -32,6 +32,8 @@ export interface SessionApplyResult {
32
32
  manifestPath: string;
33
33
  snapshotPath: string | null;
34
34
  env: Record<string, string>;
35
+ warnings: string[];
36
+ skippedSources: SessionSkippedSource[];
35
37
  files: SessionApplyFileResult[];
36
38
  conflicts: SessionApplyFileResult[];
37
39
  drift: SessionDriftCheck;
@@ -1 +1 @@
1
- {"version":3,"file":"session-apply.d.ts","sourceRoot":"","sources":["../../src/lib/session-apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-apply.d.ts","sourceRoot":"","sources":["../../src/lib/session-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-render-rule-currency-floor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-render-rule-currency-floor.test.d.ts","sourceRoot":"","sources":["../../src/lib/session-render-rule-currency-floor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-render-silent-source-drop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-render-silent-source-drop.test.d.ts","sourceRoot":"","sources":["../../src/lib/session-render-silent-source-drop.test.ts"],"names":[],"mappings":""}
@@ -150,6 +150,11 @@ export interface SessionRenderManifest {
150
150
  path: string;
151
151
  globs: string[];
152
152
  hash: string | null;
153
+ contentSha256: string;
154
+ payloadFloorApplied: boolean | null;
155
+ flooredFromRulesVersion: string | null;
156
+ flooredFromPayloadSha256: string | null;
157
+ payloadIntegrity: string | null;
153
158
  }>;
154
159
  renderedPayloadSha256: string;
155
160
  provenance: Record<string, unknown> | null;
@@ -1 +1 @@
1
- {"version":3,"file":"session-render.d.ts","sourceRoot":"","sources":["../../src/lib/session-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-render.d.ts","sourceRoot":"","sources":["../../src/lib/session-render.ts"],"names":[],"mappings":"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"}
package/dist/mcp/index.js CHANGED
@@ -6957,7 +6957,7 @@ var init_sync_dir = __esm(() => {
6957
6957
  var require_package = __commonJS((exports, module) => {
6958
6958
  module.exports = {
6959
6959
  name: "@hasna/instructions",
6960
- version: "0.4.17",
6960
+ version: "0.4.19",
6961
6961
  description: "AI coding agent instruction & configuration manager \u2014 store, version, apply, and share all your AI coding configs. CLI + MCP + HTTP API (instructions-serve) + generated SDK + Dashboard.",
6962
6962
  type: "module",
6963
6963
  main: "dist/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/instructions",
3
- "version": "0.4.17",
3
+ "version": "0.4.19",
4
4
  "description": "AI coding agent instruction & configuration manager \u2014 store, version, apply, and share all your AI coding configs. CLI + MCP + HTTP API (instructions-serve) + generated SDK + Dashboard.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",