pluribus-context 0.3.34 → 0.3.36
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/CHANGELOG.md +23 -0
- package/README.md +2 -1
- package/bin/pluribus.js +12 -0
- package/docs/agent-firewall-denial-audit.md +95 -0
- package/docs/ai-pr-review-receipts.md +173 -0
- package/docs/canonical-output-receipts.md +107 -0
- package/docs/compaction-resume-receipts.md +43 -0
- package/docs/controlled-learning-queue.md +48 -0
- package/docs/dynamic-workflow-run-receipts.md +158 -0
- package/docs/install-plan-receipts.md +79 -0
- package/docs/loaded-resource-boundary.md +97 -0
- package/docs/mcp-tool-visibility-receipts.md +67 -0
- package/docs/memory-write-policy-receipts.md +41 -0
- package/docs/parallel-session-review-ledger.md +103 -0
- package/docs/phase-boundary-contracts.md +87 -0
- package/docs/review-primitive-gate.md +109 -0
- package/docs/skill-install-receipts.md +102 -0
- package/docs/skill-policy-receipts.md +87 -0
- package/docs/skill-use-rate-receipts.md +104 -0
- package/docs/subagent-role-receipts.md +95 -0
- package/docs/temporal-context-receipts.md +123 -0
- package/examples/agent-firewall-denial-audit/README.md +14 -0
- package/examples/agent-firewall-denial-audit/check-denial-audit.mjs +116 -0
- package/examples/agent-firewall-denial-audit/denial-envelope.json +9 -0
- package/examples/agent-firewall-denial-audit/operator-audit-record.json +20 -0
- package/examples/agent-skills/skill-policy-receipts/README.md +22 -0
- package/examples/agent-skills/skill-policy-receipts/SKILL.md +77 -0
- package/examples/ai-pr-review-receipts/.github/pull_request_template.md +31 -0
- package/examples/ai-pr-review-receipts/.github/workflows/ai-pr-review-receipt.yml +25 -0
- package/examples/ai-pr-review-receipts/README.md +55 -0
- package/examples/ai-pr-review-receipts/incomplete-review-primitive-receipt.json +43 -0
- package/examples/ai-pr-review-receipts/review-primitive-receipt.json +60 -0
- package/examples/canonical-output-receipts/canonical-output-receipt.json +55 -0
- package/examples/claude-code-review-hook/README.md +74 -0
- package/examples/claude-code-review-hook/check-review-receipt-hook.mjs +80 -0
- package/examples/claude-code-review-hook/sample-task-completed-event.json +6 -0
- package/examples/compaction-resume-receipts/README.md +12 -0
- package/examples/compaction-resume-receipts/check-resume-receipt.mjs +116 -0
- package/examples/compaction-resume-receipts/safe-resume-receipt.json +52 -0
- package/examples/compaction-resume-receipts/unsafe-resume-receipt.json +41 -0
- package/examples/controlled-learning-queue/README.md +26 -0
- package/examples/controlled-learning-queue/check-learning-queue.mjs +44 -0
- package/examples/controlled-learning-queue/leads/acme-job-card.md +12 -0
- package/examples/controlled-learning-queue/learning_queue.md +27 -0
- package/examples/controlled-learning-queue/memory/durable.md +10 -0
- package/examples/controlled-learning-queue/memory/working-notes.md +5 -0
- package/examples/controlled-learning-queue/role/job-contract.md +18 -0
- package/examples/controlled-learning-queue/skills/qualify-lead.md +17 -0
- package/examples/dynamic-workflow-run-receipts/README.md +18 -0
- package/examples/dynamic-workflow-run-receipts/workflow-run-receipt.json +112 -0
- package/examples/install-plan-receipts/README.md +34 -0
- package/examples/install-plan-receipts/agent-install-plan-receipt.json +56 -0
- package/examples/loaded-resource-boundary/README.md +22 -0
- package/examples/loaded-resource-boundary/check-loaded-resource-boundary.mjs +65 -0
- package/examples/loaded-resource-boundary/loaded-resource-boundary.json +69 -0
- package/examples/memory-write-policy/README.md +28 -0
- package/examples/memory-write-policy/approved-memory-update.json +48 -0
- package/examples/memory-write-policy/check-memory-update.mjs +120 -0
- package/examples/memory-write-policy/quarantined-memory-update.json +43 -0
- package/examples/parallel-session-review-ledger/README.md +13 -0
- package/examples/parallel-session-review-ledger/check-parallel-session-review-ledger.mjs +69 -0
- package/examples/parallel-session-review-ledger/parallel-session-review-ledger.json +72 -0
- package/examples/phase-boundary-contract/README.md +23 -0
- package/examples/phase-boundary-contract/check-phase-boundary.mjs +73 -0
- package/examples/phase-boundary-contract/phase-boundary-contract.json +68 -0
- package/examples/review-primitive-gate/README.md +19 -0
- package/examples/review-primitive-gate/check-review-receipt.mjs +100 -0
- package/examples/review-primitive-gate/fail-review-receipt.json +42 -0
- package/examples/review-primitive-gate/pass-review-receipt.json +54 -0
- package/examples/skill-install-receipts/README.md +31 -0
- package/examples/skill-install-receipts/check-skill-install-receipt.mjs +75 -0
- package/examples/skill-install-receipts/skill-install-receipt.json +79 -0
- package/examples/skill-use-rate-receipts/README.md +16 -0
- package/examples/skill-use-rate-receipts/check-skill-use-rate.mjs +89 -0
- package/examples/skill-use-rate-receipts/skill-use-rate-receipt.json +79 -0
- package/examples/subagent-role-receipts/README.md +15 -0
- package/examples/subagent-role-receipts/agents.toml +36 -0
- package/examples/temporal-context-receipts/CURRENT_STATE.md +13 -0
- package/examples/temporal-context-receipts/specs/2025-checkout-rewrite.md +10 -0
- package/examples/temporal-context-receipts/specs/2026-checkout-risk-notes.md +10 -0
- package/examples/temporal-context-receipts/temporal-authority-receipt.json +27 -0
- package/package.json +1 -1
- package/src/commands/demo.js +155 -0
- package/src/index.js +1 -0
- package/src/utils/version.js +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "pluribus.skill_use_rate_receipt.v1",
|
|
3
|
+
"run_id": "skills-audit-2026-06-05T13:00Z",
|
|
4
|
+
"generated_at": "2026-06-05T13:00:00Z",
|
|
5
|
+
"installer": {
|
|
6
|
+
"name": "skills",
|
|
7
|
+
"version": "1.5.9",
|
|
8
|
+
"command_digest": "sha256:4c2b31d9f1e3a1a5f94c2c65d18f0a9b0c3d14a1c6a4f8cbb6e8f0b2a118f001"
|
|
9
|
+
},
|
|
10
|
+
"window": {
|
|
11
|
+
"started_at": "2026-05-22T00:00:00Z",
|
|
12
|
+
"ended_at": "2026-06-05T13:00:00Z"
|
|
13
|
+
},
|
|
14
|
+
"skills": [
|
|
15
|
+
{
|
|
16
|
+
"skill_id": "frontend-design",
|
|
17
|
+
"source_ref": "github:vercel-labs/agent-skills/skills/frontend-design@main",
|
|
18
|
+
"target_agent": "claude-code",
|
|
19
|
+
"scope": "project",
|
|
20
|
+
"install_method": "symlink",
|
|
21
|
+
"discovered": true,
|
|
22
|
+
"installed": true,
|
|
23
|
+
"attached": true,
|
|
24
|
+
"invoked_count": 7,
|
|
25
|
+
"acted_on_count": 3,
|
|
26
|
+
"last_invoked_at": "2026-06-05T10:12:08Z",
|
|
27
|
+
"unused_since_install": false,
|
|
28
|
+
"context_cost_bucket": "small",
|
|
29
|
+
"evidence": [
|
|
30
|
+
{
|
|
31
|
+
"kind": "session_log_digest",
|
|
32
|
+
"ref": "sha256:0b7d7a9f2950f5e4ab8d9ab2f93e71875a995ee3878d0d595c8a65f8d7bf0c4d"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"skill_id": "rust-lsp-helper",
|
|
38
|
+
"source_ref": "github:example-org/agent-skills/skills/rust-lsp-helper@v1.2.0",
|
|
39
|
+
"target_agent": "claude-code",
|
|
40
|
+
"scope": "global",
|
|
41
|
+
"install_method": "copy",
|
|
42
|
+
"discovered": true,
|
|
43
|
+
"installed": true,
|
|
44
|
+
"attached": true,
|
|
45
|
+
"invoked_count": 0,
|
|
46
|
+
"acted_on_count": 0,
|
|
47
|
+
"last_invoked_at": null,
|
|
48
|
+
"unused_since_install": true,
|
|
49
|
+
"context_cost_bucket": "medium",
|
|
50
|
+
"evidence": [
|
|
51
|
+
{
|
|
52
|
+
"kind": "installer_lock_digest",
|
|
53
|
+
"ref": "sha256:d25b0ddca0d6b8ac8705cc1e845351f5f5a3971b982be9dc6eeb3aadc5a83a54"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"skill_id": "code-review-xhigh",
|
|
59
|
+
"source_ref": "builtin:claude-code/code-review@2.1.152",
|
|
60
|
+
"target_agent": "claude-code",
|
|
61
|
+
"scope": "builtin",
|
|
62
|
+
"install_method": "builtin",
|
|
63
|
+
"discovered": true,
|
|
64
|
+
"installed": true,
|
|
65
|
+
"attached": true,
|
|
66
|
+
"invoked_count": 12,
|
|
67
|
+
"acted_on_count": 9,
|
|
68
|
+
"last_invoked_at": "2026-06-05T12:40:01Z",
|
|
69
|
+
"unused_since_install": false,
|
|
70
|
+
"context_cost_bucket": "unknown",
|
|
71
|
+
"evidence": [
|
|
72
|
+
{
|
|
73
|
+
"kind": "review_report_digest",
|
|
74
|
+
"ref": "sha256:8f489e2b0d3539b17f3d0b6ebc68bf1c9d68022c6ea086b6a3636b107a42f9f4"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Subagent role receipts example
|
|
2
|
+
|
|
3
|
+
This directory contains a small `agents.toml` example for teams experimenting with project-local subagent roles.
|
|
4
|
+
|
|
5
|
+
The important artifact is not the exact TOML dialect. The important artifact is the receipt that proves the role boundary:
|
|
6
|
+
|
|
7
|
+
- requested role vs effective role;
|
|
8
|
+
- role source and coarse hash/version;
|
|
9
|
+
- whether role instructions loaded;
|
|
10
|
+
- allowed/refused write and tool capabilities;
|
|
11
|
+
- boundary decisions made by the role;
|
|
12
|
+
- where the role stopped and the next safe action;
|
|
13
|
+
- privacy flags excluding raw prompts, code, transcripts, secrets, customer data, and raw tool output.
|
|
14
|
+
|
|
15
|
+
See [`../../docs/subagent-role-receipts.md`](../../docs/subagent-role-receipts.md) for the full recipe.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Example only: adapt field names and location to the subagent runner you use.
|
|
2
|
+
# The stable idea is the receipt, not this exact TOML dialect.
|
|
3
|
+
|
|
4
|
+
[[agents]]
|
|
5
|
+
name = "blast-radius-reviewer"
|
|
6
|
+
description = "Reviews AI-generated PRs by operational blast radius before merge."
|
|
7
|
+
model = "default"
|
|
8
|
+
tools = ["read", "grep", "test-summary"]
|
|
9
|
+
writes_allowed = false
|
|
10
|
+
instructions = """
|
|
11
|
+
Review by blast radius, not diff size.
|
|
12
|
+
|
|
13
|
+
Require explicit evidence for:
|
|
14
|
+
- schema or persisted data contracts;
|
|
15
|
+
- live reader/writer compatibility;
|
|
16
|
+
- async jobs, queues, cron, webhooks, and retries;
|
|
17
|
+
- rollout gates, feature flags, or kill switches;
|
|
18
|
+
- external side effects such as email, payments, auth, billing, analytics, or third-party APIs;
|
|
19
|
+
- generated files, public APIs, plugin manifests, MCP/Skill/hook configuration.
|
|
20
|
+
|
|
21
|
+
Do not approve merge when any high-risk boundary is ambiguous. Emit a privacy-safe review.blast_radius.v1 or subagent.role_boundary.v1 receipt instead of logging raw source, prompts, transcripts, or tool output.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
[[agents]]
|
|
25
|
+
name = "temporal-authority-checker"
|
|
26
|
+
description = "Checks whether matched docs/specs are current authority or historical citations before edits."
|
|
27
|
+
model = "default"
|
|
28
|
+
tools = ["read", "grep"]
|
|
29
|
+
writes_allowed = false
|
|
30
|
+
instructions = """
|
|
31
|
+
Before code changes, identify the current authority source and any historical/superseded specs.
|
|
32
|
+
|
|
33
|
+
Refuse writes when two sources conflict and neither one declares status, date, scope, or superseded_by metadata. Emit a privacy-safe context.temporal_authority.v1 or subagent.role_boundary.v1 receipt with coarse document names, status, decision, stopped_at, and next_safe_action.
|
|
34
|
+
|
|
35
|
+
Do not log raw prompts, source code, private paths, transcripts, secrets, or customer data.
|
|
36
|
+
"""
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Current state
|
|
2
|
+
|
|
3
|
+
## checkout-flow
|
|
4
|
+
|
|
5
|
+
- status: current
|
|
6
|
+
- as_of: 2026-05-28
|
|
7
|
+
- current authority: this section
|
|
8
|
+
- scope: checkout-flow
|
|
9
|
+
- related historical specs:
|
|
10
|
+
- `specs/2025-checkout-rewrite.md` — superseded; rationale only
|
|
11
|
+
- `specs/2026-checkout-risk-notes.md` — current supporting context
|
|
12
|
+
|
|
13
|
+
Agents may cite superseded specs for rationale, but must not implement from them unless this file explicitly reactivates that behavior.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"receipt_type": "context.temporal_authority.v1",
|
|
3
|
+
"request_id": "local-run-2026-05-28T16:00Z",
|
|
4
|
+
"current_authority": {
|
|
5
|
+
"file": "CURRENT_STATE.md",
|
|
6
|
+
"status": "current",
|
|
7
|
+
"as_of": "2026-05-28",
|
|
8
|
+
"scope": "checkout-flow"
|
|
9
|
+
},
|
|
10
|
+
"sources_considered": [
|
|
11
|
+
{
|
|
12
|
+
"file": "specs/2025-checkout-rewrite.md",
|
|
13
|
+
"status": "superseded",
|
|
14
|
+
"superseded_by": "CURRENT_STATE.md#checkout-flow",
|
|
15
|
+
"decision": "historical_citation_only"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"file": "specs/2026-checkout-risk-notes.md",
|
|
19
|
+
"status": "current",
|
|
20
|
+
"scope": "checkout-flow",
|
|
21
|
+
"decision": "allowed_as_supporting_context"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"ambiguous_sources": [],
|
|
25
|
+
"write_started": true,
|
|
26
|
+
"stopped_at": "temporal_authority_resolved"
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pluribus-context",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.36",
|
|
4
4
|
"description": "AI context and rules sync CLI for Claude.md, Claude Code, Cursor, and Copilot instructions, with privacy-safe context receipts that prove what memory, tools, skills, compactions, and security findings crossed agent boundaries without logging raw content.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/caioribeiroclw-pixel/pluribus#readme",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pluribus demo — run tiny packaged demos from npm without cloning the repo.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as fs from 'fs'
|
|
6
|
+
import * as path from 'path'
|
|
7
|
+
import { fileURLToPath } from 'url'
|
|
8
|
+
|
|
9
|
+
const DEFAULT_DEMO = 'skill-use-rate'
|
|
10
|
+
const SKILL_USE_RATE_SCHEMA = 'pluribus.skill_use_rate_receipt.v1'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {Record<string, string | boolean>} args
|
|
14
|
+
* @param {string[]} positional
|
|
15
|
+
*/
|
|
16
|
+
export async function runDemo(args, positional = []) {
|
|
17
|
+
const demoName = positional[0] || DEFAULT_DEMO
|
|
18
|
+
|
|
19
|
+
if (demoName !== DEFAULT_DEMO) {
|
|
20
|
+
console.error(`❌ Unknown demo: ${demoName}`)
|
|
21
|
+
console.error(' Available demos: skill-use-rate')
|
|
22
|
+
process.exit(1)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const receiptPath = typeof args.receipt === 'string' && args.receipt.trim()
|
|
26
|
+
? path.resolve(process.cwd(), args.receipt)
|
|
27
|
+
: bundledSkillUseRateReceiptPath()
|
|
28
|
+
|
|
29
|
+
let receipt
|
|
30
|
+
try {
|
|
31
|
+
receipt = JSON.parse(fs.readFileSync(receiptPath, 'utf8'))
|
|
32
|
+
} catch (err) {
|
|
33
|
+
console.error(`❌ Could not read skill use-rate receipt at ${receiptPath}: ${err.message}`)
|
|
34
|
+
process.exit(1)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const result = validateSkillUseRateReceipt(receipt)
|
|
38
|
+
if (Boolean(args.json)) {
|
|
39
|
+
console.log(JSON.stringify({
|
|
40
|
+
ok: result.errors.length === 0,
|
|
41
|
+
demo: DEFAULT_DEMO,
|
|
42
|
+
receipt: path.relative(process.cwd(), receiptPath) || receiptPath,
|
|
43
|
+
summary: result.summary,
|
|
44
|
+
warnings: result.warnings,
|
|
45
|
+
errors: result.errors,
|
|
46
|
+
}, null, 2))
|
|
47
|
+
} else {
|
|
48
|
+
console.log('🧪 Pluribus demo: skill use-rate receipt')
|
|
49
|
+
console.log(` Receipt: ${path.relative(process.cwd(), receiptPath) || receiptPath}`)
|
|
50
|
+
console.log('')
|
|
51
|
+
|
|
52
|
+
if (result.errors.length === 0) {
|
|
53
|
+
const warningLabel = result.warnings.length === 1 ? 'warning' : 'warnings'
|
|
54
|
+
console.log(`✅ skill use-rate receipt ok: ${result.summary.skillCount} skills checked, ${result.warnings.length} unused install ${warningLabel}`)
|
|
55
|
+
for (const warning of result.warnings) console.log(` • ${warning}`)
|
|
56
|
+
console.log('')
|
|
57
|
+
console.log('Why this matters: installed is not used. Track discovered → installed/attached → invoked → acted-on before paying context cost for dormant skills.')
|
|
58
|
+
console.log('Try your own receipt: pluribus demo skill-use-rate --receipt path/to/skill-use-rate-receipt.json')
|
|
59
|
+
} else {
|
|
60
|
+
console.error('❌ skill use-rate receipt invalid:')
|
|
61
|
+
for (const error of result.errors) console.error(` • ${error}`)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (result.errors.length > 0) process.exit(1)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function bundledSkillUseRateReceiptPath() {
|
|
69
|
+
return fileURLToPath(new URL('../../examples/skill-use-rate-receipts/skill-use-rate-receipt.json', import.meta.url))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function validateSkillUseRateReceipt(receipt) {
|
|
73
|
+
const errors = []
|
|
74
|
+
const warnings = []
|
|
75
|
+
|
|
76
|
+
function requireString(value, field) {
|
|
77
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
78
|
+
errors.push(`${field} must be a non-empty string`)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function requireBoolean(value, field) {
|
|
83
|
+
if (typeof value !== 'boolean') {
|
|
84
|
+
errors.push(`${field} must be boolean`)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function requireNonNegativeInteger(value, field) {
|
|
89
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
90
|
+
errors.push(`${field} must be a non-negative integer`)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (receipt.schema !== SKILL_USE_RATE_SCHEMA) {
|
|
95
|
+
errors.push(`schema must be ${SKILL_USE_RATE_SCHEMA}`)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
requireString(receipt.run_id, 'run_id')
|
|
99
|
+
requireString(receipt.generated_at, 'generated_at')
|
|
100
|
+
requireString(receipt.installer?.name, 'installer.name')
|
|
101
|
+
requireString(receipt.window?.started_at, 'window.started_at')
|
|
102
|
+
requireString(receipt.window?.ended_at, 'window.ended_at')
|
|
103
|
+
|
|
104
|
+
if (!Array.isArray(receipt.skills) || receipt.skills.length === 0) {
|
|
105
|
+
errors.push('skills must be a non-empty array')
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
for (const [index, skill] of (receipt.skills || []).entries()) {
|
|
109
|
+
const prefix = `skills[${index}]`
|
|
110
|
+
requireString(skill.skill_id, `${prefix}.skill_id`)
|
|
111
|
+
requireString(skill.source_ref, `${prefix}.source_ref`)
|
|
112
|
+
requireString(skill.target_agent, `${prefix}.target_agent`)
|
|
113
|
+
requireString(skill.scope, `${prefix}.scope`)
|
|
114
|
+
requireString(skill.install_method, `${prefix}.install_method`)
|
|
115
|
+
requireBoolean(skill.discovered, `${prefix}.discovered`)
|
|
116
|
+
requireBoolean(skill.installed, `${prefix}.installed`)
|
|
117
|
+
requireBoolean(skill.attached, `${prefix}.attached`)
|
|
118
|
+
requireBoolean(skill.unused_since_install, `${prefix}.unused_since_install`)
|
|
119
|
+
requireNonNegativeInteger(skill.invoked_count, `${prefix}.invoked_count`)
|
|
120
|
+
requireNonNegativeInteger(skill.acted_on_count, `${prefix}.acted_on_count`)
|
|
121
|
+
|
|
122
|
+
if (Number.isInteger(skill.acted_on_count) && Number.isInteger(skill.invoked_count) && skill.acted_on_count > skill.invoked_count) {
|
|
123
|
+
errors.push(`${prefix}.acted_on_count cannot exceed invoked_count`)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (skill.installed && skill.attached && skill.invoked_count === 0) {
|
|
127
|
+
if (skill.unused_since_install !== true) {
|
|
128
|
+
errors.push(`${prefix}.unused_since_install must be true when installed/attached but never invoked`)
|
|
129
|
+
}
|
|
130
|
+
warnings.push(`${skill.skill_id || prefix} is installed/attached but has 0 invocations in this window`)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (skill.invoked_count > 0) {
|
|
134
|
+
if (skill.unused_since_install !== false) {
|
|
135
|
+
errors.push(`${prefix}.unused_since_install must be false when invoked_count > 0`)
|
|
136
|
+
}
|
|
137
|
+
if (typeof skill.last_invoked_at !== 'string' || skill.last_invoked_at.trim() === '') {
|
|
138
|
+
errors.push(`${prefix}.last_invoked_at must be set when invoked_count > 0`)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (!Array.isArray(skill.evidence) || skill.evidence.length === 0) {
|
|
143
|
+
errors.push(`${prefix}.evidence must include at least one privacy-safe evidence ref`)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
errors,
|
|
149
|
+
warnings,
|
|
150
|
+
summary: {
|
|
151
|
+
skillCount: Array.isArray(receipt.skills) ? receipt.skills.length : 0,
|
|
152
|
+
unusedInstallCount: warnings.length,
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
}
|
package/src/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export { runSync } from './commands/sync.js'
|
|
|
7
7
|
export { runValidate } from './commands/validate.js'
|
|
8
8
|
export { runWatch } from './commands/watch.js'
|
|
9
9
|
export { runAudit } from './commands/audit.js'
|
|
10
|
+
export { runDemo, validateSkillUseRateReceipt } from './commands/demo.js'
|
|
10
11
|
export { parsePluribusFile, validateSections } from './utils/parser.js'
|
|
11
12
|
export { renderTemplate } from './utils/renderer.js'
|
|
12
13
|
export { BUILT_IN_SKILLS, SUPPORTED_TOOLS } from './skills/built-in.js'
|
package/src/utils/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = '0.3.
|
|
1
|
+
export const VERSION = '0.3.36'
|