arcane-cli 0.33.0 → 0.33.2
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.
|
@@ -54,7 +54,7 @@ Paste this entire file into any AI client (Claude web, ChatGPT, etc.) to give it
|
|
|
54
54
|
- **Framework-managed standards:** `.arcane/governance/`. Spells reference this single installed layer; **do not create a duplicate root `governance/` tree. Enforcement: explicitly advisory prose (ARC-023) — no check scans a repo for a duplicate root-level `governance/` directory.**
|
|
55
55
|
- **Project-owned orientation and continuity:** `README.md`, `project.md`, `TODO.md`, `DECISIONS.md`, `ai-context/`, and `journal/`. Arcane creates missing files once and preserves existing content.
|
|
56
56
|
- **Project/domain documents:** use explicit descriptive paths such as `docs/`, `security/`, `infrastructure/`, or a configured business root. These add project context alongside framework standards.
|
|
57
|
-
- **Overrides
|
|
57
|
+
- **Overrides survive `arcane update`:** editing a managed `.arcane/governance/` standard no longer risks silent loss. Additive project documents were always safe; a hand-edit to a shipped standard now is too. **Enforcement: executable check (ARC-038, shipped BC-31)** — `spell update` compares each file's on-disk content against its recorded hash at install time: unchanged, it refreshes normally; edited, it fetches the exact previously-installed published version as a three-way merge base against your edit and the new vendor content, auto-merging non-overlapping changes and leaving standard conflict markers only on genuine collisions. If the prior published version can't be fetched, your edit is left untouched with a warning rather than replaced.
|
|
58
58
|
|
|
59
59
|
## Research Reports
|
|
60
60
|
|
|
@@ -61,8 +61,8 @@ stale number is invisible until someone tries.
|
|
|
61
61
|
- **Spell prompts and instructions this framework ships**
|
|
62
62
|
(`.github/prompts/*.prompt.md`, `.github/instructions/*.md`): **plain text only —
|
|
63
63
|
cite the bare ID, no link at all** (`ARC-035`, not `[ARC-035](...)`). A full
|
|
64
|
-
canonical URL is *also* unsafe here, not just a same-repo link: it bakes
|
|
65
|
-
`github.com/
|
|
64
|
+
canonical URL is *also* unsafe here, not just a same-repo link: it bakes a literal
|
|
65
|
+
`github.com/{GITHUB_ORG}/{REPO_NAME}` — this project's own org and repo name — into
|
|
66
66
|
content the org-token portability gate (`scripts/org-token-lint.ts`, D2 in
|
|
67
67
|
`spell-authoring-standards.md`) exists specifically to keep out of distributed
|
|
68
68
|
spells. **Confirmed live 2026-08-31 (BC-06):** the build's `Org-token lint` failed
|
|
@@ -90,8 +90,8 @@ missing one. The first fix replaced it with a same-repo wiki-link to this repo's
|
|
|
90
90
|
`DECISIONS.md` — itself the exact cross-repo defect this section warns about
|
|
91
91
|
(`DECISIONS.md` doesn't ship). The second fix replaced that with a full canonical
|
|
92
92
|
URL, which held up locally but failed the build's org-token portability gate: a
|
|
93
|
-
`github.com/
|
|
94
|
-
gate treats as distributed content (see Doc-ID Link Format above). Settled on the
|
|
93
|
+
literal `github.com/{GITHUB_ORG}/{REPO_NAME}` URL bakes this project's own org into a
|
|
94
|
+
file the gate treats as distributed content (see Doc-ID Link Format above). Settled on the
|
|
95
95
|
bare ID — the gate's own documented safe form.
|
|
96
96
|
|
|
97
97
|
When completing a PR via `az repos pr update`, do **not** pass `--squash true`. The correct command:
|
package/dist/index.js
CHANGED
|
@@ -2287,6 +2287,29 @@ async function isHookInstalled(cwd, hookName, body) {
|
|
|
2287
2287
|
async function isHookEnforced(cwd) {
|
|
2288
2288
|
return isHookInstalled(cwd, "pre-push", PRE_PUSH_HOOK_BODY);
|
|
2289
2289
|
}
|
|
2290
|
+
var CLOSED_PR_WARNING_HOOK_BODY = `#!/bin/sh
|
|
2291
|
+
# Installed by Arcane (ARC-035 decision 4): warns when the branch being
|
|
2292
|
+
# pushed already has a closed or merged PR, instead of accepting the push
|
|
2293
|
+
# into a void with no signal at all. Never blocks -- pushing to a branch
|
|
2294
|
+
# behind a closed PR is sometimes intentional.
|
|
2295
|
+
remote_url="$2"
|
|
2296
|
+
case "$remote_url" in
|
|
2297
|
+
*github.com*) ;;
|
|
2298
|
+
*) exit 0 ;;
|
|
2299
|
+
esac
|
|
2300
|
+
command -v gh >/dev/null 2>&1 || exit 0
|
|
2301
|
+
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) || exit 0
|
|
2302
|
+
state=$(gh pr view "$branch" --json state --jq .state 2>/dev/null) || exit 0
|
|
2303
|
+
case "$state" in
|
|
2304
|
+
CLOSED|MERGED)
|
|
2305
|
+
echo "arcane: WARNING -- the PR for branch '$branch' is already $state. Pushing anyway (not blocked)." >&2
|
|
2306
|
+
;;
|
|
2307
|
+
esac
|
|
2308
|
+
exit 0
|
|
2309
|
+
`;
|
|
2310
|
+
async function installClosedPrWarningHook(cwd) {
|
|
2311
|
+
return installHook(cwd, "pre-push", CLOSED_PR_WARNING_HOOK_BODY);
|
|
2312
|
+
}
|
|
2290
2313
|
async function defaultHooks(cwd) {
|
|
2291
2314
|
let hooksDir;
|
|
2292
2315
|
try {
|
|
@@ -2980,6 +3003,15 @@ async function runInit(options, targetDir, assetsDir, packageVersion) {
|
|
|
2980
3003
|
);
|
|
2981
3004
|
}
|
|
2982
3005
|
}
|
|
3006
|
+
if (push_policy !== "blocked") {
|
|
3007
|
+
try {
|
|
3008
|
+
const hook = await installClosedPrWarningHook(targetDir);
|
|
3009
|
+
if (hook.status === "installed") {
|
|
3010
|
+
printInfo("Installed a pre-push hook that warns when the current branch's PR is already closed or merged.");
|
|
3011
|
+
}
|
|
3012
|
+
} catch {
|
|
3013
|
+
}
|
|
3014
|
+
}
|
|
2983
3015
|
try {
|
|
2984
3016
|
const hook = await installSecretsPrecommitHook(targetDir);
|
|
2985
3017
|
if (hook.status === "installed") {
|