goofish-cli 0.1.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 (64) hide show
  1. goofish_cli-0.1.0/.env.example +11 -0
  2. goofish_cli-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +54 -0
  3. goofish_cli-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +22 -0
  4. goofish_cli-0.1.0/.github/pull_request_template.md +26 -0
  5. goofish_cli-0.1.0/.github/workflows/ci.yml +57 -0
  6. goofish_cli-0.1.0/.github/workflows/publish.yml +42 -0
  7. goofish_cli-0.1.0/.gitignore +49 -0
  8. goofish_cli-0.1.0/CHANGELOG.md +32 -0
  9. goofish_cli-0.1.0/CONTRIBUTING.md +59 -0
  10. goofish_cli-0.1.0/LICENSE +190 -0
  11. goofish_cli-0.1.0/NOTICE +11 -0
  12. goofish_cli-0.1.0/PKG-INFO +279 -0
  13. goofish_cli-0.1.0/README.md +242 -0
  14. goofish_cli-0.1.0/docs/architecture.md +89 -0
  15. goofish_cli-0.1.0/docs/compliance.md +43 -0
  16. goofish_cli-0.1.0/docs/mcp-setup.md +69 -0
  17. goofish_cli-0.1.0/examples/README.md +8 -0
  18. goofish_cli-0.1.0/examples/publish_from_folder.py +70 -0
  19. goofish_cli-0.1.0/examples/watch_to_autoreply.sh +26 -0
  20. goofish_cli-0.1.0/pyproject.toml +66 -0
  21. goofish_cli-0.1.0/src/goofish_cli/__init__.py +1 -0
  22. goofish_cli-0.1.0/src/goofish_cli/cli.py +119 -0
  23. goofish_cli-0.1.0/src/goofish_cli/commands/__init__.py +0 -0
  24. goofish_cli-0.1.0/src/goofish_cli/commands/auth/__init__.py +0 -0
  25. goofish_cli-0.1.0/src/goofish_cli/commands/auth/login.py +66 -0
  26. goofish_cli-0.1.0/src/goofish_cli/commands/auth/reset_guard.py +16 -0
  27. goofish_cli-0.1.0/src/goofish_cli/commands/auth/status.py +40 -0
  28. goofish_cli-0.1.0/src/goofish_cli/commands/category/__init__.py +0 -0
  29. goofish_cli-0.1.0/src/goofish_cli/commands/category/recommend.py +64 -0
  30. goofish_cli-0.1.0/src/goofish_cli/commands/item/__init__.py +0 -0
  31. goofish_cli-0.1.0/src/goofish_cli/commands/item/delete.py +32 -0
  32. goofish_cli-0.1.0/src/goofish_cli/commands/item/get.py +34 -0
  33. goofish_cli-0.1.0/src/goofish_cli/commands/item/publish.py +175 -0
  34. goofish_cli-0.1.0/src/goofish_cli/commands/location/__init__.py +0 -0
  35. goofish_cli-0.1.0/src/goofish_cli/commands/location/default.py +40 -0
  36. goofish_cli-0.1.0/src/goofish_cli/commands/media/__init__.py +0 -0
  37. goofish_cli-0.1.0/src/goofish_cli/commands/media/upload.py +53 -0
  38. goofish_cli-0.1.0/src/goofish_cli/commands/message/__init__.py +0 -0
  39. goofish_cli-0.1.0/src/goofish_cli/commands/message/history.py +23 -0
  40. goofish_cli-0.1.0/src/goofish_cli/commands/message/send.py +102 -0
  41. goofish_cli-0.1.0/src/goofish_cli/commands/message/watch.py +58 -0
  42. goofish_cli-0.1.0/src/goofish_cli/core/__init__.py +26 -0
  43. goofish_cli-0.1.0/src/goofish_cli/core/errors.py +31 -0
  44. goofish_cli-0.1.0/src/goofish_cli/core/guard.py +63 -0
  45. goofish_cli-0.1.0/src/goofish_cli/core/limiter.py +60 -0
  46. goofish_cli-0.1.0/src/goofish_cli/core/mtop.py +131 -0
  47. goofish_cli-0.1.0/src/goofish_cli/core/output.py +82 -0
  48. goofish_cli-0.1.0/src/goofish_cli/core/registry.py +78 -0
  49. goofish_cli-0.1.0/src/goofish_cli/core/session.py +88 -0
  50. goofish_cli-0.1.0/src/goofish_cli/core/sign.py +37 -0
  51. goofish_cli-0.1.0/src/goofish_cli/core/strategy.py +10 -0
  52. goofish_cli-0.1.0/src/goofish_cli/core/token.py +88 -0
  53. goofish_cli-0.1.0/src/goofish_cli/core/ws.py +493 -0
  54. goofish_cli-0.1.0/src/goofish_cli/mcp_server.py +56 -0
  55. goofish_cli-0.1.0/src/goofish_cli/static/goofish_js_version_2.js +568 -0
  56. goofish_cli-0.1.0/tests/__init__.py +0 -0
  57. goofish_cli-0.1.0/tests/test_guard.py +46 -0
  58. goofish_cli-0.1.0/tests/test_limiter.py +29 -0
  59. goofish_cli-0.1.0/tests/test_mtop.py +40 -0
  60. goofish_cli-0.1.0/tests/test_publish_payload.py +70 -0
  61. goofish_cli-0.1.0/tests/test_registry.py +33 -0
  62. goofish_cli-0.1.0/tests/test_sign.py +29 -0
  63. goofish_cli-0.1.0/tests/test_ws_codec.py +127 -0
  64. goofish_cli-0.1.0/uv.lock +1291 -0
