{"id":"68f9a437-497e-4dc1-a42e-1d0210f50329","shortId":"qJY5dC","kind":"skill","title":"houtu-dependencies","tagline":"houtu-dependencies enterprise-grade Spring Cloud microservice foundational framework complete usage guide. GroupId is io.github.lujiafa, covering unified response, exception handling, parameter parsing, session authentication, permission control, signature verification, anti-repl","description":"# Houtu Framework — AI Agent Coding Guide\n\nhoutu-dependencies is an enterprise-grade foundational framework for Spring Boot / Spring Cloud microservices that implements \"Activate-on-import\" via the Spring Boot Starter mechanism, allowing developers to focus entirely on business logic.\n\n**Repository**: https://github.com/lujiafa/houtu-dependencies\n**Git Branches**: `3.5.2`, `3.5.1`, `3.5.0`, `2.7.3`, `2.7.2`, `2.7.1` (branch name = version)\n\n---\n\n## Core Principles\n\n1. **Activate-on-import** — Capabilities are automatically enabled after adding a starter dependency; no @Enable annotations or manual configuration needed\n2. **Annotation-driven** — Control behavior through annotations (`@Lock`, `@CheckSession`, `@SecurityWatch`...); do not hand-write interceptors/AOP\n3. **Framework-first** — For capabilities already encapsulated by the framework, use the framework approach by default instead of native Spring; defer to user when they explicitly request the native approach\n4. **Convention over configuration** — Follow framework defaults; only override when customization is needed\n5. **Version-aware** — Package paths, API names, and configuration approaches differ across versions; the version must be confirmed before generating code\n\n---\n\n## Code Generation Workflow (must be executed in order)\n\n```\nStep 1: Detect Version & Dependencies → Step 2: Identify Scenario → Step 3: Load Module Reference → Step 4: Generate Code → Step 5: Verify\n```\n\n### Step 1 — Detect Version & Dependencies\n\n**The version must be determined before generating any code, and the BOM must be imported.**\n\nRead the project build file (`pom.xml` or `build.gradle` / `build.gradle.kts`) and determine in the following order:\n\n**1a. houtu already imported —** The build file contains `houtu-dependencies` or `spring-cloud-houtu`:\n- Read the version number directly to determine the version, proceed to Step 2\n- **Multi-module projects**: The BOM is usually declared in the root `pom.xml` or root `build.gradle` under `dependencyManagement`; submodules inherit it and do not need to add it again\n\n**1b. Not imported but user explicitly wants houtu —** The user mentions \"use houtu\", \"integrate houtu\", \"use houtu-dependencies\", etc.:\n- Confirm the version (ask the user or infer from the project's Spring Boot version: `3.x` → `3.5.2`, `2.x` → `2.7.3`)\n- **Proactively add the BOM to the build file**:\n\n  **Maven (pom.xml):**\n  ```xml\n  <!-- Base module BOM (required) -->\n  <dependency>\n      <groupId>io.github.lujiafa</groupId>\n      <artifactId>houtu-dependencies</artifactId>\n      <version>${version}</version>\n      <type>pom</type>\n      <scope>import</scope>\n  </dependency>\n  ```\n  **Gradle (build.gradle / build.gradle.kts):**\n  ```kotlin\n  // Base module BOM (required)\n  implementation platform(\"io.github.lujiafa:houtu-dependencies:${version}\")\n  ```\n  If the task involves Spring Cloud modules (Feign, canary routing, Sentinel, service discovery), also add:\n  ```xml\n  <!-- Maven: Spring Cloud enhancement module BOM -->\n  <dependency>\n      <groupId>io.github.lujiafa</groupId>\n      <artifactId>spring-cloud-houtu</artifactId>\n      <version>${version}</version>\n      <type>pom</type>\n      <scope>import</scope>\n  </dependency>\n  ```\n  ```kotlin\n  // Gradle: Spring Cloud enhancement module BOM\n  implementation platform(\"io.github.lujiafa:spring-cloud-houtu:${version}\")\n  ```\n- Load `references/quick-start.md` to complete first-time setup\n\n**1c. Cannot determine —** Ask the user, or default to the latest version `3.5.2`\n\n**After determining the version, immediately load the corresponding version reference file** (`references/v{version}.md`) to obtain:\n- The correct package prefix (`io.github.lujiafa.houtu.*`)\n- The correct namespace (`jakarta.*` or `javax.*`)\n- The correct configuration path (`spring.data.redis.*` or `spring.redis.*`)\n- Dependency versions (Spring Boot, Spring Cloud, Redisson, etc.)\n\n### Step 2 — Identify Scenario & Select Module\n\nAnalyze the coding task — **not only match the user's explicit requirements, but also proactively identify scenarios that can be enhanced based on business logic semantics** (see the \"Business Scenario Enhancement Guide\" below).\n\nSelect the module reference files to load from the table below (a single task usually involves multiple modules):\n\n| Coding Task | Module | Reference File |\n|---------|------|---------|\n| New microservice / First-time setup | — | `references/quick-start.md` |\n| Write Controller / Unified response / Exception handling / Parameter binding | houtu-web | `references/module-web.md` |\n| Auth / Permissions / Session / Signing / Anti-replay | houtu-web-security | `references/module-security.md` |\n| Distributed lock / Rate limiting | houtu-cache | `references/module-cache-lock.md` |\n| Database field encryption | houtu-data-security | `references/module-data-security.md` |\n| Request access logging | houtu-access-log | `references/module-access-log.md` |\n| Canary routing / Feign / Sentinel / Service discovery | spring-cloud-houtu-* | `references/module-cloud.md` |\n| Config value decryption | houtu-core | `references/module-config-decrypt.md` |\n| API documentation | houtu-web-swagger | `references/module-swagger.md` |\n| Crypto / Signing / Hash / JSON / HTTP client utilities | houtu-utils | `references/module-utils.md` |\n| Monitoring / Metrics / Observability | houtu-actuator | `references/module-actuator.md` |\n| Async / Scheduled tasks / Cross-thread context propagation | houtu-core | `references/module-concurrent.md` |\n\n> **Example**: When the user says \"write a payment endpoint\", you should simultaneously identify: `houtu-web` (Controller response) + `houtu-web-security` (login authentication) + `houtu-cache` (`@Lock` for concurrency protection + `@CheckRepeatRequest` for anti-replay) + `houtu-access-log` (audit logging for financial operations), rather than just writing a bare Controller.\n\n### Step 3 — Load Module Reference Files\n\n**Load the corresponding module reference files before writing code.** Each file is a complete recipe: Maven dependency → Required configuration → import → Code patterns → Practices to avoid by default → Internal behavior.\n\nIf the task involves multiple modules, load all relevant files.\n\n### Step 4 — Generate Code (with automatic dependency management)\n\n1. **Check and add missing Starter dependencies** — Check whether the modules required for the current scenario are already imported in the `<dependencies>` of pom.xml; if not, proactively add them (no version needed, managed by BOM). Similarly, if the scenario involves `spring-cloud-houtu-*` modules, ensure the `spring-cloud-houtu` BOM is already in `<dependencyManagement>`\n2. Use the correct package prefix and imports from the version file\n3. Use the API patterns and code examples from the module files\n4. **Check the Anti-Pattern Checklist** — Confirm that native Spring approaches are not used to duplicate functionality\n5. Use the framework's Model base classes (`BaseForm`, `BaseVO`, `BaseDTO`, `PageForm`, `PageDataVO`, etc.)\n\n### Step 5 — Verify\n\nFor uncertain APIs, verify by reading source code via `git show <branch>:<path>`:\n\n```bash\ngit show <branch>:<file-path>\n# Example:\ngit show 3.5.2:houtu-cache/src/main/java/io/github/lujiafa/houtu/lock/annotation/Lock.java\n```\n\n---\n\n## Business Scenario Enhancement Guide (Proactively identify, apply when appropriate)\n\nWhen writing business code, do not wait for the user to explicitly specify framework features; instead, **proactively identify applicable framework capabilities based on the semantics of the business logic** and naturally integrate them into the code. Below are common business scenarios and their mapping to framework enhancements:\n\n### Interface Layer (Controller)\n\n| Business Characteristic | Framework Capability to Enhance | Description |\n|---------|----------------|------|\n| Any Controller method | `ResponseData<T>` + `BaseForm`/`PageForm` | Basic convention; all endpoints must follow |\n| Requires login to access | `@CheckSession` | Add by default for user-related endpoints |\n| Role-based permissions (e.g., admin vs. regular user) | `@RequiresRole` / `@RequiresPermission` | Determine from business description; no need for user to specify each one |\n| Endpoint has audit/traceability requirements | `@AccessLog` | Proactively add for financial, order, or sensitive operations |\n| Endpoint receives user-input rich text/comments | `@NotXss` | Should be added to all user-editable text fields |\n| List query (with pagination) | `PageForm` + `PageDataVO<T>` | Apply when \"list\", \"query\", \"pagination\" intent is identified |\n\n### Business Layer (Service)\n\n| Business Characteristic | Framework Capability to Enhance | Description |\n|---------|----------------|------|\n| Concurrent write operations (e.g., placing orders, deducting inventory, deducting balance) | `@Lock` | Proactively add when concurrency-sensitive operations like \"payment\", \"inventory\", \"balance\" are identified |\n| Submission operations (e.g., placing orders, payments, transfers) | `@CheckRepeatRequest` | Proactively add for write operations with idempotency requirements |\n| Calling external HTTP APIs (e.g., payment callbacks, third-party integrations) | `HttpClients` | Do not use RestTemplate/WebClient |\n| Object conversion (Entity → VO / Form → DTO) | `BeanUtils.smartCopyProperties` | Do not use Spring BeanUtils |\n| JSON operations | `JsonUtils` | Do not create your own ObjectMapper |\n| High-concurrency hotspot operations (e.g., flash sales) | `RateLimiter` | Apply when \"rate limiting\", \"flash sale\", \"rush purchase\" intent is identified |\n| Async/scheduled tasks needing session or context access | Framework auto-propagation (`TransferThreadPoolTaskExecutor`) | `@Async`, `@Scheduled`, `CompletableFuture` automatically inherit parent thread's SessionContext, HintContext, etc.; no manual handling needed |\n\n### Data Layer\n\n| Business Characteristic | Framework Capability to Enhance | Description |\n|---------|----------------|------|\n| Storing sensitive fields like phone numbers, ID cards, bank accounts | `@SecurityWatch` + `@SecurityParam` | Proactively suggest when field names contain phone/mobile/idCard/bankAccount, etc. |\n| Database passwords, API Keys in config files | houtu-core config decryption | Proactively suggest when password, secret, key config items are identified |\n\n### Microservice Layer\n\n| Business Characteristic | Framework Capability to Enhance | Description |\n|---------|----------------|------|\n| Inter-service calls | `@AutoFeign` | Do not hand-write FeignClient + RequestInterceptor |\n| Canary/AB testing/multi-tenant routing | `HintContext` | Apply when \"canary\", \"canary release\", \"route specific users\" intent is identified |\n| External system callbacks (e.g., payment notifications) | `@CheckSign` + `@CheckRepeatRequest` | Callback scenarios typically require both signature verification and anti-replay |\n\n### Application Principles\n\n1. **Do not over-enhance** — Only apply when business semantics truly match; do not pile on annotations just to showcase features. For example, internal admin tools may not need `@AccessLog`; simple queries do not need `@Lock`\n2. **Do not miss critical enhancements** — Scenarios involving finance, security, or concurrency must have corresponding capabilities applied; this is the core value of the framework\n3. **Progressive adoption** — When users first integrate, ensure basic capabilities (`houtu-web`) first; then gradually introduce other modules based on actual scenarios in subsequent coding\n4. **Add dependencies on demand** — When using a module's capabilities, first check whether the Starter is already imported in pom.xml; if not, proactively add it\n\n---\n\n## Anti-Pattern Checklist (Agent follows by default during autonomous coding; defers to user when explicitly requested)\n\n| Scenario | ⚠️ Avoid by Default | ✅ Framework Approach (Preferred) |\n|------|--------|-----------------|\n| Endpoint auth | Import spring-security or hand-write Filter to verify token | `@CheckSession` + `@RequiresRole` / `@RequiresPermission` |\n| Unified response | Custom Result/Response class or wrap with ResponseEntity | Return `ResponseData<T>` or `EmbedResponseData` |\n| Exception handling | Hand-write @ControllerAdvice + @ExceptionHandler | Throw `BusinessException`; framework handles automatically |\n| Parameter validation response | Manually catch BindException and format | Framework handles automatically, returns `{code:30, message:\"...\"}` |\n| Database field encryption | Hand-write TypeHandler or manually encrypt/decrypt in Service layer | `@SecurityWatch` + `@SecurityParam` annotations |\n| Distributed lock | Hand-write Redis SETNX or Redisson calls | `@Lock` annotation or `LockSupport` |\n| Feign calls | Hand-write RequestInterceptor to pass headers | Framework auto-propagates; use `@AutoFeign` to publish interfaces |\n| Request logging | Hand-write Filter/Interceptor to record logs | `@AccessLog` annotation |\n| Signature verification | Hand-write signature verification interceptor | `@CheckSign` annotation |\n| Anti-replay | Hand-write Redis idempotency check | `@CheckRepeatRequest` annotation |\n| Load balancing | Hand-write LoadBalancer strategy | Use `HintContext` + configure weights |\n| Swagger docs | Manually import springdoc/springfox and configure | Import `houtu-web-swagger` starter |\n| Rate limiting | Hand-write Redis Lua rate limiting script | Use `RateLimiter` |\n| Symmetric/asymmetric encryption | Manually import BouncyCastle or hand-write crypto utility classes | Use `SM4Utils` / `AESUtils` / `RSAUtils` / `SM2Utils`, etc. |\n| JSON serialization | Manually create ObjectMapper instances | Use `JsonUtils` |\n| HTTP client | Manually create RestTemplate or HttpClient | Use framework's auto-configured `HttpClients` |\n| Config value decryption | Hand-write EnvironmentPostProcessor or manually decrypt at startup | Use houtu-core's `decrypt` configuration |\n| Monitoring metrics | Hand-write Micrometer MeterBinder to collect endpoint metrics | Import `houtu-actuator` starter for automatic collection |\n| Async thread context propagation | Hand-write `TaskDecorator` or manually set/get context in child threads | Framework auto-replaces with `TransferThreadPoolTaskExecutor`; `@Async`/`CompletableFuture`/`@Scheduled` auto-propagate SessionContext, HintContext, etc. |\n\n---\n\n## Model Base Class Hierarchy\n\nBusiness code should inherit from the framework-provided base classes:\n\n```\nBaseResponseData<T>        (interface: getCode(), getMessage(), getData())\n├── ResponseData<T>        (standard JSON response with code/message/data)\n└── EmbedResponseData      (extends LinkedHashMap, flattened response)\n\nBaseForm                   (request form base class, implements Serializable)\n└── PageForm               (pagination request, contains currentPage/pageSize)\n\nBaseDTO                    (data transfer base class, implements Serializable)\n├── PageQueryDTO           (pagination query DTO, contains currentPage/pageSize)\n└── PageDataDTO<R,V>       (pagination data DTO, contains records/totalRecords/totalPages)\n\nBaseVO                     (view object base class, implements Serializable)\n\nPageDataVO<V> extends BaseDTO  (pagination response, contains records/totalRecords/totalPages/currentPage/pageSize)\n└── PageDataExtVO<D,V>         (pagination response + extra data field D data, e.g., paginated list with summary statistics)\n```\n\n**PageDataVO static factory methods:**\n- `PageDataVO.build(PageDataDTO dto, Class<V> clazz)` — Convert from DTO\n- `PageDataVO.build(currentPage, pageSize, totalRecords, List<V> records)` — Build manually\n- `PageDataVO.empty()` — Empty pagination\n\n---\n\n## Annotation Quick Reference\n\n| Annotation | Target | Module | Key Parameters |\n|------|--------|------|---------|\n| `@CheckSession` | TYPE, METHOD | houtu-web-security | `value`(bool, default true) |\n| `@RequiresRole` | METHOD | houtu-web-security | `value`(String[]), `logic`(Logic.OR/AND, default OR) |\n| `@RequiresPermission` | METHOD | houtu-web-security | `value`(String[]), `logic`(Logic.OR/AND, default OR) |\n| `@CheckSign` | TYPE, METHOD | houtu-web-security | `value`(bool, default true) |\n| `@CheckRepeatRequest` | TYPE, METHOD | houtu-web-security | (no parameters) |\n| `@Lock` | METHOD | houtu-cache | `prefix`(String), `key`(String), `leaseTime`(long, -1), `waitTime`(long, -1), `unit`(TimeUnit.SECONDS) |\n| `@AccessLog` | TYPE, METHOD | houtu-access-log | `value`(bool), `requestHeaders`(String[], default USER_AGENT), `requestBody`(bool, default false), `logFilterHandler`(Class) |\n| `@SecurityWatch` | TYPE, METHOD | houtu-data-security | `encrypt`(bool), `encryptMapKeys`(String[]), `decrypt`(bool), `decryptMapKeys`(String[]), `processorBeanName`(String), `processorClass`(Class) |\n| `@SecurityParam` | PARAMETER, FIELD | houtu-data-security | (no parameters) |\n| `@AutoFeign` | TYPE, METHOD | sc-houtu-feign | `value`(bool, default true), `responseBody`(bool, default true) |\n| `@NotXss` | FIELD, PARAMETER | houtu-web | `message`(String, default \"内容包含不安全信息\") |\n\n---\n\n## Predefined Error Codes (ErrorCodeConstant)\n\n| Code | Constant | Description |\n|------|------|------|\n| 0 | SUCCESS | Success |\n| 1 | INTERNAL_ERROR | Internal error |\n| 2 | SERVER_BUSY | Server busy |\n| 3 | NETWORK_ERROR | Network error |\n| 4 | OPERATION_FAIL | Operation failed |\n| 5 | REQUEST_INVALID | Invalid request |\n| 6 | REQUEST_INVALID_IP | Invalid IP |\n| 7 | REQUEST_INVALID_DATA | Invalid data |\n| 8 | REQUEST_REPEAT | Duplicate request |\n| 9 | REQUEST_TOO_FREQUENCY | Request too frequent |\n| 10 | USERNAME_NOT_EXIST | Username does not exist |\n| 11 | ACCOUNT_LOCKED | Account locked |\n| 12 | ACCOUNT_EXCEPTION | Account exception |\n| 13 | PASSWORD_ERROR | Password error |\n| 14 | USERNAME_OR_PASSWORD_ERROR | Username or password error |\n| 15 | SESSION_EXPIRED | Session expired |\n| 16 | SESSION_KICK_OUT_EXPIRED | Session kicked out |\n| 17 | INVALID_VERIFICATION_INFO | Invalid verification info |\n| 18 | INVALID_SIGNATURE_INFO | Invalid signature |\n| 19 | ACCESS_PERMISSIONS_DENIED | Access denied |\n| 30 | PARAMETER_ERROR | Parameter error |\n| 31 | PARAMETER_FORMAT_ERROR | Parameter format error |\n| 32 | NOT_SUPPORTED_PARAMETER_TYPE_CONVERSION | Parameter type conversion not supported |\n| 40 | DATA_LOADING_FAILED | Data loading failed |\n| 41 | DATA_NOT_EXIST | Data does not exist |\n| 42 | DATA_ALREADY_EXIST | Data already exists (in v2.7.1, v3.5.0, v3.5.1 this was 41, same as DATA_NOT_EXIST — a bug fixed in v2.7.2+ and v3.5.2) |\n\nCustom business error codes should start from **100**, built via `ErrorCode.build(code)`, with i18n support.\n\n---\n\n## Source Code Verification (Fallback)\n\nWhen reference files do not cover a specific API or you need to confirm parameters, read framework source code via `git show`:\n\n```bash\ngit show <branch>:<file-path>\n```\n\n| Module | Key Source Files (under `src/main/java/`) |\n|------|--------------------------------------|\n| houtu-core | `.../core/exception/BusinessException.java`, `.../core/exception/ErrorCode.java`, `.../core/constant/ErrorCodeConstant.java`, `.../core/context/SpringApplicationContext.java` |\n| houtu-web | `.../web/model/ResponseData.java`, `.../web/model/EmbedResponseData.java`, `.../web/model/vo/PageDataVO.java`, `.../web/model/form/PageForm.java`, `.../web/handler/UnifiedHandlerExceptionResolver.java`, `.../web/validation/constroins/NotXss.java` |\n| houtu-web-security | `.../websecurity/annotation/*.java`, `.../websecurity/session/SessionContext.java` |\n| houtu-cache | `.../lock/annotation/Lock.java`, `.../lock/support/LockSupport.java`, `.../lock/support/BLock.java`, `.../limit/RateLimiter.java` |\n| houtu-data-security | `.../data/security/annotation/SecurityWatch.java`, `.../data/security/handler/SecurityProcessor.java` |\n| houtu-access-log | `.../accesslog/annotation/AccessLog.java`, `.../accesslog/handler/LogFilterHandler.java` |\n| houtu-utils | `.../util/crypto/*.java`, `.../util/JsonUtils.java`, `.../util/HttpClients.java` |\n| houtu-actuator | `.../actuator/metrics/*.java` |\n| sc-houtu-loadbalancer | `.../loadbalancer/support/hint/HintContext.java` |\n| sc-houtu-feign | `.../feign/anotation/AutoFeign.java` |\n| sc-houtu-discovery | `.../discovery/context/ServiceContext.java` |\n\n> Path prefix: `io/github/lujiafa/houtu`\n> Note: The package name for `@AutoFeign` is `anotation` (not `annotation`); this is the framework's original spelling.\n\n---\n\n## Version Quick Comparison\n\n| Feature | v3.5.2 | v3.5.1 | v3.5.0 | v2.7.3 | v2.7.2 | v2.7.1 |\n|------|--------|--------|--------|--------|--------|--------|\n| JDK | 17+ | 17+ | 17+ | 1.8+ | 1.8+ | 1.8+ |\n| Spring Boot | 3.5.11 | 3.5.11 | 3.5.11 | 2.7.18 | 2.7.18 | 2.7.18 |\n| Package prefix | `io.github.lujiafa.houtu` | Same | Same | Same | Same | Same |\n| Namespace | `jakarta.*` | `jakarta.*` | `jakarta.*` | `javax.*` | `javax.*` | `javax.*` |\n| Redis config | `spring.data.redis.*` | Same | Same | `spring.redis.*` | `spring.redis.*` | `spring.redis.*` |\n| Nacos config | `spring.config.import` | Same | **bootstrap.yml** | bootstrap.yml | bootstrap.yml | bootstrap.yml |\n| SCA version | 2025.0.0.0 | Same | **2023.0.1.2** | 2021.0.6.2 | 2021.0.6.2 | 2021.0.6.2 |\n| @Lock SpEL | ✅ | ✗ | ✗ | ✅ | ✗ | ✗ |\n\n> See version details at `references/v{version}.md`","tags":["houtu","dependencies","project","skills","lujiafa","agent-skills","claude-code","claude-skills","skill-md","skillsmp"],"capabilities":["skill","source-lujiafa","skill-houtu-dependencies","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-skill-md","topic-skillsmp"],"categories":["houtu-project-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/lujiafa/houtu-project-skills/houtu-dependencies","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add lujiafa/houtu-project-skills","source_repo":"https://github.com/lujiafa/houtu-project-skills","install_from":"skills.sh"}},"qualityScore":"0.459","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 19 github stars · SKILL.md body (21,286 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T19:05:09.314Z","embedding":null,"createdAt":"2026-04-23T07:01:12.976Z","updatedAt":"2026-04-23T19:05:09.314Z","lastSeenAt":"2026-04-23T19:05:09.314Z","tsv":"'-1':1925,1928 '/accesslog/annotation/accesslog.java':2281 '/accesslog/handler/logfilterhandler.java':2282 '/actuator/metrics':2293 '/and,':1877,1891 '/core/constant/errorcodeconstant.java':2246 '/core/context/springapplicationcontext.java':2247 '/core/exception/businessexception.java':2244 '/core/exception/errorcode.java':2245 '/data/security/annotation/securitywatch.java':2275 '/data/security/handler/securityprocessor.java':2276 '/discovery/context/servicecontext.java':2309 '/feign/anotation/autofeign.java':2304 '/limit/ratelimiter.java':2270 '/loadbalancer/support/hint/hintcontext.java':2299 '/lock/annotation/lock.java':2267 '/lock/support/block.java':2269 '/lock/support/locksupport.java':2268 '/lujiafa/houtu-dependencies':82 '/src/main/java/io/github/lujiafa/houtu/lock/annotation/lock.java':909 '/util/crypto':2286 '/util/httpclients.java':2289 '/util/jsonutils.java':2288 '/web/handler/unifiedhandlerexceptionresolver.java':2255 '/web/model/embedresponsedata.java':2252 '/web/model/form/pageform.java':2254 '/web/model/responsedata.java':2251 '/web/model/vo/pagedatavo.java':2253 '/web/validation/constroins/notxss.java':2256 '/websecurity/annotation':2261 '/websecurity/session/sessioncontext.java':2263 '0':2011 '1':96,209,230,775,1311,2014 '1.8':2344,2345,2346 '10':2063 '100':2198 '11':2071 '12':2076 '13':2081 '14':2086 '15':2095 '16':2100 '17':2108,2341,2342,2343 '18':2115 '19':2121 '1a':264 '1b':322 '1c':443 '2':117,214,292,360,499,829,1348,2019 '2.7.1':90 '2.7.18':2352,2353,2354 '2.7.2':89 '2.7.3':88,362 '2021.0.6.2':2391,2392,2393 '2023.0.1.2':2390 '2025.0.0.0':2388 '3':134,218,357,723,841,1373,2024 '3.5.0':87 '3.5.1':86 '3.5.11':2349,2350,2351 '3.5.2':85,359,455,905 '30':1504,2127 '31':2132 '32':2139 '4':165,223,768,853,1399,2029 '40':2150 '41':2157,2178 '42':2165 '5':178,227,871,886,2034 '6':2039 '7':2045 '8':2051 '9':2056 'access':608,612,708,991,1182,1936,2122,2125,2279 'accesslog':1028,1341,1563,1931 'account':1221,2072,2074,2077,2079 'across':190 'activ':62,98 'activate-on-import':61,97 'actual':1394 'actuat':656,1695,2292 'ad':106,1047 'add':319,364,410,778,801,993,1030,1091,1112,1400,1423 'admin':1006,1336 'adopt':1375 'aesutil':1636 'agent':40,1429,1944 'ai':39 'allow':71 'alreadi':140,266,792,827,1416,2167,2170 'also':409,517 'analyz':504 'annot':112,119,124,1328,1521,1533,1564,1574,1585,1847,1850,2322 'annotation-driven':118 'anot':2320 'anti':35,584,704,857,1307,1426,1576 'anti-pattern':856,1425 'anti-repl':34 'anti-replay':583,703,1306,1575 'api':184,633,844,890,1122,1234,2218 'appli':916,1061,1165,1279,1318,1364 'applic':937,1309 'approach':148,164,188,864,1447 'appropri':918 'ask':345,446 'async':658,1188,1700,1721 'async/scheduled':1176 'audit':710 'audit/traceability':1026 'auth':579,1450 'authent':29,693 'auto':1185,1547,1659,1717,1725 'auto-configur':1658 'auto-propag':1184,1546,1724 'auto-replac':1716 'autofeign':1267,1550,1979,2318 'automat':103,772,1191,1490,1501,1698 'autonom':1434 'avoid':752,1443 'awar':181 'balanc':1088,1100,1587 'bank':1220 'bare':720 'base':385,525,877,940,1003,1392,1731,1743,1764,1776,1797 'basedto':881,1773,1803 'baseform':879,980,1761 'baseresponsedata':1745 'basevo':880,1794 'bash':899,2232 'basic':982,1381 'beanutil':1146 'beanutils.smartcopyproperties':1141 'behavior':122,756 'bind':574 'bindexcept':1496 'bom':245,298,366,387,426,808,825 'bool':1863,1902,1939,1946,1959,1963,1987,1991 'boot':55,68,355,493,2348 'bootstrap.yml':2382,2383,2384,2385 'bouncycastl':1626 'branch':84,91 'bug':2185 'build':252,269,369,1842 'build.gradle':256,308,382 'build.gradle.kts':257,383 'built':2199 'busi':77,527,532,910,921,946,958,969,1014,1069,1072,1205,1256,1320,1734,2021,2023,2192 'businessexcept':1487 'cach':597,696,908,1918,2266 'call':1119,1266,1531,1537 'callback':1125,1292,1298 'canari':404,615,1281,1282 'canary/ab':1275 'cannot':444 'capabl':101,139,939,972,1075,1208,1259,1363,1382,1409 'card':1219 'catch':1495 'characterist':970,1073,1206,1257 'check':776,782,854,1411,1583 'checklist':859,1428 'checkrepeatrequest':701,1110,1297,1584,1905 'checksess':126,992,1463,1855 'checksign':1296,1573,1894 'child':1713 'class':878,1470,1633,1732,1744,1765,1777,1798,1831,1950,1969 'clazz':1832 'client':645,1649 'cloud':11,57,278,401,415,423,432,495,623,816,823 'code':41,199,200,225,242,506,555,736,748,770,847,895,922,954,1398,1435,1503,1735,2006,2008,2194,2202,2207,2228 'code/message/data':1755 'collect':1689,1699 'common':957 'comparison':2332 'complet':15,438,741 'completablefutur':1190,1722 'concurr':699,1079,1094,1158,1359 'concurrency-sensit':1093 'config':626,1237,1242,1250,1662,2371,2379 'configur':115,168,187,485,746,1595,1603,1660,1680 'confirm':196,342,860,2223 'constant':2009 'contain':271,1229,1771,1784,1792,1806 'context':664,1181,1702,1711 'control':31,121,568,686,721,968,977 'controlleradvic':1484 'convent':166,983 'convers':1136,2144,2147 'convert':1833 'core':94,631,668,1241,1368,1677,2243 'correct':473,478,484,832 'correspond':463,730,1362 'cover':21,2215 'creat':1152,1643,1651 'critic':1352 'cross':662 'cross-thread':661 'crypto':640,1631 'current':789 'currentpag':1837 'currentpage/pagesize':1772,1785 'custom':175,1468,2191 'd':1809,1816 'data':604,1203,1774,1790,1814,1817,1956,1975,2048,2050,2151,2154,2158,2161,2166,2169,2181,2273 'databas':599,1232,1506 'declar':301 'decrypt':628,1243,1664,1671,1679,1962 'decryptmapkey':1964 'deduct':1085,1087 'default':150,171,450,754,995,1432,1445,1864,1878,1892,1903,1942,1947,1988,1992,2002 'defer':155,1436 'demand':1403 'deni':2124,2126 'depend':3,6,45,109,212,233,274,340,377,394,490,744,773,781,1401 'dependencymanag':310 'descript':975,1015,1078,1211,1262,2010 'detail':2398 'detect':210,231 'determin':238,259,286,445,457,1012 'develop':72 'differ':189 'direct':284 'discoveri':408,620,2308 'distribut':591,1522 'doc':1598 'document':634 'driven':120 'dto':1140,1783,1791,1830,1835 'duplic':869,2054 'e.g':1005,1082,1105,1123,1161,1293,1818 'edit':1052 'embedresponsedata':1478,1756 'empti':1845 'enabl':104,111 'encapsul':141 'encrypt':601,1508,1623,1958 'encrypt/decrypt':1515 'encryptmapkey':1960 'endpoint':678,985,1000,1024,1037,1449,1690 'enhanc':424,524,534,912,965,974,1077,1210,1261,1316,1353 'ensur':819,1380 'enterpris':8,49 'enterprise-grad':7,48 'entir':75 'entiti':1137 'environmentpostprocessor':1668 'error':2005,2016,2018,2026,2028,2083,2085,2090,2094,2129,2131,2135,2138,2193 'errorcode.build':2201 'errorcodeconst':2007 'etc':341,497,884,1198,1231,1639,1729 'exampl':670,848,902,1334 'except':24,571,1479,2078,2080 'exceptionhandl':1485 'execut':205 'exist':2066,2070,2160,2164,2168,2171,2183 'expir':2097,2099,2104 'explicit':160,327,514,930,1440 'extend':1757,1802 'extern':1120,1290 'extra':1813 'factori':1826 'fail':2031,2033,2153,2156 'fallback':2209 'fals':1948 'featur':933,1332,2333 'feign':403,617,1536,1985,2303 'feignclient':1273 'field':600,1054,1214,1227,1507,1815,1972,1995 'file':253,270,370,466,541,559,727,733,738,766,840,852,1238,2212,2238 'filter':1459 'filter/interceptor':1559 'financ':1356 'financi':713,1032 'first':137,440,563,1378,1386,1410 'first-tim':439,562 'fix':2186 'flash':1162,1169 'flatten':1759 'focus':74 'follow':169,262,987,1430 'form':1139,1763 'format':1498,2134,2137 'foundat':13,51 'framework':14,38,52,136,144,147,170,874,932,938,964,971,1074,1183,1207,1258,1372,1446,1488,1499,1545,1656,1715,1741,2226,2326 'framework-first':135 'framework-provid':1740 'frequenc':2059 'frequent':2062 'function':870 'generat':198,201,224,240,769 'getcod':1747 'getdata':1749 'getmessag':1748 'git':83,897,900,903,2230,2233 'github.com':81 'github.com/lujiafa/houtu-dependencies':80 'grade':9,50 'gradl':381,421 'gradual':1388 'groupid':18 'guid':17,42,535,913 'hand':131,1271,1457,1482,1510,1525,1539,1557,1568,1579,1589,1613,1629,1666,1684,1705 'hand-writ':130,1270,1456,1481,1509,1524,1538,1556,1567,1578,1588,1612,1628,1665,1683,1704 'handl':25,572,1201,1480,1489,1500 'hash':642 'header':1544 'hierarchi':1733 'high':1157 'high-concurr':1156 'hintcontext':1197,1278,1594,1728 'hotspot':1159 'houtu':2,5,37,44,265,273,279,329,334,336,339,376,393,416,433,576,587,596,603,611,624,630,636,648,655,667,684,689,695,707,817,824,907,1240,1384,1606,1676,1694,1859,1869,1883,1898,1909,1917,1935,1955,1974,1984,1998,2242,2249,2258,2265,2272,2278,2284,2291,2297,2302,2307 'houtu-access-log':610,706,1934,2277 'houtu-actu':654,1693,2290 'houtu-cach':595,694,906,1916,2264 'houtu-cor':629,666,1239,1675,2241 'houtu-data-secur':602,1954,1973,2271 'houtu-depend':1,4,43,272,338,375,392 'houtu-util':647,2283 'houtu-web':575,683,1383,1997,2248 'houtu-web-secur':586,688,1858,1868,1882,1897,1908,2257 'houtu-web-swagg':635,1605 'http':644,1121,1648 'httpclient':1130,1654,1661 'i18n':2204 'id':1218 'idempot':1117,1582 'identifi':215,500,519,682,915,936,1068,1102,1175,1253,1289 'immedi':460 'implement':60,389,427,1766,1778,1799 'import':64,100,248,267,324,380,419,747,793,836,1417,1451,1600,1604,1625,1692 'infer':349 'info':2111,2114,2118 'inherit':312,1192,1737 'input':1041 'instanc':1645 'instead':151,934 'integr':335,950,1129,1379 'intent':1066,1173,1287 'inter':1264 'inter-servic':1263 'interceptor':1572 'interceptors/aop':133 'interfac':966,1553,1746 'intern':755,1335,2015,2017 'introduc':1389 'invalid':2036,2037,2041,2043,2047,2049,2109,2112,2116,2119 'inventori':1086,1099 'involv':399,552,760,813,1355 'io.github.lujiafa':20,374,391,412,429 'io.github.lujiafa.houtu':476,2357 'io/github/lujiafa/houtu':2312 'ip':2042,2044 'item':1251 'jakarta':480,2364,2365,2366 'java':2262,2287,2294 'javax':482,2367,2368,2369 'jdk':2340 'json':643,1147,1640,1752 'jsonutil':1149,1647 'key':1235,1249,1853,1921,2236 'kick':2102,2106 'kotlin':384,420 'latest':453 'layer':967,1070,1204,1255,1518 'leasetim':1923 'like':1097,1215 'limit':594,1168,1611,1618 'linkedhashmap':1758 'list':1055,1063,1820,1840 'load':219,435,461,543,724,728,763,1586,2152,2155 'loadbalanc':1591,2298 'lock':125,592,697,1089,1347,1523,1532,1914,2073,2075,2394 'locksupport':1535 'log':609,613,709,711,1555,1562,1937,2280 'logfilterhandl':1949 'logic':78,528,947,1874,1888 'logic.or':1876,1890 'logic.or/and,':1875,1889 'login':692,989 'long':1924,1927 'lua':1616 'manag':774,806 'manual':114,1200,1494,1514,1599,1624,1642,1650,1670,1709,1843 'map':962 'match':510,1323 'maven':371,743 'may':1338 'md':469,2402 'mechan':70 'mention':332 'messag':1505,2000 'meterbind':1687 'method':978,1827,1857,1867,1881,1896,1907,1915,1933,1953,1981 'metric':652,1682,1691 'micromet':1686 'microservic':12,58,561,1254 'miss':779,1351 'model':876,1730 'modul':220,295,386,402,425,503,539,554,557,725,731,762,785,818,851,1391,1407,1852,2235 'monitor':651,1681 'multi':294 'multi-modul':293 'multipl':553,761 'must':194,203,236,246,986,1360 'naco':2378 'name':92,185,1228,2316 'namespac':479,2363 'nativ':153,163,862 'natur':949 'need':116,177,317,805,1017,1178,1202,1340,1346,2221 'network':2025,2027 'new':560 'note':2313 'notif':1295 'notxss':1044,1994 'number':283,1217 'object':1135,1796 'objectmapp':1155,1644 'observ':653 'obtain':471 'one':1023 'oper':714,1036,1081,1096,1104,1115,1148,1160,2030,2032 'order':207,263,1033,1084,1107 'origin':2328 'over-enh':1314 'overrid':173 'packag':182,474,833,2315,2355 'pagedatadto':1786,1829 'pagedataextvo':1808 'pagedatavo':883,1060,1801,1824 'pagedatavo.build':1828,1836 'pagedatavo.empty':1844 'pageform':882,981,1059,1768 'pagequerydto':1780 'pages':1838 'pagin':1058,1065,1769,1781,1789,1804,1811,1819,1846 'paramet':26,573,1491,1854,1913,1971,1978,1996,2128,2130,2133,2136,2142,2145,2224 'parent':1193 'pars':27 'parti':1128 'pass':1543 'password':1233,1247,2082,2084,2089,2093 'path':183,486,2310 'pattern':749,845,858,1427 'payment':677,1098,1108,1124,1294 'permiss':30,580,1004,2123 'phone':1216 'phone/mobile/idcard/bankaccount':1230 'pile':1326 'place':1083,1106 'platform':390,428 'pom':379,418 'pom.xml':254,305,372,797,1419 'practic':750 'predefin':2004 'prefer':1448 'prefix':475,834,1919,2311,2356 'principl':95,1310 'proactiv':363,518,800,914,935,1029,1090,1111,1224,1244,1422 'proceed':289 'processorbeannam':1966 'processorclass':1968 'progress':1374 'project':251,296,352 'propag':665,1186,1548,1703,1726 'protect':700 'provid':1742 'publish':1552 'purchas':1172 'queri':1056,1064,1343,1782 'quick':1848,2331 'r':1787 'rate':593,1167,1610,1617 'ratelimit':1164,1621 'rather':715 'read':249,280,893,2225 'receiv':1038 'recip':742 'record':1561,1841 'records/totalrecords/totalpages':1793 'records/totalrecords/totalpages/currentpage/pagesize':1807 'redi':1527,1581,1615,2370 'redisson':496,1530 'refer':221,465,540,558,726,732,1849,2211 'references/module-access-log.md':614 'references/module-actuator.md':657 'references/module-cache-lock.md':598 'references/module-cloud.md':625 'references/module-concurrent.md':669 'references/module-config-decrypt.md':632 'references/module-data-security.md':606 'references/module-security.md':590 'references/module-swagger.md':639 'references/module-utils.md':650 'references/module-web.md':578 'references/quick-start.md':436,566 'references/v':467,2400 'regular':1008 'relat':999 'releas':1283 'relev':765 'repeat':2053 'repl':36 'replac':1718 'replay':585,705,1308,1577 'repositori':79 'request':161,607,1441,1554,1762,1770,2035,2038,2040,2046,2052,2055,2057,2060 'requestbodi':1945 'requesthead':1940 'requestinterceptor':1274,1541 'requir':388,515,745,786,988,1027,1118,1301 'requirespermiss':1011,1465,1880 'requiresrol':1010,1464,1866 'respons':23,570,687,1467,1493,1753,1760,1805,1812 'responsebodi':1990 'responsedata':979,1476,1750 'responseent':1474 'resttempl':1652 'resttemplate/webclient':1134 'result/response':1469 'return':1475,1502 'rich':1042 'role':1002 'role-bas':1001 'root':304,307 'rout':405,616,1277,1284 'rsautil':1637 'rush':1171 'sale':1163,1170 'say':674 'sc':1983,2296,2301,2306 'sc-houtu-discoveri':2305 'sc-houtu-feign':1982,2300 'sc-houtu-loadbalanc':2295 'sca':2386 'scenario':216,501,520,533,790,812,911,959,1299,1354,1395,1442 'schedul':659,1189,1723 'script':1619 'secret':1248 'secur':589,605,691,1357,1454,1861,1871,1885,1900,1911,1957,1976,2260,2274 'securityparam':1223,1520,1970 'securitywatch':127,1222,1519,1951 'see':530,2396 'select':502,537 'semant':529,943,1321 'sensit':1035,1095,1213 'sentinel':406,618 'serial':1641 'serializ':1767,1779,1800 'server':2020,2022 'servic':407,619,1071,1265,1517 'session':28,581,1179,2096,2098,2101,2105 'sessioncontext':1196,1727 'set/get':1710 'setnx':1528 'setup':442,565 'show':898,901,904,2231,2234 'showcas':1331 'sign':582,641 'signatur':32,1303,1565,1570,2117,2120 'similar':809 'simpl':1342 'simultan':681 'singl':549 'skill' 'skill-houtu-dependencies' 'sm2utils':1638 'sm4utils':1635 'sourc':894,2206,2227,2237 'source-lujiafa' 'specif':1285,2217 'specifi':931,1021 'spel':2395 'spell':2329 'spring':10,54,56,67,154,277,354,400,414,422,431,492,494,622,815,822,863,1145,1453,2347 'spring-cloud-houtu':276,413,430,621,814,821 'spring-secur':1452 'spring.config.import':2380 'spring.data.redis':487,2372 'spring.redis':489,2375,2376,2377 'springdoc/springfox':1601 'src/main/java':2240 'standard':1751 'start':2196 'starter':69,108,780,1414,1609,1696 'startup':1673 'static':1825 'statist':1823 'step':208,213,217,222,226,229,291,498,722,767,885 'store':1212 'strategi':1592 'string':1873,1887,1920,1922,1941,1961,1965,1967,2001 'submiss':1103 'submodul':311 'subsequ':1397 'success':2012,2013 'suggest':1225,1245 'summari':1822 'support':2141,2149,2205 'swagger':638,1597,1608 'symmetric/asymmetric':1622 'system':1291 'tabl':546 'target':1851 'task':398,507,550,556,660,759,1177 'taskdecor':1707 'testing/multi-tenant':1276 'text':1053 'text/comments':1043 'third':1127 'third-parti':1126 'thread':663,1194,1701,1714 'throw':1486 'time':441,564 'timeunit.seconds':1930 'token':1462 'tool':1337 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-skill-md' 'topic-skillsmp' 'totalrecord':1839 'transfer':1109,1775 'transferthreadpooltaskexecutor':1187,1720 'true':1865,1904,1989,1993 'truli':1322 'type':1856,1895,1906,1932,1952,1980,2143,2146 'typehandl':1512 'typic':1300 'uncertain':889 'unifi':22,569,1466 'unit':1929 'usag':16 'use':145,333,337,830,842,867,872,1133,1144,1405,1549,1593,1620,1634,1646,1655,1674 'user':157,326,331,347,448,512,673,928,998,1009,1019,1040,1051,1286,1377,1438,1943 'user-edit':1050 'user-input':1039 'user-rel':997 'usernam':2064,2067,2087,2091 'usual':300,551 'util':646,649,1632,2285 'v':1788,1810 'v2.7.1':2173,2339 'v2.7.2':2188,2338 'v2.7.3':2337 'v3.5.0':2174,2336 'v3.5.1':2175,2335 'v3.5.2':2190,2334 'valid':1492 'valu':627,1369,1663,1862,1872,1886,1901,1938,1986 'verif':33,1304,1566,1571,2110,2113,2208 'verifi':228,887,891,1461 'version':93,180,191,193,211,232,235,282,288,344,356,378,395,417,434,454,459,464,468,491,804,839,2330,2387,2397,2401 'version-awar':179 'via':65,896,2200,2229 'view':1795 'vo':1138 'vs':1007 'wait':925 'waittim':1926 'want':328 'web':577,588,637,685,690,1385,1607,1860,1870,1884,1899,1910,1999,2250,2259 'weight':1596 'whether':783,1412 'workflow':202 'wrap':1472 'write':132,567,675,718,735,920,1080,1114,1272,1458,1483,1511,1526,1540,1558,1569,1580,1590,1614,1630,1667,1685,1706 'x':358,361 'xml':373,411 '内容包含不安全信息':2003","prices":[{"id":"a8dd97fa-4216-4098-907d-eed367e38364","listingId":"68f9a437-497e-4dc1-a42e-1d0210f50329","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"lujiafa","category":"houtu-project-skills","install_from":"skills.sh"},"createdAt":"2026-04-23T07:01:12.976Z"}],"sources":[{"listingId":"68f9a437-497e-4dc1-a42e-1d0210f50329","source":"github","sourceId":"lujiafa/houtu-project-skills/houtu-dependencies","sourceUrl":"https://github.com/lujiafa/houtu-project-skills/tree/main/skills/houtu-dependencies","isPrimary":false,"firstSeenAt":"2026-04-23T07:01:12.976Z","lastSeenAt":"2026-04-23T19:05:09.314Z"}],"details":{"listingId":"68f9a437-497e-4dc1-a42e-1d0210f50329","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"lujiafa","slug":"houtu-dependencies","github":{"repo":"lujiafa/houtu-project-skills","stars":19,"topics":["agent-skills","claude-code","claude-skills","skill-md","skillsmp"],"license":"mit","html_url":"https://github.com/lujiafa/houtu-project-skills","pushed_at":"2026-04-23T01:57:57Z","description":"A curated collection of skills, practices, and tooling used throughout the project lifecycle — from development to testing and beyond.","skill_md_sha":"a6ee21aa3bb1b7fbe6308c8418212430c311089c","skill_md_path":"skills/houtu-dependencies/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/lujiafa/houtu-project-skills/tree/main/skills/houtu-dependencies"},"layout":"multi","source":"github","category":"houtu-project-skills","frontmatter":{"name":"houtu-dependencies","description":"houtu-dependencies enterprise-grade Spring Cloud microservice foundational framework complete usage guide. GroupId is io.github.lujiafa, covering unified response, exception handling, parameter parsing, session authentication, permission control, signature verification, anti-replay, distributed lock, rate limiting, database field encryption, config decryption, access logging, canary routing, weighted load balancing, Feign enhancement, Sentinel circuit breaking, service discovery, Swagger documentation, crypto utilities, HTTP client, monitoring metrics, and other enterprise-grade capabilities. When the project build file (pom.xml or build.gradle/build.gradle.kts) contains io.github.lujiafa or houtu-related dependencies, or when the user mentions houtu or houtu-dependencies, this Skill must be read and code must be generated strictly following framework conventions. Even if the user is simply doing regular Spring Boot development (e.g., writing Controller, Service, Feign), as long as the project includes houtu, the houtu approach must be used instead of native Spring. When the user explicitly wants to use the houtu framework and the project has not yet included it, proactively add the BOM and required Starters; when the project already includes it, proactively identify and import required module dependencies based on business scenarios during coding, naturally integrating framework capabilities to enhance business services based on business semantics, rather than waiting for the user to specify each one."},"skills_sh_url":"https://skills.sh/lujiafa/houtu-project-skills/houtu-dependencies"},"updatedAt":"2026-04-23T19:05:09.314Z"}}