{"id":"e9a797ed-7790-42dc-88b5-b1ff3b1b402e","shortId":"XcUZ2a","kind":"skill","title":"mock-engine","tagline":"Mock Engine local development environment management. Use for starting/stopping mock services, loading test data, creating test scenarios, and troubleshooting startup issues. Triggers when the user mentions \"start mock\", \"mock environment\", \"local dev environment\", \"mock-up\", \"te","description":"# Mock Engine — Local Development Mock Environment Management\n\nProvides unified mock infrastructure (MySQL, Redis, Kafka, MQTT, LocalStack, WireMock) via Docker Compose, supporting local development and integration testing.\n\n## Description\n\nApplicable scenarios:\n\n- **Start/stop mock environment**: `make mock-up` one-command launch of all dependency services\n- **Load test data**: Base fixtures auto-load; scenario fixtures load on demand\n- **Create test scenarios**: Prepare preset data (SQL + Redis + WireMock stubs) for specific business flows\n- **Troubleshoot startup issues**: Container status checks, port conflicts, data loading failures\n- **Integration testing**: Manage mock infrastructure in automated tests via Java SDK or Go SDK\n\nPrerequisites:\n\n- Docker Compose v2.20+ (verify with `docker compose version`)\n- A `mock/` directory exists at the project root (containing docker-compose.yml and Makefile)\n- If there is no `mock/` directory, initialize from the mock-engine template:\n  ```bash\n  cp -r /path/to/mock-engine/core/templates/mock/ ./mock/\n  # Modify project configuration in mock/Makefile (database name, password, etc.)\n  ```\n\n## Rules\n\n### Operational Flow\n\n**First-time initialization:**\n\n```bash\ncd mock/\nmake mock-init    # Download compose fragments\n```\n\n**Start Mock environment:**\n\n```bash\nmake mock-up      # Start all services + wait for health checks + load data\nmake mock-status  # Verify all services are running normally\n```\n\n**Start the application (backend-service example):**\n\n```bash\n# The appName environment variable must be set\nappName=your-app mvn spring-boot:run \\\n  -pl your-app \\\n  -Dspring-boot.run.profiles=dev-local,mock\n```\n\n**Load a test scenario:**\n\n```bash\nmake mock-scenario SCENARIO=user-registration\n# View available scenarios:\nls fixtures/scenarios/\n```\n\n**Stop/reset:**\n\n```bash\nmake mock-down    # Stop services (preserve data)\nmake mock-clean   # Stop + delete data volumes\nmake mock-reset   # Full reset (clean + init + up)\n```\n\n### Default Port Mapping\n\n| Service | Port | Environment Variable Override |\n|------|------|-------------|\n| MySQL | 13306 | MOCK_MYSQL_PORT |\n| Redis (business) | 16379 | MOCK_REDIS_BUSINESS_PORT |\n| Redis (readonly) | 16380 | MOCK_REDIS_READONLY_PORT |\n| Redis (event) | 16381 | MOCK_REDIS_EVENT_PORT |\n| Kafka | 19092 | MOCK_KAFKA_PORT |\n| MQTT | 11883 | MOCK_MQTT_PORT |\n| LocalStack | 14566 | MOCK_LOCALSTACK_PORT |\n| WireMock | 19999 | MOCK_WIREMOCK_PORT |\n\n### Test Data Management\n\n**Base Fixtures (auto-loaded):** Place in `mock/fixtures/base/`, executed in filename order:\n\n```\nfixtures/base/\n├── 01-seed-users.sql        # INSERT test users\n├── 02-seed-devices.sql      # INSERT test devices\n└── 03-seed-data.sql         # INSERT test data\n```\n\n**Scenario Fixtures (load on demand):** One subdirectory per scenario:\n\n```\nfixtures/scenarios/user-registration/\n├── data.sql                 # MySQL data\n├── redis-cmds.txt           # Redis CLI commands (one per line)\n└── stubs-override/          # WireMock stub overrides\n```\n\n`redis-cmds.txt` format:\n```\n# Comment line\nSET user:1001:token abc123\nHSET device:DEV001 status online\nEXPIRE user:1001:token 3600\n```\n\n**WireMock Stubs:** Place in `mock/stubs/<service-name>/`:\n\n```json\n{\n  \"request\": {\n    \"method\": \"POST\",\n    \"urlPath\": \"/stripe/v1/customers\"\n  },\n  \"response\": {\n    \"status\": 200,\n    \"jsonBody\": { \"id\": \"cus_mock_001\" }\n  }\n}\n```\n\nSupports advanced features: conditional routing (queryParameters/bodyPatterns), dynamic templates (response-template), state machines (scenarioName), Webhook callbacks (serveEventListeners).\n\n### Common Troubleshooting\n\n**MySQL connection failed:**\n```bash\ndocker ps --filter name=mock-mysql\ndocker logs mock-mysql\ndocker exec -e MYSQL_PWD=root123456 mock-mysql mysql -uroot -e \"SELECT 1\"\n```\n\n**Bind mount not taking effect (Docker-in-Docker):** SQL files not auto-loaded into MySQL:\n```bash\ndocker exec -e MYSQL_PWD=root123456 -i mock-mysql mysql -uroot < mock/sql/init-schema.sql\n```\n\n**WireMock stubs not loaded:**\n```bash\ncurl http://localhost:19999/__admin/mappings | python3 -m json.tool\ndocker cp mock/stubs/. mock-wiremock:/home/wiremock/mappings/\ncurl -X POST http://localhost:19999/__admin/mappings/reset\n```\n\n**Spring Bean missing (CloudBeanCondition):** Ensure the `appName=your-app` environment variable is set.\n\n### SDK Integration (Automated Testing)\n\n**Java (Testcontainers):**\n\n```java\n// pom.xml: <dependency>com.example:mock-engine</dependency>\nMockInfraManager manager = MockInfraManager.fromProjectMockDir(\"./mock\");\nmanager.startAll();\nMap<String, String> props = manager.getAllProperties();\n```\n\n**Go:**\n\n```go\n// go.mod: require gitlab.example.com/tools/mock-engine/go\ninfra := mockinfra.New(mockinfra.WithProjectDir(\"./mock\"))\ninfra.Start(ctx)\ndefer infra.Stop(ctx)\ninfra.LoadScenario(ctx, \"user-registration\")\n```\n\n## Examples\n\n### Bad Example\n\n```\nUser: Help me start the mock environment\nAI: Let me just docker compose up directly\n\ndocker compose up -d\n\n# Then directly start the application\nmvn spring-boot:run -pl your-app\n```\n\nProblems:\n- Did not enter the `mock/` directory\n- Did not use `make mock-init` to initialize fragments\n- Did not use `make mock-up` (skips health checks and data loading)\n- Did not set `appName` environment variable or `mock` profile\n\n### Good Example\n\n```\nUser: Help me start the mock environment\nAI: OK, let me check the mock directory and start the environment.\n\ncd mock/\n# Check if already initialized\nls .fragments/Makefile.include 2>/dev/null || make mock-init\n# Start and wait for all services to be ready\nmake mock-up\n# Verify service status\nmake mock-status\n\n# Start the application (with correct environment variable and profile)\ncd ..\nappName=your-app mvn spring-boot:run \\\n  -pl your-app \\\n  -Dspring-boot.run.profiles=dev-local,mock\n\n# Verify health check\ncurl -s http://localhost:7777/actuator/health\n```\n\n### Bad Example\n\n```\nUser: I need to test the user registration flow\nAI: Let me just call the registration API directly\n\ncurl -X POST http://localhost:7777/account/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"newuser@test.com\"}'\n```\n\nProblems:\n- Did not load the test scenario data first\n- Did not provide an Authorization token\n- Missing required request parameters\n\n### Good Example\n\n```\nUser: I need to test the user registration flow\nAI: OK, let me load the registration test scenario data first, then test step by step.\n\n# 1. Load user registration scenario data\ncd mock/\nmake mock-scenario SCENARIO=user-registration\n\n# 2. Login first to get an admin token\nTOKEN=$(curl -s -X POST http://localhost:7777/account/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"testuser1@mock.local\",\"password\":\"password\",\"loginType\":99}' \\\n  | python3 -c \"import sys,json; print(json.load(sys.stdin)['data']['token'])\")\n\n# 3. Check if the email is available\ncurl -s -X POST http://localhost:7777/account/check-email \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: $TOKEN\" \\\n  -d '{\"email\":\"newuser@mock.local\"}'\n\n# 4. Execute registration\ncurl -s -X POST http://localhost:7777/account/register \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: $TOKEN\" \\\n  -d '{\"email\":\"newuser@mock.local\",\"password\":\"Test@1234\",\"nickname\":\"TestUser\"}'\n```\n\n## Related Resources\n\n- mock-engine repository: `gitlab.example.com/tools/mock-engine`\n- Design document: `mock-engine/docs/specs/2026-03-20-mock-engine-generalization-design.md`","tags":["mock","engine","enterprise","harness","engineering","addxai","agent-skills","ai-agent","ai-engineering","claude-code","code-review","cursor"],"capabilities":["skill","source-addxai","skill-mock-engine","topic-agent-skills","topic-ai-agent","topic-ai-engineering","topic-claude-code","topic-code-review","topic-cursor","topic-devops","topic-enterprise","topic-sre","topic-windsurf"],"categories":["enterprise-harness-engineering"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/addxai/enterprise-harness-engineering/mock-engine","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add addxai/enterprise-harness-engineering","source_repo":"https://github.com/addxai/enterprise-harness-engineering","install_from":"skills.sh"}},"qualityScore":"0.458","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 16 github stars · SKILL.md body (7,456 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-22T01:02:12.230Z","embedding":null,"createdAt":"2026-04-21T19:04:01.754Z","updatedAt":"2026-04-22T01:02:12.230Z","lastSeenAt":"2026-04-22T01:02:12.230Z","tsv":"'/dev/null':718 '/docs/specs/2026-03-20-mock-engine-generalization-design.md':973 '/home/wiremock/mappings':550 '/mock':175,585,602 '/path/to/mock-engine/core/templates/mock':174 '/stripe/v1/customers':444 '/tools/mock-engine':967 '/tools/mock-engine/go':598 '001':452 '01-seed-users.sql':377 '02-seed-devices.sql':381 '03-seed-data.sql':385 '1':501,857 '1001':421,431 '11883':347 '1234':956 '13306':316 '14566':352 '16379':322 '16380':329 '16381':336 '19092':342 '19999':357 '19999/__admin/mappings':540 '19999/__admin/mappings/reset':555 '2':717,873 '200':447 '3':910 '3600':433 '4':934 '7777/account/check-email':922 '7777/account/login':887 '7777/account/register':802,942 '7777/actuator/health':777 '99':899 'abc123':423 'admin':879 'advanc':454 'ai':623,697,789,841 'alreadi':713 'api':796 'app':247,256,565,648,756,765 'applic':68,231,639,745 'application/json':807,892,927,947 'appnam':238,244,562,682,753 'author':824,929,949 'auto':91,367,515 'auto-load':90,366,514 'autom':129,572 'avail':276,916 'backend':233 'backend-servic':232 'bad':614,778 'base':88,364 'bash':171,192,205,236,266,281,475,519,537 'bean':557 'bind':502 'boot':251,643,760 'busi':110,321,325 'c':901 'call':793 'callback':468 'cd':193,709,752,863 'check':117,216,675,701,711,773,911 'clean':293,304 'cli':404 'cloudbeancondit':559 'com.example':578 'command':79,405 'comment':417 'common':470 'compos':60,139,144,200,628,632 'condit':456 'configur':178 'conflict':119 'connect':473 'contain':115,154 'content':805,890,925,945 'content-typ':804,889,924,944 'correct':747 'cp':172,545 'creat':18,98 'ctx':604,607,609 'curl':538,551,774,798,882,917,937 'cus':450 'd':634,808,893,931,951 'data':17,87,103,120,218,289,296,362,388,401,677,818,850,862,908 'data.sql':399 'databas':181 'default':307 'defer':605 'delet':295 'demand':97,393 'depend':83 'descript':67 'design':968 'dev':35,259,768 'dev-loc':258,767 'dev001':426 'develop':7,44,63 'devic':384,425 'direct':630,636,797 'directori':148,163,655,704 'docker':59,138,143,476,483,488,508,510,520,544,627,631 'docker-compose.yml':155 'docker-in-dock':507 'document':969 'download':199 'dspring-boot.run.profiles':257,766 'dynam':459 'e':490,499,522 'effect':506 'email':809,894,914,932,952 'engin':3,5,42,169,581,963,972 'ensur':560 'enter':652 'environ':8,33,36,46,72,204,239,312,566,622,683,696,708,748 'etc':184 'event':335,339 'exampl':235,613,615,689,779,831 'exec':489,521 'execut':372,935 'exist':149 'expir':429 'fail':474 'failur':122 'featur':455 'file':512 'filenam':374 'filter':478 'first':189,819,851,875 'first-tim':188 'fixtur':89,94,365,390 'fixtures/base':376 'fixtures/scenarios':279 'fixtures/scenarios/user-registration':398 'flow':111,187,788,840 'format':416 'fragment':201,665 'fragments/makefile.include':716 'full':302 'get':877 'gitlab.example.com':597,966 'gitlab.example.com/tools/mock-engine':965 'gitlab.example.com/tools/mock-engine/go':596 'go':135,592,593 'go.mod':594 'good':688,830 'h':803,888,923,928,943,948 'health':215,674,772 'help':617,691 'hset':424 'id':449 'import':902 'infra':599 'infra.loadscenario':608 'infra.start':603 'infra.stop':606 'infrastructur':51,127 'init':198,305,662,722 'initi':164,191,664,714 'insert':378,382,386 'integr':65,123,571 'issu':24,114 'java':132,574,576 'json':439,904 'json.load':906 'json.tool':543 'jsonbodi':448 'kafka':54,341,344 'launch':80 'let':624,699,790,843 'line':408,418 'load':15,85,92,95,121,217,262,368,391,516,536,678,814,845,858 'local':6,34,43,62,260,769 'localhost':539,554,776,801,886,921,941 'localstack':56,351,354 'log':484 'login':874 'logintyp':898 'ls':278,715 'm':542 'machin':465 'make':73,195,206,219,267,282,290,298,659,669,719,732,739,865 'makefil':157 'manag':9,47,125,363,583 'manager.getallproperties':591 'manager.startall':586 'map':309,587 'mention':29 'method':441 'miss':558,826 'mock':2,4,13,31,32,38,41,45,50,71,75,126,147,162,168,194,197,203,208,221,261,269,284,292,300,317,323,330,337,343,348,353,358,451,481,486,495,528,548,580,621,654,661,671,686,695,703,710,721,734,741,770,864,867,962,971 'mock-clean':291 'mock-down':283 'mock-engin':1,167,579,961,970 'mock-init':196,660,720 'mock-mysql':480,485,494,527 'mock-reset':299 'mock-scenario':268,866 'mock-status':220,740 'mock-up':37,74,207,670,733 'mock-wiremock':547 'mock/fixtures/base':371 'mock/makefile':180 'mock/sql/init-schema.sql':532 'mock/stubs':438,546 'mockinfra.new':600 'mockinfra.withprojectdir':601 'mockinframanag':582 'mockinframanager.fromprojectmockdir':584 'modifi':176 'mount':503 'mqtt':55,346,349 'must':241 'mvn':248,640,757 'mysql':52,315,318,400,472,482,487,491,496,497,518,523,529,530 'name':182,479 'need':782,834 'newuser@mock.local':933,953 'newuser@test.com':810 'nicknam':957 'normal':228 'ok':698,842 'one':78,394,406 'one-command':77 'onlin':428 'oper':186 'order':375 'overrid':314,411,414 'paramet':829 'password':183,896,897,954 'per':396,407 'pl':253,645,762 'place':369,436 'pom.xml':577 'port':118,308,311,319,326,333,340,345,350,355,360 'post':442,553,800,885,920,940 'prepar':101 'prerequisit':137 'preserv':288 'preset':102 'print':905 'problem':649,811 'profil':687,751 'project':152,177 'prop':590 'provid':48,822 'ps':477 'pwd':492,524 'python3':541,900 'queryparameters/bodypatterns':458 'r':173 'readi':731 'readon':328,332 'redi':53,105,320,324,327,331,334,338,403 'redis-cmds.txt':402,415 'registr':274,612,787,795,839,847,860,872,936 'relat':959 'repositori':964 'request':440,828 'requir':595,827 'reset':301,303 'resourc':960 'respons':445,462 'response-templ':461 'root':153 'root123456':493,525 'rout':457 'rule':185 'run':227,252,644,761 'scenario':20,69,93,100,265,270,271,277,389,397,817,849,861,868,869 'scenarionam':466 'sdk':133,136,570 'select':500 'serveeventlisten':469 'servic':14,84,212,225,234,287,310,728,737 'set':243,419,569,681 'skill' 'skill-mock-engine' 'skip':673 'source-addxai' 'specif':109 'spring':250,556,642,759 'spring-boot':249,641,758 'sql':104,511 'start':30,202,210,229,619,637,693,706,723,743 'start/stop':70 'starting/stopping':12 'startup':23,113 'state':464 'status':116,222,427,446,738,742 'step':854,856 'stop':286,294 'stop/reset':280 'string':588,589 'stub':107,410,413,435,534 'stubs-overrid':409 'subdirectori':395 'support':61,453 'sys':903 'sys.stdin':907 'take':505 'te':40 'templat':170,460,463 'test':16,19,66,86,99,124,130,264,361,379,383,387,573,784,816,836,848,853,955 'testcontain':575 'testus':958 'testuser1@mock.local':895 'time':190 'token':422,432,825,880,881,909,930,950 'topic-agent-skills' 'topic-ai-agent' 'topic-ai-engineering' 'topic-claude-code' 'topic-code-review' 'topic-cursor' 'topic-devops' 'topic-enterprise' 'topic-sre' 'topic-windsurf' 'trigger':25 'troubleshoot':22,112,471 'type':806,891,926,946 'unifi':49 'urlpath':443 'uroot':498,531 'use':10,658,668 'user':28,273,380,420,430,611,616,690,780,786,832,838,859,871 'user-registr':272,610,870 'v2.20':140 'variabl':240,313,567,684,749 'verifi':141,223,736,771 'version':145 'via':58,131 'view':275 'volum':297 'wait':213,725 'webhook':467 'wiremock':57,106,356,359,412,434,533,549 'x':552,799,884,919,939 'your-app':245,254,563,646,754,763","prices":[{"id":"20702f8a-a9fb-4219-a0b2-8007cce3e7ef","listingId":"e9a797ed-7790-42dc-88b5-b1ff3b1b402e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"addxai","category":"enterprise-harness-engineering","install_from":"skills.sh"},"createdAt":"2026-04-21T19:04:01.754Z"}],"sources":[{"listingId":"e9a797ed-7790-42dc-88b5-b1ff3b1b402e","source":"github","sourceId":"addxai/enterprise-harness-engineering/mock-engine","sourceUrl":"https://github.com/addxai/enterprise-harness-engineering/tree/main/skills/mock-engine","isPrimary":false,"firstSeenAt":"2026-04-21T19:04:01.754Z","lastSeenAt":"2026-04-22T01:02:12.230Z"}],"details":{"listingId":"e9a797ed-7790-42dc-88b5-b1ff3b1b402e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"addxai","slug":"mock-engine","github":{"repo":"addxai/enterprise-harness-engineering","stars":16,"topics":["agent-skills","ai-agent","ai-engineering","claude-code","code-review","cursor","devops","enterprise","sre","windsurf"],"license":"apache-2.0","html_url":"https://github.com/addxai/enterprise-harness-engineering","pushed_at":"2026-04-17T08:57:37Z","description":"Enterprise-grade AI Agent Skills for software development, DevOps, SRE, security, and product teams. Compatible with Claude Code, Cursor, Windsurf, Gemini CLI, GitHub Copilot, and 30+ AI coding agents.","skill_md_sha":"369c9b8763dcec148bacc64859f7a51723f49f8e","skill_md_path":"skills/mock-engine/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/addxai/enterprise-harness-engineering/tree/main/skills/mock-engine"},"layout":"multi","source":"github","category":"enterprise-harness-engineering","frontmatter":{"name":"mock-engine","description":"Mock Engine local development environment management. Use for starting/stopping mock services, loading test data, creating test scenarios, and troubleshooting startup issues. Triggers when the user mentions \"start mock\", \"mock environment\", \"local dev environment\", \"mock-up\", \"test data\", or \"test scenarios\"."},"skills_sh_url":"https://skills.sh/addxai/enterprise-harness-engineering/mock-engine"},"updatedAt":"2026-04-22T01:02:12.230Z"}}