@@ -0,0 +1,11 @@
1
+ # cookie 文件路径(默认 ~/.goofish-cli/cookies.json)
2
+ GOOFISH_COOKIES_PATH=~/.goofish-cli/cookies.json
3
+
4
+ # 写操作限流:每分钟允许次数(默认 1,防风控)
5
+ GOOFISH_WRITE_RPM=1
6
+
7
+ # 风控熔断时长(分钟)
8
+ GOOFISH_CIRCUIT_BREAK_MINUTES=10
9
+
10
+ # 日志等级
11
+ GOOFISH_LOG_LEVEL=INFO
@@ -0,0 +1,54 @@
1
+ name: Bug report
2
+ description: 报告一个 bug
3
+ labels: [bug]
4
+ body:
5
+ - type: input
6
+ id: version
7
+ attributes:
8
+ label: goofish-cli 版本
9
+ placeholder: "运行 `goofish version` 获取"
10
+ validations:
11
+ required: true
12
+ - type: dropdown
13
+ id: os
14
+ attributes:
15
+ label: 操作系统
16
+ options: [macOS, Linux, Windows, WSL, 其他]
17
+ validations:
18
+ required: true
19
+ - type: input
20
+ id: py
21
+ attributes:
22
+ label: Python 版本
23
+ placeholder: "3.11 / 3.12"
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: repro
28
+ attributes:
29
+ label: 复现步骤
30
+ description: 请给出最小复现命令(**不要粘贴 cookie**)
31
+ placeholder: |
32
+ 1. `goofish auth login ...`
33
+ 2. `goofish item get 12345`
34
+ 3. 报错:...
35
+ validations:
36
+ required: true
37
+ - type: textarea
38
+ id: expected
39
+ attributes:
40
+ label: 期望行为
41
+ - type: textarea
42
+ id: actual
43
+ attributes:
44
+ label: 实际行为(含报错栈)
45
+ render: shell
46
+ validations:
47
+ required: true
48
+ - type: checkboxes
49
+ id: sensitive
50
+ attributes:
51
+ label: 敏感信息检查
52
+ options:
53
+ - label: 我已经从日志/示例中去除了 cookie、token、_m_h5_tk 等敏感信息
54
+ required: true
@@ -0,0 +1,22 @@
1
+ name: Feature request
2
+ description: 提个新功能 / 新命令
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: 要解决什么问题
9
+ placeholder: 现在没法 xxx;我在 yyy 场景下会被卡住
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: proposal
14
+ attributes:
15
+ label: 想要的接口 / 命令
16
+ placeholder: |
17
+ `goofish item list --status selling`
18
+ 返回:[{itemId, title, price, updatedAt}]
19
+ - type: textarea
20
+ id: alternatives
21
+ attributes:
22
+ label: 已考虑的替代方案
@@ -0,0 +1,26 @@
1
+ ## 改动描述
2
+ <!-- 简述这个 PR 在做什么。一句话。 -->
3
+
4
+ ## 动机 / 关联 issue
5
+ <!-- fix #xxx / close #yyy -->
6
+
7
+ ## 改动类型
8
+ - [ ] bug 修复
9
+ - [ ] 新功能
10
+ - [ ] 重构(不改变外部行为)
11
+ - [ ] 文档
12
+ - [ ] CI / 构建
13
+
14
+ ## 验证
15
+ <!-- 必填。贴出你做了什么真实验证。光单测绿不算完成。 -->
16
+ - [ ] `pytest` 全绿
17
+ - [ ] `ruff check src tests` 无告警
18
+ - [ ] 真实 CLI 跑通:`goofish <命令> ...` 的输出示例(粘贴在下方)
19
+
20
+ ```
21
+ # 粘贴命令 + 真实输出
22
+ ```
23
+
24
+ ## 合规
25
+ - [ ] 我确认没有把 cookie / _m_h5_tk / 任何账号敏感信息 commit 进代码或测试 fixture
26
+ - [ ] 我确认本 PR 不会被用于欺诈、刷单、违反闲鱼用户协议等行为
@@ -0,0 +1,57 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.11", "3.12"]
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Install Node.js (for execjs)
19
+ uses: actions/setup-node@v4
20
+ with:
21
+ node-version: "20"
22
+
23
+ - uses: actions/setup-python@v5
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+
27
+ - name: Install uv
28
+ run: pip install uv
29
+
30
+ - name: Install deps
31
+ run: |
32
+ uv venv
33
+ uv pip install -e ".[dev]"
34
+
35
+ - name: Lint (ruff)
36
+ run: uv run ruff check src tests
37
+
38
+ - name: Test (pytest)
39
+ run: uv run pytest -q
40
+
41
+ build:
42
+ needs: test
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+ - uses: actions/setup-python@v5
47
+ with:
48
+ python-version: "3.11"
49
+ - name: Build sdist + wheel
50
+ run: |
51
+ pip install build
52
+ python -m build
53
+ - name: Upload artifacts
54
+ uses: actions/upload-artifact@v4
55
+ with:
56
+ name: dist
57
+ path: dist/
@@ -0,0 +1,42 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.11"
17
+ - name: Build sdist + wheel
18
+ run: |
19
+ pip install build
20
+ python -m build
21
+ - name: Upload dist
22
+ uses: actions/upload-artifact@v4
23
+ with:
24
+ name: dist
25
+ path: dist/
26
+
27
+ publish:
28
+ needs: build
29
+ runs-on: ubuntu-latest
30
+ environment:
31
+ name: pypi
32
+ url: https://pypi.org/project/goofish-cli/
33
+ permissions:
34
+ id-token: write
35
+ steps:
36
+ - name: Download dist
37
+ uses: actions/download-artifact@v4
38
+ with:
39
+ name: dist
40
+ path: dist/
41
+ - name: Publish to PyPI (Trusted Publisher)
42
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,49 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ *.egg
11
+ .pytest_cache/
12
+ .mypy_cache/
13
+ .ruff_cache/
14
+ .coverage
15
+ htmlcov/
16
+
17
+ # Virtual env
18
+ .venv/
19
+ venv/
20
+ env/
21
+
22
+ # Secrets — NEVER commit
23
+ .env
24
+ .env.*
25
+ !.env.example
26
+ cookies.json
27
+ *cookies*.json
28
+ credentials.json
29
+
30
+ # IDE
31
+ .vscode/
32
+ .idea/
33
+ .DS_Store
34
+
35
+ # Logs / runtime
36
+ *.log
37
+ logs/
38
+ *.db
39
+ *.sqlite
40
+ *.sqlite3
41
+
42
+ # OS
43
+ Thumbs.db
44
+
45
+ # Scratch
46
+ /tmp_*
47
+ *.tmp.json
48
+ /frames.jsonl
49
+ /ws_diag*.jsonl
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.0] - 2026-04-21
10
+
11
+ ### Added
12
+ - 初始发布。12 个命令覆盖闲鱼核心运营链路:
13
+ - `auth`:login / status / reset-guard
14
+ - `item`:get / publish / delete
15
+ - `media upload`、`category recommend`、`location default`
16
+ - `message`:watch / history / send(WebSocket IM)
17
+ - `message watch` 三类事件分类输出(JSONL):
18
+ - `event=message`:收到消息正文
19
+ - `event=read`:对方已读回执(带 msg_ids)
20
+ - `event=new_msg`:轻量新消息通知(无正文,需 history 拉取)
21
+ - WebSocket 自动重连 + 指数退避
22
+ - 全局速率限制(令牌桶 1 写/分钟)+ RGV587 熔断器
23
+ - MCP server:`goofish-mcp` 同一命令集自动暴露给 Claude Code / Cursor / Codex
24
+ - 统一输出契约 `--format json/yaml/table/md/csv`
25
+ - 29 个单测
26
+
27
+ ### Notes
28
+ - 本版本需要用户手动从浏览器导入 cookie(含 `unb` / `_m_h5_tk` / `x5sec`)
29
+ - 遇到 `RGV587_ERROR` 风控时,需在浏览器完成滑块验证并**重新导出**带 `x5sec` 的 cookie
30
+
31
+ [Unreleased]: https://github.com/fancyboi999/goofish-cli/compare/v0.1.0...HEAD
32
+ [0.1.0]: https://github.com/fancyboi999/goofish-cli/releases/tag/v0.1.0
@@ -0,0 +1,59 @@
1
+ # Contributing to goofish-cli
2
+
3
+ 感谢参与 👋。本文档讲清楚:环境搭建、加命令的流程、写测试和验证的要求、合规红线。
4
+
5
+ ## 环境
6
+
7
+ ```bash
8
+ git clone https://github.com/fancyboi999/goofish-cli
9
+ cd goofish-cli
10
+ uv venv --python 3.11
11
+ uv pip install -e ".[dev]"
12
+ ```
13
+
14
+ 运行时依赖 Node.js(`pyexecjs` 跑签名 JS):
15
+
16
+ ```bash
17
+ brew install node # macOS
18
+ sudo apt install nodejs # Debian/Ubuntu
19
+ ```
20
+
21
+ ## 验证
22
+
23
+ ```bash
24
+ uv run pytest
25
+ uv run ruff check src tests
26
+ ```
27
+
28
+ 单测全绿 **不等于** 功能可用。下面三种情况是硬门槛:
29
+
30
+ 1. **新增 HTTP 命令** — 必须用 `goofish auth login` 后的真实 cookie 跑一次对应 `goofish <cmd>`,并把 ret/data 的要点贴到 PR。
31
+ 2. **新增 WebSocket 行为** — 必须让 `message watch` 跑起来并实际收到一条远端消息(或 send 到真实 cid),贴出现场日志。
32
+ 3. **改签名 / 风控相关** — 必须手工跑 `goofish auth status` 验证旧 cookie 仍有效,以及新逻辑不触发 `RGV587_ERROR` / `FAIL_SYS_USER_VALIDATE`。
33
+
34
+ "我只是小改" 也不能跳过。参考 [真实验证准则](./docs/architecture.md#验证准则)。
35
+
36
+ ## 加命令:典型流程
37
+
38
+ 1. 在 `src/goofish_cli/commands/<namespace>/<cmd>.py` 写一个函数
39
+ 2. 函数加 `@command(namespace="...", name="...", description="...", strategy=..., columns=[...], write=True/False)` 装饰器
40
+ 3. 入参用 `typer.Option / typer.Argument` 声明
41
+ 4. 返回 `dict` / `list[dict]`,格式由 `--format` 渲染
42
+ 5. 写单测:纯函数逻辑(解析/编码/状态)用 pytest 覆盖。HTTP/WS 不要 mock 骨架,走真实 Session 的要标 `@pytest.mark.integration`。
43
+ 6. 跑一次真实 CLI 验证,贴输出到 PR
44
+
45
+ 新命令自动被 `registry()` 发现,同时对 MCP server 可见。**无需**改别的地方。
46
+
47
+ ## 合规红线
48
+
49
+ - 任何情况下都**不要** commit cookie、`_m_h5_tk`、IM accessToken、可复现签名的 JSON fixture
50
+ - 新命令不得让工具更容易做:刷单、虚假交易、批量骚扰、规避平台封禁(例如"换设备重登"、"免滑块")
51
+ - 风控能用人工解(`goofish auth reset-guard` + 浏览器滑块)就用,别 PR "自动过滑块"、"自动生成 x5sec" 这类
52
+ - 写 demo 请脱敏:itemId 可公开,unb/cid 掩码处理
53
+
54
+ ## 风格
55
+
56
+ - `ruff check` 零告警
57
+ - 函数/类名用英文。用户可见的 description、log、error 用简体中文
58
+ - 每个文件开头一行中文说明它在干啥
59
+ - 避免无用注释 / 无用 docstring
@@ -0,0 +1,190 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for describing the origin of the Work and
141
+ reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Support. While redistributing the Work or
166
+ Derivative Works thereof, You may choose to offer, and charge a
167
+ fee for, acceptance of support, warranty, indemnity, or other
168
+ liability obligations and/or rights consistent with this License.
169
+ However, in accepting such obligations, You may act only on Your
170
+ own behalf and on Your sole responsibility, not on behalf of any
171
+ other Contributor, and only if You agree to indemnify, defend,
172
+ and hold each Contributor harmless for any liability incurred by,
173
+ or claims asserted against, such Contributor by reason of your
174
+ accepting any such warranty or support.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ Copyright 2026 fancy
179
+
180
+ Licensed under the Apache License, Version 2.0 (the "License");
181
+ you may not use this file except in compliance with the License.
182
+ You may obtain a copy of the License at
183
+
184
+ http://www.apache.org/licenses/LICENSE-2.0
185
+
186
+ Unless required by applicable law or agreed to in writing, software
187
+ distributed under the License is distributed on an "AS IS" BASIS,
188
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
189
+ See the License for the specific language governing permissions and
190
+ limitations under the License.
@@ -0,0 +1,11 @@
1
+ goofish-cli
2
+ Copyright 2026 fancy
3
+
4
+ This tool is provided for lawful automation of the user's own Goofish/Xianyu
5
+ (咸鱼) account. The authors explicitly disallow:
6
+ - Any use for fraud, scalping, or fake transactions
7
+ - Reselling this tool as a SaaS targeting the Goofish platform
8
+ - Any use that violates Goofish/Alibaba Terms of Service
9
+
10
+ Users are solely responsible for compliance with applicable laws and
11
+ platform policies.