orizu 0.5.8 → 0.5.9

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.
@@ -280,6 +280,12 @@ export async function bootstrapHostedSandbox(opts) {
280
280
  const skillSkillsDirRel = `${workspaceDir}/.claude/skills`;
281
281
  const stage = await session.exec([
282
282
  `mkdir -p ${skillSkillsDirRel}`,
283
+ // The staged skill is bootstrap-injected RUNTIME scaffolding (a symlink to
284
+ // the sandbox-local CLI vendor dir), NOT the agent's work. Exclude it
285
+ // repo-LOCALLY (.git/info/exclude — invisible to the diff, never committed)
286
+ // so auto-harvest's `git add -A` can't sweep it into the session branch and
287
+ // (ALI-1051) auto-apply a broken symlink to the customer's main.
288
+ `if [ -d ${workspaceDir}/.git ]; then printf '%s\\n' '/.claude/skills/' >> ${workspaceDir}/.git/info/exclude; fi`,
283
289
  `src="${'${ORIZU_SKILL_SOURCE_DIR:-}'}"`,
284
290
  `if [ -z "$src" ] || [ ! -d "$src" ]; then src="$(orizu skills path 2>/dev/null || true)"; fi`,
285
291
  `if [ -z "$src" ] || [ ! -d "$src" ]; then r="$(npm root -g 2>/dev/null || true)"; if [ -n "$r" ] && [ -d "$r/orizu/vendor/skills/orizu-cli" ]; then src="$r/orizu/vendor/skills/orizu-cli"; fi; fi`,
@@ -66,13 +66,18 @@ export function harvestWorkspace(opts) {
66
66
  }
67
67
  const exec = opts.exec ?? defaultHarvestExec(opts.workspaceDir);
68
68
  try {
69
- const status = exec(['status', '--porcelain']);
69
+ // Never harvest bootstrap-injected runtime scaffolding (ALI-1051): the
70
+ // .claude/skills symlink is a sandbox-local pointer, not the agent's work.
71
+ // Bootstrap also excludes it via .git/info/exclude; this pathspec is the
72
+ // belt-and-braces for any sandbox where that didn't run.
73
+ const excludeScaffold = [':(exclude).claude/skills/**', ':(exclude).claude/skills'];
74
+ const status = exec(['status', '--porcelain', '--', '.', ...excludeScaffold]);
70
75
  if (status.exitCode !== 0) {
71
76
  return { kind: 'work_persist_failed', error: `git status failed: ${detail(status)}` };
72
77
  }
73
78
  const dirty = status.stdout.trim().length > 0;
74
79
  if (dirty) {
75
- const add = exec(['add', '-A']);
80
+ const add = exec(['add', '-A', '--', '.', ...excludeScaffold]);
76
81
  if (add.exitCode !== 0) {
77
82
  return { kind: 'work_persist_failed', error: `git add failed: ${detail(add)}` };
78
83
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orizu",
3
- "version": "0.5.8",
3
+ "version": "0.5.9",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -457,6 +457,12 @@ export async function bootstrapHostedSandbox(opts: HostedBootstrapOptions): Prom
457
457
  const stage = await session.exec(
458
458
  [
459
459
  `mkdir -p ${skillSkillsDirRel}`,
460
+ // The staged skill is bootstrap-injected RUNTIME scaffolding (a symlink to
461
+ // the sandbox-local CLI vendor dir), NOT the agent's work. Exclude it
462
+ // repo-LOCALLY (.git/info/exclude — invisible to the diff, never committed)
463
+ // so auto-harvest's `git add -A` can't sweep it into the session branch and
464
+ // (ALI-1051) auto-apply a broken symlink to the customer's main.
465
+ `if [ -d ${workspaceDir}/.git ]; then printf '%s\\n' '/.claude/skills/' >> ${workspaceDir}/.git/info/exclude; fi`,
460
466
  `src="${'${ORIZU_SKILL_SOURCE_DIR:-}'}"`,
461
467
  `if [ -z "$src" ] || [ ! -d "$src" ]; then src="$(orizu skills path 2>/dev/null || true)"; fi`,
462
468
  `if [ -z "$src" ] || [ ! -d "$src" ]; then r="$(npm root -g 2>/dev/null || true)"; if [ -n "$r" ] && [ -d "$r/orizu/vendor/skills/orizu-cli" ]; then src="$r/orizu/vendor/skills/orizu-cli"; fi; fi`,
@@ -104,14 +104,19 @@ export function harvestWorkspace(opts: HarvestOptions): HarvestOutcome {
104
104
  }
105
105
  const exec = opts.exec ?? defaultHarvestExec(opts.workspaceDir)
106
106
  try {
107
- const status = exec(['status', '--porcelain'])
107
+ // Never harvest bootstrap-injected runtime scaffolding (ALI-1051): the
108
+ // .claude/skills symlink is a sandbox-local pointer, not the agent's work.
109
+ // Bootstrap also excludes it via .git/info/exclude; this pathspec is the
110
+ // belt-and-braces for any sandbox where that didn't run.
111
+ const excludeScaffold = [':(exclude).claude/skills/**', ':(exclude).claude/skills']
112
+ const status = exec(['status', '--porcelain', '--', '.', ...excludeScaffold])
108
113
  if (status.exitCode !== 0) {
109
114
  return { kind: 'work_persist_failed', error: `git status failed: ${detail(status)}` }
110
115
  }
111
116
  const dirty = status.stdout.trim().length > 0
112
117
 
113
118
  if (dirty) {
114
- const add = exec(['add', '-A'])
119
+ const add = exec(['add', '-A', '--', '.', ...excludeScaffold])
115
120
  if (add.exitCode !== 0) {
116
121
  return { kind: 'work_persist_failed', error: `git add failed: ${detail(add)}` }
117
122
  }