@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 +227 -28
- package/dist/index.js +137 -22
- package/dist/lib/global-agent-rules-standard.d.ts +29 -10
- package/dist/lib/global-agent-rules-standard.d.ts.map +1 -1
- package/dist/lib/global-source-coverage.d.ts +41 -0
- package/dist/lib/global-source-coverage.d.ts.map +1 -0
- package/dist/lib/global-source-coverage.test.d.ts +2 -0
- package/dist/lib/global-source-coverage.test.d.ts.map +1 -0
- package/dist/lib/session-apply.d.ts +3 -1
- package/dist/lib/session-apply.d.ts.map +1 -1
- package/dist/lib/session-render-rule-currency-floor.test.d.ts +2 -0
- package/dist/lib/session-render-rule-currency-floor.test.d.ts.map +1 -0
- package/dist/lib/session-render-silent-source-drop.test.d.ts +2 -0
- package/dist/lib/session-render-silent-source-drop.test.d.ts.map +1 -0
- package/dist/lib/session-render.d.ts +5 -0
- package/dist/lib/session-render.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
10506
|
-
if (!
|
|
10597
|
+
const declaration = semanticPolicyDeclaration(source);
|
|
10598
|
+
if (!declaration) {
|
|
10507
10599
|
selected.push(source);
|
|
10508
10600
|
continue;
|
|
10509
10601
|
}
|
|
10510
|
-
const version =
|
|
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
|
-
|
|
10527
|
-
|
|
10528
|
-
if (
|
|
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
|
-
|
|
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
|
|
10584
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
8577
|
-
if (!
|
|
8668
|
+
const declaration = semanticPolicyDeclaration(source);
|
|
8669
|
+
if (!declaration) {
|
|
8578
8670
|
selected.push(source);
|
|
8579
8671
|
continue;
|
|
8580
8672
|
}
|
|
8581
|
-
const version =
|
|
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
|
-
|
|
8598
|
-
|
|
8599
|
-
if (
|
|
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
|
-
|
|
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
|
|
8655
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
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
|
|
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 @@
|
|
|
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":"AAiBA,OAAO,EAIL,KAAK,qBAAqB,EAE1B,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"session-apply.d.ts","sourceRoot":"","sources":["../../src/lib/session-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
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.
|
|
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.
|
|
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",
|