askovo 2.7.0__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 (160) hide show
  1. askovo-2.7.0/.github/ISSUE_TEMPLATE/bug_report.yml +54 -0
  2. askovo-2.7.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. askovo-2.7.0/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  4. askovo-2.7.0/.github/pull_request_template.md +23 -0
  5. askovo-2.7.0/.github/workflows/pages.yml +38 -0
  6. askovo-2.7.0/.github/workflows/release.yml +150 -0
  7. askovo-2.7.0/.github/workflows/tests.yml +70 -0
  8. askovo-2.7.0/AGENTS.md +40 -0
  9. askovo-2.7.0/CHANGELOG.md +309 -0
  10. askovo-2.7.0/CODE_OF_CONDUCT.md +65 -0
  11. askovo-2.7.0/CONTRIBUTING.md +57 -0
  12. askovo-2.7.0/LICENSE +21 -0
  13. askovo-2.7.0/MANIFEST.in +17 -0
  14. askovo-2.7.0/PKG-INFO +411 -0
  15. askovo-2.7.0/README.md +381 -0
  16. askovo-2.7.0/RELEASING.md +79 -0
  17. askovo-2.7.0/SECURITY.md +40 -0
  18. askovo-2.7.0/VERSION +1 -0
  19. askovo-2.7.0/askovo/__init__.py +20 -0
  20. askovo-2.7.0/askovo/cli.py +140 -0
  21. askovo-2.7.0/askovo/documents.py +112 -0
  22. askovo-2.7.0/askovo/mcp.py +22 -0
  23. askovo-2.7.0/askovo.egg-info/PKG-INFO +411 -0
  24. askovo-2.7.0/askovo.egg-info/SOURCES.txt +158 -0
  25. askovo-2.7.0/askovo.egg-info/dependency_links.txt +1 -0
  26. askovo-2.7.0/askovo.egg-info/entry_points.txt +3 -0
  27. askovo-2.7.0/askovo.egg-info/top_level.txt +1 -0
  28. askovo-2.7.0/assets/brand/askovo-logo-600.png +0 -0
  29. askovo-2.7.0/assets/brand/askovo-logo.png +0 -0
  30. askovo-2.7.0/docs/README.md +33 -0
  31. askovo-2.7.0/docs/business-analysis.md +141 -0
  32. askovo-2.7.0/docs/cli.md +299 -0
  33. askovo-2.7.0/docs/concepts.md +114 -0
  34. askovo-2.7.0/docs/connectors.md +159 -0
  35. askovo-2.7.0/docs/data-contract.md +303 -0
  36. askovo-2.7.0/docs/feature-status.md +19 -0
  37. askovo-2.7.0/docs/modes.md +158 -0
  38. askovo-2.7.0/docs/open-source-integrations.md +44 -0
  39. askovo-2.7.0/docs/product-methodology.md +236 -0
  40. askovo-2.7.0/docs/product-reasoning.md +188 -0
  41. askovo-2.7.0/docs/quickstart.md +231 -0
  42. askovo-2.7.0/docs/research-loop.md +187 -0
  43. askovo-2.7.0/docs/sure-engine.md +50 -0
  44. askovo-2.7.0/docs/troubleshooting.md +297 -0
  45. askovo-2.7.0/examples/sample-study/01-sources/source-plan.csv +6 -0
  46. askovo-2.7.0/examples/sample-study/02-data/evidence.jsonl +7 -0
  47. askovo-2.7.0/examples/sample-study/03-codebook/codebook.csv +8 -0
  48. askovo-2.7.0/examples/sample-study/03-codebook/gold-set.jsonl +1 -0
  49. askovo-2.7.0/examples/sample-study/04-findings/demand-judgments.json +23 -0
  50. askovo-2.7.0/examples/sample-study/04-findings/product-reasoning.json +331 -0
  51. askovo-2.7.0/examples/sample-study/05-audit/.gitkeep +0 -0
  52. askovo-2.7.0/examples/sample-study/study.json +101 -0
  53. askovo-2.7.0/llms.txt +64 -0
  54. askovo-2.7.0/pyproject.toml +47 -0
  55. askovo-2.7.0/setup.cfg +4 -0
  56. askovo-2.7.0/setup.py +32 -0
  57. askovo-2.7.0/skills/askovo/SKILL.md +297 -0
  58. askovo-2.7.0/skills/askovo/agents/openai.yaml +4 -0
  59. askovo-2.7.0/skills/askovo/assets/amazon-route-template.csv +6 -0
  60. askovo-2.7.0/skills/askovo/assets/collection-manifest-template.json +24 -0
  61. askovo-2.7.0/skills/askovo/assets/demand-judgment-template.md +32 -0
  62. askovo-2.7.0/skills/askovo/assets/domain-packs/automotive.json +218 -0
  63. askovo-2.7.0/skills/askovo/assets/domain-packs/consumer.json +224 -0
  64. askovo-2.7.0/skills/askovo/assets/domain-packs/hardware.json +218 -0
  65. askovo-2.7.0/skills/askovo/assets/domain-packs/mobile.json +220 -0
  66. askovo-2.7.0/skills/askovo/assets/domain-packs/software.json +226 -0
  67. askovo-2.7.0/skills/askovo/assets/experience-space-template.csv +1 -0
  68. askovo-2.7.0/skills/askovo/assets/jd-route-template.csv +6 -0
  69. askovo-2.7.0/skills/askovo/assets/kickstarter-route-template.csv +6 -0
  70. askovo-2.7.0/skills/askovo/assets/lexicon-template.csv +1 -0
  71. askovo-2.7.0/skills/askovo/assets/method-catalog.json +1373 -0
  72. askovo-2.7.0/skills/askovo/assets/open-source-connectors.json +401 -0
  73. askovo-2.7.0/skills/askovo/assets/platform-catalog.json +880 -0
  74. askovo-2.7.0/skills/askovo/assets/platform-map.json +66 -0
  75. askovo-2.7.0/skills/askovo/assets/raw-connector-envelope-template.jsonl +1 -0
  76. askovo-2.7.0/skills/askovo/assets/reddit-route-template.csv +6 -0
  77. askovo-2.7.0/skills/askovo/assets/research-contract-template.md +70 -0
  78. askovo-2.7.0/skills/askovo/assets/study-template/01-sources/manifests/.gitkeep +1 -0
  79. askovo-2.7.0/skills/askovo/assets/study-template/01-sources/source-plan.csv +6 -0
  80. askovo-2.7.0/skills/askovo/assets/study-template/02-data/evidence.jsonl +2 -0
  81. askovo-2.7.0/skills/askovo/assets/study-template/02-data/raw/.gitkeep +0 -0
  82. askovo-2.7.0/skills/askovo/assets/study-template/02-data/views/.gitkeep +0 -0
  83. askovo-2.7.0/skills/askovo/assets/study-template/03-codebook/codebook.csv +8 -0
  84. askovo-2.7.0/skills/askovo/assets/study-template/03-codebook/gold-set.jsonl +1 -0
  85. askovo-2.7.0/skills/askovo/assets/study-template/04-findings/demand-judgments.json +1 -0
  86. askovo-2.7.0/skills/askovo/assets/study-template/04-findings/product-reasoning.json +122 -0
  87. askovo-2.7.0/skills/askovo/assets/study-template/05-audit/.gitkeep +0 -0
  88. askovo-2.7.0/skills/askovo/assets/study-template/06-report/.gitkeep +0 -0
  89. askovo-2.7.0/skills/askovo/assets/study-template/study.json +217 -0
  90. askovo-2.7.0/skills/askovo/assets/taobao-route-template.csv +6 -0
  91. askovo-2.7.0/skills/askovo/assets/x-route-template.csv +6 -0
  92. askovo-2.7.0/skills/askovo/assets/youtube-route-template.csv +6 -0
  93. askovo-2.7.0/skills/askovo/references/agent-runbook.md +254 -0
  94. askovo-2.7.0/skills/askovo/references/amazon-research.md +88 -0
  95. askovo-2.7.0/skills/askovo/references/commerce-and-crowdfunding-source-adapters.md +115 -0
  96. askovo-2.7.0/skills/askovo/references/connector-contract.md +114 -0
  97. askovo-2.7.0/skills/askovo/references/data-contract.md +163 -0
  98. askovo-2.7.0/skills/askovo/references/jd-research.md +46 -0
  99. askovo-2.7.0/skills/askovo/references/kickstarter-research.md +49 -0
  100. askovo-2.7.0/skills/askovo/references/open-source-connectors.md +115 -0
  101. askovo-2.7.0/skills/askovo/references/product-reasoning.md +163 -0
  102. askovo-2.7.0/skills/askovo/references/reddit-research.md +134 -0
  103. askovo-2.7.0/skills/askovo/references/research-protocol.md +232 -0
  104. askovo-2.7.0/skills/askovo/references/social-media-source-adapters.md +112 -0
  105. askovo-2.7.0/skills/askovo/references/taobao-research.md +42 -0
  106. askovo-2.7.0/skills/askovo/references/unnamed-experience-research.md +104 -0
  107. askovo-2.7.0/skills/askovo/references/x-research.md +103 -0
  108. askovo-2.7.0/skills/askovo/references/youtube-research.md +105 -0
  109. askovo-2.7.0/skills/askovo/scripts/askovo.py +4889 -0
  110. askovo-2.7.0/skills/askovo/scripts/askovo_mcp.py +1091 -0
  111. askovo-2.7.0/skills/askovo/scripts/connectors/README.md +255 -0
  112. askovo-2.7.0/skills/askovo/scripts/connectors/amazon_reviews_2023_manifest.py +63 -0
  113. askovo-2.7.0/skills/askovo/scripts/connectors/clean_screen_corpus.py +318 -0
  114. askovo-2.7.0/skills/askovo/scripts/connectors/collect_amazon_reviews_2023.py +194 -0
  115. askovo-2.7.0/skills/askovo/scripts/connectors/collect_arctic_reddit.py +172 -0
  116. askovo-2.7.0/skills/askovo/scripts/connectors/collect_hn.py +136 -0
  117. askovo-2.7.0/skills/askovo/scripts/connectors/collect_legacy_reddit.py +296 -0
  118. askovo-2.7.0/skills/askovo/scripts/connectors/collect_pullpush_reddit.py +146 -0
  119. askovo-2.7.0/skills/askovo/scripts/connectors/common.py +261 -0
  120. askovo-2.7.0/skills/askovo/scripts/connectors/range_download.py +77 -0
  121. askovo-2.7.0/skills/askovo/scripts/decision_review.py +343 -0
  122. askovo-2.7.0/skills/askovo/scripts/research_loop.py +1651 -0
  123. askovo-2.7.0/skills/askovo/scripts/research_run.py +362 -0
  124. askovo-2.7.0/skills/askovo/scripts/stages/README.md +147 -0
  125. askovo-2.7.0/skills/askovo/scripts/stages/audit_workbook.py +583 -0
  126. askovo-2.7.0/skills/askovo/scripts/stages/build_month_balanced_dataset.py +143 -0
  127. askovo-2.7.0/skills/askovo/scripts/stages/build_primary_dataset.py +218 -0
  128. askovo-2.7.0/skills/askovo/scripts/stages/common.py +561 -0
  129. askovo-2.7.0/skills/askovo/scripts/stages/export_metadata_detail.py +134 -0
  130. askovo-2.7.0/skills/askovo/scripts/stages/extract_candidate_signals.py +347 -0
  131. askovo-2.7.0/skills/askovo/scripts/stages/import_feedback_export.py +269 -0
  132. askovo-2.7.0/skills/askovo/scripts/stages/label_feedback.py +154 -0
  133. askovo-2.7.0/skills/askovo/scripts/stages/taxonomy.example.json +81 -0
  134. askovo-2.7.0/skills/askovo/scripts/sure_engine.py +4636 -0
  135. askovo-2.7.0/skills/askovo/scripts/validate_study.py +18 -0
  136. askovo-2.7.0/skills/askovo/templates/integration-docs/00-/346/226/207/346/241/243/345/234/260/345/233/276/344/270/216/351/230/205/350/257/273/346/214/207/345/274/225-/346/250/241/346/235/277.md +115 -0
  137. askovo-2.7.0/skills/askovo/templates/integration-docs/01-BRD-/345/225/206/344/270/232/351/234/200/346/261/202/346/226/207/346/241/243-/346/250/241/346/235/277.md +140 -0
  138. askovo-2.7.0/skills/askovo/templates/integration-docs/02-MRD-/345/270/202/345/234/272/351/234/200/346/261/202/346/226/207/346/241/243-/346/250/241/346/235/277.md +174 -0
  139. askovo-2.7.0/skills/askovo/templates/integration-docs/03-PRD-/344/272/247/345/223/201/351/234/200/346/261/202/346/226/207/346/241/243-/346/250/241/346/235/277.md +127 -0
  140. askovo-2.7.0/skills/askovo/templates/integration-docs/04-/347/274/272/345/217/243/345/256/241/350/256/241/344/270/216/344/277/256/346/224/271/346/204/217/350/247/201-/346/250/241/346/235/277.md +124 -0
  141. askovo-2.7.0/skills/askovo/templates/integration-docs/05-/345/256/232/344/273/267/347/240/224/347/251/266-/346/250/241/346/235/277.md +82 -0
  142. askovo-2.7.0/skills/askovo/templates/integration-docs/06-/345/205/263/351/224/256/344/272/224/351/227/256-/346/250/241/346/235/277.md +72 -0
  143. askovo-2.7.0/skills/askovo/templates/integration-docs/runbook.md +140 -0
  144. askovo-2.7.0/skills/askovo/templates/interview-kit/runbook.md +171 -0
  145. askovo-2.7.0/skills/askovo/templates/interview-kit//345/201/207/350/256/276/346/240/270/351/252/214/350/241/250/346/250/241/346/235/277.md +57 -0
  146. askovo-2.7.0/skills/askovo/templates/interview-kit//350/256/277/350/260/210/346/217/220/347/272/262/346/250/241/346/235/277.md +88 -0
  147. askovo-2.7.0/skills/askovo/templates/interview-kit//350/256/277/350/260/210/347/272/252/350/246/201/346/250/241/346/235/277.md +87 -0
  148. askovo-2.7.0/tests/test_askovo_cdp.py +223 -0
  149. askovo-2.7.0/tests/test_askovo_cli.py +951 -0
  150. askovo-2.7.0/tests/test_askovo_economics.py +165 -0
  151. askovo-2.7.0/tests/test_askovo_mcp.py +303 -0
  152. askovo-2.7.0/tests/test_askovo_product_reasoning.py +832 -0
  153. askovo-2.7.0/tests/test_askovo_queue.py +206 -0
  154. askovo-2.7.0/tests/test_askovo_router.py +363 -0
  155. askovo-2.7.0/tests/test_askovo_tools.py +268 -0
  156. askovo-2.7.0/tests/test_boundary_signoff_cost.py +171 -0
  157. askovo-2.7.0/tests/test_decision_review.py +135 -0
  158. askovo-2.7.0/tests/test_document_intake.py +54 -0
  159. askovo-2.7.0/tests/test_research_loop.py +484 -0
  160. askovo-2.7.0/tests/test_research_run.py +157 -0
