aukeys-opscli 0.0.6__tar.gz → 0.0.7__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.
Files changed (188) hide show
  1. aukeys_opscli-0.0.7/PKG-INFO +982 -0
  2. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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 +3 -3
  3. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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 +3 -3
  4. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/version.py +2 -2
  5. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/pyproject.toml +2 -1
  6. aukeys_opscli-0.0.6/PKG-INFO +0 -15
  7. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.agents/plugins/marketplace.json +0 -0
  8. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.agents/skills/super-dev/SKILL.md +0 -0
  9. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.agents/skills/super-dev-seeai/SKILL.md +0 -0
  10. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/CLAUDE.md +0 -0
  11. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/agents/super-dev.md +0 -0
  12. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/commands/super-dev-seeai.md +0 -0
  13. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/commands/super-dev.md +0 -0
  14. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/settings.local.json +0 -0
  15. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/skills/super-dev/SKILL.md +0 -0
  16. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude/skills/super-dev-seeai/SKILL.md +0 -0
  17. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.claude-plugin/marketplace.json +0 -0
  18. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.gitignore +0 -0
  19. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/.super-dev/install-manifest.json +0 -0
  20. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/AGENTS.md +0 -0
  21. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/CLAUDE.md +0 -0
  22. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/README.md +0 -0
  23. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/analysis/amazon-monitor/346/216/245/345/205/245/345/210/206/346/236/220.md" +0 -0
  24. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  25. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  26. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  27. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  28. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  29. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  30. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/design/ops-amazon Skill/350/247/204/345/210/222/346/226/271/346/241/210.md" +0 -0
  31. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/design/query/346/250/241/345/235/227/350/256/276/350/256/241.md" +0 -0
  32. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  33. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  34. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  35. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  36. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  37. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  38. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  39. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  40. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  41. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/plans/2026-04-22-p1-contract-version-governance.md +0 -0
  42. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  43. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  44. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  45. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  46. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  47. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  48. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/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
  49. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/release//346/211/223/345/214/205/345/217/221/345/270/203/346/214/207/345/215/227.md" +0 -0
  50. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/docs/spec//345/274/200/345/217/221/350/247/204/350/214/203.md" +0 -0
  51. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/__init__.py +0 -0
  52. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/__init__.py +0 -0
  53. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/cli.py +0 -0
  54. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/client.py +0 -0
  55. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/commands/__init__.py +0 -0
  56. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/commands/cli.py +0 -0
  57. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/domain/__init__.py +0 -0
  58. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/domain/exceptions.py +0 -0
  59. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/domain/models.py +0 -0
  60. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/exceptions.py +0 -0
  61. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/manager.py +0 -0
  62. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/models.py +0 -0
  63. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/parser.py +0 -0
  64. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/scraper.py +0 -0
  65. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/scraping/__init__.py +0 -0
  66. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/scraping/parser.py +0 -0
  67. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/scraping/scraper.py +0 -0
  68. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/services/__init__.py +0 -0
  69. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/services/manager.py +0 -0
  70. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/transport/__init__.py +0 -0
  71. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/amazon/transport/client.py +0 -0
  72. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/__init__.py +0 -0
  73. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/cli.py +0 -0
  74. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/commands/__init__.py +0 -0
  75. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/commands/cli.py +0 -0
  76. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/config.py +0 -0
  77. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/core/__init__.py +0 -0
  78. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/core/device_flow.py +0 -0
  79. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/core/system_registry.py +0 -0
  80. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/core/token_manager.py +0 -0
  81. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/domain/__init__.py +0 -0
  82. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/domain/exceptions.py +0 -0
  83. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/exceptions.py +0 -0
  84. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/storage/__init__.py +0 -0
  85. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/storage/credential_store.py +0 -0
  86. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/auth/storage/crypto.py +0 -0
  87. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/cli.py +0 -0
  88. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/config.py +0 -0
  89. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/__init__.py +0 -0
  90. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/cli.py +0 -0
  91. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/client.py +0 -0
  92. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/commands/__init__.py +0 -0
  93. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/commands/cli.py +0 -0
  94. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/domain/__init__.py +0 -0
  95. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/domain/exceptions.py +0 -0
  96. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/domain/models.py +0 -0
  97. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/exceptions.py +0 -0
  98. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/manager.py +0 -0
  99. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/models.py +0 -0
  100. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/services/__init__.py +0 -0
  101. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/services/manager.py +0 -0
  102. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/transport/__init__.py +0 -0
  103. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/query/transport/client.py +0 -0
  104. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/__init__.py +0 -0
  105. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/cli.py +0 -0
  106. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/commands/__init__.py +0 -0
  107. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/commands/cli.py +0 -0
  108. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/detector.py +0 -0
  109. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/discovery/__init__.py +0 -0
  110. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/discovery/detector.py +0 -0
  111. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/domain/__init__.py +0 -0
  112. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/domain/exceptions.py +0 -0
  113. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/domain/models.py +0 -0
  114. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/exceptions.py +0 -0
  115. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/manager.py +0 -0
  116. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/models.py +0 -0
  117. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/services/__init__.py +0 -0
  118. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/services/manager.py +0 -0
  119. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/sync/__init__.py +0 -0
  120. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/sync/updater.py +0 -0
  121. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-amazon/SKILL.md +0 -0
  122. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-amazon/data/VERSION.json +0 -0
  123. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-auth/SKILL.md +0 -0
  124. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-auth/data/VERSION.json +0 -0
  125. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/SKILL.md +0 -0
  126. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/data/VERSION.json +0 -0
  127. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/data/dataset_fields.csv +0 -0
  128. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/data/datasets.csv +0 -0
  129. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/data/query_metadata.json +0 -0
  130. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/references//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
  131. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/scripts/core.py +0 -0
  132. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/scripts/query.py +0 -0
  133. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/scripts/search.py +0 -0
  134. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-dataset-query/scripts/updater.py +0 -0
  135. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-skills/SKILL.md +0 -0
  136. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/templates/ops-skills/data/VERSION.json +0 -0
  137. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/opscli/skills/updater.py +0 -0
  138. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-payload-sample-shell.json +0 -0
  139. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-payload-sample.json +0 -0
  140. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-scrape-sample-shell.json +0 -0
  141. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-scrape-sample.json +0 -0
  142. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-search-sample-shell.json +0 -0
  143. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/amazon-search-sample.json +0 -0
  144. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/maintenance/host-onboard-smoke-20260423-082206.json +0 -0
  145. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/maintenance/host-onboard-smoke-20260423-082206.md +0 -0
  146. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/SKILL.md +0 -0
  147. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/code_analysis.json +0 -0
  148. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/config_patterns/config_patterns.json +0 -0
  149. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/config_patterns/config_patterns.md +0 -0
  150. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/dependencies/dependency_graph.dot +0 -0
  151. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/dependencies/dependency_graph.json +0 -0
  152. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/dependencies/dependency_graph.mmd +0 -0
  153. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/dependencies/statistics.json +0 -0
  154. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/documentation/documentation_index.json +0 -0
  155. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/documentation/extraction_summary.json +0 -0
  156. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/output/opscli-codebase/references/documentation/templates/SKILL.md +0 -0
  157. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-claude/.claude-plugin/plugin.json +0 -0
  158. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-claude/README.md +0 -0
  159. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-claude/skills/super-dev/SKILL.md +0 -0
  160. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-claude/skills/super-dev-seeai/SKILL.md +0 -0
  161. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-codex/.codex-plugin/plugin.json +0 -0
  162. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-codex/README.md +0 -0
  163. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-codex/skills/super-dev/SKILL.md +0 -0
  164. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/plugins/super-dev-codex/skills/super-dev-seeai/SKILL.md +0 -0
  165. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/publish.sh +0 -0
  166. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/__init__.py +0 -0
  167. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/amazon/__init__.py +0 -0
  168. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/amazon/test_cli.py +0 -0
  169. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/amazon/test_client.py +0 -0
  170. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/amazon/test_manager.py +0 -0
  171. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/amazon/test_parser.py +0 -0
  172. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/__init__.py +0 -0
  173. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/test_credential_store.py +0 -0
  174. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/test_crypto.py +0 -0
  175. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/test_device_flow.py +0 -0
  176. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/test_system_registry.py +0 -0
  177. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/auth/test_token_manager.py +0 -0
  178. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/query/test_cli.py +0 -0
  179. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/query/test_client.py +0 -0
  180. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/query/test_manager.py +0 -0
  181. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/__init__.py +0 -0
  182. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/test_cli.py +0 -0
  183. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/test_detector.py +0 -0
  184. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/test_manager.py +0 -0
  185. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/test_ops_dataset_query_search.py +0 -0
  186. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/skills/test_updater.py +0 -0
  187. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/tests/test_version_consistency.py +0 -0
  188. {aukeys_opscli-0.0.6 → aukeys_opscli-0.0.7}/uv.lock +0 -0
