From 1842375108c012cc1e7069a0ad9a665f109e2244 Mon Sep 17 00:00:00 2001 From: hatayama Date: Tue, 27 Oct 2026 17:39:19 +0900 Subject: [PATCH] Hide verify-project from help, command lists, and installed skills Unity's official CLI already covers these project-file checks, so this project does not need to offer its own. It follows the compile-check precedent: the command stays routable by name, while nothing user-facing advertises it. - Mark its native command entry Hidden and its skill internal, so --help, `uloop list --names`, completion, and `uloop skills install` leave it out - Drop its skill guidance line and the generated .claude/.agents copies, so --help never points at a skill that is no longer installed - Remove it from both READMEs and restamp the shared release inputs --- .agents/skills/uloop-verify-project/SKILL.md | 86 ------------------- .claude/skills/uloop-verify-project/SKILL.md | 86 ------------------- .../VerifyProject/Skill/SKILL.md | 1 + README.md | 6 +- README_ja.md | 6 +- cli/common/clicore/command_errors_test.go | 2 +- cli/common/clicore/command_registry.go | 4 +- cli/common/clicore/command_registry_test.go | 35 +++++--- cli/common/tooldocs/skill_guidance.go | 2 - cli/common/tooldocs/skill_guidance_test.go | 14 +-- .../internal/dispatcher/help_test.go | 6 +- .../dispatcher/verify_project_test.go | 11 +-- cli/dispatcher/shared-inputs-stamp.json | 2 +- .../internal/projectrunner/list_names_test.go | 4 +- cli/project-runner/shared-inputs-stamp.json | 2 +- 15 files changed, 52 insertions(+), 215 deletions(-) delete mode 100644 .agents/skills/uloop-verify-project/SKILL.md delete mode 100644 .claude/skills/uloop-verify-project/SKILL.md diff --git a/.agents/skills/uloop-verify-project/SKILL.md b/.agents/skills/uloop-verify-project/SKILL.md deleted file mode 100644 index ff4f6e02f8..0000000000 --- a/.agents/skills/uloop-verify-project/SKILL.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -name: uloop-verify-project -description: "Check a Unity project's files without starting Unity: missing or orphaned .meta files, invalid or duplicate GUIDs, leftover merge conflict markers, and a broken Packages/manifest.json. Use after adding, moving, renaming, deleting, or merging assets, and before committing." ---- - -# uloop verify-project - -Check the project's files the way Unity reads them on its next import, without starting Unity. -When Unity opens a project with these problems, it silently gives assets new GUIDs and deletes -orphaned `.meta` files, which breaks references in ways that cannot be undone. Run this first and -fix what it finds while the old GUIDs still exist. - -## When to use - -- After adding, moving, renaming, copying, or deleting assets, especially from a script or another branch -- After a merge or rebase that touched `Assets/`, `Packages/`, or `ProjectSettings/` -- Before committing -- Before opening the project in Unity - -## Usage - -```bash -uloop verify-project -uloop verify-project --project-path -``` - -Exit codes: - -- `0`: nothing found -- `1`: problems found (the report is still printed on stdout), or the check could not run (an error - envelope on stderr and nothing on stdout) - -## Checks - -| Check | Meaning | How to fix | -|-------|---------|------------| -| `CONFLICT_MARKER` | A merge conflict block (`<<<<<<<`, `=======`, `>>>>>>>`) is left in a file | Resolve the conflict and remove the markers; Unity cannot load or compile a file that contains them | -| `MANIFEST_INVALID` | `Packages/manifest.json` is missing, is not a valid JSON object, has a malformed `dependencies` object, or has a `file:` dependency that does not point to a package folder | Restore the manifest from version control, or fix or remove the dependency the message names | -| `GUID_DUPLICATE` | Two or more `.meta` files declare the same GUID | Keep the `.meta` file of the original asset and delete the copies' `.meta` files so Unity assigns them new GUIDs | -| `GUID_INVALID` | A `.meta` file has no valid `guid:` line (32 hexadecimal characters, not all zero) | Restore the `.meta` file from version control; otherwise Unity assigns a new GUID, which breaks references to the asset | -| `META_MISSING` | An asset has no `.meta` file next to it | Bring its `.meta` file along from the branch or folder it came from; if you just created the asset, let Unity import it (for example with `uloop compile`) and commit the generated `.meta` file | -| `META_ORPHAN` | A `.meta` file has no matching asset | If the asset was moved or renamed, move the `.meta` file with it to keep the GUID; if the asset was deleted, delete the `.meta` file too | - -## What is checked - -- `.meta` files under `Assets/`, under every embedded package (a folder directly under `Packages/` - with a `package.json` file), and under every local package the manifest lists as `file:` - (a relative path is resolved from `Packages/`). A folder inside another of these is checked once. -- Names Unity hides are skipped and need no `.meta` file: names starting with `.`, names ending - with `~`, `cvs` in any case, and files with a `.tmp` extension in any case. -- Plugin folders ending in `.bundle`, `.framework`, `.xcframework`, `.plugin`, or `.androidlib` - (any case) need their own `.meta` file, but nothing inside them is checked: Unity imports such a - folder as one plugin, so the files inside are not checked whether they have `.meta` files or not. -- Symbolic links need a `.meta` file but are never followed. -- A `.meta` file pairs with its asset by exact name, letter case included, so the result is the same - on every OS. An orphaned `.meta` file is not checked further, because Unity deletes it. -- Conflict markers are searched in every file of those folders (`.meta` files included), every file - under `ProjectSettings/`, and `Packages/manifest.json` and `Packages/packages-lock.json`. Only the - first block of each file is reported. A file with a NUL byte in its first 8000 bytes is treated as - binary and skipped. - -## Output - -JSON on stdout: - -- `Success`: `true` when nothing was found -- `ProjectRoot`: the checked project -- `FindingCount`: every problem found, including those left out of `Findings` -- `CountsByCheck`: the count for each of the six checks, always all six -- `Findings`: each with `Check`, `Path`, and `Message`, plus `Line` for `CONFLICT_MARKER` and - `GUID` and `RelatedPaths` for `GUID_DUPLICATE`. `Path` is `/`-separated and relative to the - project, or absolute for a local package outside it. Sorted in the order of the table above, then - by path. At most 100 findings of each check are listed. -- `Truncated`: `true` when a check had more than 100 findings -- `ScannedRoots`: the folders whose `.meta` files were checked -- `MetaFileCount`: how many `.meta` files were checked -- `Message`: one-line summary - -## Notes - -- A file you just created has no .meta file until Unity imports it. Run `uloop compile` first, or treat META_MISSING on brand-new files as expected. -- After a fresh clone, an empty folder that git does not track leaves its folder .meta file as META_ORPHAN. Delete that .meta file, or add a file to the folder so git tracks it. -- Run it while Unity is idle. Files Unity is writing at that moment can be reported, and a file Unity deletes during the check makes the command fail; run it again once Unity is idle. -- Not checked: GUID collisions with packages in Library/PackageCache, folders hidden only by the Windows hidden attribute (they are reported as META_MISSING), and package folders under Packages/ that are symbolic links. -- It only reads files and works whether Unity is open or closed. -- If uloop answers that verify-project is an unknown command, or that it "is handled by the global uloop dispatcher", the installed uloop is older than this command: run `uloop update`. diff --git a/.claude/skills/uloop-verify-project/SKILL.md b/.claude/skills/uloop-verify-project/SKILL.md deleted file mode 100644 index ff4f6e02f8..0000000000 --- a/.claude/skills/uloop-verify-project/SKILL.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -name: uloop-verify-project -description: "Check a Unity project's files without starting Unity: missing or orphaned .meta files, invalid or duplicate GUIDs, leftover merge conflict markers, and a broken Packages/manifest.json. Use after adding, moving, renaming, deleting, or merging assets, and before committing." ---- - -# uloop verify-project - -Check the project's files the way Unity reads them on its next import, without starting Unity. -When Unity opens a project with these problems, it silently gives assets new GUIDs and deletes -orphaned `.meta` files, which breaks references in ways that cannot be undone. Run this first and -fix what it finds while the old GUIDs still exist. - -## When to use - -- After adding, moving, renaming, copying, or deleting assets, especially from a script or another branch -- After a merge or rebase that touched `Assets/`, `Packages/`, or `ProjectSettings/` -- Before committing -- Before opening the project in Unity - -## Usage - -```bash -uloop verify-project -uloop verify-project --project-path -``` - -Exit codes: - -- `0`: nothing found -- `1`: problems found (the report is still printed on stdout), or the check could not run (an error - envelope on stderr and nothing on stdout) - -## Checks - -| Check | Meaning | How to fix | -|-------|---------|------------| -| `CONFLICT_MARKER` | A merge conflict block (`<<<<<<<`, `=======`, `>>>>>>>`) is left in a file | Resolve the conflict and remove the markers; Unity cannot load or compile a file that contains them | -| `MANIFEST_INVALID` | `Packages/manifest.json` is missing, is not a valid JSON object, has a malformed `dependencies` object, or has a `file:` dependency that does not point to a package folder | Restore the manifest from version control, or fix or remove the dependency the message names | -| `GUID_DUPLICATE` | Two or more `.meta` files declare the same GUID | Keep the `.meta` file of the original asset and delete the copies' `.meta` files so Unity assigns them new GUIDs | -| `GUID_INVALID` | A `.meta` file has no valid `guid:` line (32 hexadecimal characters, not all zero) | Restore the `.meta` file from version control; otherwise Unity assigns a new GUID, which breaks references to the asset | -| `META_MISSING` | An asset has no `.meta` file next to it | Bring its `.meta` file along from the branch or folder it came from; if you just created the asset, let Unity import it (for example with `uloop compile`) and commit the generated `.meta` file | -| `META_ORPHAN` | A `.meta` file has no matching asset | If the asset was moved or renamed, move the `.meta` file with it to keep the GUID; if the asset was deleted, delete the `.meta` file too | - -## What is checked - -- `.meta` files under `Assets/`, under every embedded package (a folder directly under `Packages/` - with a `package.json` file), and under every local package the manifest lists as `file:` - (a relative path is resolved from `Packages/`). A folder inside another of these is checked once. -- Names Unity hides are skipped and need no `.meta` file: names starting with `.`, names ending - with `~`, `cvs` in any case, and files with a `.tmp` extension in any case. -- Plugin folders ending in `.bundle`, `.framework`, `.xcframework`, `.plugin`, or `.androidlib` - (any case) need their own `.meta` file, but nothing inside them is checked: Unity imports such a - folder as one plugin, so the files inside are not checked whether they have `.meta` files or not. -- Symbolic links need a `.meta` file but are never followed. -- A `.meta` file pairs with its asset by exact name, letter case included, so the result is the same - on every OS. An orphaned `.meta` file is not checked further, because Unity deletes it. -- Conflict markers are searched in every file of those folders (`.meta` files included), every file - under `ProjectSettings/`, and `Packages/manifest.json` and `Packages/packages-lock.json`. Only the - first block of each file is reported. A file with a NUL byte in its first 8000 bytes is treated as - binary and skipped. - -## Output - -JSON on stdout: - -- `Success`: `true` when nothing was found -- `ProjectRoot`: the checked project -- `FindingCount`: every problem found, including those left out of `Findings` -- `CountsByCheck`: the count for each of the six checks, always all six -- `Findings`: each with `Check`, `Path`, and `Message`, plus `Line` for `CONFLICT_MARKER` and - `GUID` and `RelatedPaths` for `GUID_DUPLICATE`. `Path` is `/`-separated and relative to the - project, or absolute for a local package outside it. Sorted in the order of the table above, then - by path. At most 100 findings of each check are listed. -- `Truncated`: `true` when a check had more than 100 findings -- `ScannedRoots`: the folders whose `.meta` files were checked -- `MetaFileCount`: how many `.meta` files were checked -- `Message`: one-line summary - -## Notes - -- A file you just created has no .meta file until Unity imports it. Run `uloop compile` first, or treat META_MISSING on brand-new files as expected. -- After a fresh clone, an empty folder that git does not track leaves its folder .meta file as META_ORPHAN. Delete that .meta file, or add a file to the folder so git tracks it. -- Run it while Unity is idle. Files Unity is writing at that moment can be reported, and a file Unity deletes during the check makes the command fail; run it again once Unity is idle. -- Not checked: GUID collisions with packages in Library/PackageCache, folders hidden only by the Windows hidden attribute (they are reported as META_MISSING), and package folders under Packages/ that are symbolic links. -- It only reads files and works whether Unity is open or closed. -- If uloop answers that verify-project is an unknown command, or that it "is handled by the global uloop dispatcher", the installed uloop is older than this command: run `uloop update`. diff --git a/Packages/src/Editor/CliOnlyTools~/VerifyProject/Skill/SKILL.md b/Packages/src/Editor/CliOnlyTools~/VerifyProject/Skill/SKILL.md index ff4f6e02f8..5aff0d6089 100644 --- a/Packages/src/Editor/CliOnlyTools~/VerifyProject/Skill/SKILL.md +++ b/Packages/src/Editor/CliOnlyTools~/VerifyProject/Skill/SKILL.md @@ -1,6 +1,7 @@ --- name: uloop-verify-project description: "Check a Unity project's files without starting Unity: missing or orphaned .meta files, invalid or duplicate GUIDs, leftover merge conflict markers, and a broken Packages/manifest.json. Use after adding, moving, renaming, deleting, or merging assets, and before committing." +internal: true --- # uloop verify-project diff --git a/README.md b/README.md index 9060e89c28..6e0831e4ec 100644 --- a/README.md +++ b/README.md @@ -243,13 +243,12 @@ That's it! After installing Skills, LLM tools can automatically handle instructi
-All 23 Bundled Skills +All 22 Bundled Skills - `/uloop-launch` - Launch Unity with correct version - `/uloop-status` - Check whether Unity can take a command now - `/uloop-cancel` - Cancel the command Unity is running now, when BUSY keeps rejecting commands - `/uloop-compile` - Execute compilation -- `/uloop-verify-project` - Check .meta files, GUIDs, conflict markers, and the package manifest without Unity - `/uloop-get-logs` - Get console logs - `/uloop-run-tests` - Run tests - `/uloop-hot-reload` - Apply method-body changes to running code instantly, without recompiling @@ -289,9 +288,6 @@ uloop launch -p Android # Kill running Unity and restart uloop launch -r -# Check .meta files, GUIDs, and conflict markers without Unity -uloop verify-project - # Execute compilation uloop compile diff --git a/README_ja.md b/README_ja.md index dff2af52ef..bb7e37785b 100644 --- a/README_ja.md +++ b/README_ja.md @@ -243,13 +243,12 @@ V2 のプロジェクトの Settings ウィンドウで **Update CLI** や **Dow
-バンドルされている全23個のSkills一覧 +バンドルされている全22個のSkills一覧 - `/uloop-launch` - 正しいバージョンでUnityを起動 - `/uloop-status` - Unityが今コマンドを受け付けられるかを確認 - `/uloop-cancel` - BUSYでコマンドが拒否され続けるときに、Unityが実行中のコマンドをキャンセル - `/uloop-compile` - コンパイルの実行 -- `/uloop-verify-project` - Unityを起動せずに.metaファイル・GUID・コンフリクトマーカー・パッケージmanifestを検査 - `/uloop-get-logs` - Consoleログの取得 - `/uloop-run-tests` - テストの実行 - `/uloop-hot-reload` - メソッド本体の変更を再コンパイルなしで実行中のコードへ即時適用 @@ -289,9 +288,6 @@ uloop launch -p Android # 実行中のUnityを終了して再起動 uloop launch -r -# Unityを起動せずに.metaファイル・GUID・コンフリクトマーカーを検査 -uloop verify-project - # コンパイルを実行 uloop compile diff --git a/cli/common/clicore/command_errors_test.go b/cli/common/clicore/command_errors_test.go index 1f107b1786..aeee93adbf 100644 --- a/cli/common/clicore/command_errors_test.go +++ b/cli/common/clicore/command_errors_test.go @@ -9,7 +9,7 @@ import ( func TestAvailableCommandNamesIncludesBuiltIns(t *testing.T) { // Verifies unknown-command suggestions include visible built-in CLI commands before cached tools. names := availableCommandNames(ToolsCache{}) - expectedBuiltIns := []string{"launch", "verify-project", "list", "sync", "focus-window", "await-pause-point", "pause-point-status", "set-code-optimization", "status", "cancel", "skills", "package", "install", "update", "uninstall"} + expectedBuiltIns := []string{"launch", "list", "sync", "focus-window", "await-pause-point", "pause-point-status", "set-code-optimization", "status", "cancel", "skills", "package", "install", "update", "uninstall"} for index, expected := range expectedBuiltIns { if names[index] != expected { t.Fatalf("built-in command mismatch: %#v", names) diff --git a/cli/common/clicore/command_registry.go b/cli/common/clicore/command_registry.go index db60371701..67ea7a7356 100644 --- a/cli/common/clicore/command_registry.go +++ b/cli/common/clicore/command_registry.go @@ -40,7 +40,9 @@ var NativeCommands = []NativeCommandEntry{ // Why compile-check is hidden: its place beside `uloop compile` is not settled, so it stays // runnable for development while nothing user-facing advertises it (ADR 0018, amendment). {Name: CompileCheckCommandName, Description: "Compile changed assemblies with the Editor's bundled C# compiler without launching Unity", Owner: DispatcherOwned, Hidden: true}, - {Name: VerifyProjectCommandName, Description: "Check .meta files, GUIDs, merge conflict markers, and Packages/manifest.json without Unity", Owner: DispatcherOwned}, + // Why verify-project is hidden: Unity's official CLI already covers these project-file checks, + // so this project does not need to offer its own. + {Name: VerifyProjectCommandName, Description: "Check .meta files, GUIDs, merge conflict markers, and Packages/manifest.json without Unity", Owner: DispatcherOwned, Hidden: true}, {Name: "list", Description: "Show Unity tools currently exposed by the Editor", Owner: RunnerOwned}, {Name: "sync", Description: "Refresh .uloop/tools.json from the running Editor", Owner: RunnerOwned}, {Name: "focus-window", Description: "Bring the Unity Editor window to the foreground", Owner: RunnerOwned}, diff --git a/cli/common/clicore/command_registry_test.go b/cli/common/clicore/command_registry_test.go index 481203c6f6..38b208fe40 100644 --- a/cli/common/clicore/command_registry_test.go +++ b/cli/common/clicore/command_registry_test.go @@ -141,23 +141,34 @@ func TestVisibleNativeCommandsLeaveOutAHiddenEntry(t *testing.T) { } } -// Verifies compile-check is registered as a hidden dispatcher-owned command: routable by name but -// left out of the listed commands and of completion while its place beside `uloop compile` is open. -func TestCompileCheckIsRoutableButNotListed(t *testing.T) { - if !IsDispatcherOwnedCommandName(CompileCheckCommandName) { - t.Fatalf("%s must stay registered as a dispatcher-owned command", CompileCheckCommandName) +// Verifies compile-check and verify-project are registered as hidden dispatcher-owned commands: +// routable by name but left out of the listed commands and of completion, and that no other +// command is hidden. +func TestHiddenDispatcherCommandsAreRoutableButNotListed(t *testing.T) { + hiddenCommands := []string{CompileCheckCommandName, VerifyProjectCommandName} + for _, command := range hiddenCommands { + assertRoutableButNotListed(t, command) + } + if len(VisibleNativeCommands()) != len(NativeCommands)-len(hiddenCommands) { + t.Fatalf("only %v should be hidden: %#v", hiddenCommands, VisibleNativeCommands()) + } +} + +// assertRoutableButNotListed fails the test unless command stays dispatcher-owned while help and +// completion leave it out. +func assertRoutableButNotListed(t *testing.T, command string) { + t.Helper() + if !IsDispatcherOwnedCommandName(command) { + t.Fatalf("%s must stay registered as a dispatcher-owned command", command) } for _, entry := range VisibleNativeCommands() { - if entry.Name == CompileCheckCommandName { - t.Fatalf("%s must not be listed: %#v", CompileCheckCommandName, VisibleNativeCommands()) + if entry.Name == command { + t.Fatalf("%s must not be listed: %#v", command, VisibleNativeCommands()) } } for _, name := range NativeCommandNamesForCompletion() { - if name == CompileCheckCommandName { - t.Fatalf("%s must not be offered as a completion: %#v", CompileCheckCommandName, NativeCommandNamesForCompletion()) + if name == command { + t.Fatalf("%s must not be offered as a completion: %#v", command, NativeCommandNamesForCompletion()) } } - if len(VisibleNativeCommands()) != len(NativeCommands)-1 { - t.Fatalf("only %s should be hidden: %#v", CompileCheckCommandName, VisibleNativeCommands()) - } } diff --git a/cli/common/tooldocs/skill_guidance.go b/cli/common/tooldocs/skill_guidance.go index 996f03eae8..03aa21998b 100644 --- a/cli/common/tooldocs/skill_guidance.go +++ b/cli/common/tooldocs/skill_guidance.go @@ -38,8 +38,6 @@ var commandSkillNames = map[string]string{ "enable-watch": "uloop-pause-point", "clear-watch": "uloop-pause-point", "get-watch-values": "uloop-pause-point", - - "verify-project": "uloop-verify-project", } // SkillGuidanceLine returns the closing line of a command's --help output: an instruction to load diff --git a/cli/common/tooldocs/skill_guidance_test.go b/cli/common/tooldocs/skill_guidance_test.go index 278c4e4741..2554fb3f64 100644 --- a/cli/common/tooldocs/skill_guidance_test.go +++ b/cli/common/tooldocs/skill_guidance_test.go @@ -19,12 +19,14 @@ func TestSkillGuidanceLineNamesTheMatchingSkill(t *testing.T) { } } -// Verifies the hidden compile-check command gets no skill guidance line: its skill is internal and -// not installed, so pointing at it would send the reader to a skill that does not exist. -func TestSkillGuidanceLineLeavesOutTheHiddenCompileCheckCommand(t *testing.T) { - line, ok := SkillGuidanceLine("compile-check") - if ok { - t.Errorf("guidance line = %q, want none while compile-check is hidden", line) +// Verifies the hidden compile-check and verify-project commands get no skill guidance line: their +// skills are internal and not installed, so pointing at one would send the reader to a skill that +// does not exist. +func TestSkillGuidanceLineLeavesOutHiddenCommands(t *testing.T) { + for _, command := range []string{"compile-check", "verify-project"} { + if line, ok := SkillGuidanceLine(command); ok { + t.Errorf("%s guidance line = %q, want none while the command is hidden", command, line) + } } } diff --git a/cli/dispatcher/internal/dispatcher/help_test.go b/cli/dispatcher/internal/dispatcher/help_test.go index c376dda704..d86a61c1e3 100644 --- a/cli/dispatcher/internal/dispatcher/help_test.go +++ b/cli/dispatcher/internal/dispatcher/help_test.go @@ -24,7 +24,6 @@ func TestPrintDispatcherHelpListsNativeCommandsAndLiveToolGuidance(t *testing.T) "Dispatcher. Finds the Unity project, then dispatches live Unity tool commands.", "Native commands:", " launch", - " verify-project", " focus-window", " list", " skills", @@ -47,6 +46,8 @@ func TestPrintDispatcherHelpListsNativeCommandsAndLiveToolGuidance(t *testing.T) for _, unexpected := range []string{ // Why compile-check is here: it is a hidden native command, still routable but never listed. " compile", + // verify-project is hidden the same way. + " verify-project", " get-logs", " run-tests", "uloop --list-commands", @@ -68,7 +69,6 @@ func TestPrintProjectLocalHelpListsNativeCommandsAndLiveToolGuidance(t *testing. for _, expected := range []string{ "Native commands:", " launch", - " verify-project", " focus-window", " list", " sync", @@ -88,6 +88,8 @@ func TestPrintProjectLocalHelpListsNativeCommandsAndLiveToolGuidance(t *testing. for _, unexpected := range []string{ // Why compile-check is here: it is a hidden native command, still routable but never listed. " compile", + // verify-project is hidden the same way. + " verify-project", " get-logs", " run-tests", "uloop --list-commands", diff --git a/cli/dispatcher/internal/dispatcher/verify_project_test.go b/cli/dispatcher/internal/dispatcher/verify_project_test.go index 9aa749a030..1cac6fd6c2 100644 --- a/cli/dispatcher/internal/dispatcher/verify_project_test.go +++ b/cli/dispatcher/internal/dispatcher/verify_project_test.go @@ -198,8 +198,8 @@ func TestVerifyProjectRejectsPositionalArgument(t *testing.T) { callVerifyProject([]string{"verify-project", "extra"}, projectRoot, ""), "extra") } -// Verifies --help or -h anywhere after the command prints the usage and points to the skill, even -// next to an unknown option. +// Verifies --help or -h anywhere after the command prints the usage, even next to an unknown +// option, without pointing to the skill that hidden verify-project no longer installs. func TestVerifyProjectHelpPrintsUsage(t *testing.T) { for _, args := range [][]string{ {"verify-project", "--help"}, @@ -211,13 +211,14 @@ func TestVerifyProjectHelpPrintsUsage(t *testing.T) { if !call.handled || call.code != 0 || call.stderr != "" { t.Fatalf("%v: handled=%v code=%d stderr=%s", args, call.handled, call.code, call.stderr) } - for _, expected := range []string{ - "uloop verify-project", "Global options:", "Load the uloop-verify-project skill", - } { + for _, expected := range []string{"uloop verify-project", "Global options:"} { if !strings.Contains(call.stdout, expected) { t.Fatalf("%v: help output missing %q:\n%s", args, expected, call.stdout) } } + if strings.Contains(call.stdout, "uloop-verify-project") { + t.Fatalf("%v: help output must not name the uninstalled skill:\n%s", args, call.stdout) + } } } diff --git a/cli/dispatcher/shared-inputs-stamp.json b/cli/dispatcher/shared-inputs-stamp.json index 3ae049d319..32f5d47cdc 100644 --- a/cli/dispatcher/shared-inputs-stamp.json +++ b/cli/dispatcher/shared-inputs-stamp.json @@ -1,4 +1,4 @@ { "schemaVersion": 1, - "sharedInputsHash": "201f7fc23d2f35969582d5f290edaf13a1556929" + "sharedInputsHash": "0a0862142bfe42dd8abf5f68e895b6ded074284d" } diff --git a/cli/project-runner/internal/projectrunner/list_names_test.go b/cli/project-runner/internal/projectrunner/list_names_test.go index 1161f38f8c..41939214f8 100644 --- a/cli/project-runner/internal/projectrunner/list_names_test.go +++ b/cli/project-runner/internal/projectrunner/list_names_test.go @@ -44,7 +44,7 @@ func TestRunResolvedProjectCommandListNamesWritesNativeAndLiveToolNames(t *testi t.Fatalf("list --names failed: code=%d stdout=%s stderr=%s", code, stdout.String(), stderr.String()) } - const expected = "launch\nverify-project\nlist\nsync\nfocus-window\nawait-pause-point\npause-point-status\nset-code-optimization\nstatus\ncancel\nskills\npackage\ninstall\nupdate\nuninstall\nversion\nenable-watch\nclear-watch\nget-watch-values\n" + const expected = "launch\nlist\nsync\nfocus-window\nawait-pause-point\npause-point-status\nset-code-optimization\nstatus\ncancel\nskills\npackage\ninstall\nupdate\nuninstall\nversion\nenable-watch\nclear-watch\nget-watch-values\n" if stdout.String() != expected { t.Fatalf("list --names output mismatch:\n got:\n%s\nwant:\n%s", stdout.String(), expected) } @@ -58,7 +58,7 @@ func TestRunResolvedProjectCommandListNamesWritesNativeAndLiveToolNames(t *testi // Verifies list accepts repeated names selectors but rejects value assignment and positional // arguments with the complete stable INVALID_ARGUMENT envelope. func TestRunListOptionBoundaries(t *testing.T) { - const namesOutput = "launch\nverify-project\nlist\nsync\nfocus-window\nawait-pause-point\npause-point-status\nset-code-optimization\nstatus\ncancel\nskills\npackage\ninstall\nupdate\nuninstall\nversion\n" + const namesOutput = "launch\nlist\nsync\nfocus-window\nawait-pause-point\npause-point-status\nset-code-optimization\nstatus\ncancel\nskills\npackage\ninstall\nupdate\nuninstall\nversion\n" const namesAssignmentError = "{\n" + " \"Success\": false,\n" + " \"Error\": {\n" + diff --git a/cli/project-runner/shared-inputs-stamp.json b/cli/project-runner/shared-inputs-stamp.json index 466b358c17..2c39fdf551 100644 --- a/cli/project-runner/shared-inputs-stamp.json +++ b/cli/project-runner/shared-inputs-stamp.json @@ -1,4 +1,4 @@ { "schemaVersion": 1, - "sharedInputsHash": "30c21c3eae97d957604131bdd7f60b201fd1b64a" + "sharedInputsHash": "6e27b965cbea814d35f4df1634fe18faa82e46bd" }