@@ -0,0 +1,54 @@
1
+ name: Bug 报告
2
+ description: 报告可复现的 CLI、Skill、MCP 或打包问题
3
+ title: "[Bug] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ 请只使用合成数据。不要上传真实用户内容、平台导出、凭据、Cookie 或个人信息。安全漏洞请走私密漏洞报告。
10
+ - type: input
11
+ id: version
12
+ attributes:
13
+ label: askovo 版本
14
+ description: "`askovo --version` 的输出"
15
+ placeholder: "askovo 2.0.0"
16
+ validations:
17
+ required: true
18
+ - type: input
19
+ id: environment
20
+ attributes:
21
+ label: 环境
22
+ description: 操作系统、Python 版本,以及源码/editable/wheel 安装方式
23
+ placeholder: "macOS 15, Python 3.12, wheel"
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: reproduce
28
+ attributes:
29
+ label: 最小复现步骤
30
+ description: 提供完整命令和必要的合成输入
31
+ validations:
32
+ required: true
33
+ - type: textarea
34
+ id: actual
35
+ attributes:
36
+ label: 实际结果
37
+ description: 包含错误输出和退出码
38
+ validations:
39
+ required: true
40
+ - type: textarea
41
+ id: expected
42
+ attributes:
43
+ label: 预期结果
44
+ validations:
45
+ required: true
46
+ - type: checkboxes
47
+ id: checks
48
+ attributes:
49
+ label: 提交前检查
50
+ options:
51
+ - label: 我已移除真实用户数据、个人信息和凭据
52
+ required: true
53
+ - label: 我已阅读故障排查文档并尝试现有版本
54
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: 快速开始与故障排查
4
+ url: https://github.com/roy-tong/askovo/blob/main/docs/troubleshooting.md
5
+ about: 安装、路由、采集和 MCP 的常见问题请先查看这里
6
+ - name: 私密安全漏洞报告
7
+ url: https://github.com/roy-tong/askovo/security/advisories/new
8
+ about: 不要在公开 Issue 中披露漏洞、凭据或真实研究数据
@@ -0,0 +1,42 @@
1
+ name: 功能或研究能力建议
2
+ description: 提出一个边界清晰、可验证的改进
3
+ title: "[Feature] "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: 要解决的问题
10
+ description: 描述用户、场景和当前缺口,不先限定实现方式
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: 建议行为
17
+ description: 给出示例命令、输入和预期输出
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: alternatives
22
+ attributes:
23
+ label: 已考虑的替代方案与非目标
24
+ - type: dropdown
25
+ id: surface
26
+ attributes:
27
+ label: 影响入口
28
+ options:
29
+ - CLI / Skill / MCP 三者共有行为
30
+ - Agent Skill
31
+ - MCP
32
+ - 文档与示例
33
+ - 打包与发布
34
+ validations:
35
+ required: true
36
+ - type: checkboxes
37
+ id: boundaries
38
+ attributes:
39
+ label: 边界确认
40
+ options:
41
+ - label: 该建议不会新增按领域分叉的 CLI/Skill,也不会绕过 blocked connector 或平台授权
42
+ required: true
@@ -0,0 +1,23 @@
1
+ ## 问题与改动
2
+
3
+ <!-- 链接 Issue;说明行为变化,而不只列文件名。 -->
4
+
5
+ ## 验证
6
+
7
+ <!-- 粘贴实际运行的命令与结果;没有运行的项目写“未运行”及原因。 -->
8
+
9
+ - [ ] `python3 -m unittest discover -s tests`
10
+ - [ ] `python3 skills/askovo/scripts/askovo.py demo`
11
+ - [ ] 涉及安装/打包时,已验证非 editable wheel 安装
12
+
13
+ ## 边界检查
14
+
15
+ - [ ] CLI / Skill / MCP 行为与 README / docs 已同步
16
+ - [ ] 未新增按领域分叉的入口,未把 `sure` 恢复为公共命令或工具前缀
17
+ - [ ] 未绕过 blocked connector、平台授权、安全门或提示注入边界
18
+ - [ ] 未提交真实研究数据、生成报告、凭据或个人信息
19
+ - [ ] 仅修改 `VERSION` 作为版本号事实源(如果本 PR 负责发版)
20
+
21
+ ## AI 辅助披露
22
+
23
+ <!-- 无则写“无”;有则说明主要生成范围,以及你如何进行人工逐行复核。 -->
@@ -0,0 +1,38 @@
1
+ name: pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "website/**"
8
+ - ".github/workflows/pages.yml"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+ pages: write
14
+ id-token: write
15
+
16
+ concurrency:
17
+ group: pages
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ deploy:
22
+ runs-on: ubuntu-latest
23
+ environment:
24
+ name: github-pages
25
+ url: ${{ steps.deployment.outputs.page_url }}
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/configure-pages@v5
29
+ with:
30
+ # The repository had no Pages site configured, so configure-pages
31
+ # failed before upload. Let the action create the workflow Pages site
32
+ # using the workflow token; no other repository setting is changed.
33
+ enablement: true
34
+ - uses: actions/upload-pages-artifact@v3
35
+ with:
36
+ path: website
37
+ - id: deployment
38
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,150 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ branches:
8
+ - "release/*"
9
+
10
+ permissions:
11
+ contents: write
12
+
13
+ jobs:
14
+ release:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Resolve release tag
18
+ run: |
19
+ case "${GITHUB_REF}" in
20
+ refs/tags/*) TAG="${GITHUB_REF#refs/tags/}" ;;
21
+ refs/heads/release/*)
22
+ TAG="${GITHUB_REF#refs/heads/release/}"
23
+ case "${TAG}" in v*) ;; *) TAG="v${TAG}" ;; esac
24
+ ;;
25
+ *) echo "unexpected ref: ${GITHUB_REF}" >&2; exit 2 ;;
26
+ esac
27
+ echo "TAG=${TAG}" >> "$GITHUB_ENV"
28
+ echo "building release for tag: ${TAG}"
29
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
30
+ with:
31
+ fetch-depth: 0
32
+ - name: Check out the release tag
33
+ run: |
34
+ TARGET_SHA="$(git rev-parse "refs/tags/${TAG}^{commit}" 2>/dev/null || true)"
35
+ if [ -z "${TARGET_SHA}" ]; then
36
+ TARGET_SHA="$(git ls-remote origin "refs/tags/${TAG}" | cut -f1)"
37
+ fi
38
+ if [ -z "${TARGET_SHA}" ]; then
39
+ echo "tag ${TAG} not found locally or on origin" >&2
40
+ exit 2
41
+ fi
42
+ git checkout --detach "${TARGET_SHA}"
43
+ echo "HEAD is now: $(git rev-parse HEAD) (tag ${TAG} -> ${TARGET_SHA})"
44
+ - name: Record failure diagnostics
45
+ if: failure()
46
+ run: |
47
+ git config user.name "askovo-release-bot"
48
+ git config user.email "release-bot@askovo.invalid"
49
+ git checkout -B release-diagnostics || true
50
+ {
51
+ echo "run: ${GITHUB_RUN_ID} ref: ${GITHUB_REF} TAG: ${TAG:-<unset>}"
52
+ git --version
53
+ git remote -v
54
+ git tag -l | sed -n '1,30p'
55
+ } > diagnostics.txt
56
+ git add diagnostics.txt
57
+ git commit -m "diagnostics for release run ${GITHUB_RUN_ID}" || true
58
+ git push origin HEAD:refs/heads/release-diagnostics --force || true
59
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
60
+ with:
61
+ python-version: "3.9"
62
+ - name: Build wheel and sdist
63
+ run: |
64
+ python3 -m pip install --upgrade pip build twine
65
+ python3 -m build
66
+ - name: Twine check
67
+ run: python3 -m twine check dist/*
68
+ - name: Isolated wheel smoke
69
+ run: |
70
+ python3 -m venv /tmp/smoke
71
+ /tmp/smoke/bin/pip install dist/*.whl
72
+ /tmp/smoke/bin/askovo --version
73
+ /tmp/smoke/bin/askovo doctor
74
+ cd /tmp && /tmp/smoke/bin/askovo demo
75
+ - name: Extract release notes from CHANGELOG
76
+ run: |
77
+ python3 - <<'PY'
78
+ import pathlib, re
79
+ version = pathlib.Path("VERSION").read_text(encoding="utf-8").strip()
80
+ text = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8")
81
+ pattern = r"^## " + re.escape(version) + r" [^\n]*\n(.*?)(?=^## |\Z)"
82
+ match = re.search(pattern, text, re.M | re.S)
83
+ assert match, "missing CHANGELOG section for " + version
84
+ header = "# Askovo v" + version + "\n\n"
85
+ pathlib.Path("/tmp/notes.md").write_text(header + match.group(1).strip() + "\n", encoding="utf-8")
86
+ PY
87
+ - name: Append asset checksums
88
+ run: |
89
+ cd dist && sha256sum *.whl *.tar.gz > /tmp/checksums.txt && cd ..
90
+ {
91
+ echo ""
92
+ echo "## Checksums"
93
+ echo ""
94
+ echo '```'
95
+ cat /tmp/checksums.txt
96
+ echo '```'
97
+ } >> /tmp/notes.md
98
+ - name: Create or update GitHub release
99
+ env:
100
+ GH_TOKEN: ${{ github.token }}
101
+ run: |
102
+ if gh release view "$TAG" -R "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
103
+ gh release edit "$TAG" -R "$GITHUB_REPOSITORY" --notes-file /tmp/notes.md
104
+ gh release upload "$TAG" -R "$GITHUB_REPOSITORY" dist/*.whl dist/*.tar.gz --clobber
105
+ else
106
+ gh release create "$TAG" -R "$GITHUB_REPOSITORY" --title "Askovo ${TAG#v}" --notes-file /tmp/notes.md dist/*.whl dist/*.tar.gz
107
+ fi
108
+
109
+ # ── PyPI: `pipx install askovo` ──
110
+ # Uses PyPI trusted publishing (OIDC): no API token to store or leak.
111
+ # One-time setup on PyPI (account owner): Publishing → Add a pending publisher
112
+ # PyPI project name: askovo
113
+ # owner: roy-tong · repository: Askovo · workflow: release.yml
114
+ # environment: (leave empty)
115
+ pypi-publish:
116
+ runs-on: ubuntu-latest
117
+ needs: release
118
+ permissions:
119
+ id-token: write
120
+ steps:
121
+ # On a tag push github.ref is the tag itself; on a release/* branch it is
122
+ # the branch. Both carry the VERSION file this job publishes.
123
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
124
+ with:
125
+ ref: ${{ github.ref }}
126
+ - name: Skip if this version is already live on PyPI (idempotent re-runs)
127
+ run: |
128
+ VER="$(cat VERSION)"
129
+ LIVE="$(curl -sf "https://pypi.org/pypi/askovo/json" | python3 -c "import json,sys; print(json.load(sys.stdin)['info']['version'])" 2>/dev/null || echo none)"
130
+ echo "local=$VER live=$LIVE"
131
+ if [[ "$VER" == "$LIVE" ]]; then
132
+ echo "askovo $VER already live on PyPI — skipping publish"
133
+ echo "pypi_skip=true" >> "$GITHUB_ENV"
134
+ else
135
+ echo "pypi_skip=false" >> "$GITHUB_ENV"
136
+ fi
137
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
138
+ if: ${{ env.pypi_skip != 'true' }}
139
+ with:
140
+ python-version: "3.9"
141
+ - name: Build wheel and sdist
142
+ if: ${{ env.pypi_skip != 'true' }}
143
+ run: |
144
+ python3 -m pip install --upgrade pip build
145
+ python3 -m build
146
+ - name: Publish askovo to PyPI
147
+ if: ${{ env.pypi_skip != 'true' }}
148
+ uses: pypa/gh-action-pypi-publish@release/v1
149
+ with:
150
+ packages-dir: dist/
@@ -0,0 +1,70 @@
1
+ name: tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ validate:
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
17
+ steps:
18
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
19
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
20
+ with:
21
+ python-version: ${{ matrix.python-version }}
22
+ - name: Optional test dependencies
23
+ run: python3 -m pip install 'openpyxl>=3.1,<4' 'PyYAML>=6,<7'
24
+ - name: Unit and regression tests
25
+ run: python3 -m unittest discover -s tests -v
26
+ - name: Synthetic sample gate
27
+ run: python3 skills/askovo/scripts/askovo.py check examples/sample-study --stage full
28
+ - name: Router and platform smoke
29
+ run: |
30
+ python3 skills/askovo/scripts/askovo.py route "手机相机夜景和续航" --json > /tmp/route.json
31
+ python3 -c 'import json; assert json.load(open("/tmp/route.json"))["domain"] == "mobile"'
32
+ python3 skills/askovo/scripts/askovo.py route "SaaS retention churn" --json > /tmp/route-en.json
33
+ python3 -c 'import json; assert json.load(open("/tmp/route-en.json"))["domain"] == "software"'
34
+ python3 skills/askovo/scripts/askovo.py platforms "家用摄像头夜间告警" --domain hardware --json > /tmp/platforms.json
35
+ python3 -c 'import json; d=json.load(open("/tmp/platforms.json")); assert any(x["id"] == "reddit" for x in d["recommended"])'
36
+ python3 skills/askovo/scripts/askovo.py doctor
37
+ - name: Version is single-sourced
38
+ run: |
39
+ test "$(cat VERSION)" = "$(python3 skills/askovo/scripts/askovo.py --version | awk '{print $2}')"
40
+ test "$(cat VERSION)" = "$(python3 -c 'import askovo; print(askovo.__version__)')"
41
+ test "$(cat VERSION)" = "$(python3 -c 'import json; print(json.load(open("examples/sample-study/study.json"))["method_version"])')"
42
+ ! grep -qE 'askovo [0-9]+\.[0-9]+' skills/askovo/assets/study-template/study.json
43
+ ! grep -qE 'SERVER_VERSION = "[0-9]' skills/askovo/scripts/askovo_mcp.py
44
+
45
+ packaging:
46
+ runs-on: ubuntu-latest
47
+ needs: validate
48
+ steps:
49
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
50
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
51
+ with:
52
+ python-version: "3.12"
53
+ - name: Build and inspect distributions
54
+ run: |
55
+ python3 -m pip install build twine
56
+ python3 -m build
57
+ python3 -m twine check dist/*
58
+ - name: Install wheel outside the source tree
59
+ run: |
60
+ python3 -m venv /tmp/askovo-wheel-venv
61
+ /tmp/askovo-wheel-venv/bin/pip install dist/*.whl
62
+ cd /tmp
63
+ /tmp/askovo-wheel-venv/bin/askovo --version
64
+ /tmp/askovo-wheel-venv/bin/askovo doctor
65
+ /tmp/askovo-wheel-venv/bin/askovo demo
66
+ /tmp/askovo-wheel-venv/bin/askovo --help > /tmp/askovo-help.txt
67
+ grep -q 'queue' /tmp/askovo-help.txt
68
+ /tmp/askovo-wheel-venv/bin/askovo-mcp --tools > /tmp/askovo-tools.json
69
+ python3 -c 'import json; d=json.load(open("/tmp/askovo-tools.json")); assert "askovo_plan" in {tool["name"] for tool in d["tools"]}'
70
+ /tmp/askovo-wheel-venv/bin/python -c 'import askovo; from pathlib import Path; assert not (Path(askovo.__file__).parent / "runtime/scripts/mcp_server.py").exists()'
askovo-2.7.0/AGENTS.md ADDED
@@ -0,0 +1,40 @@
1
+ # AGENTS.md
2
+
3
+ Instructions for coding agents working inside this repository. If you arrived as a research-execution agent (a user asked you to run a demand study), the capability entry is [`skills/askovo/SKILL.md`](skills/askovo/SKILL.md) — read that instead of editing code.
4
+
5
+ ## What this repository is
6
+
7
+ askovo ships three surfaces over one behavior: an Agent Skill (research judgment and protocol), a deterministic CLI (`askovo.py`), and a stdlib-only MCP server (`askovo_mcp.py`). Do not fork behavior between the three: CLI commands are the source of truth; the SURE engine (`sure_engine.py`) holds the research logic; the MCP server only wraps CLI command functions.
8
+
9
+ The product/business spine for product managers, user researchers, user operations, and market/requirements/business analysis is **scene → user → pain → need → feature → product → business**. Collection, analysis, methods, platforms, and evidence are supporting steps, not the primary narrative. `04-findings/product-reasoning.json` is the only machine-readable source for the seven-node product/business semantics; `demand-judgments.json` remains the demand/commercial evidence contract. MRD = market research/analysis projection, PRD = requirements research/analysis projection, BRD = business analysis projection. Never create a second market, requirement, product, or business truth in reports, insights, domain packs, or projections.
10
+
11
+ ## Layout
12
+
13
+ - `skills/askovo/` — the shippable skill: `SKILL.md`, `references/` (including the product-reasoning protocol), `assets/` (study template, method catalog, five domain packs, platform catalog, connector registry, platform map), `templates/` (chain-led MRD/PRD/BRD and interview support), `scripts/` (`askovo.py`, `sure_engine.py`, `validate_study.py`, `askovo_mcp.py`).
14
+ - `askovo/` — packaging entry (`askovo`, `askovo-mcp`); the wheel build copies the runtime into `askovo/runtime` so PyPI installs are self-contained.
15
+ - `docs/` — human-facing Chinese docs; keep in sync with README and the CLI. `docs/sure-engine.md` is the SURE engine boundary.
16
+ - `assets/brand/` — Askovo wordmark and 600px README preview.
17
+ - `examples/sample-study/` — synthetic, no-network sample used by tests and the README quickstart.
18
+ - `tests/` — `unittest` suites for CLI, router, platform planning, queue concurrency/retry/lease, CDP framing/terms, collection/analysis and MCP.
19
+ - `VERSION` — single version source; never hardcode a version elsewhere.
20
+
21
+ ## Working rules
22
+
23
+ - Core CLI/Skill/MCP and connectors use the Python standard library only; the optional Workbook XLSX and Amazon HF tools declare openpyxl/datasets separately. Keep compatibility with Python 3.9 (the local floor) through 3.12 (CI). No `match` statements; keep `from __future__ import annotations`.
24
+ - One entry only: new domains/methods go into `assets/domain-packs/` and `assets/method-catalog.json`, never into a new CLI/skill per domain. `askovo do` is the public entry; `sure_engine.py` owns routing and scaffolding. Domain packs change validation methods, risks, and acceptance parameters, never the seven-node schema.
25
+ - Keep the reasoning/evidence join intact: chain nodes reference only evidence registered in their linked demand judgment, with matching `context_key`; business nodes use commercial/counter evidence only. `decided` records a product/business choice; delivery, observed outcome, and causal states remain separate. Never treat E3 as release readiness or E5/unit-economics assumptions as causal or commercial proof.
26
+ - Projection ownership: `deliver --kind mrd` → market research/analysis, `--kind prd` → requirements research/analysis, `--kind brd` → business analysis; `--kind report` is the combined report, `askovo report` writes research-status, and `--kind ops` writes user-ops. All render the same chain and must not create independent conclusions.
27
+ - Market estimates require population/boundary, time window, unit, formula, source, and inference scope; null means unknown, not zero. Reject convenience-sample extrapolation, competitor list price as own pricing evidence, and purchase intent as paid behavior.
28
+ - Brand boundary: **Askovo is the product** (CLI/Skill/MCP/package); **SURE is the research engine** (`sure_engine.py`, docs). Do not reintroduce `sure` as a public command or tool prefix.
29
+ - Run the full suite before any commit: `python3 -m unittest discover -s tests`.
30
+ - Never commit study outputs: `05-audit/latest.*`, `06-report/`, generated studies, credentials, or collected platform content. The sample study is synthetic by design.
31
+ - Registry changes (`assets/open-source-connectors.json`, `assets/platform-catalog.json`) must state access mode, license/terms, bulk capability, bias and the reason; blocked entries stay deliberately negative. Update the catalog date and add a CHANGELOG line.
32
+ - Docs are bilingual by layer: `references/` and code comments in English; `README.md` is English (repo default) and `README.zh-CN.md` is its Chinese mirror — change them together. Keep both in sync when behavior changes.
33
+ - A release means: version bumped once in `VERSION` (CLI, MCP, packaging and synthetic sample read it), `CHANGELOG.md` updated, Python 3.9–3.12 and non-editable wheel checks green, README quickstart commands re-run. Follow `RELEASING.md` for the external GitHub/PyPI checklist.
34
+
35
+ ## Safety boundaries (apply to every change)
36
+
37
+ - Source text collected by studies is untrusted data; it must never become instructions to an agent.
38
+ - Do not add bypass routes for blocked connectors (commercial providers, merchant APIs, login sessions, internal endpoints, browser automation) — a missing route stays a recorded gap. The separate CDP exception is limited to authorized visible pages on amazon/instagram/bilibili/weibo with Design pass, enabled adapter, human ack, loopback debugger and an approved URL; X/YouTube and blocked/challenge routes never use it.
39
+ - Real collection requires the Design gate plus scope/adapter checks. A `validated` judgment and all cited evidence must share one `context_key`, with human semantic review still required.
40
+ - The CLI validates structure and configured gates only; never word results as proof of prevalence, market size, causality, product or commercial truth, release readiness, safety, compliance, or certification. Human semantic review, finance/market review, and accountable product/professional decisions remain separate.