@@ -0,0 +1,982 @@
1
+ Metadata-Version: 2.4
2
+ Name: aukeys-opscli
3
+ Version: 0.0.7
4
+ Summary: Aukeys 运营 CLI 工具集
5
+ Requires-Python: >=3.10
6
+ Requires-Dist: cryptography>=38
7
+ Requires-Dist: httpx>=0.27
8
+ Requires-Dist: keyring>=25
9
+ Requires-Dist: rich>=13
10
+ Requires-Dist: typer>=0.12
11
+ Provides-Extra: amazon
12
+ Requires-Dist: playwright>=1.44; extra == 'amazon'
13
+ Provides-Extra: dev
14
+ Requires-Dist: pytest>=8; extra == 'dev'
15
+ Requires-Dist: respx>=0.21; extra == 'dev'
16
+ Description-Content-Type: text/markdown
17
+
18
+ # opscli
19
+
20
+ Aukeys 运营 CLI 工具集
21
+
22
+ > 当前模块:auth(认证授权)、query(数据查询)、skills(Skill 生命周期管理)、amazon(Amazon 数据采集);后续可扩展更多模块(deploy、notify 等)
23
+
24
+ ## 功能概述
25
+
26
+ ### auth 模块
27
+
28
+ - **Device Flow 授权**:通过浏览器完成 CLI 登录认证
29
+ - **多系统 Token 管理**:统一获取和管理 ops/polaris 系统的 JWT
30
+ - **三态 Token 状态**:`valid / needs_refresh / expired`,过期前 5 分钟自动刷新
31
+ - **Keychain 优先存储**:macOS 钥匙串 → AES-256-GCM 文件双层兜底
32
+ - **并发安全**:线程锁 + 跨进程文件锁,防止多进程并发重复换取 JWT
33
+ - **Scope 权限展示**:`status` 命令自动解析 JWT 显示各系统已授权权限
34
+ - **Session 30 天有效期**:每次浏览器授权确认自动续期
35
+ - **可配置地址**:支持通过配置文件覆盖系统地址,无需改代码
36
+
37
+ ### skills 模块
38
+
39
+ - **Skill 安装**:支持安装内置 `ops-dataset-query` Skill 模板
40
+ - **Skill 扫描**:自动扫描 `--skills-dir`、`OPSCLI_SKILLS_DIR`、`.claude/skills`、`.openclaw/skills`
41
+ - **Skill 升级**:从远端拉取 `manifest`、字段 CSV、数据集 CSV、查询元数据
42
+ - **统一 JSON 输出**:默认适合脚本消费,`--pretty` 可切换可读格式
43
+ - **数据查询支持**:通过 `opscli skills` 与 `opscli query` 组合完成元数据读取、构造 payload 与远端执行
44
+ - **Amazon Skill 模板**:支持安装 `ops-amazon`,指导 AI 使用 `opscli amazon` 完成抓取和字段取样
45
+
46
+ ### query 模块
47
+
48
+ - **元数据读取**:支持按 `dataset_alias` 或 `table_id` 读取 query metadata
49
+ - **查询构造**:支持通过维度、指标、筛选、排序等参数生成标准 query payload
50
+ - **即时执行**:支持直接转发 payload 到远端查询服务
51
+ - **JSON 优先输出**:默认适合 Skill 和脚本消费
52
+
53
+ ### amazon 模块
54
+
55
+ - **商品页抓取**:抓取 Amazon 商品页价格、评分、评论数、配送位置等快照
56
+ - **搜索结果抓取**:抓取关键词搜索结果页,沉淀竞品结果集
57
+ - **标准 payload 预留**:输出未来提交给 ops API 的标准请求体
58
+ - **本地历史存档**:商品抓取结果可落本地 JSONL,便于趋势分析和后续补数
59
+
60
+ ---
61
+
62
+ ## 系统架构
63
+
64
+ ```mermaid
65
+ graph TB
66
+ subgraph 用户侧
67
+ CLI["CLI 客户端<br/>opscli"]
68
+ Browser["浏览器<br/>cli-auth 页面"]
69
+ end
70
+
71
+ subgraph 本地存储
72
+ Store["CredentialStore<br/>Keychain 优先 / AES-256-GCM 兜底"]
73
+ Config["config.ini<br/>系统地址配置"]
74
+ Registry["systems.json<br/>自定义系统列表"]
75
+ end
76
+
77
+ subgraph ops 认证服务
78
+ DeviceAPI["Device Flow API<br/>/api/v1/cli/device/*"]
79
+ TokenAPI["Token API<br/>/api/v1/auth/cli-token"]
80
+ SessionDB[("shared_login_sessions<br/>session 存储")]
81
+ end
82
+
83
+ subgraph 业务系统
84
+ OpsAPI["ops 运营系统<br/>ops.aukeys.com"]
85
+ PolarisAPI["polaris 刊登系统<br/>bi.aukeys.com"]
86
+ end
87
+
88
+ CLI -->|"1. 申请设备码"| DeviceAPI
89
+ CLI -->|"自动打开"| Browser
90
+ Browser -->|"2. 携带 polarisUserToken 确认授权"| DeviceAPI
91
+ DeviceAPI -->|"读写 session"| SessionDB
92
+ CLI -->|"3. 轮询获取 session_id"| DeviceAPI
93
+ CLI -->|"4. session_id 换取 JWT"| TokenAPI
94
+ CLI -->|"5. 携带 JWT + Cookie 调用业务 API"| OpsAPI
95
+ CLI -->|"5. 携带 JWT + Cookie 调用业务 API"| PolarisAPI
96
+ CLI --> Store
97
+ CLI --> Config
98
+ CLI --> Registry
99
+ ```
100
+
101
+ ---
102
+
103
+ ## 安装
104
+
105
+ ```bash
106
+ # 从 PyPI 安装(正式环境)
107
+ pip install aukeys-opscli
108
+
109
+ # 如需 Amazon 抓取能力,补装 Playwright 依赖
110
+ pip install "aukeys-opscli[amazon]"
111
+ playwright install chromium
112
+
113
+ # 从 TestPyPI 安装(测试环境)
114
+ # ⚠️ 必须加 --extra-index-url,否则依赖解析会失败回退到旧版本
115
+ pip install \
116
+ --index-url https://test.pypi.org/simple/ \
117
+ --extra-index-url https://pypi.org/simple/ \
118
+ aukeys-opscli
119
+
120
+ # 从源码开发模式安装
121
+ git clone <repo-url> opscli
122
+ cd opscli
123
+ pip install -e .
124
+
125
+ # 如需 Amazon 抓取能力
126
+ pip install -e ".[amazon]"
127
+ playwright install chromium
128
+ ```
129
+
130
+ > 发行包名为 `aukeys-opscli`,安装后仍使用 `opscli` 作为命令入口。
131
+
132
+ ---
133
+
134
+ ## 快速开始
135
+
136
+ ```bash
137
+ # 1. 登录授权
138
+ opscli auth login
139
+
140
+ # 2. 查看状态
141
+ opscli auth token status
142
+
143
+ # 3. 获取 ops 运营系统 JWT
144
+ opscli auth token get --system ops
145
+
146
+ # 4. 获取 polaris 刊登系统 JWT
147
+ opscli auth token get --system polaris
148
+
149
+ # 5. 安装 ops-dataset-query Skill
150
+ opscli skills install ops-dataset-query
151
+
152
+ # 6. 拉取真实数据
153
+ opscli skills upgrade ops-dataset-query
154
+
155
+ # 7. 抓取 Amazon 商品页
156
+ opscli amazon scrape --asin B09LCJPZ1P --include-raw --pretty
157
+
158
+ # 8. 输出预留给 ops API 的标准 payload
159
+ opscli amazon payload --asin B09LCJPZ1P --pretty
160
+
161
+ # 9. 抓取 Amazon 搜索结果
162
+ opscli amazon search --keyword "usb c cable" --limit 5 --pretty
163
+
164
+ # 10. 退出登录
165
+ opscli auth logout
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 核心流程图
171
+
172
+ ### Device Flow 授权登录
173
+
174
+ ```mermaid
175
+ sequenceDiagram
176
+ participant User as 用户
177
+ participant CLI as CLI 客户端
178
+ participant Backend as ops 认证服务
179
+ participant Browser as 浏览器
180
+
181
+ CLI->>Backend: POST /api/v1/cli/device/code
182
+ Backend-->>CLI: device_code + user_code + verification_url
183
+
184
+ CLI->>User: 显示验证码 + 自动打开浏览器
185
+ User->>Browser: 在授权页面确认
186
+ Browser->>Browser: 检测 polarisUserToken cookie
187
+ Browser->>Backend: POST /api/v1/cli/device/confirm<br/>{user_code, polaris_user_token}
188
+
189
+ alt 授权成功
190
+ Backend-->>Browser: 200 OK → 显示成功
191
+ Backend->>Backend: 创建 session(30天有效期)
192
+ else 未登录 polaris
193
+ Browser-->>User: 引导登录 polaris 系统
194
+ end
195
+
196
+ loop 轮询(每 3 秒)
197
+ CLI->>Backend: POST /api/v1/cli/device/poll
198
+ Backend-->>CLI: pending / authorized
199
+ end
200
+
201
+ CLI->>CLI: 保存 session_id + device_code 到加密存储
202
+ CLI-->>User: ✓ 授权成功!账号:user@example.com
203
+ ```
204
+
205
+ ### Token 获取与自动刷新
206
+
207
+ ```mermaid
208
+ flowchart TD
209
+ Start([get_token alias]) --> Load["加载本地凭证"]
210
+ Load --> HasSession{"session_id 有效?"}
211
+
212
+ HasSession -->|否| Error1["抛出 NotAuthenticatedError"]
213
+ HasSession -->|是| CheckCache{"本地有缓存 JWT?"}
214
+
215
+ CheckCache -->|否| FetchNew["用 session_id 向后端换取 JWT"]
216
+ CheckCache -->|是| CheckValid{"JWT 有效<br/>距过期 > 5 分钟?"}
217
+
218
+ CheckValid -->|是| Return["返回缓存的 JWT"]
219
+ CheckValid -->|否| FetchNew
220
+
221
+ FetchNew --> Backend["POST {system_url}{token_endpoint}<br/>{session_id}"]
222
+ Backend --> CapTTL["限制 expires_in ≤ 86400s(24h)"]
223
+ CapTTL --> Save["加密保存 JWT + expires_at"]
224
+ Save --> Return
225
+ ```
226
+
227
+ ### Token 生命周期
228
+
229
+ ```mermaid
230
+ stateDiagram-v2
231
+ [*] --> 未登录
232
+
233
+ 未登录 --> DeviceCode生成: opscli auth login
234
+ DeviceCode生成 --> 等待授权: 显示验证码 + 打开浏览器
235
+ 等待授权 --> SessionActive: 用户确认授权<br/>轮询获取 session_id
236
+ 等待授权 --> 超时过期: 5 分钟未操作
237
+ 超时过期 --> 未登录
238
+
239
+ SessionActive --> JWT有效: get_token<br/>session_id 换取 JWT
240
+ SessionActive --> Session过期: 30 天未续期
241
+ Session过期 --> 未登录
242
+
243
+ JWT有效 --> JWT有效: get_token<br/>返回缓存(自动命中)
244
+ JWT有效 --> 刷新中: 剩余 ≤ 5 分钟时<br/>自动触发刷新
245
+ 刷新中 --> JWT有效: 刷新成功<br/>新的 24h JWT
246
+
247
+ note right of SessionActive
248
+ 每次浏览器授权确认
249
+ 自动续期 30 天
250
+ end note
251
+
252
+ note right of JWT有效
253
+ JWT 最长 24h
254
+ (MAX_JWT_TTL = 86400s)
255
+ end note
256
+ ```
257
+
258
+ ---
259
+
260
+ ## CLI 命令参考
261
+
262
+ ### 命令树总览
263
+
264
+ ```mermaid
265
+ graph LR
266
+ Root["opscli"]
267
+ Root --- Auth["auth"]
268
+ Root --- Query["query"]
269
+ Root --- Skills["skills"]
270
+ Root --- Amazon["amazon"]
271
+
272
+ Auth --- login
273
+ Auth --- logout
274
+ Auth --- doctor
275
+ Auth --- Token["token"]
276
+ Auth --- System["system"]
277
+
278
+ Token --- token_status["status"]
279
+ Token --- token_get["get -s &lt;alias&gt;"]
280
+ Token --- token_check["check -s &lt;alias&gt;"]
281
+ Token --- token_refresh["refresh -s &lt;alias&gt; / --all"]
282
+
283
+ System --- sys_list["list"]
284
+ System --- sys_sync["sync"]
285
+ System --- sys_add["add --alias --url"]
286
+ System --- sys_remove["remove --alias"]
287
+
288
+ Query --- query_metadata["metadata"]
289
+ Query --- query_build["build"]
290
+ Query --- query_run["run"]
291
+
292
+ Skills --- skills_list["list"]
293
+ Skills --- skills_install["install <name>"]
294
+ Skills --- skills_status["status"]
295
+ Skills --- skills_upgrade["upgrade [name]"]
296
+
297
+ Amazon --- amazon_scrape["scrape --asin"]
298
+ Amazon --- amazon_payload["payload --asin"]
299
+ Amazon --- amazon_search["search --keyword"]
300
+ Amazon --- amazon_schema["schema"]
301
+ Amazon --- amazon_history["history --asin"]
302
+ ```
303
+
304
+ ### 授权管理
305
+
306
+ #### `opscli auth login` - Device Flow 授权登录
307
+
308
+ ```bash
309
+ opscli auth login
310
+ ```
311
+
312
+ 触发 Device Flow 授权流程:CLI 申请设备码 → 自动打开浏览器 → 用户确认授权 → CLI 获取 session。
313
+
314
+ **输出示例**:
315
+ ```
316
+ 请在浏览器打开: http://ops.cm/cli-auth
317
+ 输入验证码: AB12-CD34
318
+ 等待授权中...(300 秒内完成)
319
+
320
+ ✓ 授权成功!账号:user@example.com
321
+ ```
322
+
323
+ #### `opscli auth logout` - 退出登录
324
+
325
+ ```bash
326
+ opscli auth logout
327
+ ```
328
+
329
+ 清除本地所有凭证(session_id + 全部系统 JWT)。
330
+
331
+ #### `opscli auth token status` - 查看登录状态
332
+
333
+ ```bash
334
+ opscli auth token status
335
+ ```
336
+
337
+ **输出示例**:
338
+ ```
339
+ 已登录 user@example.com
340
+ Session 过期:2026-05-17T10:00:00
341
+
342
+ ┏━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
343
+ ┃ 别名 ┃ System Key ┃ Token 状态 ┃ 剩余时间(s) ┃
344
+ ┡━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
345
+ │ ops │ ops │ 有效 │ 82800 │
346
+ │ polaris │ polaris │ 有效 │ 82800 │
347
+ └─────────┴──────────────┴────────────┴─────────────┘
348
+ 权限(3 项):read write admin
349
+ 权限(2 项):read write
350
+ ```
351
+
352
+ ---
353
+
354
+ ### Token 管理
355
+
356
+ #### `opscli auth token get` - 获取 JWT(纯文本输出,适合脚本)
357
+
358
+ ```bash
359
+ # 获取 ops 系统 JWT
360
+ opscli auth token get --system ops
361
+ opscli auth token get -s ops
362
+
363
+ # 获取 polaris 系统 JWT
364
+ opscli auth token get --system polaris
365
+ opscli auth token get -s polaris
366
+ ```
367
+
368
+ | 参数 | 简写 | 必需 | 说明 |
369
+ |------|------|------|------|
370
+ | `--system` | `-s` | 是 | 系统别名(ops / polaris) |
371
+
372
+ **脚本集成示例**:
373
+ ```bash
374
+ # Shell 脚本中获取 token 并调用 API
375
+ TOKEN=$(opscli auth token get -s ops)
376
+ curl -s -H "Authorization: Bearer $TOKEN" \
377
+ "https://ops.aukeys.com/api/v1/some-endpoint"
378
+
379
+ # Python 脚本中调用
380
+ python3 -c "
381
+ import httpx
382
+ from opscli import AuthClient
383
+ token = AuthClient().get_token('ops')
384
+ resp = httpx.get('https://ops.aukeys.com/api/v1/resource',
385
+ headers={'Authorization': f'Bearer {token}'})
386
+ print(resp.json())
387
+ "
388
+ ```
389
+
390
+ #### `opscli auth token check` - 检测 Token 有效性
391
+
392
+ ```bash
393
+ opscli auth token check --system ops
394
+ opscli auth token check -s polaris
395
+ ```
396
+
397
+ #### `opscli auth token refresh` - 刷新 Token
398
+
399
+ ```bash
400
+ # 刷新单个系统
401
+ opscli auth token refresh --system ops
402
+
403
+ # 刷新全部系统
404
+ opscli auth token refresh --all
405
+ ```
406
+
407
+ ---
408
+
409
+ ### 系统管理
410
+
411
+ #### `opscli auth system list` - 列出所有已注册系统
412
+
413
+ ```bash
414
+ opscli auth system list
415
+ ```
416
+
417
+ #### `opscli auth system sync` - 从 ops 同步系统列表
418
+
419
+ ```bash
420
+ opscli auth system sync
421
+ ```
422
+
423
+ #### `opscli auth system add` - 手动添加系统
424
+
425
+ ```bash
426
+ opscli auth system add --alias 数据分析 --url http://analytics.cm
427
+ opscli auth system add --alias 财务系统 --url http://finance.cm --key finance
428
+ ```
429
+
430
+ | 参数 | 必需 | 说明 |
431
+ |------|------|------|
432
+ | `--alias` | 是 | 系统别名(用于 CLI 调用) |
433
+ | `--url` | 是 | 系统 base URL |
434
+ | `--key` | 否 | 存储键(默认从 alias 自动生成) |
435
+
436
+ #### `opscli auth system remove` - 移除手动添加的系统
437
+
438
+ ```bash
439
+ opscli auth system remove --alias 数据分析
440
+ ```
441
+
442
+ > 内置系统(ops/polaris)不可移除,仅能移除 `local` 来源的系统。
443
+
444
+ ---
445
+
446
+ ### 诊断工具
447
+
448
+ #### `opscli auth doctor` - 环境检查
449
+
450
+ ```bash
451
+ opscli auth doctor
452
+ ```
453
+
454
+ **输出示例**:
455
+ ```
456
+ opscli auth 环境检查
457
+
458
+ ✓ 已登录
459
+ ✓ ops 可访问
460
+ ✓ polaris 可访问
461
+ ```
462
+
463
+ #### `opscli --version` - 显示版本
464
+
465
+ ```bash
466
+ opscli --version
467
+ opscli -V
468
+ ```
469
+
470
+ **输出示例**:
471
+ ```
472
+ opscli v0.0.4
473
+ ```
474
+
475
+ ---
476
+
477
+ ## Python SDK
478
+
479
+ 作为 Python SDK 在其他项目中调用:
480
+
481
+ ```python
482
+ # 两种导入方式均可
483
+ from opscli import AuthClient
484
+ from opscli.auth import AuthClient
485
+
486
+ client = AuthClient()
487
+ ```
488
+
489
+ ### 方法列表
490
+
491
+ | 方法 | 返回值 | 说明 |
492
+ |------|--------|------|
493
+ | `is_authenticated()` | `bool` | 是否已登录 |
494
+ | `get_token(alias)` | `str` | 获取 JWT(自动缓存+刷新) |
495
+ | `get_session(alias)` | `str` | 获取当前登录态对应的 `session_id` |
496
+ | `get_device_code()` | `str \| None` | 获取当前登录态对应的 `device_code` |
497
+ | `build_request_auth(alias)` | `tuple[dict, dict]` | 构造业务接口请求所需的 `headers` 和 `cookies` |
498
+ | `build_session_headers(alias)` | `dict` | 构造 ops session 型接口所需的 `X-Session-Id` 请求头 |
499
+ | `check_token(alias)` | `dict` | 检测有效性,返回 `{"valid": bool, "expires_in": int}` |
500
+ | `refresh_token(alias)` | `str` | 强制刷新 JWT |
501
+
502
+ ### 使用示例
503
+
504
+ ```python
505
+ import httpx
506
+ from opscli import AuthClient
507
+
508
+ client = AuthClient()
509
+
510
+ # 检查登录状态
511
+ if not client.is_authenticated():
512
+ print("未登录,请先执行: opscli auth login")
513
+ exit(1)
514
+
515
+ # 获取统一认证参数并调用业务 API
516
+ headers, cookies = client.build_request_auth("ops")
517
+ resp = httpx.get(
518
+ "https://ops.aukeys.com/api/v1/operation-reminder/list",
519
+ headers=headers,
520
+ cookies=cookies,
521
+ )
522
+ print(resp.json())
523
+
524
+ # 获取 polaris 系统统一认证参数
525
+ headers, cookies = client.build_request_auth("polaris")
526
+ resp = httpx.get(
527
+ "https://bi.aukeys.com/api/some-endpoint",
528
+ headers=headers,
529
+ cookies=cookies,
530
+ )
531
+ print(resp.json())
532
+ ```
533
+
534
+ 其中 `build_request_auth()` 返回的认证参数形如:
535
+
536
+ ```python
537
+ headers = {"Authorization": "Bearer <jwt>"}
538
+ cookies = {
539
+ "polarisUserToken": "<session_id>",
540
+ "opscliDeviceCode": "<device_code>", # 本地存在时自动附带
541
+ }
542
+ ```
543
+
544
+ ### 异常处理
545
+
546
+ ```python
547
+ from opscli import AuthClient
548
+ from opscli.auth.exceptions import (
549
+ NotAuthenticatedError,
550
+ TokenFetchError,
551
+ SystemNotFoundError,
552
+ )
553
+
554
+ client = AuthClient()
555
+
556
+ try:
557
+ token = client.get_token("ops")
558
+ except NotAuthenticatedError:
559
+ print("未登录,请运行: opscli auth login")
560
+ except SystemNotFoundError:
561
+ print("系统别名不存在,用 system list 查看可用系统")
562
+ except TokenFetchError as e:
563
+ print(f"获取 JWT 失败: {e}")
564
+ ```
565
+
566
+ ### 在 pyproject.toml 中声明依赖
567
+
568
+ ```toml
569
+ [project]
570
+ dependencies = [
571
+ "opscli",
572
+ ]
573
+ ```
574
+
575
+ ---
576
+
577
+ ## 模块架构
578
+
579
+ ```mermaid
580
+ graph TB
581
+ subgraph "opscli 包结构"
582
+ Init["__init__.py<br/>re-export AuthClient"]
583
+ CLI["cli.py<br/>顶级 Typer app(挂载子模块)"]
584
+ Config["config.py<br/>全局 CONFIG_DIR + 迁移函数"]
585
+ end
586
+
587
+ subgraph "opscli/auth/"
588
+ AuthInit["__init__.py<br/>AuthClient, BUILTIN_SYSTEMS, OPS_URL"]
589
+ AuthCLI["cli.py<br/>auth 子命令组"]
590
+ AuthConfig["config.py<br/>auth 专属地址配置"]
591
+ Exceptions["exceptions.py<br/>异常类定义"]
592
+ end
593
+
594
+ subgraph "opscli/auth/core/"
595
+ TokenMgr["token_manager.py<br/>JWT 缓存/刷新/获取"]
596
+ DeviceFlow["device_flow.py<br/>Device Flow 授权"]
597
+ SysRegistry["system_registry.py<br/>系统注册表"]
598
+ end
599
+
600
+ subgraph "opscli/auth/storage/"
601
+ CredStore["credential_store.py<br/>Keychain 优先 / AES 加密兜底"]
602
+ Crypto["crypto.py<br/>AES-256-GCM"]
603
+ end
604
+
605
+ CLI --> AuthCLI
606
+ AuthCLI --> AuthInit
607
+ AuthInit --> TokenMgr
608
+ AuthInit --> SysRegistry
609
+ AuthInit --> CredStore
610
+ AuthInit --> AuthConfig
611
+ TokenMgr --> CredStore
612
+ TokenMgr --> SysRegistry
613
+ DeviceFlow --> CredStore
614
+ SysRegistry --> Config
615
+ CredStore --> Config
616
+ CredStore --> Crypto
617
+ ```
618
+
619
+ ---
620
+
621
+ ## 配置文件
622
+
623
+ ### 存储目录
624
+
625
+ 凭证优先存入系统 **Keychain**(macOS 钥匙串),Keychain 不可用时自动降级到本地加密文件。
626
+
627
+ ```
628
+ ~/.config/opscli/
629
+ ├── config.ini # 系统地址配置(可选,覆盖默认值)
630
+ ├── credentials.bin # 加密凭证兜底(Keychain 不可用时启用)
631
+ ├── .key # AES 加密密钥(权限 600,Keychain 兜底时使用)
632
+ ├── .lock_<key> # 跨进程并发文件锁(运行时临时文件)
633
+ └── systems.json # 用户自定义系统列表
634
+ ```
635
+
636
+ ### 系统地址配置
637
+
638
+ 代码中内置生产环境默认地址。如需覆盖(如本地开发),创建 `~/.config/opscli/config.ini`:
639
+
640
+ ```ini
641
+ [systems]
642
+ # ops 认证服务地址
643
+ ops_url = http://localhost/api
644
+ # ops 运营系统地址
645
+ ops_system_url = http://ops.cm
646
+ ops_token_endpoint = /api/v1/auth/cli-token
647
+ # polaris 刊登系统地址
648
+ polaris_system_url = http://po2.cm
649
+ polaris_token_endpoint = /api/auth/cli-token
650
+ ```
651
+
652
+ **配置优先级**:`config.ini` 用户配置 > 代码默认值(生产环境)
653
+
654
+ ### Token 生命周期
655
+
656
+ | 类型 | 有效期 | 说明 |
657
+ |------|--------|------|
658
+ | Session ID | **30 天** | 登录后签发,浏览器授权确认时自动续期 |
659
+ | JWT Token | **24 小时** | 用 session_id 换取,三态管理(过期前 5 分钟自动刷新) |
660
+ | Device Code | **5 分钟** | login 时生成,超时需重新执行 login |
661
+
662
+ ---
663
+
664
+ ## 打包与发布
665
+
666
+ 详见 [打包发布指南](docs/opscli-publish-guide.md)。
667
+
668
+ ### 版本更新流程
669
+
670
+ ```bash
671
+ # 1. 修改 pyproject.toml 中的 version 字段
672
+ # version = "0.0.2"
673
+
674
+ # 2. 清理旧产物并构建
675
+ rm -rf dist/ build/
676
+ python -m build
677
+
678
+ # 3. 校验包
679
+ twine check dist/*
680
+
681
+ # 4. 发布到 TestPyPI 验证
682
+ twine upload --repository testpypi dist/*
683
+
684
+ # 5. 验证通过后发布到正式 PyPI
685
+ twine upload dist/*
686
+ ```
687
+
688
+ ### TestPyPI 安装验证
689
+
690
+ > **重要**:TestPyPI 上缺少部分依赖包(如 cryptography、httpx 等),安装时必须加 `--extra-index-url` 指向正式 PyPI,否则 pip 解析依赖失败后会回退到旧版本。
691
+
692
+ ```bash
693
+ # 正确:指定额外索引源拉依赖
694
+ pip install \
695
+ --index-url https://test.pypi.org/simple/ \
696
+ --extra-index-url https://pypi.org/simple/ \
697
+ aukeys-opscli==0.0.2
698
+
699
+ # 错误:只用 TestPyPI 做索引源,可能安装到旧版本
700
+ pip install -i https://test.pypi.org/simple/ aukeys-opscli
701
+ ```
702
+
703
+ 验证安装:
704
+
705
+ ```bash
706
+ opscli --version
707
+ python -c "from opscli import AuthClient; print('SDK OK')"
708
+ ```
709
+
710
+ ### 常见问题
711
+
712
+ | 问题 | 原因 | 解决方式 |
713
+ |------|------|----------|
714
+ | `File already exists` | PyPI 不允许覆盖同版本号 | 修改 `pyproject.toml` 中的 `version` 后重新构建 |
715
+ | `Invalid API Token` | `~/.pypirc` 中 token 过期或错误 | 重新生成 token 并更新 `~/.pypirc` |
716
+ | TestPyPI 安装到旧版本 | 缺少 `--extra-index-url` | 加上 `--extra-index-url https://pypi.org/simple/` |
717
+
718
+ ---
719
+
720
+ ## 错误处理
721
+
722
+ | 场景 | 错误信息 | 处理方式 |
723
+ |------|----------|----------|
724
+ | 未登录 | `未登录,请运行: opscli auth login` | 执行 login |
725
+ | session 过期 | `登录已过期,请重新运行: opscli auth login` | 重新 login |
726
+ | Token 过期 | `已过期或未获取` | 执行 token refresh 或自动刷新 |
727
+ | 系统别名不存在 | `系统 'xxx' 未注册` | 用 system list 查看,或 system add 添加 |
728
+ | 目标系统不可达 | `获取 xxx JWT 失败` | 用 doctor 检查连通性 |
729
+
730
+ ### `skills` 常见错误
731
+
732
+ | 场景 | 典型提示 | 处理方式 |
733
+ |------|----------|----------|
734
+ | 未登录 ops | `未登录 ops,请先执行 opscli auth login` | 先执行 `opscli auth login` |
735
+ | 远端环境未部署接口 | `远端环境未部署该 Skill 接口` | 检查 `~/.config/opscli/config.ini` 中的 `ops_url` 是否指向已部署环境 |
736
+ | 远端接口鉴权失败 | `远端 Skill 接口鉴权失败` | 重新登录后重试 |
737
+ | 远端返回坏 JSON | `远端接口返回了无法解析的 JSON` | 检查目标环境接口返回内容 |
738
+ | 本地未安装 Skill | `未找到已安装 Skill: ops-dataset-query` | 先执行 `opscli skills install ops-dataset-query` |
739
+
740
+ ### 异常类
741
+
742
+ ```mermaid
743
+ graph TD
744
+ AuthError["AuthError<br/>认证异常基类"]
745
+ NotAuth["NotAuthenticatedError<br/>未登录或 session 过期"]
746
+ SessionExp["SessionExpiredError<br/>session_id 过期"]
747
+ TokenFetch["TokenFetchError<br/>获取 JWT 失败"]
748
+ SysNotFound["SystemNotFoundError<br/>系统别名不存在"]
749
+ DeviceFlow["DeviceFlowError<br/>Device Flow 异常基类"]
750
+ DFExpired["DeviceFlowExpiredError<br/>设备码超时"]
751
+ DFDenied["DeviceFlowDeniedError<br/>用户拒绝授权"]
752
+
753
+ AuthError --> NotAuth
754
+ AuthError --> SessionExp
755
+ AuthError --> TokenFetch
756
+ AuthError --> SysNotFound
757
+ AuthError --> DeviceFlow
758
+ DeviceFlow --> DFExpired
759
+ DeviceFlow --> DFDenied
760
+ ```
761
+
762
+ ---
763
+
764
+ ## 依赖
765
+
766
+ - Python >= 3.10
767
+ - typer >= 0.12
768
+ - httpx >= 0.27
769
+ - cryptography >= 38, < 42
770
+ - rich >= 13
771
+ - keyring >= 25(Keychain 存储,macOS 钥匙串优先)
772
+
773
+ ## 新增模块规范
774
+
775
+ 在 `opscli/cli.py` 中追加一行注册:
776
+
777
+ ```python
778
+ from opscli.{module_name}.cli import app as {module_name}_app
779
+ app.add_typer({module_name}_app, name="{module_name}")
780
+ ```
781
+
782
+ 新模块配置统一存放在 `~/.config/opscli/` 下,通过 `opscli.config.CONFIG_DIR` 获取。
783
+
784
+ ## Skills 使用
785
+
786
+ ### `opscli skills list`
787
+
788
+ 列出当前扫描到的已安装 Skill。
789
+
790
+ ```bash
791
+ opscli skills list
792
+ opscli skills list --pretty
793
+ opscli skills list --skills-dir ~/.claude/skills
794
+ ```
795
+
796
+ ### `opscli skills install`
797
+
798
+ 安装内置 `ops-dataset-query` Skill 模板。
799
+
800
+ ```bash
801
+ opscli skills install ops-dataset-query
802
+ opscli skills install ops-dataset-query --skills-dir ~/.claude/skills
803
+ opscli skills install ops-dataset-query --skills-dir ~/.claude/skills --force
804
+ ```
805
+
806
+ ### `opscli skills status`
807
+
808
+ 查看本地安装状态,并附带远端 manifest 摘要。
809
+
810
+ ```bash
811
+ opscli skills status
812
+ opscli skills status --pretty
813
+ ```
814
+
815
+ 返回结果中会包含:
816
+ - `installed`
817
+ - `remote_manifest`
818
+ - `remote_summary`
819
+ - `remote_error`
820
+
821
+ ### `opscli skills upgrade`
822
+
823
+ 从远端拉取最新的 `ops-dataset-query` 数据文件。
824
+
825
+ ```bash
826
+ opscli skills upgrade
827
+ opscli skills upgrade ops-dataset-query
828
+ opscli skills upgrade ops-dataset-query --force
829
+ opscli skills upgrade ops-dataset-query --pretty
830
+ ```
831
+
832
+ ### `ops-dataset-query` 典型工作流
833
+
834
+ 推荐统一通过 `opscli` 正式命令入口完成 metadata 读取、payload 构造与执行,不直接调用 Skill 脚本:
835
+
836
+ ```bash
837
+ opscli auth login
838
+ opscli skills install ops-dataset-query
839
+ opscli skills upgrade ops-dataset-query --pretty
840
+ opscli query metadata --dataset sales_order_d
841
+ opscli query build --dataset sales_order_d --dimension date_id --metric gmv --output payload.json
842
+ opscli query run --payload payload.json
843
+ ```
844
+
845
+ ### `skills` 联调建议顺序
846
+
847
+ ```bash
848
+ opscli auth login
849
+ opscli skills install ops-dataset-query
850
+ opscli skills status --pretty
851
+ opscli skills upgrade ops-dataset-query --pretty
852
+ opscli query metadata --dataset sales_order_d
853
+ ```
854
+
855
+ ### `skills` 相关配置
856
+
857
+ 可以通过配置文件覆盖后端地址:
858
+
859
+ ```ini
860
+ [systems]
861
+ ops_url = https://ops.aukeys.com/api
862
+ ops_system_url = https://ops.aukeys.com
863
+ ops_token_endpoint = /api/v1/auth/cli-token
864
+ ```
865
+
866
+ 如果 `skills status` 返回 404,通常意味着 `ops_url` 指向的环境还没有部署这些 Skill 接口。
867
+
868
+ ## Amazon 使用
869
+
870
+ `amazon` 模块依赖 Playwright 浏览器环境。首次使用前请确保已经执行:
871
+
872
+ ```bash
873
+ pip install "opscli[amazon]"
874
+ playwright install chromium
875
+ ```
876
+
877
+ ### `opscli amazon scrape`
878
+
879
+ 抓取单个商品页,并可选输出原始字段镜像。
880
+
881
+ ```bash
882
+ opscli amazon scrape --asin B09LCJPZ1P
883
+ opscli amazon scrape --asin B09LCJPZ1P --zip-code 10001 --include-raw --pretty
884
+ opscli amazon scrape --asin B09LCJPZ1P --no-save-history
885
+ ```
886
+
887
+ | 参数 | 必需 | 说明 |
888
+ |------|------|------|
889
+ | `--asin` | 是 | 目标商品 ASIN |
890
+ | `--zip-code` | 否 | 配送邮编,默认 `10001` |
891
+ | `--save-history/--no-save-history` | 否 | 是否将快照落本地历史,默认保存 |
892
+ | `--include-raw` | 否 | 是否返回 `raw` 原始抓取字段 |
893
+ | `--pretty` | 否 | 是否格式化 JSON 输出 |
894
+
895
+ 返回结构包含:
896
+
897
+ - `snapshot`:标准化商品快照
898
+ - `history_path`:本地历史 JSONL 路径
899
+ - `submit_result`:当前保留字段,本期默认为 `null`
900
+
901
+ ### `opscli amazon payload`
902
+
903
+ 抓取商品页,并输出预留给 ops API 的标准 payload。
904
+
905
+ ```bash
906
+ opscli amazon payload --asin B09LCJPZ1P
907
+ opscli amazon payload --asin B09LCJPZ1P --zip-code 10001 --pretty
908
+ ```
909
+
910
+ | 参数 | 必需 | 说明 |
911
+ |------|------|------|
912
+ | `--asin` | 是 | 目标商品 ASIN |
913
+ | `--zip-code` | 否 | 配送邮编,默认 `10001` |
914
+ | `--save-history/--no-save-history` | 否 | 是否将快照落本地历史,默认保存 |
915
+ | `--pretty` | 否 | 是否格式化 JSON 输出 |
916
+
917
+ 返回结构包含:
918
+
919
+ - `payload.source`:当前固定为 `opscli.amazon`
920
+ - `payload.snapshot`:未来提交到 ops API 的商品快照对象
921
+ - `history_path`:本地历史 JSONL 路径
922
+
923
+ ### `opscli amazon search`
924
+
925
+ 抓取 Amazon 搜索结果页,适合做竞品池样本采集。
926
+
927
+ ```bash
928
+ opscli amazon search --keyword "usb c cable"
929
+ opscli amazon search --keyword "usb c cable" --zip-code 10001 --limit 10 --pretty
930
+ ```
931
+
932
+ | 参数 | 必需 | 说明 |
933
+ |------|------|------|
934
+ | `--keyword` | 是 | 搜索关键词 |
935
+ | `--zip-code` | 否 | 配送邮编,默认 `10001` |
936
+ | `--limit` | 否 | 最大结果数,默认 `10`,范围 `1-50` |
937
+ | `--pretty` | 否 | 是否格式化 JSON 输出 |
938
+
939
+ 返回结构包含:
940
+
941
+ - `keyword`
942
+ - `zip_code`
943
+ - `count`
944
+ - `results`
945
+
946
+ 说明:
947
+
948
+ - 搜索结果页的 `review_count_value` 来自页面展示口径,可能是近似值
949
+ - 商品页 `scrape` 的 `review_count_value` 更适合作为精确快照值
950
+
951
+ ### `opscli amazon schema`
952
+
953
+ 输出当前 `amazon` 模块的字段契约,便于后端设计接口和表结构。
954
+
955
+ ```bash
956
+ opscli amazon schema
957
+ opscli amazon schema --pretty
958
+ ```
959
+
960
+ | 参数 | 必需 | 说明 |
961
+ |------|------|------|
962
+ | `--pretty` | 否 | 是否格式化 JSON 输出 |
963
+
964
+ ### `opscli amazon history`
965
+
966
+ 读取某个商品的本地历史快照。
967
+
968
+ ```bash
969
+ opscli amazon history --asin B09LCJPZ1P
970
+ opscli amazon history --asin B09LCJPZ1P --pretty
971
+ ```
972
+
973
+ | 参数 | 必需 | 说明 |
974
+ |------|------|------|
975
+ | `--asin` | 是 | 目标商品 ASIN |
976
+ | `--pretty` | 否 | 是否格式化 JSON 输出 |
977
+
978
+ 默认历史路径位于 `~/.config/opscli/amazon/history/<ASIN>.jsonl`。
979
+
980
+ ## 许可证
981
+
982
+ MIT