mdk-skills 2.3.19 → 2.3.21

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.
@@ -2,6 +2,81 @@
2
2
  "skills": {
3
3
  "template": {
4
4
  "enabled": false
5
+ },
6
+ "algorithmic-art": {
7
+ "enabled": false
8
+ },
9
+ "android-cli": {
10
+ "enabled": true
11
+ },
12
+ "brand-guidelines": {
13
+ "enabled": false
14
+ },
15
+ "canvas-design": {
16
+ "enabled": false
17
+ },
18
+ "claude-api": {
19
+ "enabled": false
20
+ },
21
+ "doc-coauthoring": {
22
+ "enabled": false
23
+ },
24
+ "docx": {
25
+ "enabled": false
26
+ },
27
+ "frontend-design": {
28
+ "enabled": false
29
+ },
30
+ "internal-comms": {
31
+ "enabled": false
32
+ },
33
+ "mcp-builder": {
34
+ "enabled": false
35
+ },
36
+ "moark-doc-extraction": {
37
+ "enabled": false
38
+ },
39
+ "moark-image-gen": {
40
+ "enabled": false
41
+ },
42
+ "moark-ocr": {
43
+ "enabled": false
44
+ },
45
+ "moark-text-moderations": {
46
+ "enabled": false
47
+ },
48
+ "moark-tts": {
49
+ "enabled": false
50
+ },
51
+ "moark-web-search": {
52
+ "enabled": false
53
+ },
54
+ "pdf": {
55
+ "enabled": false
56
+ },
57
+ "pptx": {
58
+ "enabled": false
59
+ },
60
+ "skill-creator": {
61
+ "enabled": false
62
+ },
63
+ "slack-gif-creator": {
64
+ "enabled": false
65
+ },
66
+ "template-skill": {
67
+ "enabled": false
68
+ },
69
+ "theme-factory": {
70
+ "enabled": false
71
+ },
72
+ "web-artifacts-builder": {
73
+ "enabled": false
74
+ },
75
+ "webapp-testing": {
76
+ "enabled": false
77
+ },
78
+ "xlsx": {
79
+ "enabled": false
5
80
  }
6
81
  },
7
82
  "always_apply_skills": [
@@ -11,5 +86,5 @@
11
86
  "ui-ux-pro-max"
12
87
  ],
13
88
  "_active_profile": "vue3-frontend",
