aukeys-opscli 0.0.26__tar.gz → 0.0.29__tar.gz
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.
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/PKG-INFO +1 -1
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/change-log-pending.md +0 -69
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/services/manager.py +16 -72
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/commands/cli.py +2 -5
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/version.py +1 -1
- aukeys_opscli-0.0.29/publish.sh +272 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/pyproject.toml +1 -1
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_manager.py +4 -15
- aukeys_opscli-0.0.26/docs/design/1.md +0 -422
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-asin-health-diagnoser/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-competitive-intelligence-analyst/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-cross-border-product-selector/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-inventory-health-monitor/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-perspective-builder/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-product-attribute-analyzer/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-profit-structure-analyzer/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/opscli/skills/templates/ops-refund-priority-matrix/references/query-essential-guide.md +0 -149
- aukeys_opscli-0.0.26/publish.sh +0 -94
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/plugins/marketplace.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/skills/super-dev/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/skills/super-dev-seeai/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/CLAUDE.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/agents/super-dev.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/commands/super-dev-seeai.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/commands/super-dev.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/settings.local.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/skills/super-dev/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/skills/super-dev-seeai/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude-plugin/marketplace.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.github/workflows/cross-platform-preflight.yml +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.gitignore +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.super-dev/install-manifest.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/AGENTS.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/CLAUDE.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/README.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/README_MCP.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/Skill/346/226/271/346/263/225/350/256/272/346/267/261/345/272/246/345/210/206/346/236/220/344/270/216/346/225/260/346/215/256/351/233/206/350/236/215/345/220/210/345/244/215/347/224/250/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/amazon-monitor/346/216/245/345/205/245/345/210/206/346/236/220.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/opscli/347/263/273/347/273/237/346/236/266/346/236/204/345/210/206/346/236/220/346/212/245/345/221/212.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis//344/272/232/351/251/254/351/200/212/344/272/247/345/223/201/345/205/250/347/273/264/345/210/206/346/236/220/344/275/223/347/263/273_v1.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis//344/272/232/351/251/254/351/200/212/344/272/247/345/223/201/345/205/250/347/273/264/345/210/206/346/236/220/344/275/223/347/263/273_/347/254/254/344/270/200/346/255/245/351/200/217/350/247/206/345/233/276/346/236/204/345/273/272/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis//346/216/210/346/235/203/346/250/241/345/274/217/345/257/271/346/257/224/345/210/206/346/236/220/346/212/245/345/221/212.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/AI/345/217/226/346/225/260/350/203/275/345/212/233/345/272/225/345/272/247/345/274/200/345/217/221/351/234/200/346/261/202.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/CLI/345/212/250/346/200/201/346/250/241/345/235/227/345/212/240/350/275/275/346/224/271/351/200/240/345/256/236/346/226/275/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/Skills/345/244/232/345/267/245/345/205/267/350/260/203/347/240/224/350/247/204/345/210/222.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/amazon/345/273/272/350/241/250SQL/350/215/211/346/241/210/344/270/216ops API/350/257/267/346/261/202/344/275/223/345/256/232/344/271/211.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/amazon/346/225/260/346/215/256/346/250/241/345/236/213/344/270/216API/351/242/204/347/225/231/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/ops-amazon Skill/350/247/204/345/210/222/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/opscli-session/345/205/261/347/224/250/346/200/247/345/210/206/346/236/220/344/270/216/344/274/230/345/214/226/346/226/271/346/241/210/346/212/245/345/221/212.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/opscli/346/216/210/346/235/203/346/265/201/347/250/213/346/267/261/345/272/246/345/210/206/346/236/220.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/query/346/250/241/345/235/227/350/256/276/350/256/241.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/225/260/346/215/256/346/237/245/350/257/242/346/234/215/345/212/241/345/274/200/345/217/221/350/257/264/346/230/216/346/226/207/346/241/243.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/225/260/346/215/256/351/233/206/345/255/227/346/256/265/346/212/200/350/203/275/347/263/273/347/273/237/346/212/200/346/234/257/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/250/241/345/235/227/345/215/217/350/256/256/344/270/216/346/217/222/344/273/266/346/263/250/345/206/214/346/216/245/345/217/243/350/256/276/350/256/241.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/250/241/345/235/227/345/256/211/350/243/205/345/210/206/345/261/202/344/270/216/351/273/230/350/256/244/345/217/221/350/241/214/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/250/241/345/235/227/346/217/222/344/273/266/345/214/226/344/270/216/345/244/232/345/233/242/351/230/237/346/262/273/347/220/206/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//346/250/241/345/235/227/347/233/256/345/275/225/345/210/206/345/261/202/350/247/204/350/214/203.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design//351/200/232/347/224/250Skill/347/211/210/346/234/254/346/216/247/345/210/266/346/236/266/346/236/204.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide/MCP/345/267/245/345/205/267/344/275/277/347/224/250/346/211/213/345/206/214.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide/Skills/345/237/272/347/241/200/345/274/200/345/217/221/345/237/271/350/256/255/346/211/213/345/206/214.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide/opscli/345/221/275/344/273/244/347/224/250/344/276/213/346/211/213/345/206/214.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide//344/273/216/351/233/266/345/256/211/350/243/205/351/203/250/347/275/262/346/214/207/345/215/227.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide//350/256/244/350/257/201/346/250/241/345/235/227/344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide//350/267/250/345/271/263/345/217/260/345/217/221/345/270/203/345/211/215/346/243/200/346/237/245.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans/2026-04-22-p1-contract-version-governance.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans/MCP/346/234/215/345/212/241/345/256/214/345/226/204/346/225/264/346/224/271/350/256/241/345/210/222/344/271/246.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/211/251/344/275/231/344/273/273/345/212/241.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/217/221/345/270/203/346/243/200/346/237/245/346/270/205/345/215/225.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/274/200/345/217/221/350/256/241/345/210/222.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/350/201/224/350/260/203/350/256/260/345/275/225.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/351/252/214/346/224/266/346/211/213/345/206/214.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//350/256/244/350/257/201/346/250/241/345/235/227/345/256/236/346/226/275/350/256/241/345/210/222.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans//350/256/244/350/257/201/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/release//345/244/232/345/214/205/345/217/221/345/270/203/344/270/216/350/201/232/345/220/210/345/217/221/350/241/214/347/255/226/347/225/245.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/release//346/211/223/345/214/205/345/217/221/345/270/203/346/214/207/345/215/227.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/01-asin-health-diagnoser.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/02-profit-structure-analyzer.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/03-refund-priority-matrix.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/04-product-attribute-analyzer.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/05-advertising-efficiency-optimizer.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/06-inventory-health-monitor.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/07-ops-perspective-builder.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/08-competitive-intelligence-analyst.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/09-cross-border-product-selector.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/README.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/spec/MCP/346/250/241/345/235/227/346/216/245/345/205/245/350/247/204/350/214/203.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/spec//345/274/200/345/217/221/350/247/204/350/214/203.md" +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/commands/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/commands/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/parser.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraper.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/parser.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/scraper.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/services/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/services/manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/transport/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/transport/client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/commands/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/commands/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/config.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/device_flow.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/system_registry.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/token_manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/domain/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/domain/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/credential_store.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/crypto.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/config.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/auth_middleware.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/context.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/credential_cache.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/server.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/amazon.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/auth.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/chatgpt.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/helpers.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/query.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/skills.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/user_store.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/commands/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/commands/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/services/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/transport/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/transport/client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/http.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/logging.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/commands/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/detector.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/discovery/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/discovery/detector.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/exceptions.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/models.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/services/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/services/manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/sync/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/sync/updater.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/ads_metrics_guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/campaign_optimization_playbook.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/ads_budget_allocator.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/ads_budget_allocator_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/analyze_ads_efficiency.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/analyze_ads_efficiency_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/calculate_roas_acos.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/calculate_roas_acos_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/threshold_reference.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/calculate_health_score.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/calculate_health_score_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/porter_template.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/competitive_analysis.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/competitive_analysis_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/bsr_filtering_rules.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/quadrant_matrix_guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/product_selector.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/product_selector_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/dataset_fields.csv +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/datasets.csv +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/query_metadata.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_map.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_map_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/excel_export.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/excel_export_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/query.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/query_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/search.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/updater.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/updater_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/inventory_thresholds.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/replenishment_formula.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/calculate_inventory_health.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/calculate_inventory_health_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/generate_replenishment_plan.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/generate_replenishment_plan_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-mcp/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-mcp/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/perspective_catalog.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/build_perspective_config.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/build_perspective_config_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/3d_tag_dictionary.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/attribute_mapping_table.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/market_portrait_template.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/analyze_attribute_combo.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/analyze_attribute_combo_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/calculate_weighted_share.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/calculate_weighted_share_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/generate_market_portrait.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/generate_market_portrait_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/four_actions_template.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/analyze_cost_structure.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/analyze_cost_structure_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/cli.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/data-query-service-dev-guide.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/dataset_fields_mapping.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/mcp.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/refund_reasons_catalog.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/calculate_priority_matrix.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/calculate_priority_matrix_mcp.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/core.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/SKILL_MCP.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/data/VERSION.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/updater.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-payload-sample-shell.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-payload-sample.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-scrape-sample-shell.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-scrape-sample.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-search-sample-shell.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-search-sample.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/maintenance/host-onboard-smoke-20260423-082206.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/maintenance/host-onboard-smoke-20260423-082206.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/code_analysis.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/config_patterns/config_patterns.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/config_patterns/config_patterns.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.dot +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.mmd +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/statistics.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/documentation_index.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/extraction_summary.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/templates/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/.claude-plugin/plugin.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/README.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/skills/super-dev/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/skills/super-dev-seeai/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/.codex-plugin/plugin.json +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/README.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/skills/super-dev/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/skills/super-dev-seeai/SKILL.md +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/scripts/release_preflight.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_parser.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_credential_store.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_crypto.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_device_flow.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_system_registry.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_token_manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/benchmark_credential_read.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/conftest.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_context.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_credential_cache.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_multi_user_isolation.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_tools.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_user_store.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_client.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/shared/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/shared/test_shared.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/__init__.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_cli.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_detector.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_manager.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_ops_dataset_query_search.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_updater.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/test_session_sharing.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/test_version_consistency.py +0 -0
- {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/uv.lock +0 -0
|
@@ -1,41 +1,5 @@
|
|
|
1
1
|
# 待归档变更记录
|
|
2
2
|
|
|
3
|
-
## 2026-04-29 opscli - 实现 Skill 委托模式,防止 AI 猜测字段名
|
|
4
|
-
|
|
5
|
-
**变更原因**:测试调用记录显示,AI 在执行数据集查询时经常直接猜测字段名(如 `ds_pdTYjvLRCadv.asin`),导致 `INVALID_PAYLOAD` 错误。需要显式声明业务逻辑层 Skill 应将数据查询工作委托给 `ops-dataset-query` Skill,由其负责字段发现、metadata 验证和 payload 构造。
|
|
6
|
-
|
|
7
|
-
**改动点**:
|
|
8
|
-
- 为 9 个数据查询类 Skill 的 `SKILL.md` 添加"## 技能委托声明"部分
|
|
9
|
-
- ops-asin-health-diagnoser(之前已完成)
|
|
10
|
-
- ops-competitive-intelligence-analyst
|
|
11
|
-
- ops-cross-border-product-selector
|
|
12
|
-
- ops-advertising-efficiency-optimizer
|
|
13
|
-
- ops-inventory-health-monitor
|
|
14
|
-
- ops-product-attribute-analyzer
|
|
15
|
-
- ops-perspective-builder
|
|
16
|
-
- ops-profit-structure-analyzer
|
|
17
|
-
- ops-refund-priority-matrix
|
|
18
|
-
- 每个委托声明包含:
|
|
19
|
-
- 责任边界表(数据查询层 → ops-dataset-query,业务逻辑层 → 当前 Skill)
|
|
20
|
-
- 委托触发规则表(5 场景,标注 ✅ 必须委托 / ❌ 可直接执行)
|
|
21
|
-
- 委托调用方式示例(→ 调用 / ← 返回)
|
|
22
|
-
- 反例警告(禁止直接猜测字段名)
|
|
23
|
-
- 插入位置统一为"阅读入口"和"使用原则"之间
|
|
24
|
-
|
|
25
|
-
**验证结果**:
|
|
26
|
-
- `grep -l "## 技能委托声明" opscli/skills/templates/ops-*/SKILL.md | wc -l` 返回 9
|
|
27
|
-
- 所有 9 个数据查询类 Skill 已包含完整委托声明
|
|
28
|
-
|
|
29
|
-
**影响范围**:
|
|
30
|
-
- AI Agent 在调用这些 Skill 时,会优先切换到 ops-dataset-query 进行字段发现
|
|
31
|
-
- 减少 INVALID_PAYLOAD 错误,避免额外的往返修复
|
|
32
|
-
- 不影响 CLI 模式用户直接使用 opscli query 命令
|
|
33
|
-
|
|
34
|
-
**回滚方式**:
|
|
35
|
-
- 删除各 SKILL.md 中"## 技能委托声明"部分(从 `---` 到下一个 `---`)
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
3
|
## 2026-04-27 opscli - 新增 chart_analyze_mcp.py
|
|
40
4
|
|
|
41
5
|
**变更原因**:为 ops-dataset-query Skill 新增 MCP 无状态模式的图表异常检测脚本,原 `chart_analyze.py` 依赖 `opscli` CLI(subprocess),无法在纯 MCP 环境中使用。
|
|
@@ -248,36 +212,3 @@
|
|
|
248
212
|
- opscli:回退 `manager.py` 中 `run_chart_queries` 和 `generate_chart_doc`,回退 `cli.py` 中 `chart_doc` 命令
|
|
249
213
|
|
|
250
214
|
---
|
|
251
|
-
|
|
252
|
-
## 2026-04-29 query - 优化 chart-doc 生成文档结构
|
|
253
|
-
|
|
254
|
-
**变更原因**:生成的文档存在三个缺陷:可过滤字段在多 Query 时重复渲染浪费 token;7.1 字段映射表列数达 8 列宽表 AI 不友好;缺少字段命名约定说明导致 AI 无法处理边界场景
|
|
255
|
-
**改动点**:
|
|
256
|
-
1. `opscli/query/services/manager.py - generate_chart_doc`:
|
|
257
|
-
- §2 新增"字段命名约定"小节(§2.2),说明 query_alias / global_alias / origin_name / expr 的格式规律、生成方式和使用场景,及公式字段边界说明
|
|
258
|
-
- §7.1 输出字段映射由 1 张 8 列宽表拆分为 2 张 4 列表(表A字段语义 + 表B字段引用),以 field_name 作连接键,expr 列去掉并在表B注释中说明
|
|
259
|
-
- §7.3 可过滤字段新增去重逻辑:对比当前 Query 与所属数据集(§5.2)的 filterable_fields 集合,完全相同时只输出一行引用语句,不同才完整渲染
|
|
260
|
-
2. `tests/query/test_manager.py`:更新两个受影响的测试断言匹配新双表格式和去重引用格式
|
|
261
|
-
**验证结果**:pytest tests/query/ 39 passed
|
|
262
|
-
**影响范围**:opscli query chart-doc 命令输出的 Markdown 文档结构;不影响 API 调用逻辑
|
|
263
|
-
**回滚方式**:git revert 此次改动,恢复 manager.py 和 test_manager.py 对应段落
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## 2026-04-29 skills/templates - 精简所有 Skill 的 references 文档
|
|
267
|
-
|
|
268
|
-
**变更原因**:`data-query-service-dev-guide.md`(1173行)在 9 个业务 Skill 中存在完全相同的 10 份副本,占每个 Skill 文档总量的 60-75%;其中大量章节(多次查询、MOY/ACC/PPT、缓存、PHP 伪代码)对 Skill 执行无用,造成 AI 上下文浪费和维护困难
|
|
269
|
-
|
|
270
|
-
**改动点**:
|
|
271
|
-
1. 新建 `query-essential-guide.md`(149行):从完整 dev-guide 中提取 Skill 真正需要的内容(WHERE 操作符、SELECT 格式、日期规范、dataComparison、错误码),复制到 9 个业务 Skill 的 references/
|
|
272
|
-
2. 删除 9 个业务 Skill 中的 `data-query-service-dev-guide.md`,保留 `ops-dataset-query/references/` 中的唯一完整版
|
|
273
|
-
3. 精简 `ops-asin-health-diagnoser/references/dataset_fields_mapping.md`(134行→65行):去掉静态 payload 模板,保留数据集索引 + 核心字段业务语义 + chart-doc 使用指引
|
|
274
|
-
4. 更新 9 个 Skill 的 `SKILL.md`、`references/cli.md`、`references/mcp.md` 中的文件名引用(data-query-service-dev-guide → query-essential-guide)
|
|
275
|
-
|
|
276
|
-
**验证结果**:
|
|
277
|
-
- dev-guide 残留检查通过(9 个业务 Skill 均已删除)
|
|
278
|
-
- query-essential-guide 分布:9 个 Skill 均已到位
|
|
279
|
-
- 各 Skill 文档总行数:平均从 ~1800 行降至 ~737 行,减少约 59%
|
|
280
|
-
|
|
281
|
-
**影响范围**:所有业务类 Skill 的 references 目录结构;ops-dataset-query 不受影响
|
|
282
|
-
**回滚方式**:从 ops-dataset-query/references/data-query-service-dev-guide.md 重新 cp 到各 Skill,删除 query-essential-guide.md,恢复文件名引用
|
|
283
|
-
---
|
|
@@ -428,9 +428,7 @@ class QueryManager:
|
|
|
428
428
|
md_lines.append("4. Skill 开发时,优先使用本文中的 `origin_name` 构造过滤条件,使用 `global_alias` / `query_alias` 对齐结果列名。")
|
|
429
429
|
md_lines.append("")
|
|
430
430
|
|
|
431
|
-
md_lines.append("##
|
|
432
|
-
md_lines.append("")
|
|
433
|
-
md_lines.append("### 2.1 术语说明")
|
|
431
|
+
md_lines.append("## 二、关键术语")
|
|
434
432
|
md_lines.append("")
|
|
435
433
|
md_lines.append("| 术语 | 含义 | 典型用途 |")
|
|
436
434
|
md_lines.append("|------|------|----------|")
|
|
@@ -440,18 +438,6 @@ class QueryManager:
|
|
|
440
438
|
md_lines.append("| `global_alias` | 字段统一全局别名 | 与图表配置、查询结果做稳定映射 |")
|
|
441
439
|
md_lines.append("| `field_type` | `dimension` 或 `metric` | 决定字段角色与用法 |")
|
|
442
440
|
md_lines.append("")
|
|
443
|
-
md_lines.append("### 2.2 字段命名约定")
|
|
444
|
-
md_lines.append("")
|
|
445
|
-
md_lines.append("| 别名类型 | 格式规律 | 生成方式 | 使用场景 |")
|
|
446
|
-
md_lines.append("|----------|----------|----------|----------|")
|
|
447
|
-
md_lines.append("| `query_alias` | `f_[16位16进制]`,如 `f_9064850a20e4d581` | 系统自动生成,**禁止手写** | `select.alias`、`groupBy`、`orderBy` 中引用字段 |")
|
|
448
|
-
md_lines.append("| `global_alias` | `f_[20位字母数字]`,如 `f_WfKn5Dex0mqGINtDlWx` | 系统自动生成,跨 Query 保持稳定 | 字段身份识别,与图表配置做稳定映射 |")
|
|
449
|
-
md_lines.append("| `origin_name` | `{dataset_alias}.{column_name}` | 由数据集别名 + 列名拼接 | `where.field`、`dataComparison.field` 的值 |")
|
|
450
|
-
md_lines.append("| `expr`(select) | 通常等于 `origin_name`;公式字段时为完整 SQL 表达式 | 来自图表配置 | `select.expr`,直接传入查询服务 |")
|
|
451
|
-
md_lines.append("")
|
|
452
|
-
md_lines.append("> **边界场景**:当字段的 `expr` 与 `origin_name` 不同时(即公式字段),构造 select 时必须使用 `expr` 原值,")
|
|
453
|
-
md_lines.append("> 且不得再传 `aggregation`(公式内已内置聚合逻辑)。")
|
|
454
|
-
md_lines.append("")
|
|
455
441
|
|
|
456
442
|
md_lines.append("## 三、图表总览")
|
|
457
443
|
md_lines.append("")
|
|
@@ -596,10 +582,8 @@ class QueryManager:
|
|
|
596
582
|
|
|
597
583
|
md_lines.append("## 七、Query 逐条拆解")
|
|
598
584
|
md_lines.append("")
|
|
599
|
-
# 建立 dataset 索引,便于为每个 query 快速找到对应的 fields
|
|
585
|
+
# 建立 dataset 索引,便于为每个 query 快速找到对应的 fields
|
|
600
586
|
dataset_field_index: dict[tuple[str, int | None, str], list[dict]] = {}
|
|
601
|
-
# dataset_filterable_index: key → frozenset of column_names,用于 7.3 节去重判断
|
|
602
|
-
dataset_filterable_index: dict[tuple[str, int | None, str], frozenset[str]] = {}
|
|
603
587
|
for ds in datasets:
|
|
604
588
|
if not isinstance(ds, dict):
|
|
605
589
|
continue
|
|
@@ -609,12 +593,6 @@ class QueryManager:
|
|
|
609
593
|
str(ds.get("dataSource") or ""),
|
|
610
594
|
)
|
|
611
595
|
dataset_field_index[key] = ds.get("fields") or []
|
|
612
|
-
# 将数据集级可过滤字段的 column_name 集合存入索引,供后续去重比对
|
|
613
|
-
dataset_filterable_index[key] = frozenset(
|
|
614
|
-
str(f.get("column_name") or "")
|
|
615
|
-
for f in (ds.get("filterable_fields") or [])
|
|
616
|
-
if isinstance(f, dict) and f.get("column_name")
|
|
617
|
-
)
|
|
618
596
|
|
|
619
597
|
for idx, item in enumerate(chart_items, 1):
|
|
620
598
|
query = item.get("query", {}) or {}
|
|
@@ -641,34 +619,14 @@ class QueryManager:
|
|
|
641
619
|
md_lines.append("#### 7.1 输出字段映射")
|
|
642
620
|
md_lines.append("")
|
|
643
621
|
if select_field_mappings:
|
|
644
|
-
|
|
645
|
-
md_lines.append("
|
|
646
|
-
md_lines.append("")
|
|
647
|
-
md_lines.append("| verbose_name | field_type | aggregation | field_name |")
|
|
648
|
-
md_lines.append("|--------------|------------|-------------|------------|")
|
|
649
|
-
for mapping in select_field_mappings:
|
|
650
|
-
md_lines.append(
|
|
651
|
-
f"| {mapping.get('verbose_name') or '-'} | `{mapping.get('field_type') or '-'}` | "
|
|
652
|
-
f"`{mapping.get('aggregation') or '-'}` | `{mapping.get('field_name') or '-'}` |"
|
|
653
|
-
)
|
|
654
|
-
md_lines.append("")
|
|
655
|
-
# 表 B:字段引用(AI 构造查询,4列)
|
|
656
|
-
# expr 通常等于 origin_name,仅公式字段时不同;
|
|
657
|
-
# 当 expr != origin_name 时在 select.expr 中必须使用 expr 原值
|
|
658
|
-
md_lines.append("**表B — 字段引用**(用于构造 select / groupBy / where)")
|
|
659
|
-
md_lines.append("")
|
|
660
|
-
md_lines.append("| field_name | query_alias | origin_name | global_alias |")
|
|
661
|
-
md_lines.append("|------------|-------------|-------------|--------------|")
|
|
622
|
+
md_lines.append("| query_alias | aggregation | verbose_name | field_type | field_name | origin_name | global_alias | expr |")
|
|
623
|
+
md_lines.append("|-------------|-------------|--------------|------------|------------|-------------|--------------|------|")
|
|
662
624
|
for mapping in select_field_mappings:
|
|
663
|
-
expr = mapping.get("query_expr") or ""
|
|
664
|
-
origin = mapping.get("origin_name") or ""
|
|
665
|
-
# 当 expr 与 origin_name 不同(公式字段)时标注差异
|
|
666
|
-
origin_cell = f"`{origin}`" if origin else "-"
|
|
667
|
-
if expr and expr != origin:
|
|
668
|
-
origin_cell = f"`{origin}` ⚠️ expr=`{expr}`"
|
|
669
625
|
md_lines.append(
|
|
670
|
-
f"| `{mapping.get('
|
|
671
|
-
f"{
|
|
626
|
+
f"| `{mapping.get('query_alias') or '-'}` | `{mapping.get('aggregation') or '-'}` | "
|
|
627
|
+
f"{mapping.get('verbose_name') or '-'} | `{mapping.get('field_type') or '-'}` | "
|
|
628
|
+
f"`{mapping.get('field_name') or '-'}` | `{mapping.get('origin_name') or '-'}` | "
|
|
629
|
+
f"`{mapping.get('global_alias') or '-'}` | `{mapping.get('query_expr') or '-'}` |"
|
|
672
630
|
)
|
|
673
631
|
else:
|
|
674
632
|
md_lines.append("当前 Query 未返回可解析的输出字段映射。")
|
|
@@ -694,28 +652,14 @@ class QueryManager:
|
|
|
694
652
|
md_lines.append("")
|
|
695
653
|
filterable = item.get("filterable_fields", []) or []
|
|
696
654
|
if filterable:
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
)
|
|
706
|
-
if query_filterable_set == ds_filterable_set and ds_filterable_set:
|
|
707
|
-
# 与数据集级可过滤字段完全相同,直接引用第五章,不重复渲染
|
|
708
|
-
md_lines.append(f"> 可过滤字段与数据集 `{dataset_alias}` 完全相同,见第五章 §5.2,共 {len(filterable)} 个字段。")
|
|
709
|
-
else:
|
|
710
|
-
# 与数据集级不同(或无法比对),完整渲染本 Query 的过滤字段
|
|
711
|
-
md_lines.append("| column_name | verbose_name | source_column_name | 建议 field 写法 |")
|
|
712
|
-
md_lines.append("|-------------|--------------|--------------------|-----------------|")
|
|
713
|
-
for field in filterable:
|
|
714
|
-
column_name = field.get("column_name") or "-"
|
|
715
|
-
verbose_name = field.get("verbose_name") or "-"
|
|
716
|
-
source_name = field.get("source_column_name") or "-"
|
|
717
|
-
suggested = f"{dataset_alias}.{column_name}" if dataset_alias and column_name != "-" else "-"
|
|
718
|
-
md_lines.append(f"| `{column_name}` | {verbose_name} | `{source_name}` | `{suggested}` |")
|
|
655
|
+
md_lines.append("| column_name | verbose_name | source_column_name | 建议 field 写法 |")
|
|
656
|
+
md_lines.append("|-------------|--------------|--------------------|-----------------|")
|
|
657
|
+
for field in filterable:
|
|
658
|
+
column_name = field.get("column_name") or "-"
|
|
659
|
+
verbose_name = field.get("verbose_name") or "-"
|
|
660
|
+
source_name = field.get("source_column_name") or "-"
|
|
661
|
+
suggested = f"{dataset_alias}.{column_name}" if dataset_alias and column_name != "-" else "-"
|
|
662
|
+
md_lines.append(f"| `{column_name}` | {verbose_name} | `{source_name}` | `{suggested}` |")
|
|
719
663
|
else:
|
|
720
664
|
md_lines.append("当前数据集没有返回 `filterable_fields` 配置。")
|
|
721
665
|
md_lines.append("")
|
|
@@ -60,10 +60,8 @@ def _tui_select_skills(manager: SkillsManager) -> list[str]:
|
|
|
60
60
|
if not templates:
|
|
61
61
|
raise ValueError("未找到任何内置 Skill 模板")
|
|
62
62
|
|
|
63
|
-
# 根据总数动态计算序号列宽,避免两位数以上被截断
|
|
64
|
-
idx_width = max(3, len(str(len(templates))) + 2)
|
|
65
63
|
table = Table(show_header=True, header_style="bold cyan", box=None, padding=(0, 1))
|
|
66
|
-
table.add_column("#", style="bold yellow", width=
|
|
64
|
+
table.add_column("#", style="bold yellow", width=3)
|
|
67
65
|
table.add_column("名称", style="green", min_width=20)
|
|
68
66
|
table.add_column("版本", style="dim", width=8)
|
|
69
67
|
table.add_column("说明")
|
|
@@ -93,9 +91,8 @@ def _tui_select_targets(manager: SkillsManager) -> list[tuple[str, Path]] | None
|
|
|
93
91
|
if not targets:
|
|
94
92
|
return None
|
|
95
93
|
|
|
96
|
-
idx_width = max(3, len(str(len(targets))) + 2)
|
|
97
94
|
table = Table(show_header=True, header_style="bold cyan", box=None, padding=(0, 1))
|
|
98
|
-
table.add_column("#", style="bold yellow", width=
|
|
95
|
+
table.add_column("#", style="bold yellow", width=3)
|
|
99
96
|
table.add_column("工具", style="green", min_width=14)
|
|
100
97
|
table.add_column("安装路径", style="dim")
|
|
101
98
|
for idx, (runtime, path) in enumerate(targets, start=1):
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 一键升级版本号 + 构建分发包 + 上传
|
|
3
|
+
# 用法:
|
|
4
|
+
# ./publish.sh patch
|
|
5
|
+
# ./publish.sh minor
|
|
6
|
+
# ./publish.sh major
|
|
7
|
+
# ./publish.sh # 默认 patch
|
|
8
|
+
#
|
|
9
|
+
# 可选环境变量:
|
|
10
|
+
# AUTO_CONFIRM=1 跳过确认提示
|
|
11
|
+
# DRY_RUN=1 执行构建和校验,但不上传,并在结束后回滚版本号
|
|
12
|
+
# USE_CIBUILDWHEEL=0 强制跳过 cibuildwheel
|
|
13
|
+
# USE_CIBUILDWHEEL=1 允许在需要平台轮子时使用 cibuildwheel(默认)
|
|
14
|
+
# ENABLE_CYTHON=1 额外执行 in-place cythonize(默认关闭)
|
|
15
|
+
# PRIVATE_PYPI_URL=... 上传到私有仓库
|
|
16
|
+
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
+
cd "$ROOT_DIR"
|
|
21
|
+
|
|
22
|
+
PYPROJECT="$ROOT_DIR/pyproject.toml"
|
|
23
|
+
BUMP_TYPE="${1:-patch}"
|
|
24
|
+
AUTO_CONFIRM="${AUTO_CONFIRM:-0}"
|
|
25
|
+
DRY_RUN="${DRY_RUN:-0}"
|
|
26
|
+
USE_CIBUILDWHEEL="${USE_CIBUILDWHEEL:-1}"
|
|
27
|
+
ENABLE_CYTHON="${ENABLE_CYTHON:-0}"
|
|
28
|
+
PRIVATE_PYPI_URL="${PRIVATE_PYPI_URL:-}"
|
|
29
|
+
|
|
30
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
|
31
|
+
BLUE='\033[0;34m'; BOLD='\033[1m'; RESET='\033[0m'
|
|
32
|
+
|
|
33
|
+
info() { echo -e "${BLUE}[INFO]${RESET} $*"; }
|
|
34
|
+
success() { echo -e "${GREEN}[OK]${RESET} $*"; }
|
|
35
|
+
warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
|
|
36
|
+
error() { echo -e "${RED}[ERROR]${RESET} $*"; exit 1; }
|
|
37
|
+
|
|
38
|
+
[[ "$BUMP_TYPE" =~ ^(patch|minor|major)$ ]] \
|
|
39
|
+
|| error "参数必须是 patch / minor / major,当前:$BUMP_TYPE"
|
|
40
|
+
|
|
41
|
+
detect_package_dir() {
|
|
42
|
+
local package_dir
|
|
43
|
+
|
|
44
|
+
package_dir="$(
|
|
45
|
+
awk '
|
|
46
|
+
/^\[tool\.hatch\.build\.targets\.wheel\]$/ { in_section = 1; next }
|
|
47
|
+
/^\[/ { if (in_section) exit; in_section = 0 }
|
|
48
|
+
in_section && /^packages = \[/ {
|
|
49
|
+
line = $0
|
|
50
|
+
sub(/^packages = \["/, "", line)
|
|
51
|
+
sub(/".*$/, "", line)
|
|
52
|
+
print line
|
|
53
|
+
exit
|
|
54
|
+
}
|
|
55
|
+
' "$PYPROJECT"
|
|
56
|
+
)"
|
|
57
|
+
if [[ -n "$package_dir" && -d "$ROOT_DIR/$package_dir" ]]; then
|
|
58
|
+
printf '%s\n' "$package_dir"
|
|
59
|
+
return 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
package_dir="$(find "$ROOT_DIR" -mindepth 2 -maxdepth 2 -type f -name "__init__.py" \
|
|
63
|
+
! -path '*/tests/*' ! -path '*/.*/*' \
|
|
64
|
+
-exec dirname {} \; | head -n1)"
|
|
65
|
+
if [[ -n "$package_dir" ]]; then
|
|
66
|
+
basename "$package_dir"
|
|
67
|
+
return 0
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
return 1
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
ensure_python_pip() {
|
|
74
|
+
if python3 -m pip --version >/dev/null 2>&1; then
|
|
75
|
+
return 0
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
warn "当前 python3 缺少 pip,尝试使用 ensurepip 修复..."
|
|
79
|
+
python3 -m ensurepip --upgrade >/dev/null 2>&1 \
|
|
80
|
+
|| error "当前 python3 不包含 pip/ensurepip,请切换到带 pip 的解释器后重试"
|
|
81
|
+
python3 -m pip --version >/dev/null 2>&1 \
|
|
82
|
+
|| error "pip 修复失败,请检查当前 python3 环境"
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
is_pure_python_wheel() {
|
|
86
|
+
local wheel_path="$1"
|
|
87
|
+
[[ "$wheel_path" == *"-none-any.whl" ]]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
CURRENT_VERSION="$(grep -m1 '^version = ' "$PYPROJECT" | sed 's/version = "\(.*\)"/\1/')"
|
|
91
|
+
[[ -n "$CURRENT_VERSION" ]] || error "无法从 $PYPROJECT 读取 version 字段"
|
|
92
|
+
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
|
|
93
|
+
|
|
94
|
+
case "$BUMP_TYPE" in
|
|
95
|
+
patch) PATCH=$((PATCH + 1)) ;;
|
|
96
|
+
minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
|
|
97
|
+
major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
|
|
98
|
+
esac
|
|
99
|
+
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
|
100
|
+
NEW_FALLBACK_VERSION="${NEW_VERSION}-dev"
|
|
101
|
+
|
|
102
|
+
PACKAGE_DIR="$(detect_package_dir)" || error "无法自动探测包目录,请检查 $PYPROJECT 的 wheel packages 配置"
|
|
103
|
+
VERSION_FILE="$ROOT_DIR/$PACKAGE_DIR/version.py"
|
|
104
|
+
|
|
105
|
+
PYPROJECT_BAK="$(mktemp)"
|
|
106
|
+
VERSION_FILE_BAK=""
|
|
107
|
+
ROLLBACK_REQUIRED=0
|
|
108
|
+
|
|
109
|
+
cleanup_backups() {
|
|
110
|
+
rm -f "$PYPROJECT_BAK"
|
|
111
|
+
if [[ -n "$VERSION_FILE_BAK" ]]; then
|
|
112
|
+
rm -f "$VERSION_FILE_BAK"
|
|
113
|
+
fi
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
rollback_versions() {
|
|
117
|
+
if [[ "$ROLLBACK_REQUIRED" != "1" ]]; then
|
|
118
|
+
return
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
cp "$PYPROJECT_BAK" "$PYPROJECT"
|
|
122
|
+
if [[ -n "$VERSION_FILE_BAK" && -f "$VERSION_FILE" ]]; then
|
|
123
|
+
cp "$VERSION_FILE_BAK" "$VERSION_FILE"
|
|
124
|
+
fi
|
|
125
|
+
warn "已回滚版本文件到发布前状态"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
trap 'status=$?; if [[ $status -ne 0 ]]; then rollback_versions; fi; cleanup_backups' EXIT
|
|
129
|
+
|
|
130
|
+
echo -e "\n${BOLD}======================================${RESET}"
|
|
131
|
+
echo -e "${BOLD} 发布脚本(稳健版)${RESET}"
|
|
132
|
+
echo -e "${BOLD}======================================${RESET}"
|
|
133
|
+
echo -e " 包目录 :${BLUE}${PACKAGE_DIR}${RESET}"
|
|
134
|
+
echo -e " 当前版本:${YELLOW}${CURRENT_VERSION}${RESET}"
|
|
135
|
+
echo -e " 新版本 :${GREEN}${NEW_VERSION}${RESET} (${BUMP_TYPE})"
|
|
136
|
+
echo -e " Dry Run :${YELLOW}${DRY_RUN}${RESET}"
|
|
137
|
+
echo -e "${BOLD}======================================${RESET}\n"
|
|
138
|
+
|
|
139
|
+
if [[ "$AUTO_CONFIRM" != "1" ]]; then
|
|
140
|
+
read -rp "确认发布?[y/N] " CONFIRM
|
|
141
|
+
[[ "$CONFIRM" =~ ^[Yy]$ ]] || { warn "已取消"; exit 0; }
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
info "Step 1/10 检查依赖工具..."
|
|
145
|
+
command -v python3 &>/dev/null || error "未找到 python3"
|
|
146
|
+
ensure_python_pip
|
|
147
|
+
python3 -c "import build" 2>/dev/null || { warn "正在安装 build..."; python3 -m pip install build -q; }
|
|
148
|
+
python3 -c "import twine" 2>/dev/null || { warn "正在安装 twine..."; python3 -m pip install twine -q; }
|
|
149
|
+
if [[ "$ENABLE_CYTHON" == "1" ]]; then
|
|
150
|
+
python3 -c "import Cython" 2>/dev/null || { warn "正在安装 Cython..."; python3 -m pip install cython -q; }
|
|
151
|
+
fi
|
|
152
|
+
success "工具检查通过"
|
|
153
|
+
|
|
154
|
+
info "Step 2/10 校验项目结构..."
|
|
155
|
+
[[ -d "$ROOT_DIR/$PACKAGE_DIR" ]] || error "包目录不存在:$ROOT_DIR/$PACKAGE_DIR"
|
|
156
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
157
|
+
grep -q '^FALLBACK_VERSION = "' "$VERSION_FILE" \
|
|
158
|
+
|| error "未在 $VERSION_FILE 找到 FALLBACK_VERSION,无法同步开发态版本"
|
|
159
|
+
else
|
|
160
|
+
warn "未找到 $VERSION_FILE,发布时将只更新 pyproject.toml"
|
|
161
|
+
fi
|
|
162
|
+
success "项目结构校验通过"
|
|
163
|
+
|
|
164
|
+
info "Step 3/10 更新版本号 → ${NEW_VERSION}..."
|
|
165
|
+
cp "$PYPROJECT" "$PYPROJECT_BAK"
|
|
166
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
167
|
+
VERSION_FILE_BAK="$(mktemp)"
|
|
168
|
+
cp "$VERSION_FILE" "$VERSION_FILE_BAK"
|
|
169
|
+
fi
|
|
170
|
+
ROLLBACK_REQUIRED=1
|
|
171
|
+
|
|
172
|
+
sed -i.bak "s/^version = \"${CURRENT_VERSION}\"/version = \"${NEW_VERSION}\"/" "$PYPROJECT"
|
|
173
|
+
rm -f "${PYPROJECT}.bak"
|
|
174
|
+
|
|
175
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
176
|
+
sed -i.bak "s/^FALLBACK_VERSION = \".*\"/FALLBACK_VERSION = \"${NEW_FALLBACK_VERSION}\"/" "$VERSION_FILE"
|
|
177
|
+
rm -f "${VERSION_FILE}.bak"
|
|
178
|
+
fi
|
|
179
|
+
success "版本号已更新"
|
|
180
|
+
|
|
181
|
+
info "Step 4/10 清理旧构建产物..."
|
|
182
|
+
rm -rf dist/ build/ *.egg-info/
|
|
183
|
+
success "清理完成"
|
|
184
|
+
|
|
185
|
+
info "Step 5/10 处理可选 Cython 编译..."
|
|
186
|
+
if [[ "$ENABLE_CYTHON" == "1" ]]; then
|
|
187
|
+
mapfile -t pyfiles < <(find "$ROOT_DIR/$PACKAGE_DIR" -type f -name "*.py" ! -name "__init__.py" | sort)
|
|
188
|
+
if [[ "${#pyfiles[@]}" -eq 0 ]]; then
|
|
189
|
+
warn "未找到可编译的 Python 源文件,跳过 Cython"
|
|
190
|
+
else
|
|
191
|
+
for pyfile in "${pyfiles[@]}"; do
|
|
192
|
+
info " 编译 ${pyfile#$ROOT_DIR/}"
|
|
193
|
+
cythonize -3 -i "$pyfile"
|
|
194
|
+
done
|
|
195
|
+
success "Cython 编译完成"
|
|
196
|
+
fi
|
|
197
|
+
else
|
|
198
|
+
warn "默认跳过 Cython。当前项目使用 hatchling,in-place cythonize 不会自动变成可靠的发布产物。"
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
info "Step 6/10 构建分发包..."
|
|
202
|
+
info " 构建 sdist..."
|
|
203
|
+
python3 -m build --sdist --outdir dist
|
|
204
|
+
|
|
205
|
+
info " 预构建 wheel,用于判断是否为纯 Python 包..."
|
|
206
|
+
python3 -m build --wheel --outdir dist
|
|
207
|
+
|
|
208
|
+
shopt -s nullglob
|
|
209
|
+
probe_wheels=(dist/*.whl)
|
|
210
|
+
shopt -u nullglob
|
|
211
|
+
[[ "${#probe_wheels[@]}" -gt 0 ]] || error "预构建 wheel 失败,dist/ 中未发现 wheel 产物"
|
|
212
|
+
PROBE_WHEEL="${probe_wheels[0]}"
|
|
213
|
+
|
|
214
|
+
if is_pure_python_wheel "$PROBE_WHEEL"; then
|
|
215
|
+
warn "检测到纯 Python wheel:$(basename "$PROBE_WHEEL")"
|
|
216
|
+
warn "纯 Python 包不需要 cibuildwheel,保留当前 wheel 作为发布产物"
|
|
217
|
+
elif [[ "$USE_CIBUILDWHEEL" == "1" ]]; then
|
|
218
|
+
info " 检测到平台相关 wheel,切换到 cibuildwheel 生成多 Python 版本产物..."
|
|
219
|
+
python3 -c "import cibuildwheel" 2>/dev/null || { warn "正在安装 cibuildwheel..."; python3 -m pip install cibuildwheel -q; }
|
|
220
|
+
rm -f dist/*.whl
|
|
221
|
+
cibuildwheel --output-dir dist
|
|
222
|
+
else
|
|
223
|
+
warn "检测到平台相关 wheel,但 USE_CIBUILDWHEEL=0;将仅发布当前解释器构建的 wheel"
|
|
224
|
+
fi
|
|
225
|
+
success "构建完成"
|
|
226
|
+
|
|
227
|
+
info "Step 7/10 校验包(twine check)..."
|
|
228
|
+
shopt -s nullglob
|
|
229
|
+
artifacts=(dist/*)
|
|
230
|
+
shopt -u nullglob
|
|
231
|
+
[[ "${#artifacts[@]}" -gt 0 ]] || error "dist/ 目录为空,未生成任何构建产物"
|
|
232
|
+
twine check "${artifacts[@]}"
|
|
233
|
+
success "校验通过"
|
|
234
|
+
printf '%s\n' "${artifacts[@]##$ROOT_DIR/}" | sed 's/^/ /'
|
|
235
|
+
|
|
236
|
+
info "Step 8/10 上传包..."
|
|
237
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
238
|
+
warn "DRY_RUN=1,跳过上传"
|
|
239
|
+
elif [[ -n "$PRIVATE_PYPI_URL" ]]; then
|
|
240
|
+
twine upload --repository-url "$PRIVATE_PYPI_URL" "${artifacts[@]}"
|
|
241
|
+
else
|
|
242
|
+
twine upload "${artifacts[@]}"
|
|
243
|
+
fi
|
|
244
|
+
success "上传步骤完成"
|
|
245
|
+
|
|
246
|
+
info "Step 9/10 清理临时编译文件..."
|
|
247
|
+
if [[ "$ENABLE_CYTHON" == "1" ]]; then
|
|
248
|
+
find "$ROOT_DIR/$PACKAGE_DIR" -type f \( -name "*.c" -o -name "*.so" -o -name "*.pyd" \) -delete
|
|
249
|
+
success "临时编译文件清理完成"
|
|
250
|
+
else
|
|
251
|
+
warn "未启用 Cython,无需清理临时编译文件"
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
255
|
+
rollback_versions
|
|
256
|
+
ROLLBACK_REQUIRED=0
|
|
257
|
+
fi
|
|
258
|
+
|
|
259
|
+
if [[ "$DRY_RUN" != "1" ]]; then
|
|
260
|
+
ROLLBACK_REQUIRED=0
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
echo ""
|
|
264
|
+
info "Step 10/10 完成提示:"
|
|
265
|
+
echo " pip install aukeys-opscli==${NEW_VERSION}"
|
|
266
|
+
echo " opscli --version"
|
|
267
|
+
echo ""
|
|
268
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
269
|
+
success "Dry run 完成,版本文件已回滚,可直接检查 dist/ 产物"
|
|
270
|
+
else
|
|
271
|
+
success "全部完成 aukeys-opscli v${NEW_VERSION} 已发布"
|
|
272
|
+
fi
|
|
@@ -734,15 +734,9 @@ def test_generate_chart_doc_uses_server_field_mappings(monkeypatch):
|
|
|
734
734
|
assert "| 订单量 | `metric` | `order_qty` | `ds_sales.order_qty` | `ga_order_qty` | `f_order_qty` | `SUM` | `select` |" in markdown
|
|
735
735
|
assert "## 七、Query 逐条拆解" in markdown
|
|
736
736
|
assert "#### 7.1 输出字段映射" in markdown
|
|
737
|
-
|
|
738
|
-
assert "**表A — 字段语义**" in markdown
|
|
739
|
-
assert "| 订单量 | `metric` | `SUM` | `order_qty` |" in markdown
|
|
740
|
-
assert "**表B — 字段引用**" in markdown
|
|
741
|
-
assert "| `order_qty` | `f_order_qty` | `ds_sales.order_qty` | `ga_order_qty` |" in markdown
|
|
742
|
-
# 7.2 条件字段映射格式不变
|
|
737
|
+
assert "| `f_order_qty` | `SUM` | 订单量 | `metric` | `order_qty` | `ds_sales.order_qty` | `ga_order_qty` | `ds_sales.order_qty` |" in markdown
|
|
743
738
|
assert "| `where` | `ds_sales.date_id` | 日期 | `dimension` | `date_id` | `ds_sales.date_id` | `ga_date_id` |" in markdown
|
|
744
|
-
|
|
745
|
-
assert "可过滤字段与数据集 `ds_sales` 完全相同,见第五章 §5.2,共 1 个字段。" in markdown
|
|
739
|
+
assert "| `date_id` | 日期 | `date_id` | `ds_sales.date_id` |" in markdown
|
|
746
740
|
|
|
747
741
|
|
|
748
742
|
def test_generate_chart_doc_falls_back_when_field_mappings_missing(monkeypatch):
|
|
@@ -779,10 +773,5 @@ def test_generate_chart_doc_falls_back_when_field_mappings_missing(monkeypatch):
|
|
|
779
773
|
markdown = result["markdown"]
|
|
780
774
|
|
|
781
775
|
assert "当前数据集没有返回 `filterable_fields` 配置。" in markdown
|
|
782
|
-
|
|
783
|
-
assert "
|
|
784
|
-
assert "| - | `-` | `-` | `channel_name` |" in markdown
|
|
785
|
-
assert "**表B — 字段引用**" in markdown
|
|
786
|
-
assert "| `channel_name` | `f_channel` | `ds_sales.channel_name` | `f_channel` |" in markdown
|
|
787
|
-
# 7.2 条件字段映射:fallback 时 field_name 从 origin_name 末段提取(date_id),不为 -
|
|
788
|
-
assert "| `where` | `ds_sales.date_id` | - | `-` | `date_id` | `ds_sales.date_id` | `-` |" in markdown
|
|
776
|
+
assert "| `f_channel` | `-` | - | `-` | `-` | `-` | `f_channel` | `ds_sales.channel_name` |" in markdown
|
|
777
|
+
assert "| `where` | `ds_sales.date_id` | - | `-` | `-` | `ds_sales.date_id` | `-` |" in markdown
|