@event4u/agent-config 9.10.0 → 9.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/README.md +20 -16
- package/agents/templates/.ai-council.yml.example +481 -0
- package/agents/templates/.ai-video.xml.example +247 -0
- package/dist/agent-src/commands/fix/ci.md +29 -0
- package/dist/agent-src/commands/pr/create.md +60 -0
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +18 -2
- package/dist/agent-src/rules/design-fidelity.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +1 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +27 -1
- package/dist/agent-src/skills/design-intelligence/data/font-pairings-reference.csv +74 -74
- package/dist/agent-src/skills/design-intelligence/data/manifest.json +2 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +0 -7
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +15 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +55 -11
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +180 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
- package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/dist/cli/initRouting.js +74 -11
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +14 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
- package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
- package/dist/cli-delegate/chunk-A3HJ6NTI.js +1084 -0
- package/dist/cli-delegate/chunk-EJYIGZ3T.js +125 -0
- package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
- package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
- package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
- package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
- package/dist/cli-delegate/chunk-HYWSRNUX.js +179 -0
- package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
- package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
- package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
- package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
- package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
- package/dist/cli-delegate/chunk-QFKQLQ7X.js +10835 -0
- package/dist/cli-delegate/chunk-TEGJU2JX.js +6908 -0
- package/dist/cli-delegate/chunk-TJIAM5FW.js +133 -0
- package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
- package/dist/cli-delegate/cmd_analyze_session.js +294 -0
- package/dist/cli-delegate/cmd_conformance.js +643 -0
- package/dist/cli-delegate/cmd_converge.js +326 -0
- package/dist/cli-delegate/cmd_doctor.js +142 -0
- package/dist/cli-delegate/cmd_explain.js +2576 -0
- package/dist/cli-delegate/cmd_export.js +298 -0
- package/dist/cli-delegate/cmd_fleet.js +333 -0
- package/dist/cli-delegate/cmd_memory_get.js +3878 -0
- package/dist/cli-delegate/cmd_migrate.js +11 -0
- package/dist/cli-delegate/cmd_preflight.js +153 -0
- package/dist/cli-delegate/cmd_prune.js +446 -0
- package/dist/cli-delegate/cmd_refresh.js +28 -0
- package/dist/cli-delegate/cmd_settings_check.js +574 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +225 -0
- package/dist/cli-delegate/cmd_sync.js +266 -0
- package/dist/cli-delegate/cmd_uninstall.js +657 -0
- package/dist/cli-delegate/cmd_update.js +425 -0
- package/dist/cli-delegate/cmd_upgrade.js +444 -0
- package/dist/cli-delegate/cmd_validate.js +307 -0
- package/dist/cli-delegate/cmd_versions.js +370 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +45 -16
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +13 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/install/emit_host_rules_cli.js +2 -1
- package/dist/install/emit_host_rules_cli.js.map +1 -1
- package/dist/install/install.mjs +634 -409
- package/dist/install/ruleInScope.js +123 -0
- package/dist/install/ruleInScope.js.map +1 -0
- package/dist/install/rule_scope.js +7 -3
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/toolDetection.js +40 -12
- package/dist/install/toolDetection.js.map +1 -1
- package/dist/install/wizard-plan.js +12 -3
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1553 -2728
- package/dist/router.json +1 -1
- package/dist/scripts/condense.js +6 -22
- package/dist/scripts/condense.js.map +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +14 -0
- package/package.json +4 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
- package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/src/config/discovery/packs.yml +7 -0
- package/src/config/evaluator-budgets.json +1 -1
- package/src/config/pack-size-budget.json +27 -0
- package/src/install/emit_host_rules_cli.ts +2 -1
- package/src/install/ruleInScope.ts +133 -0
- package/src/install/rule_scope.ts +7 -3
- package/src/install/toolDetection.ts +39 -8
- package/src/install/wizard-plan.ts +13 -3
- package/src/scripts/_cli/cmd_conformance.ts +2 -1
- package/src/scripts/_cli/cmd_converge.ts +2 -1
- package/src/scripts/_cli/cmd_doctor.ts +214 -13
- package/src/scripts/_cli/cmd_export.ts +2 -1
- package/src/scripts/_cli/cmd_fleet.ts +2 -1
- package/src/scripts/_cli/cmd_migrate.ts +2 -1
- package/src/scripts/_cli/cmd_preflight.ts +2 -1
- package/src/scripts/_cli/cmd_refresh.ts +2 -1
- package/src/scripts/_cli/cmd_update.ts +2 -1
- package/src/scripts/_cli/cmd_upgrade.ts +2 -1
- package/src/scripts/_cli/cmd_versions.ts +2 -1
- package/src/scripts/_cli/detection_report.ts +480 -0
- package/src/scripts/_dispatch.bash +52 -14
- package/src/scripts/_lib/changelog_eras.ts +103 -9
- package/src/scripts/_lib/environment_detector.ts +441 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +38 -2
- package/src/scripts/_lib/package_root.ts +72 -0
- package/src/scripts/ai_council/config.ts +15 -7
- package/src/scripts/ai_council/modes.ts +68 -2
- package/src/scripts/ai_council/transport_resolver.ts +331 -0
- package/src/scripts/check_bundle_path_leakage.ts +10 -4
- package/src/scripts/check_dependency_floors.ts +153 -0
- package/src/scripts/check_installer_import_purity.ts +295 -0
- package/src/scripts/check_pack_size.ts +188 -0
- package/src/scripts/condense.ts +7 -28
- package/src/scripts/council_cli.ts +6 -2
- package/src/scripts/evaluator_umbrella.sh +34 -1
- package/src/scripts/install-hooks.sh +36 -4
- package/src/scripts/install.ts +210 -5
- package/src/scripts/lint_eval_fixture_citations.ts +113 -0
- package/src/scripts/lint_ui_stack_bundles.ts +201 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
LEGACY_ALL,
|
|
4
|
+
ruleFileArrives
|
|
5
|
+
} from "./chunk-TJIAM5FW.js";
|
|
6
|
+
|
|
7
|
+
// src/install/wizard-plan.ts
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
10
|
+
var USER_SCOPE_PATHS = {
|
|
11
|
+
"claude-code": "~/.claude/",
|
|
12
|
+
"claude-desktop": "~/Library/Application Support/Claude/",
|
|
13
|
+
cursor: "~/.cursor/",
|
|
14
|
+
windsurf: "~/.codeium/windsurf/",
|
|
15
|
+
cline: "~/Documents/Cline/Rules/",
|
|
16
|
+
"gemini-cli": "~/.gemini/",
|
|
17
|
+
copilot: "~/.copilot/",
|
|
18
|
+
augment: "~/.augment/",
|
|
19
|
+
aider: "~/.aider.conf.yml",
|
|
20
|
+
codex: "~/.codex/",
|
|
21
|
+
roocode: "~/.roo/",
|
|
22
|
+
continue: "~/.continue/",
|
|
23
|
+
kilocode: "~/.kilocode/",
|
|
24
|
+
zed: "~/.config/zed/",
|
|
25
|
+
jetbrains: "~/.config/JetBrains/",
|
|
26
|
+
kiro: "~/.kiro/",
|
|
27
|
+
qoder: "~/.qoder/",
|
|
28
|
+
opencode: "~/.opencode/",
|
|
29
|
+
trae: "~/.trae/",
|
|
30
|
+
antigravity: "~/.agents/",
|
|
31
|
+
codebuddy: "~/.codebuddy/",
|
|
32
|
+
droid: "~/.factory/",
|
|
33
|
+
warp: "~/.warp/"
|
|
34
|
+
};
|
|
35
|
+
var CLAUDE_SKILL_BUNDLE = [
|
|
36
|
+
["dist/agent-src/rules", "rules"],
|
|
37
|
+
["dist/agent-src/skills", "skills"],
|
|
38
|
+
// Commands ship to ~/.claude/commands/ — native Claude Code slash-
|
|
39
|
+
// command surface. Verified empirically 2026-05-28: rich frontmatter
|
|
40
|
+
// (disable-model-invocation, custom fields) tolerated; nested
|
|
41
|
+
// subdirs route as `/<cluster>:<sub>`. Council session 2026-05-28
|
|
42
|
+
// converged on Option B (native slash-only) — see
|
|
43
|
+
// agents/runtime/council/responses/claude-code-distribution.json
|
|
44
|
+
// and scripts/install.py:_CLAUDE_SKILL_BUNDLE for the Python mirror.
|
|
45
|
+
["dist/agent-src/commands", "commands"],
|
|
46
|
+
["dist/agent-src/personas", "personas"]
|
|
47
|
+
];
|
|
48
|
+
var RULE_SOURCE_REL = "dist/agent-src/rules";
|
|
49
|
+
var GLOBAL_DEPLOY_SOURCES = {
|
|
50
|
+
"claude-code": CLAUDE_SKILL_BUNDLE,
|
|
51
|
+
augment: [
|
|
52
|
+
["dist/agent-src/rules", "rules"],
|
|
53
|
+
["dist/agent-src/skills", "skills"],
|
|
54
|
+
["dist/agent-src/commands", "commands"],
|
|
55
|
+
["dist/agent-src/contexts", "contexts"],
|
|
56
|
+
["dist/agent-src/personas", "personas"],
|
|
57
|
+
["dist/agent-src/templates", "templates"]
|
|
58
|
+
],
|
|
59
|
+
cursor: [
|
|
60
|
+
["dist/agent-src/rules", "rules"],
|
|
61
|
+
["dist/agent-src/commands", "commands"],
|
|
62
|
+
["dist/agent-src/personas", "personas"]
|
|
63
|
+
],
|
|
64
|
+
windsurf: [
|
|
65
|
+
["dist/agent-src/rules", "rules"]
|
|
66
|
+
],
|
|
67
|
+
cline: [
|
|
68
|
+
["dist/agent-src/rules", ""]
|
|
69
|
+
],
|
|
70
|
+
"gemini-cli": CLAUDE_SKILL_BUNDLE,
|
|
71
|
+
codex: CLAUDE_SKILL_BUNDLE,
|
|
72
|
+
continue: CLAUDE_SKILL_BUNDLE,
|
|
73
|
+
roocode: CLAUDE_SKILL_BUNDLE,
|
|
74
|
+
kilocode: CLAUDE_SKILL_BUNDLE,
|
|
75
|
+
qoder: CLAUDE_SKILL_BUNDLE,
|
|
76
|
+
opencode: CLAUDE_SKILL_BUNDLE,
|
|
77
|
+
trae: CLAUDE_SKILL_BUNDLE,
|
|
78
|
+
antigravity: CLAUDE_SKILL_BUNDLE,
|
|
79
|
+
codebuddy: CLAUDE_SKILL_BUNDLE,
|
|
80
|
+
droid: CLAUDE_SKILL_BUNDLE,
|
|
81
|
+
warp: CLAUDE_SKILL_BUNDLE,
|
|
82
|
+
kiro: [
|
|
83
|
+
["dist/agent-src/rules", "rules"],
|
|
84
|
+
["dist/agent-src/skills", "steering"],
|
|
85
|
+
["dist/agent-src/personas", "personas"]
|
|
86
|
+
]
|
|
87
|
+
};
|
|
88
|
+
function expandAnchor(anchor, home) {
|
|
89
|
+
const h = home ?? homedir();
|
|
90
|
+
if (anchor === "~") return h;
|
|
91
|
+
if (anchor.startsWith("~/")) return join(h, anchor.slice(2));
|
|
92
|
+
if (isAbsolute(anchor)) return anchor;
|
|
93
|
+
return resolve(anchor);
|
|
94
|
+
}
|
|
95
|
+
function expandWizardSources(inputs) {
|
|
96
|
+
const { toolIds, packageRoot, home } = inputs;
|
|
97
|
+
const scope = inputs.ruleScope ?? LEGACY_ALL;
|
|
98
|
+
const ruleFilter = (srcFile) => ruleFileArrives(srcFile, scope);
|
|
99
|
+
const out = [];
|
|
100
|
+
for (const toolId of toolIds) {
|
|
101
|
+
const deploy = GLOBAL_DEPLOY_SOURCES[toolId];
|
|
102
|
+
const anchor = USER_SCOPE_PATHS[toolId];
|
|
103
|
+
if (!deploy || !anchor) continue;
|
|
104
|
+
const destRoot = expandAnchor(anchor, home);
|
|
105
|
+
for (const [srcRel, destSub] of deploy) {
|
|
106
|
+
const srcDir = join(packageRoot, srcRel);
|
|
107
|
+
const destDir = destSub.length === 0 ? destRoot : join(destRoot, destSub);
|
|
108
|
+
const isRuleSource = srcRel === RULE_SOURCE_REL;
|
|
109
|
+
out.push({
|
|
110
|
+
toolId,
|
|
111
|
+
srcDir,
|
|
112
|
+
destDir,
|
|
113
|
+
kind: "deployed",
|
|
114
|
+
...isRuleSource ? { fileFilter: ruleFilter } : {}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
RULE_SOURCE_REL,
|
|
123
|
+
GLOBAL_DEPLOY_SOURCES,
|
|
124
|
+
expandWizardSources
|
|
125
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/scripts/_lib/claude_plugin.ts
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as os from "node:os";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import process from "node:process";
|
|
8
|
+
var CLAUDE_PLUGIN_ID = "agent-config";
|
|
9
|
+
var CLAUDE_MARKETPLACE_NAME = "event4u-agent-config";
|
|
10
|
+
var CLAUDE_MARKETPLACE_REPO = "event4u-app/agent-config";
|
|
11
|
+
var CLAUDE_PLUGIN_INSTALL_HINT = [
|
|
12
|
+
`claude plugin marketplace add ${CLAUDE_MARKETPLACE_REPO}`,
|
|
13
|
+
`claude plugin install ${CLAUDE_PLUGIN_ID}@${CLAUDE_MARKETPLACE_NAME}`
|
|
14
|
+
];
|
|
15
|
+
var CODEX_PLUGIN_ID = "codex";
|
|
16
|
+
var CODEX_MARKETPLACE_NAME = "openai-codex";
|
|
17
|
+
var CODEX_MARKETPLACE_REPO = "openai/codex-plugin-cc";
|
|
18
|
+
var CODEX_PLUGIN_INSTALL_HINT = [
|
|
19
|
+
`claude plugin marketplace add ${CODEX_MARKETPLACE_REPO}`,
|
|
20
|
+
`claude plugin install ${CODEX_PLUGIN_ID}@${CODEX_MARKETPLACE_NAME}`
|
|
21
|
+
];
|
|
22
|
+
function claude_config_dir() {
|
|
23
|
+
const env = (process.env["CLAUDE_CONFIG_DIR"] ?? "").trim();
|
|
24
|
+
return env !== "" ? env : path.join(os.homedir(), ".claude");
|
|
25
|
+
}
|
|
26
|
+
function _plugin_id_recorded(plugin_id) {
|
|
27
|
+
const p = path.join(claude_config_dir(), "plugins", "installed_plugins.json");
|
|
28
|
+
let data;
|
|
29
|
+
try {
|
|
30
|
+
data = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (data === null || typeof data !== "object") return false;
|
|
35
|
+
const plugins = data.plugins;
|
|
36
|
+
if (plugins === null || plugins === void 0 || typeof plugins !== "object") return false;
|
|
37
|
+
return Object.keys(plugins).some(
|
|
38
|
+
(k) => k.startsWith(`${plugin_id}@`)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function claude_plugin_installed() {
|
|
42
|
+
return _plugin_id_recorded(CLAUDE_PLUGIN_ID);
|
|
43
|
+
}
|
|
44
|
+
function _plugin_marketplaces(plugin_id) {
|
|
45
|
+
const p = path.join(claude_config_dir(), "plugins", "installed_plugins.json");
|
|
46
|
+
let data;
|
|
47
|
+
try {
|
|
48
|
+
data = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
49
|
+
} catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
if (data === null || typeof data !== "object") return [];
|
|
53
|
+
const plugins = data.plugins;
|
|
54
|
+
if (plugins === null || plugins === void 0 || typeof plugins !== "object") return [];
|
|
55
|
+
const prefix = `${plugin_id}@`;
|
|
56
|
+
return Object.keys(plugins).filter((k) => k.startsWith(prefix)).map((k) => k.slice(prefix.length));
|
|
57
|
+
}
|
|
58
|
+
function _marketplace_source_repo(marketplace) {
|
|
59
|
+
const p = path.join(claude_config_dir(), "plugins", "known_marketplaces.json");
|
|
60
|
+
let data;
|
|
61
|
+
try {
|
|
62
|
+
data = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
63
|
+
} catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (data === null || typeof data !== "object") return null;
|
|
67
|
+
const entry = data[marketplace];
|
|
68
|
+
if (entry === null || entry === void 0 || typeof entry !== "object") return null;
|
|
69
|
+
const source = entry.source;
|
|
70
|
+
if (source === null || source === void 0 || typeof source !== "object") return null;
|
|
71
|
+
const repo = source.repo;
|
|
72
|
+
return typeof repo === "string" && repo.trim() !== "" ? repo.trim() : null;
|
|
73
|
+
}
|
|
74
|
+
function codex_plugin_identity() {
|
|
75
|
+
const marketplaces = _plugin_marketplaces(CODEX_PLUGIN_ID);
|
|
76
|
+
if (marketplaces.length === 0) {
|
|
77
|
+
return { installed: false, identity_verified: false };
|
|
78
|
+
}
|
|
79
|
+
const want = CODEX_MARKETPLACE_REPO.toLowerCase();
|
|
80
|
+
const identity_verified = marketplaces.some(
|
|
81
|
+
(m) => (_marketplace_source_repo(m) ?? "").toLowerCase() === want
|
|
82
|
+
);
|
|
83
|
+
return { installed: true, identity_verified };
|
|
84
|
+
}
|
|
85
|
+
function claude_plugin_snapshot_version() {
|
|
86
|
+
const p = path.join(
|
|
87
|
+
claude_config_dir(),
|
|
88
|
+
"plugins",
|
|
89
|
+
"marketplaces",
|
|
90
|
+
CLAUDE_MARKETPLACE_NAME,
|
|
91
|
+
".claude-plugin",
|
|
92
|
+
"marketplace.json"
|
|
93
|
+
);
|
|
94
|
+
let data;
|
|
95
|
+
try {
|
|
96
|
+
data = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
97
|
+
} catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (data === null || typeof data !== "object") return null;
|
|
101
|
+
const metadata = data.metadata;
|
|
102
|
+
if (metadata === null || metadata === void 0 || typeof metadata !== "object") return null;
|
|
103
|
+
const v = metadata.version;
|
|
104
|
+
return typeof v === "string" && v.trim() !== "" ? v.trim() : null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
CLAUDE_PLUGIN_ID,
|
|
109
|
+
CLAUDE_MARKETPLACE_NAME,
|
|
110
|
+
CODEX_PLUGIN_ID,
|
|
111
|
+
CODEX_MARKETPLACE_NAME,
|
|
112
|
+
CODEX_PLUGIN_INSTALL_HINT,
|
|
113
|
+
claude_config_dir,
|
|
114
|
+
claude_plugin_installed,
|
|
115
|
+
codex_plugin_identity,
|
|
116
|
+
claude_plugin_snapshot_version
|
|
117
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/scripts/_cli/explain_last/state_loader.ts
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
var EXPECTED_VERSION = 1;
|
|
6
|
+
var StateLoadError = class extends Error {
|
|
7
|
+
exitCode;
|
|
8
|
+
constructor(message, options = {}) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "StateLoadError";
|
|
11
|
+
this.exitCode = options.exitCode ?? 2;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
function _pyRepr(value) {
|
|
15
|
+
if (value === null || value === void 0) {
|
|
16
|
+
return "None";
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "boolean") {
|
|
19
|
+
return value ? "True" : "False";
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === "string") {
|
|
22
|
+
if (value.includes("'") && !value.includes('"')) {
|
|
23
|
+
return `"${value}"`;
|
|
24
|
+
}
|
|
25
|
+
return `'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
|
|
26
|
+
}
|
|
27
|
+
return String(value);
|
|
28
|
+
}
|
|
29
|
+
function load_state(state_file) {
|
|
30
|
+
if (!fs.existsSync(state_file)) {
|
|
31
|
+
throw new StateLoadError(`state file not found: ${state_file}`, {
|
|
32
|
+
exitCode: 1
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
let text;
|
|
36
|
+
try {
|
|
37
|
+
text = fs.readFileSync(state_file, "utf-8");
|
|
38
|
+
} catch (exc) {
|
|
39
|
+
throw new StateLoadError(
|
|
40
|
+
`cannot read state file ${state_file}: ${_osErr(exc)}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
let payload;
|
|
44
|
+
try {
|
|
45
|
+
payload = JSON.parse(text);
|
|
46
|
+
} catch (exc) {
|
|
47
|
+
throw new StateLoadError(
|
|
48
|
+
`state file ${state_file} is not valid JSON: ${_jsonErr(exc, text)}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
|
|
52
|
+
throw new StateLoadError(
|
|
53
|
+
`state file ${state_file} must contain a JSON object`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const version = payload.version;
|
|
57
|
+
if (version !== EXPECTED_VERSION) {
|
|
58
|
+
throw new StateLoadError(
|
|
59
|
+
`trace format upgraded; rerun the upstream command on this branch to regenerate (found version=${_pyRepr(version === void 0 ? null : version)}, expected ${EXPECTED_VERSION})`,
|
|
60
|
+
{ exitCode: 0 }
|
|
61
|
+
// informational, not a failure (council fix).
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return payload;
|
|
65
|
+
}
|
|
66
|
+
function _osErr(exc) {
|
|
67
|
+
if (exc instanceof Error) {
|
|
68
|
+
return exc.message;
|
|
69
|
+
}
|
|
70
|
+
return String(exc);
|
|
71
|
+
}
|
|
72
|
+
function _jsonErr(exc, _text) {
|
|
73
|
+
if (exc instanceof Error) {
|
|
74
|
+
return exc.message;
|
|
75
|
+
}
|
|
76
|
+
return String(exc);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
StateLoadError,
|
|
81
|
+
load_state
|
|
82
|
+
};
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
resolve_with_fallback,
|
|
4
|
+
write_target
|
|
5
|
+
} from "./chunk-NDJLNC6Q.js";
|
|
6
|
+
|
|
7
|
+
// src/scripts/_lib/installed_lock.ts
|
|
8
|
+
import { randomBytes } from "node:crypto";
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
|
|
14
|
+
// src/scripts/_lib/install_layout.ts
|
|
15
|
+
var PRE_FREEZE_LAYOUT_VERSION = 0;
|
|
16
|
+
var INSTALL_LAYOUT_VERSION = 1;
|
|
17
|
+
function _pyInt(value) {
|
|
18
|
+
if (typeof value === "boolean") {
|
|
19
|
+
return value ? 1 : 0;
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === "number") {
|
|
22
|
+
if (!Number.isFinite(value)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return Math.trunc(value);
|
|
26
|
+
}
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
const trimmed = value.trim();
|
|
29
|
+
if (!/^[+-]?\d+(?:_\d+)*$/.test(trimmed)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return Number.parseInt(trimmed.replace(/_/g, ""), 10);
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function coerce_layout_version(value) {
|
|
37
|
+
if (value === null || value === void 0) {
|
|
38
|
+
return PRE_FREEZE_LAYOUT_VERSION;
|
|
39
|
+
}
|
|
40
|
+
const parsed = _pyInt(value);
|
|
41
|
+
if (parsed === null) {
|
|
42
|
+
return PRE_FREEZE_LAYOUT_VERSION;
|
|
43
|
+
}
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
function needs_migration(recorded) {
|
|
47
|
+
return coerce_layout_version(recorded) < INSTALL_LAYOUT_VERSION;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/scripts/_lib/installed_lock.ts
|
|
51
|
+
var LOCKFILE_ENV = "AGENT_CONFIG_INSTALLED_LOCK";
|
|
52
|
+
var SCHEMA_VERSION = 1;
|
|
53
|
+
function _default_lockfile() {
|
|
54
|
+
return write_target("installed.lock");
|
|
55
|
+
}
|
|
56
|
+
var DEFAULT_LOCKFILE = _default_lockfile();
|
|
57
|
+
var _VERSION_RE = /^\s*agent_config_version\s*:\s*"?([^"\s]+)"?\s*$/;
|
|
58
|
+
var _SCHEMA_RE = /^\s*schema_version\s*:\s*(\d+)\s*$/;
|
|
59
|
+
var _LAYOUT_RE = /^\s*install_layout_version\s*:\s*(\d+)\s*$/;
|
|
60
|
+
var _INSTALLED_AT_RE = /^\s*installed_at\s*:\s*"?([^"\s]+)"?\s*$/;
|
|
61
|
+
var _TOOL_RE = /^\s*-\s*([A-Za-z0-9_\-.]+)\s*$/;
|
|
62
|
+
function expanduser(p) {
|
|
63
|
+
if (p === "~") {
|
|
64
|
+
return os.homedir();
|
|
65
|
+
}
|
|
66
|
+
if (p.startsWith("~/") || process.platform === "win32" && p.startsWith("~\\")) {
|
|
67
|
+
return path.join(os.homedir(), p.slice(2));
|
|
68
|
+
}
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
function lockfile_path(env) {
|
|
72
|
+
const env_map = env ?? process.env;
|
|
73
|
+
const override = env_map[LOCKFILE_ENV];
|
|
74
|
+
if (override) {
|
|
75
|
+
return expanduser(override);
|
|
76
|
+
}
|
|
77
|
+
const resolved = resolve_with_fallback("installed.lock", { env: env ?? null });
|
|
78
|
+
if (resolved !== null) {
|
|
79
|
+
return resolved;
|
|
80
|
+
}
|
|
81
|
+
return write_target("installed.lock", { env: env ?? null });
|
|
82
|
+
}
|
|
83
|
+
function lockfile_write_path(env) {
|
|
84
|
+
const env_map = env ?? process.env;
|
|
85
|
+
const override = env_map[LOCKFILE_ENV];
|
|
86
|
+
if (override) {
|
|
87
|
+
return expanduser(override);
|
|
88
|
+
}
|
|
89
|
+
return write_target("installed.lock", { env: env ?? null });
|
|
90
|
+
}
|
|
91
|
+
function read_lockfile(path2) {
|
|
92
|
+
const target = path2 ?? lockfile_path();
|
|
93
|
+
let text;
|
|
94
|
+
try {
|
|
95
|
+
text = fs.readFileSync(target, { encoding: "utf-8" });
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const data = { tools: [] };
|
|
100
|
+
let in_tools = false;
|
|
101
|
+
for (const raw_line of splitlines(text)) {
|
|
102
|
+
const schema_m = _SCHEMA_RE.exec(raw_line);
|
|
103
|
+
if (schema_m) {
|
|
104
|
+
data.schema_version = Number.parseInt(schema_m[1], 10);
|
|
105
|
+
in_tools = false;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const layout_m = _LAYOUT_RE.exec(raw_line);
|
|
109
|
+
if (layout_m) {
|
|
110
|
+
data.install_layout_version = Number.parseInt(layout_m[1], 10);
|
|
111
|
+
in_tools = false;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const version_m = _VERSION_RE.exec(raw_line);
|
|
115
|
+
if (version_m) {
|
|
116
|
+
data.agent_config_version = version_m[1];
|
|
117
|
+
in_tools = false;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const installed_m = _INSTALLED_AT_RE.exec(raw_line);
|
|
121
|
+
if (installed_m) {
|
|
122
|
+
data.installed_at = installed_m[1];
|
|
123
|
+
in_tools = false;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (raw_line.trim().startsWith("tools:")) {
|
|
127
|
+
in_tools = true;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (in_tools) {
|
|
131
|
+
const m = _TOOL_RE.exec(raw_line);
|
|
132
|
+
if (m) {
|
|
133
|
+
data.tools.push(m[1]);
|
|
134
|
+
} else if (raw_line.trim() && !(raw_line.startsWith(" ") || raw_line.startsWith(" ") || raw_line.startsWith("-"))) {
|
|
135
|
+
in_tools = false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return data;
|
|
140
|
+
}
|
|
141
|
+
function splitlines(text) {
|
|
142
|
+
const parts = text.split("\n");
|
|
143
|
+
if (parts.length > 0 && parts[parts.length - 1] === "") {
|
|
144
|
+
parts.pop();
|
|
145
|
+
}
|
|
146
|
+
return parts;
|
|
147
|
+
}
|
|
148
|
+
function _render(version, tools, installed_at) {
|
|
149
|
+
const lines = [
|
|
150
|
+
`schema_version: ${SCHEMA_VERSION}`,
|
|
151
|
+
`install_layout_version: ${INSTALL_LAYOUT_VERSION}`,
|
|
152
|
+
`agent_config_version: "${version}"`,
|
|
153
|
+
`installed_at: "${installed_at}"`,
|
|
154
|
+
"tools:"
|
|
155
|
+
];
|
|
156
|
+
for (const tool of tools) {
|
|
157
|
+
lines.push(` - ${tool}`);
|
|
158
|
+
}
|
|
159
|
+
return lines.join("\n") + "\n";
|
|
160
|
+
}
|
|
161
|
+
function write_lockfile(version, tools, options = {}) {
|
|
162
|
+
const target = options.path ?? lockfile_path();
|
|
163
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
164
|
+
const stamp = strftime_iso_z(options.now ?? /* @__PURE__ */ new Date());
|
|
165
|
+
const rendered = _render(version, sorted_unique(tools), stamp);
|
|
166
|
+
const parent = path.dirname(target);
|
|
167
|
+
const { fd, tmp_name } = mkstemp(parent, ".installed.lock.");
|
|
168
|
+
try {
|
|
169
|
+
fs.writeFileSync(fd, rendered, { encoding: "utf-8" });
|
|
170
|
+
fs.closeSync(fd);
|
|
171
|
+
fs.renameSync(tmp_name, target);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
try {
|
|
174
|
+
fs.closeSync(fd);
|
|
175
|
+
} catch {
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
fs.unlinkSync(tmp_name);
|
|
179
|
+
} catch {
|
|
180
|
+
}
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
return target;
|
|
184
|
+
}
|
|
185
|
+
function _parse_installed_at(stamp) {
|
|
186
|
+
if (!stamp) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/.exec(stamp);
|
|
190
|
+
if (!m) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const [, y, mo, d, h, mi, s] = m;
|
|
194
|
+
const ms = Date.UTC(
|
|
195
|
+
Number.parseInt(y, 10),
|
|
196
|
+
Number.parseInt(mo, 10) - 1,
|
|
197
|
+
Number.parseInt(d, 10),
|
|
198
|
+
Number.parseInt(h, 10),
|
|
199
|
+
Number.parseInt(mi, 10),
|
|
200
|
+
Number.parseInt(s, 10)
|
|
201
|
+
);
|
|
202
|
+
const parsed = new Date(ms);
|
|
203
|
+
if (parsed.getUTCFullYear() !== Number.parseInt(y, 10) || parsed.getUTCMonth() !== Number.parseInt(mo, 10) - 1 || parsed.getUTCDate() !== Number.parseInt(d, 10) || parsed.getUTCHours() !== Number.parseInt(h, 10) || parsed.getUTCMinutes() !== Number.parseInt(mi, 10) || parsed.getUTCSeconds() !== Number.parseInt(s, 10)) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return parsed;
|
|
207
|
+
}
|
|
208
|
+
function migrate_layout(options = {}) {
|
|
209
|
+
const target = options.path ?? lockfile_write_path();
|
|
210
|
+
const existing = read_lockfile(target);
|
|
211
|
+
if (existing === null) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const from_v = coerce_layout_version(existing.install_layout_version);
|
|
215
|
+
if (!needs_migration(existing.install_layout_version)) {
|
|
216
|
+
return { from: from_v, to: from_v, changed: [] };
|
|
217
|
+
}
|
|
218
|
+
const version = existing.agent_config_version || current_package_version();
|
|
219
|
+
const tools = [...existing.tools ?? []];
|
|
220
|
+
const when = options.now ?? _parse_installed_at(existing.installed_at);
|
|
221
|
+
write_lockfile(version, tools, { path: target, now: when });
|
|
222
|
+
return {
|
|
223
|
+
from: from_v,
|
|
224
|
+
to: INSTALL_LAYOUT_VERSION,
|
|
225
|
+
changed: [`install_layout_version ${from_v} \u2192 ${INSTALL_LAYOUT_VERSION}`]
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function sorted_unique(tools) {
|
|
229
|
+
return [...new Set(tools)].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
230
|
+
}
|
|
231
|
+
function strftime_iso_z(now) {
|
|
232
|
+
return now.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
233
|
+
}
|
|
234
|
+
function mkstemp(dir, prefix) {
|
|
235
|
+
for (let attempt = 0; attempt < 32; attempt += 1) {
|
|
236
|
+
const tmp_name = path.join(dir, `${prefix}${randomBytes(6).toString("hex")}`);
|
|
237
|
+
try {
|
|
238
|
+
const fd = fs.openSync(tmp_name, "wx", 384);
|
|
239
|
+
return { fd, tmp_name };
|
|
240
|
+
} catch (err) {
|
|
241
|
+
if (err.code === "EEXIST") {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
throw err;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
throw new Error("mkstemp: could not create a unique temp file");
|
|
248
|
+
}
|
|
249
|
+
function check_version(installed_version, options = {}) {
|
|
250
|
+
const existing = read_lockfile(options.path ?? null);
|
|
251
|
+
if (existing === null) {
|
|
252
|
+
return [true, null];
|
|
253
|
+
}
|
|
254
|
+
const recorded = existing.agent_config_version;
|
|
255
|
+
if (!recorded) {
|
|
256
|
+
return [true, null];
|
|
257
|
+
}
|
|
258
|
+
return [recorded === installed_version, recorded];
|
|
259
|
+
}
|
|
260
|
+
var _SEMVER_RE = /^\s*v?(\d+)\.(\d+)\.(\d+)/;
|
|
261
|
+
function _parse_semver(version) {
|
|
262
|
+
const match = _SEMVER_RE.exec(version);
|
|
263
|
+
if (!match) {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
return [Number.parseInt(match[1], 10), Number.parseInt(match[2], 10), Number.parseInt(match[3], 10)];
|
|
267
|
+
}
|
|
268
|
+
function classify_mismatch(installed_version, recorded) {
|
|
269
|
+
if (recorded === null) {
|
|
270
|
+
return "none";
|
|
271
|
+
}
|
|
272
|
+
if (recorded === installed_version) {
|
|
273
|
+
return "match";
|
|
274
|
+
}
|
|
275
|
+
const rec = _parse_semver(recorded);
|
|
276
|
+
const inst = _parse_semver(installed_version);
|
|
277
|
+
if (rec === null || inst === null) {
|
|
278
|
+
return "unparseable";
|
|
279
|
+
}
|
|
280
|
+
if (tuple_lt(rec, inst)) {
|
|
281
|
+
return "upgrade";
|
|
282
|
+
}
|
|
283
|
+
return "downgrade";
|
|
284
|
+
}
|
|
285
|
+
function tuple_lt(a, b) {
|
|
286
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
287
|
+
const av = a[i];
|
|
288
|
+
const bv = b[i];
|
|
289
|
+
if (av < bv) return true;
|
|
290
|
+
if (av > bv) return false;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
function _read_package_version(dir) {
|
|
295
|
+
try {
|
|
296
|
+
const data = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), { encoding: "utf-8" }));
|
|
297
|
+
const version = data.version;
|
|
298
|
+
if (typeof version === "string" && version.trim()) {
|
|
299
|
+
return version.trim();
|
|
300
|
+
}
|
|
301
|
+
} catch {
|
|
302
|
+
}
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
function _find_package_version_upward(start_dir) {
|
|
306
|
+
let dir = start_dir;
|
|
307
|
+
for (; ; ) {
|
|
308
|
+
const found = _read_package_version(dir);
|
|
309
|
+
if (found !== null) {
|
|
310
|
+
return found;
|
|
311
|
+
}
|
|
312
|
+
const parent = path.dirname(dir);
|
|
313
|
+
if (parent === dir) {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
dir = parent;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function current_package_version(repo_root) {
|
|
320
|
+
if (repo_root != null) {
|
|
321
|
+
return _read_package_version(repo_root) ?? "0.0.0";
|
|
322
|
+
}
|
|
323
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
324
|
+
return _find_package_version_upward(here) ?? "0.0.0";
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export {
|
|
328
|
+
lockfile_path,
|
|
329
|
+
lockfile_write_path,
|
|
330
|
+
read_lockfile,
|
|
331
|
+
write_lockfile,
|
|
332
|
+
migrate_layout,
|
|
333
|
+
check_version,
|
|
334
|
+
classify_mismatch,
|
|
335
|
+
current_package_version
|
|
336
|
+
};
|