14
- "_skill_source": "D:\\软件\\test-skills"
15
- }
89
+ "_skill_source": "D:\\study_work\\study\\my-skills"
90
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "description": "Orchestrates Android development tasks including project creation, deployment, SDK management, and environment diagnostics using the `android` command-line tool.",
4
+ "tags": [],
5
+ "_updateCount": 0
6
+ }
@@ -0,0 +1,207 @@
1
+ ---
2
+ name: android-cli
3
+ description: Orchestrates Android development tasks including project creation, deployment, SDK management, and environment diagnostics using the `android` command-line tool.
4
+ license: Complete terms in LICENSE.txt
5
+ metadata:
6
+ author: Google LLC
7
+ keywords:
8
+ - sdk
9
+ - emulator
10
+ - skills
11
+ - docs
12
+ - knowledge base
13
+ - project creation
14
+ - screenshots
15
+ ---
16
+ # Android CLI Specialist
17
+
18
+ This skill provides instructions for using the `android` CLI tool. The tool includes various commands for creating projects, running applications, interacting with devices, and managing the CLI environment.
19
+
20
+ ## SDK management
21
+ To manage the installation of Android SDKs and tools, use the `sdk` command. For example:
22
+
23
+ - `android sdk install <package>[@<version>]...`: Install specific packages. Multiple packages can be specified, separated by spaces. `<version>` defaults to latest. For example: `android sdk install platforms/android-30@2 platforms/android-34`
24
+ - `android sdk update [<pkg-name>]`: Update a specific package or all packages to the latest version.
25
+ - `android sdk remove <pkg-name>`: Remove a package from the local SDK.
26
+ - `android sdk list --all`: List installed and available SDK packages.
27
+
28
+ ## Project creation
29
+ Create projects from templates using the `create` command.
30
+
31
+ For example: `android create empty-activity --name="My App" --output=./my-app`
32
+
33
+ ## Interacting with devices
34
+ For more information on interacting with running devices, see [here](references/interact.md)
35
+
36
+ ## Running journey tests
37
+ For more information on running journeys, see [here](references/journeys.md)
38
+
39
+ ## Doc searching
40
+ The `docs` command searches authoritative, high-quality Android developer documentation in the Android Knowledge Base.
41
+ By providing a few keywords, this tool will return high quality articles that contain examples or guidance on how to use Android APIs or libraries.
42
+ Use this tool to obtain additional information on how to achieve Android-specific tasks or to know more about Android APIs, surfaces, libraries, or devices.
43
+
44
+ Always use this tool to get the most up-to-date information about Android concepts. Typical good use cases are:
45
+ - Finding migration guides for APIs.
46
+ - Finding examples for APIs.
47
+ - Finding up-to-date information about Android APIs.
48
+ - Finding best practices for Android concepts.
49
+
50
+ ## Running APKs
51
+ Use the `run` command to run Android apps.
52
+
53
+ ## Managing emulators
54
+
55
+ Manage Android Virtual Devices (AVDs) using the `android emulator` command
56
+
57
+ ## Capturing screenshots
58
+
59
+ Capture an image of the current screen of a connected Android device and output it to a file using the `android screenshot` command.
60
+
61
+ ## Managing skills
62
+
63
+ Manage antigravity agent skills for Android using the `android skills` command.
64
+
65
+ ## Inspecting UI Layouts
66
+
67
+ Use the `android layout` command to inspect the UI layout of an Android application. It returns the layout tree of an Android application in JSON format. When debugging UI errors, this is often a much faster approach than taking a screenshot.
68
+
69
+ ## Updating the CLI
70
+
71
+ Update the Android CLI using the `android update` command.
72
+
73
+ # `android help` output
74
+
75
+ Usage: android [-hV] [--sdk=PARAM] [COMMAND]
76
+ -h, --help Show this help message and exit.
77
+ --sdk=PARAM Path to the Android SDK
78
+ -V, --version Print version information and exit.
79
+ Commands:
80
+ create Create a new Android project
81
+ describe Analyzes an Android project to generate descriptive metadata.
82
+ docs Android documentation commands
83
+ emulator Emulator commands
84
+ help Shows the help of all commands
85
+ info Print environment information (SDK Location, etc.)
86
+ init Initializes the environment (eg. skills) for Android CLI.
87
+ layout Returns the layout tree of an application
88
+ run Deploy an Android Application
89
+ screen Commands to view the device
90
+ sdk Download and list SDK packages
91
+ skills Manage skills
92
+ update Update the Android CLI
93
+
94
+ create
95
+ Usage: android create [-h] [--verbose] [--list] [--minSdk=api]
96
+ --name=applicationName [-o=dest-path] [template-name]
97
+ Create a new Android project
98
+ [template-name] The template name
99
+ -h, --help Show this help message and exit.
100
+ --minSdk=api The 'minSdk' supported by the application (default
101
+ is defined in the template)
102
+ --name=applicationName
103
+ The name of the application (e.g. 'My Application')
104
+ -o, --output=dest-path The destination project directory path (default is
105
+ '.')
106
+ --verbose Enables verbose output
107
+ --list List all available templates
108
+
109
+ describe
110
+ Usage: android describe [-hV] [--project_dir=PARAM]
111
+ Analyzes an Android project to generate descriptive metadata.
112
+ This command identifies and outputs the paths to JSON files that detail the
113
+ project's structure, including build targets and their corresponding output
114
+ artifact locations (e.g., APKs). This information enables other tools and
115
+ commands to locate build artifacts efficiently.
116
+ -h, --help Show this help message and exit.
117
+ --project_dir=PARAM The project directory to describe
118
+ -V, --version Print version information and exit.
119
+
120
+ docs
121
+ Usage: android docs [-h] [COMMAND]
122
+ Android documentation commands
123
+ -h, --help Show this help message and exit.
124
+ Commands:
125
+ search Search Android documentation
126
+ fetch Fetch Android documentation
127
+
128
+ emulator
129
+ Usage: android emulator [-h] [COMMAND]
130
+ Emulator commands
131
+ -h, --help Show this help message and exit.
132
+ Commands:
133
+ create Creates a virtual device
134
+ start Launches the specified virtual device. This command will return when
135
+ the emulator is fully started and ready to use.
136
+ stop Stops the specified virtual device
137
+ list Lists available virtual devices
138
+ remove Delete a virtual device
139
+
140
+ help
141
+ Usage: android help [COMMAND]
142
+ Shows the help of all commands
143
+ [COMMAND] The command to show help for
144
+
145
+ info
146
+ Usage: android info <field>
147
+ Print environment information (SDK Location, etc.)
148
+ <field> The specific field to print the value of. If omitted print all.
149
+
150
+ init
151
+ Usage: android init
152
+ Initializes the environment (eg. skills) for Android CLI.
153
+
154
+ layout
155
+ Usage: android layout [-dhp] [--device=PARAM] [-o=PARAM]
156
+ Returns the layout tree of an application
157
+ -d, --diff Returns a flat list of the layout elements that have
158
+ changed since the last invocation of ui-dump
159
+ --device=PARAM The device serial number
160
+ -h, --help Show this help message and exit.
161
+ -o, --output=PARAM Writes the layout tree to the specified file or
162
+ directory. If omitted, prints the tree to standard
163
+ output
164
+ -p, --pretty Pretty-prints the returned JSON
165
+
166
+ run
167
+ Usage: android run [-h] [--debug] [--activity=PARAM] [--device=PARAM]
168
+ [--type=PARAM] [--apks=PARAM[,PARAM...]]...
169
+ Deploy an Android Application
170
+ --activity=PARAM The activity name
171
+ --apks=PARAM[,PARAM...]
172
+ The paths to the APKs
173
+ --debug Run in debug mode
174
+ --device=PARAM The device serial number
175
+ -h, --help Show this help message and exit.
176
+ --type=PARAM The component type (ACTIVITY, SERVICE, etc.)
177
+
178
+ screen
179
+ Usage: android screen [-h] [COMMAND]
180
+ Commands to view the device
181
+ -h, --help Show this help message and exit.
182
+ Commands:
183
+ capture Outputs the device screen to a PNG
184
+ resolve Target UI elements visually
185
+
186
+ sdk
187
+ Usage: android sdk [COMMAND]
188
+ Download and list SDK packages
189
+ Commands:
190
+ install Install SDK packages
191
+ update Update one or all packages to the latest version
192
+ remove Remove a package from the SDK
193
+ list List installed and available SDK packages
194
+
195
+ skills
196
+ Usage: android skills [COMMAND]
197
+ Manage skills
198
+ Commands:
199
+ add Install a skill
200
+ remove Remove a skill
201
+ list List available skills
202
+ find Find skills by keyword
203
+
204
+ update
205
+ Usage: android update [--url=PARAM]
206
+ Update the Android CLI
207
+ --url=PARAM The URL to download the update from
@@ -0,0 +1,83 @@
1
+ # Tools
2
+ Run `android layout --help` and `android screen --help`.
3
+
4
+ ## UI Dump
5
+ `android layout` returns a flat JSON list of the UI elements on screen.
6
+ `android layout --diff` returns a flat JSON list of the UI elements that have changed since the last call to `layout` or `layout --diff`
7
+
8
+ Each JSON object represents a UI element in the Android app. The following properties may be present:
9
+ - `text` - any literal text the element contains
10
+ - `resourceId` - the Android resource id used to refer to the element
11
+ - `contentDesc` - a description of a UI element for use by accessibility tools
12
+ - `interactions` - the set of user interactions the element supports. May contain one or more of: `checkable`, `clickable`, `focusable`, `scrollable`, `long-clickable`, `password`
13
+ - `state` - the set of states the element is in. May contain one or more of `checked`, `focused`, `selected`
14
+ - `bounds` - the screen coordinates of the bounding rectangle of the element, in the format `[min X,min Y][max X, max Y]`
15
+ - `center` - the screen coordinates of the center of the element, in the format `[x,y]`
16
+ - `off-screen` - if true, the element is in the UI hierarchy but not visible; it may require scrolling to view.
17
+
18
+ Use `layout` as a primary means of examining an Android app. Use `layout --diff` to focus on changes and to keep your context small.
19
+ Example: When entering digits into a calculator, use `layout --diff` to output only the digit readout element.
20
+
21
+ `layout` may fail due to the app displaying a WebView or animation; in these cases, use `android screen --annotate` to inspect the app.
22
+ This failure will likely resolve after navigating away from the current screen.
23
+
24
+ ## Screenshot
25
+ `android screen capture -o <file path>` saves a PNG of the current device screen to `<file path>`
26
+
27
+ Use `screen capture` as a secondary means of examining an Android app
28
+ Examples:
29
+ - Understanding the content of an on-screen image
30
+ - Looking at a `WebView` (web content does not always appear in the ui dump)
31
+ - Trying to find a UI element by its visual appearance
32
+
33
+ **IMPORTANT**: Always *VISUALLY* examine the PNG image returned from `android screen` BEFORE doing anything else.
34
+
35
+ ## Annotated Screenshot
36
+ `android screen capture --annotate -o <file path>`
37
+ `android screen resolve --screen <path> --string <string>`
38
+
39
+ The `--annotate` command adds numerical labels and bounding boxes around UI elements. Use this command to locate UI elements that cannot
40
+ be located in the `layout` output.
41
+
42
+ **IMPORTANT**: When using `android screen --annotate`, always *VISUALLY* examine the resulting PNG file.
43
+
44
+ To refer to these labels in input commands, use `screen resolve` to convert labels into coordinates:
45
+
46
+ `android screen resolve --screen <file path> --string "#3"` returns `<x coord of region 3> <y coord of region 3>`
47
+
48
+ To save turns, you can combine shell commands:
49
+
50
+ `adb shell input $(android screen resolve --screen screen.png --string "tap #34")`
51
+
52
+ This command taps on region #34 from `screen.png`
53
+
54
+ ## Input
55
+ Use `adb shell input` for interacting with Android devices.
56
+ Refer to the `"interactions"` property of an element for what interactions can be performed on a particular element.
57
+
58
+ Interact with UI elements with their `center` coordinate or their `bounds` coordinates:
59
+ ```json
60
+ {
61
+ "key": -248568265,
62
+ "class": "android.widget.Button",
63
+ "bounds": "[138,9][167,38]",
64
+ "center": "[152,23]"
65
+ }
66
+ ```
67
+ To tap on this button, you would execute `adb shell input tap 152 23`. This taps the center.
68
+
69
+ ```json
70
+ {
71
+ "key": 12487234,
72
+ "class": "com.example.ui.ScrollableList",
73
+ "bounds": "[100,200][400,600]",
74
+ "center": "[250,400]"
75
+ }
76
+ ```
77
+ To scroll down on this list, you would execute `adb shell input swipe 250 400 600 500`. This swipes from the center to the bottom over 500ms.
78
+
79
+ # Android Interaction Rules
80
+ 1. Always ensure text input fields have `"focused"` in their `"state"` list before entering text
81
+ 2. If an element has `"scrollable"` in its `"interactions"` list, try scrolling it when looking for missing UI elements
82
+ 2. Always scroll slowly when executing scroll inputs. The 5th argument to `adb shell input swipe` controls scroll duration.
83
+ 3. Content may take time to load; if a `layout` is missing information after you take an action, wait a few seconds, then perform `layout --diff` to see if anything changes.
@@ -0,0 +1,97 @@
1
+ A journey is an XML-specified test of an Android app's behavior. It consists of a list of `<action>` elements. For example:
2
+ ```xml
3
+ <journey name="My Journey">
4
+ <description>
5
+ A sample journey to illustrate the format
6
+ </description>
7
+ <actions>
8
+ <action>
9
+ Tap the "Home" icon
10
+ </action>
11
+ <action>
12
+ Verify that the app is on its Home screen
13
+ </action>
14
+ </actions>
15
+ </journey>
16
+ ```
17
+
18
+ Evaluate a journey by proceeding through the `<actions>` list in sequential order. Evaluate each `<action>` block individually.
19
+ A journey succeeds if all elements in the `<actions>` list succeed.
20
+
21
+ A journey is a test case for an app. The journey XML is the source of truth; if the app disagrees with the journey, the app has failed.
22
+ Additionally, if the app exits, crashes, or freezes, journey evaluation stops and the journey fails.
23
+
24
+ **IMPORTANT** - Execute each step EXACTLY as written, and independently of other steps! If an action says to `"tap the first search result"`,
25
+ you MUST find the search results and tap the first one. Do this even if you believe you know the intent behind the action.
26
+
27
+ ## Taking Actions
28
+ Some `<action>` elements specify UI interactions to perform on the running Android app. Perform the interaction and verify that the app does
29
+ not crash or behave in an unexpected manner. This is the *only* verification you should perform for an `<action>`.
30
+
31
+ If the interaction cannot be performed as specified, the journey fails.
32
+ Example:
33
+ ```<action>Click the red button</action>```
34
+ If you determine a red button is not present in the UI, the journey fails.
35
+
36
+ If the text of an `<action>` specifies a list of actions, break it into sub-actions and evaluate them individually:
37
+ Example:
38
+ ```<action>Search for soda and add the first result to the cart</action>```
39
+ This should be evaluated as:
40
+ ```
41
+ <action>Search for soda</action>
42
+ <action>Add the first result to the cart</action>
43
+ ```
44
+
45
+ If an `<action>` contains something that is not a specification for a UI interaction, alert the user that the journey is malformed and exit
46
+ early, specifying the error in question.
47
+
48
+ ## Verifying Expectations
49
+ `<action>` elements that begin with "check" or "verify" specify expectations for the current state of the Android app. Determine the current
50
+ state of the app and check if the expectations are met.
51
+
52
+ Determine the current state of the app by inspecting the current screen of the device without interacting with it.
53
+ Example:
54
+ ```<action>Check if "Switch 2" is visible on the screen</action>```
55
+ This requires only inspecting the current screen, not scrolling or interacting. If "Switch 2" is not currently visible, the action fails.
56
+
57
+ If the expectations are not met, mark the `<action>` as a failure and the journey evaluation ends. A single `<action>` may contain
58
+ multiple expectations.
59
+ Example:
60
+ ```<action>Verify that the app is on the Home screen, the Home icon is blue, and the temperature is displayed</action>```
61
+ This `<action>` fails if ANY of the following are false:
62
+ - The app is on the Home screen
63
+ - There is a Home icon, and it is blue
64
+ - A temperature is displayed
65
+
66
+ ## Handling failure
67
+ When running a journey, evaluate it as a test. Failure is acceptable, and often expected. Proper reporting of failures is the priority.
68
+
69
+ Keep debugging and troubleshooting to a minimum; assume that tools are showing you the correct output every time. The goal is to determine
70
+ if the *current* Android app can correctly handle the *current* steps outlined in the journey. Suggestions for bug fixes, clarification, or
71
+ other improvements should be kept to journey evaluation summary at the end.
72
+
73
+ ## Summarizing
74
+ For each `<action>` you evaluated, output JSON describing the results.
75
+
76
+ ```
77
+ {
78
+ "journey:", The name of the journey
79
+ "results:" [
80
+ {
81
+ // A string containing the full text of the <action>
82
+ "action": "Click the blue button,
83
+ // "PASSED" if the instruction was evaluated, "FAILED" if the instruction could not be evaluated, or "SKIPPED" if journey evaluation ended early because an instruction failed
84
+ "status": "PASSED",
85
+ // A list of the ADB commands executed while evaluating the instruction,
86
+ "commands": [ "adb input swipe 490 200 500 500 500", "adb input tap 45 920" ],
87
+ // Failure reasons, feedback, or other useful information
88
+ "comment": "The journey step doesn't specify that the button requires scrolling to see",
89
+ },
90
+ {
91
+ "action": "The home screen is shown",
92
+ "status": "FAILED",
93
+ "comment": "The settings page was shown",
94
+ },
95
+ ]
96
+ }
97
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mdk-skills",
3
- "version": "2.3.19",
3
+ "version": "2.3.21",
4
4
  "description": "mdk-engineer - 沉稳靠谱的前端开发助手 Claude Skills 配置包,一键注入 .claude/ 技能目录和 CLAUDE.md 人设配置",
5
5
  "author": "XiaoMa",
6
6
  "license": "MIT",
@@ -0,0 +1 @@
1
+ *{box-sizing:border-box;margin:0;padding:0}html,body,#app{background:#f5f7fa;height:100%}body{overflow-y:auto}*{scrollbar-width:none;-ms-overflow-style:none}::-webkit-scrollbar{display:none}.app-layout{flex-direction:column;min-height:100vh;padding-top:56px;display:flex}.app-header{z-index:100;background:#fff;border-bottom:1px solid #e5e7eb;align-items:center;height:56px;padding:0 24px;display:flex;position:fixed;top:0;left:0;right:0}.header-inner{justify-content:space-between;align-items:center;width:100%;display:flex}.header-left{align-items:center;gap:32px;display:flex}.logo{color:#1a1a1a;white-space:nowrap;font-size:18px;font-weight:700}.app-content{flex:1;width:100%;max-width:1000px;margin:0 auto;padding:24px}.markdown-content{color:#333;word-wrap:break-word;font-size:14px;line-height:1.7;overflow:auto}.markdown-content h1{border-bottom:1px solid #eee;margin:20px 0 12px;padding-bottom:8px;font-size:22px;font-weight:700}.markdown-content h2{border-bottom:1px solid #eee;margin:18px 0 10px;padding-bottom:6px;font-size:18px;font-weight:700}.markdown-content h3{margin:16px 0 8px;font-size:16px;font-weight:600}.markdown-content h4{margin:14px 0 6px;font-size:14px;font-weight:600}.markdown-content h5,.markdown-content h6{margin:12px 0 6px;font-size:13px;font-weight:600}.markdown-content p{margin:8px 0}.markdown-content ul,.markdown-content ol{margin:8px 0;padding-left:24px}.markdown-content li{margin:4px 0}.markdown-content blockquote{color:#555;background:#f0f7ff;border-left:4px solid #2080f0;margin:10px 0;padding:8px 16px}.markdown-content blockquote p{margin:4px 0}.markdown-content a{color:#2080f0;text-decoration:none}.markdown-content a:hover{text-decoration:underline}.markdown-content hr{border:none;border-top:1px solid #e0e0e0;margin:16px 0}.markdown-content table{border-collapse:collapse;width:100%;margin:12px 0;font-size:13px}.markdown-content th,.markdown-content td{text-align:left;border:1px solid #e0e0e0;padding:8px 12px}.markdown-content th{background:#f5f7fa;font-weight:600}.markdown-content tr:nth-child(2n) td{background:#fafafa}.markdown-content img{border-radius:4px;max-width:100%;margin:8px 0}.markdown-content code{color:#d63384;background:#f0f0f0;border-radius:3px;padding:2px 6px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.markdown-content pre{border:1px solid #e8e8e8;border-radius:6px;margin:12px 0;padding:0;position:relative;overflow:hidden}.markdown-content pre code{color:#333;tab-size:2;background:#f8f9fa;padding:14px 16px;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.markdown-content pre .copy-btn{color:#999;cursor:pointer;opacity:0;background:#fff;border:1px solid #e0e0e0;border-radius:4px;padding:3px 8px;font-size:11px;transition:opacity .2s;position:absolute;top:6px;right:6px}.readme-fold{border:1px solid #e5e7eb;border-radius:6px;margin-bottom:20px;overflow:hidden}.fold-header{cursor:pointer;-webkit-user-select:none;user-select:none;background:#fafafa;align-items:center;gap:6px;padding:10px 16px;font-size:14px;font-weight:600;display:flex}.fold-header:hover{background:#f0f0f0}.fold-arrow{color:#999;font-size:11px;transition:transform .2s}.fold-arrow.open{transform:rotate(90deg)}.fold-body{padding:0 16px 16px}.markdown-content pre:hover .copy-btn{opacity:1}.markdown-content pre .copy-btn:hover{color:#2080f0;border-color:#2080f0}.header-right{align-items:center;gap:8px;display:flex}html,body,#app,.app-header,.app-content,.logo,.readme-fold,.fold-header,.fold-body,.markdown-content,[class*=n-]{transition:background-color .3s,color .3s,border-color .3s,box-shadow .3s}[data-theme=dark] html,[data-theme=dark] body,[data-theme=dark] #app{background:#1e1e2e}[data-theme=dark] .app-header{background:#1e1e2e;border-bottom-color:#363650}[data-theme=dark] .app-content{background:0 0}[data-theme=dark] .logo{color:#e4e4ef}[data-theme=dark] .header-status-item{color:#a6adc8}[data-theme=dark] .header-status-item.clickable:hover{color:#6a8cff}[data-theme=dark] .header-status-divider{background:#363650}[data-theme=dark] .readme-fold{border-color:#363650}[data-theme=dark] .fold-header{color:#e4e4ef;background:#282840}[data-theme=dark] .fold-header:hover{background:#323250}[data-theme=dark] .fold-body{background:#282840}[data-theme=dark] .markdown-content{color:#cdd6f4}[data-theme=dark] .markdown-content h1,[data-theme=dark] .markdown-content h2{color:#e4e4ef;border-bottom-color:#363650}[data-theme=dark] .markdown-content h3,[data-theme=dark] .markdown-content h4{color:#e4e4ef}[data-theme=dark] .markdown-content code{color:#e06c75;background:#2a2a42}[data-theme=dark] .markdown-content pre{border-color:#363650}[data-theme=dark] .markdown-content pre code{color:#cdd6f4;background:#1a1a2a}[data-theme=dark] .markdown-content blockquote{color:#a6adc8;background:#282840;border-left-color:#6a8cff}[data-theme=dark] .markdown-content a{color:#6a8cff}[data-theme=dark] .markdown-content th{background:#282840}[data-theme=dark] .markdown-content td{border-color:#363650}[data-theme=dark] .markdown-content tr:nth-child(2n) td{background:#24243a}[data-theme=dark] .markdown-content hr{border-top-color:#363650}[data-theme=dark] .markdown-content img{filter:brightness(.8)}[data-theme=dark] .markdown-content pre .copy-btn{color:#6c7086;background:#2a2a42;border-color:#363650}[data-theme=dark] .markdown-content pre .copy-btn:hover{color:#6a8cff;border-color:#6a8cff}[data-theme=dark] .hljs-keyword,[data-theme=dark] .hljs-selector-tag,[data-theme=dark] .hljs-built_in{color:#c678dd}[data-theme=dark] .hljs-string,[data-theme=dark] .hljs-addition{color:#98c379}[data-theme=dark] .hljs-number,[data-theme=dark] .hljs-literal{color:#d19a66}[data-theme=dark] .hljs-comment{color:#5c6370}[data-theme=dark] .hljs-title,[data-theme=dark] .hljs-section{color:#61afef}[data-theme=dark] .hljs-attr,[data-theme=dark] .hljs-attribute,[data-theme=dark] .hljs-selector-class,[data-theme=dark] .hljs-variable{color:#e06c75}[data-theme=dark] .hljs-type,[data-theme=dark] .hljs-meta{color:#e5c07b}[data-theme=dark] .hljs-deletion{color:#e06c75}[data-theme=dark] .hljs-bullet,[data-theme=dark] .hljs-link{color:#6a8cff}[data-theme=dark] .hljs-emphasis{font-style:italic}[data-theme=dark] .hljs-strong{font-weight:700}[data-theme=dark] .page-header h2{color:#e4e4ef}[data-theme=dark] .scene-desc{color:#a6adc8}.fade-enter-active,.fade-leave-active{transition:opacity .2s,transform .2s}.fade-enter-from{opacity:0;transform:translateY(6px)}.fade-leave-to{opacity:0}.header-status{align-items:center;gap:8px;margin-right:8px;display:flex}.header-status-item{color:#666;white-space:nowrap;align-items:center;gap:4px;font-size:12px;display:flex}.header-status-item.clickable{cursor:pointer}.header-status-item.clickable:hover{color:#2080f0}.header-status-divider{background:#e0e0e0;width:1px;height:14px}.skill-card[data-v-5b75bf2b]{cursor:pointer;transition:box-shadow .2s}.skill-card[data-v-5b75bf2b]:hover{box-shadow:0 2px 8px #00000014}.skill-meta[data-v-5b75bf2b]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.skill-version[data-v-5b75bf2b]{color:#888;font-family:monospace;font-size:12px}.skill-desc[data-v-5b75bf2b]{color:#666;text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;overflow:hidden}[data-theme=dark] .skill-version{color:#9399b2}[data-theme=dark] .skill-desc{color:#a6adc8}.modal-overlay[data-v-6c73fe2b]{z-index:2000;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-card[data-v-6c73fe2b]{background:#fff;border-radius:8px;flex-direction:column;width:90%;max-height:85vh;display:flex;box-shadow:0 8px 32px #0000001f}.modal-header[data-v-6c73fe2b]{justify-content:space-between;align-items:center;padding:14px 20px 0;display:flex}.modal-title[data-v-6c73fe2b]{color:#333;font-size:16px;font-weight:600}.modal-close[data-v-6c73fe2b]{color:#999;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;font-size:20px;line-height:1;transition:background .15s,color .15s;display:flex}.modal-close[data-v-6c73fe2b]:hover{color:#333;background:#f0f0f0}.modal-body[data-v-6c73fe2b]{padding:16px 20px;overflow-y:auto}.modal-footer[data-v-6c73fe2b]{border-top:1px solid #f0f0f0;justify-content:flex-end;gap:8px;padding:12px 20px 16px;display:flex}.modal-fade-enter-active[data-v-6c73fe2b]{transition:opacity .2s}.modal-fade-leave-active[data-v-6c73fe2b]{transition:opacity .15s}.modal-fade-enter-from[data-v-6c73fe2b],.modal-fade-leave-to[data-v-6c73fe2b]{opacity:0}[data-theme=dark] .modal-card{background:#2a2a42;box-shadow:0 8px 32px #00000080}[data-theme=dark] .modal-title{color:#e4e4ef}[data-theme=dark] .modal-close{color:#6c7086}[data-theme=dark] .modal-close:hover{color:#cdd6f4;background:#323250}[data-theme=dark] .modal-footer{border-top-color:#363650}[data-theme=dark] .modal-overlay{background:#000000a6}.dashboard[data-v-b4d50d38]{overflow-anchor:auto}.page-header[data-v-b4d50d38]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px;display:flex}.page-header h2[data-v-b4d50d38]{font-size:20px;font-weight:600}.header-actions[data-v-b4d50d38]{align-items:center;gap:8px;display:flex}.tag-filter[data-v-b4d50d38]{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:16px;display:flex}.search-bar[data-v-b4d50d38]{margin-bottom:12px}.detail-status[data-v-b4d50d38]{justify-content:center;padding:40px 0;display:flex}.detail-body[data-v-b4d50d38]{max-height:65vh;overflow-y:auto}.edit-panel[data-v-b4d50d38]{margin-bottom:4px}.edit-row[data-v-b4d50d38]{align-items:flex-start;gap:10px;margin-bottom:10px;display:flex}.edit-label[data-v-b4d50d38]{color:#888;flex-shrink:0;width:50px;font-size:13px;line-height:30px}.update-count-hint[data-v-b4d50d38]{color:#e68a00;margin-left:8px;font-family:monospace;font-size:12px}.pull-modal-body[data-v-b4d50d38]{min-height:100px}.pull-status[data-v-b4d50d38]{color:#666;justify-content:center;align-items:center;gap:10px;padding:24px 0;font-size:13px;display:flex}.preview-result[data-v-b4d50d38]{margin-top:8px}.pull-search-input[data-v-b4d50d38]{margin-bottom:8px}.preview-info[data-v-b4d50d38]{color:#555;align-items:center;gap:8px;margin-bottom:10px;font-size:13px;display:flex}.preview-list[data-v-b4d50d38]{background:#00000005;border-radius:6px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px;max-height:300px;margin-bottom:14px;padding:10px;display:grid;overflow-y:auto}.preview-actions[data-v-b4d50d38]{justify-content:flex-end;gap:8px;display:flex}.pull-section[data-v-b4d50d38]{margin-top:12px}.pull-input-row[data-v-b4d50d38]{gap:8px;margin-bottom:8px;display:flex}.pull-input-row .n-input[data-v-b4d50d38]{flex:1}.pull-error[data-v-b4d50d38]{margin-bottom:8px}.pull-result[data-v-b4d50d38]{margin-top:8px}.pull-result-line[data-v-b4d50d38]{flex-wrap:wrap;align-items:center;gap:4px;margin-bottom:8px;font-size:13px;display:flex}.pull-result-label[data-v-b4d50d38]{color:#888;flex-shrink:0}.pull-result-hint[data-v-b4d50d38]{color:#999;font-size:12px}.install-panel[data-v-b4d50d38]{background:#00000005;border-radius:6px;margin-top:12px;padding:12px}.install-panel-label[data-v-b4d50d38]{color:#666;margin-bottom:8px;font-size:13px}.install-check-list[data-v-b4d50d38]{margin-bottom:10px}.install-btn[data-v-b4d50d38]{float:right}.edit-actions[data-v-b4d50d38]{justify-content:flex-end;gap:8px;display:flex}.alias-edit-trigger[data-v-b4d50d38]{cursor:pointer;opacity:0;vertical-align:middle;align-items:center;transition:opacity .15s;display:inline-flex}.group-header:hover .alias-edit-trigger[data-v-b4d50d38]{opacity:1}.alias-edit-icon[data-v-b4d50d38]{color:#999}.alias-edit-inline[data-v-b4d50d38]{align-items:center;display:inline-flex}.group-menu-btn[data-v-b4d50d38]{flex-shrink:0}.source-manager[data-v-b4d50d38]{background:#00000005;border-radius:6px;margin-top:8px;padding:10px}.source-manager-header[data-v-b4d50d38]{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.source-manager-title[data-v-b4d50d38]{font-size:13px;font-weight:600}.source-manager-list[data-v-b4d50d38]{flex-direction:column;gap:6px;max-height:240px;display:flex;overflow-y:auto}.source-manager-row[data-v-b4d50d38]{align-items:center;gap:8px;display:flex}.source-manager-url[data-v-b4d50d38]{color:#888;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.source-manager-empty[data-v-b4d50d38]{color:#999;text-align:center;padding:12px 0;font-size:12px}.source-manager-actions[data-v-b4d50d38]{justify-content:flex-end;margin-top:8px;display:flex}.installed-tag[data-v-b4d50d38]{margin-left:4px}.skill-group[data-v-b4d50d38]{margin-bottom:4px}.group-header[data-v-b4d50d38]{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:8px;padding:8px 4px;display:flex}.group-header[data-v-b4d50d38]:hover{background:#00000008}.fold-arrow[data-v-b4d50d38]{color:#999;flex-shrink:0;font-size:10px;transition:transform .2s}.fold-arrow.open[data-v-b4d50d38]{transform:rotate(90deg)}.group-label[data-v-b4d50d38]{color:inherit;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.group-count[data-v-b4d50d38]{color:#999;flex-shrink:0;font-size:12px}.group-update-btn[data-v-b4d50d38]{flex-shrink:0}.group-body[data-v-b4d50d38]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:8px;display:grid}.readme-fold[data-v-b4d50d38]{border-top:1px solid #80808026;margin-top:24px;padding-top:12px}.setup-card[data-v-b4d50d38]{margin-bottom:20px}.setup-card-content[data-v-b4d50d38]{text-align:center;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;display:flex}.setup-icon[data-v-b4d50d38]{margin-bottom:4px}.setup-title[data-v-b4d50d38]{margin:0;font-size:18px;font-weight:600}.setup-desc[data-v-b4d50d38]{color:#666;max-width:420px;margin:0;font-size:13px;line-height:1.6}.setup-desc code[data-v-b4d50d38]{background:#0000000f;border-radius:3px;padding:1px 6px;font-size:12px}.skill-group.group-remote[data-v-b4d50d38]{border-left:3px solid #2080f0;margin-bottom:12px;padding-left:8px}.skill-group.group-local[data-v-b4d50d38]{border-left:3px solid #18a058;margin-bottom:12px;padding-left:8px}.group-indicator[data-v-b4d50d38]{border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.indicator-remote[data-v-b4d50d38]{background:#2080f0}.indicator-local[data-v-b4d50d38]{background:#18a058}.source-info[data-v-b4d50d38]{margin-bottom:4px}.source-row[data-v-b4d50d38]{align-items:center;gap:10px;margin-bottom:6px;font-size:13px;display:flex}.source-label[data-v-b4d50d38]{color:#888;flex-shrink:0;width:70px}.source-value[data-v-b4d50d38]{word-break:break-all}.local-tag[data-v-b4d50d38]{color:#2e7d32;background:#e8f5e9;border-radius:3px;padding:1px 8px;font-size:12px;display:inline-block}.path-text[data-v-b4d50d38]{color:#666;font-family:monospace;font-size:12px}.source-actions[data-v-b4d50d38]{gap:8px;margin-top:8px;display:flex}.local-hint[data-v-b4d50d38]{color:#999;background:#00000005;border-radius:4px;margin-top:8px;padding:8px;font-size:12px;line-height:1.5}.siblings-body[data-v-b4d50d38]{min-height:60px}.siblings-desc[data-v-b4d50d38]{margin-bottom:12px;font-size:13px;line-height:1.6}.siblings-list[data-v-b4d50d38]{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.siblings-actions[data-v-b4d50d38]{justify-content:flex-end;gap:8px;display:flex}.batch-modal-body[data-v-b4d50d38]{min-height:60px}.batch-desc[data-v-b4d50d38]{margin-bottom:16px;font-size:13px;line-height:1.6}.batch-actions[data-v-b4d50d38]{justify-content:flex-end;gap:8px;display:flex}.batch-executing[data-v-b4d50d38]{color:#666;justify-content:center;align-items:center;gap:12px;padding:24px 0;font-size:13px;display:flex}.batch-result[data-v-b4d50d38]{margin-bottom:16px}.batch-result-line[data-v-b4d50d38]{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:10px;font-size:13px;display:flex}.batch-result-label[data-v-b4d50d38]{color:#888;flex-shrink:0}[data-theme=dark] .edit-label,[data-theme=dark] .source-label,[data-theme=dark] .pull-result-label,[data-theme=dark] .batch-result-label{color:#9399b2!important}[data-theme=dark] .update-count-hint{color:#fbbf24}[data-theme=dark] .pull-status,[data-theme=dark] .batch-executing,[data-theme=dark] .install-panel-label,[data-theme=dark] .preview-info{color:#a6adc8}[data-theme=dark] .pull-result-hint,[data-theme=dark] .group-count,[data-theme=dark] .local-hint{color:#6c7086}[data-theme=dark] .path-text{color:#a6adc8}[data-theme=dark] .preview-list,[data-theme=dark] .install-panel,[data-theme=dark] .local-hint{background:#ffffff08}[data-theme=dark] .group-header:hover{background:#ffffff0a}[data-theme=dark] .local-tag{color:#4ade80;background:#4ade8026}[data-theme=dark] .skill-group.group-remote{border-left-color:#6a8cff}[data-theme=dark] .skill-group.group-local{border-left-color:#4ade80}[data-theme=dark] .indicator-remote{background:#6a8cff}[data-theme=dark] .indicator-local{background:#4ade80}[data-theme=dark] .setup-desc{color:#a6adc8}[data-theme=dark] .setup-desc code{background:#ffffff14}[data-theme=dark] .readme-fold{border-top-color:#ffffff14}[data-theme=dark] .source-manager{background:#ffffff08}[data-theme=dark] .source-manager-url,[data-theme=dark] .alias-edit-icon{color:#6c7086}.page-header[data-v-1815b287]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.page-header h2[data-v-1815b287]{font-size:20px;font-weight:600}.scene-grid[data-v-1815b287]{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;margin:2px;display:grid}.scene-card[data-v-1815b287]{transition:box-shadow .2s}.scene-card.active[data-v-1815b287]{box-shadow:0 0 0 2px #2080f0}.scene-desc[data-v-1815b287]{color:#666;margin:0;font-size:13px}.scene-footer[data-v-1815b287]{justify-content:space-between;align-items:center;display:flex}.hint-text[data-v-1815b287]{color:#999;font-size:12px}.modal-skill-groups[data-v-1815b287]{max-height:50vh;overflow-y:auto}.skill-group[data-v-1815b287]{margin-bottom:2px}.skill-group-header[data-v-1815b287]{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:6px;padding:6px 4px;font-size:13px;display:flex}.skill-group-header[data-v-1815b287]:hover{background:#00000008}.fold-arrow[data-v-1815b287]{color:#999;flex-shrink:0;font-size:10px;transition:transform .2s}.fold-arrow.open[data-v-1815b287]{transform:rotate(90deg)}.skill-group-label[data-v-1815b287]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.skill-group-count[data-v-1815b287]{color:#999;flex-shrink:0;font-size:12px}.skill-group-body[data-v-1815b287]{padding:4px 0 4px 16px}.search-input[data-v-1815b287]{margin-bottom:12px}[data-theme=dark] .scene-card.active{box-shadow:0 0 0 2px #6a8cff}[data-theme=dark] .hint-text,[data-theme=dark] .skill-group-count{color:#6c7086}[data-theme=dark] .skill-group-header:hover{background:#ffffff0a}[data-theme=dark] .fold-arrow{color:#6c7086}.page-header[data-v-5bb876ac]{margin-bottom:20px}.page-header h2[data-v-5bb876ac]{font-size:20px;font-weight:600}.section[data-v-5bb876ac]{margin-bottom:20px}.init-alert[data-v-5bb876ac]{margin-bottom:12px}.missing-list[data-v-5bb876ac]{flex-direction:column;gap:4px;display:flex}.missing-item[data-v-5bb876ac]{font-size:13px;line-height:1.6}.missing-item code[data-v-5bb876ac]{background:#0000000f;border-radius:3px;padding:1px 6px;font-size:12px}.skill-tag[data-v-5bb876ac]{margin:1px 2px;display:inline-block}.missing-hint[data-v-5bb876ac]{opacity:.7;margin-top:4px;font-size:12px}.source-status[data-v-5bb876ac]{margin-bottom:16px}.source-actions[data-v-5bb876ac]{flex-direction:column;gap:12px;display:flex}.action-buttons[data-v-5bb876ac]{gap:8px;display:flex}.healthy-text[data-v-5bb876ac]{color:#18a058;font-size:13px}.issue-text[data-v-5bb876ac]{color:#d03050;font-size:13px}.readme-dialog-desc[data-v-5bb876ac]{color:#555;margin-bottom:16px;font-size:14px}.readme-checkbox[data-v-5bb876ac]{align-items:flex-start;margin-bottom:12px;display:flex}.readme-checkbox-content[data-v-5bb876ac]{flex-direction:column;gap:2px;display:flex}.readme-checkbox-title[data-v-5bb876ac]{font-size:14px;font-weight:500}.readme-checkbox-desc[data-v-5bb876ac]{color:#999;font-size:12px}.diag-group[data-v-5bb876ac]{margin-bottom:16px}.diag-group[data-v-5bb876ac]:last-child{margin-bottom:0}.diag-group-header[data-v-5bb876ac]{align-items:center;gap:6px;padding:6px 0;font-size:13px;font-weight:600;display:flex}.diag-group-error[data-v-5bb876ac]{color:#d03050}.diag-group-ok[data-v-5bb876ac]{color:#18a058}[data-theme=dark] .missing-item code{background:#ffffff14}[data-theme=dark] .healthy-text{color:#4ade80}[data-theme=dark] .issue-text{color:#f87171}[data-theme=dark] .readme-dialog-desc{color:#a6adc8}[data-theme=dark] .readme-checkbox-desc{color:#6c7086}.page-header[data-v-97d38fe1]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.page-header h2[data-v-97d38fe1]{font-size:20px;font-weight:600}.fade-enter-active[data-v-97d38fe1],.fade-leave-active[data-v-97d38fe1]{transition:opacity .2s}.fade-enter-from[data-v-97d38fe1],.fade-leave-to[data-v-97d38fe1]{opacity:0}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}