chatup 0.0.1__tar.gz → 0.2.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 (59) hide show
  1. chatup-0.2.0/PKG-INFO +48 -0
  2. chatup-0.2.0/README.md +30 -0
  3. {chatup-0.0.1 → chatup-0.2.0}/pyproject.toml +18 -3
  4. {chatup-0.0.1 → chatup-0.2.0}/src/chatup/__init__.py +1 -1
  5. chatup-0.2.0/src/chatup/cli.py +25 -0
  6. chatup-0.2.0/src/chatup/const.py +35 -0
  7. chatup-0.2.0/src/chatup/interaction/__init__.py +64 -0
  8. chatup-0.2.0/src/chatup/interaction/command_schema.py +62 -0
  9. chatup-0.2.0/src/chatup/interaction/policy.py +49 -0
  10. chatup-0.2.0/src/chatup/interaction/warnings.py +24 -0
  11. chatup-0.2.0/src/chatup/setup/__init__.py +0 -0
  12. chatup-0.2.0/src/chatup/setup/assets/hermes/install.sh +2837 -0
  13. chatup-0.2.0/src/chatup/setup/assets/nvm.sh +4285 -0
  14. chatup-0.2.0/src/chatup/setup/cc_connect.py +63 -0
  15. chatup-0.2.0/src/chatup/setup/chrome.py +188 -0
  16. chatup-0.2.0/src/chatup/setup/claude.py +239 -0
  17. chatup-0.2.0/src/chatup/setup/cli.py +17 -0
  18. chatup-0.2.0/src/chatup/setup/codex.py +454 -0
  19. chatup-0.2.0/src/chatup/setup/docker.py +160 -0
  20. chatup-0.2.0/src/chatup/setup/elements.py +702 -0
  21. chatup-0.2.0/src/chatup/setup/frp.py +290 -0
  22. chatup-0.2.0/src/chatup/setup/hermes.py +549 -0
  23. chatup-0.2.0/src/chatup/setup/lark_cli.py +425 -0
  24. chatup-0.2.0/src/chatup/setup/mode_prompt.py +22 -0
  25. chatup-0.2.0/src/chatup/setup/nodejs.py +438 -0
  26. chatup-0.2.0/src/chatup/setup/opencode.py +428 -0
  27. chatup-0.2.0/src/chatup/setup/shell_rc.py +74 -0
  28. chatup-0.2.0/src/chatup/setup/workspace/__init__.py +3 -0
  29. chatup-0.2.0/src/chatup/setup/workspace/cli.py +246 -0
  30. chatup-0.2.0/src/chatup/setup/workspace/core.py +77 -0
  31. chatup-0.2.0/src/chatup/setup/workspace/options.py +232 -0
  32. chatup-0.2.0/src/chatup/setup/workspace/render.py +170 -0
  33. chatup-0.2.0/src/chatup/setup/workspace/templates/default/en/AGENTS.md +80 -0
  34. chatup-0.2.0/src/chatup/setup/workspace/templates/default/en/projects/README.md +113 -0
  35. chatup-0.2.0/src/chatup/setup/workspace/templates/default/zh/AGENTS.md +80 -0
  36. chatup-0.2.0/src/chatup/setup/workspace/templates/default/zh/projects/README.md +121 -0
  37. chatup-0.2.0/src/chatup/setup/workspace.py +3 -0
  38. chatup-0.2.0/src/chatup/setup/zsh.py +428 -0
  39. chatup-0.2.0/src/chatup/utils/__init__.py +0 -0
  40. chatup-0.2.0/src/chatup/utils/custom_logger.py +110 -0
  41. chatup-0.2.0/src/chatup/utils/pathing.py +40 -0
  42. chatup-0.2.0/src/chatup.egg-info/PKG-INFO +48 -0
  43. chatup-0.2.0/src/chatup.egg-info/SOURCES.txt +51 -0
  44. chatup-0.2.0/src/chatup.egg-info/requires.txt +4 -0
  45. chatup-0.2.0/tests/test_pyproject_metadata.py +46 -0
  46. chatup-0.2.0/tests/test_setup_cli.py +104 -0
  47. chatup-0.2.0/tests/test_version.py +23 -0
  48. chatup-0.2.0/tests/test_workspace_setup.py +102 -0
  49. chatup-0.0.1/PKG-INFO +0 -38
  50. chatup-0.0.1/README.md +0 -22
  51. chatup-0.0.1/src/chatup.egg-info/PKG-INFO +0 -38
  52. chatup-0.0.1/src/chatup.egg-info/SOURCES.txt +0 -11
  53. chatup-0.0.1/src/chatup.egg-info/requires.txt +0 -2
  54. chatup-0.0.1/tests/test_version.py +0 -5
  55. {chatup-0.0.1 → chatup-0.2.0}/LICENSE +0 -0
  56. {chatup-0.0.1 → chatup-0.2.0}/setup.cfg +0 -0
  57. {chatup-0.0.1 → chatup-0.2.0}/src/chatup.egg-info/dependency_links.txt +0 -0
  58. {chatup-0.0.1 → chatup-0.2.0}/src/chatup.egg-info/entry_points.txt +0 -0
  59. {chatup-0.0.1 → chatup-0.2.0}/src/chatup.egg-info/top_level.txt +0 -0
chatup-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,48 @@
1
+ Metadata-Version: 2.4
2
+ Name: chatup
3
+ Version: 0.2.0
4
+ Summary: ChatArch setup CLI extracted from ChatTool
5
+ Author-email: rexwzh <1073853456@qq.com>
6
+ License-Expression: MIT
7
+ Keywords: chatup,chatarch,setup,cli
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.9
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: click>=8.0
14
+ Requires-Dist: chatstyle<0.2.0,>=0.1.0
15
+ Requires-Dist: chatenv<0.3.0,>=0.2.0
16
+ Requires-Dist: colorama
17
+ Dynamic: license-file
18
+
19
+ # chatup
20
+
21
+ ChatUp is the standalone ChatArch setup CLI. It is the first-level replacement for `chattool setup`: commands such as `chattool setup workspace` become `chatup workspace` while preserving the same interactive/non-interactive CLI conventions.
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ chatup --help
27
+ chatup doctor
28
+ ```
29
+
30
+ ## Development
31
+
32
+ ```bash
33
+ python -m pytest -q
34
+ python -m build
35
+ python -m twine check dist/*
36
+ ```
37
+
38
+ ## Layout
39
+
40
+ - `src/chatup/`: package source code
41
+ - `tests/`: package tests
42
+ - `cli-tests/`: real CLI tests, doc-first
43
+ - `mock-cli-tests/`: mock/fake CLI tests, doc-first
44
+ - `docs/`: long-lived project docs
45
+
46
+ ## Release
47
+
48
+ Release is tag-driven. A `vX.Y.Z` tag must match `src/chatup/__init__.py::__version__`; the publish workflow builds and publishes to PyPI through Trusted Publishing/OIDC when the PyPI project is configured for `ChatArch/ChatUp`, workflow `.github/workflows/publish.yml`, environment `pypi`.
chatup-0.2.0/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # chatup
2
+
3
+ ChatUp is the standalone ChatArch setup CLI. It is the first-level replacement for `chattool setup`: commands such as `chattool setup workspace` become `chatup workspace` while preserving the same interactive/non-interactive CLI conventions.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ chatup --help
9
+ chatup doctor
10
+ ```
11
+
12
+ ## Development
13
+
14
+ ```bash
15
+ python -m pytest -q
16
+ python -m build
17
+ python -m twine check dist/*
18
+ ```
19
+
20
+ ## Layout
21
+
22
+ - `src/chatup/`: package source code
23
+ - `tests/`: package tests
24
+ - `cli-tests/`: real CLI tests, doc-first
25
+ - `mock-cli-tests/`: mock/fake CLI tests, doc-first
26
+ - `docs/`: long-lived project docs
27
+
28
+ ## Release
29
+
30
+ Release is tag-driven. A `vX.Y.Z` tag must match `src/chatup/__init__.py::__version__`; the publish workflow builds and publishes to PyPI through Trusted Publishing/OIDC when the PyPI project is configured for `ChatArch/ChatUp`, workflow `.github/workflows/publish.yml`, environment `pypi`.
@@ -5,13 +5,18 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "chatup"
7
7
  dynamic = ["version"]
8
- description = "Chattool Setup"
8
+ description = "ChatArch setup CLI extracted from ChatTool"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
11
11
  license = "MIT"
12
- dependencies = ["click>=8.0", "chatstyle"]
12
+ dependencies = [
13
+ "click>=8.0",
14
+ "chatstyle>=0.1.0,<0.2.0",
15
+ "chatenv>=0.2.0,<0.3.0",
16
+ "colorama",
17
+ ]
13
18
  authors = [{name = "rexwzh", email = "1073853456@qq.com"}]
14
- keywords = ["chatup", "cli"]
19
+ keywords = ["chatup", "chatarch", "setup", "cli"]
15
20
  classifiers = [
16
21
  "Programming Language :: Python :: 3",
17
22
  "Operating System :: OS Independent",
@@ -28,3 +33,13 @@ where = ["src"]
28
33
 
29
34
  [tool.setuptools]
30
35
  include-package-data = true
36
+
37
+ [tool.setuptools.package-data]
38
+ "chatup.setup" = [
39
+ "assets/*.sh",
40
+ "assets/hermes/*.sh",
41
+ "workspace/templates/default/zh/*.md",
42
+ "workspace/templates/default/zh/projects/*.md",
43
+ "workspace/templates/default/en/*.md",
44
+ "workspace/templates/default/en/projects/*.md",
45
+ ]
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.1"
5
+ __version__ = "0.2.0"
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ import click
4
+
5
+ from chatup import __version__
6
+ from chatup.setup.cli import register_setup_commands
7
+
8
+
9
+ @click.group(context_settings={"help_option_names": ["-h", "--help"]})
10
+ @click.version_option(__version__, prog_name="chatup")
11
+ def main() -> None:
12
+ """ChatUp CLI for ChatArch bootstrap workflows."""
13
+
14
+
15
+ @main.command(name="doctor")
16
+ def doctor() -> None:
17
+ """Check that ChatUp is installed and callable."""
18
+ click.echo(f"chatup {__version__} ok")
19
+
20
+
21
+ register_setup_commands(main)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ main()
@@ -0,0 +1,35 @@
1
+ from pathlib import Path
2
+
3
+ from chatenv.configs import OpenAIConfig
4
+ from chatenv.fields import BaseEnvConfig
5
+ from chatenv.paths import get_paths
6
+
7
+ # ChatTool 7.0.0 uses the ChatArch env root directly. Old platformdirs based
8
+ # paths are intentionally not used as fallback.
9
+ CHATARCH_PATHS = get_paths()
10
+ CHATARCH_HOME = CHATARCH_PATHS.home_dir
11
+ CHATARCH_ENV_DIR = CHATARCH_PATHS.envs_dir
12
+ CHATARCH_ENV_FILE = CHATARCH_ENV_DIR / ".env"
13
+ CHATARCH_CACHE_DIR = CHATARCH_HOME / "cache" / "chatup"
14
+ CHATARCH_CONFIG_DIR = CHATARCH_HOME / "config" / "chatup"
15
+ CHATTOOL_REPO_DIR = Path(__file__).parent.parent.parent
16
+
17
+ CHATARCH_ENV_DIR.mkdir(parents=True, exist_ok=True)
18
+ CHATARCH_CACHE_DIR.mkdir(parents=True, exist_ok=True)
19
+
20
+ # setup environment variables
21
+ # explicit args > environment > typed env files > default values
22
+ BaseEnvConfig.load_all(CHATARCH_ENV_DIR)
23
+
24
+ # Inject loaded values into current namespace for setup modules that read constants.
25
+ globals().update(BaseEnvConfig.get_all_values())
26
+
27
+ _api_base = globals().get("OPENAI_API_BASE")
28
+
29
+ # Final fallback
30
+ if not _api_base:
31
+ _api_base = "https://api.openai.com/v1"
32
+
33
+ OPENAI_API_BASE = _api_base
34
+ # Update the config object as well, just in case
35
+ OpenAIConfig.OPENAI_API_BASE.value = _api_base
@@ -0,0 +1,64 @@
1
+ """Shared CLI interaction helpers."""
2
+
3
+ from chatstyle import (
4
+ BACK_VALUE,
5
+ CHECKBOX_SELECTED_INDICATOR,
6
+ CHECKBOX_UNSELECTED_INDICATOR,
7
+ ask_checkbox,
8
+ ask_checkbox_with_controls,
9
+ ask_confirm,
10
+ ask_path,
11
+ ask_select,
12
+ ask_text,
13
+ create_choice,
14
+ get_separator,
15
+ get_style,
16
+ is_interactive_available,
17
+ prompt_sensitive_value,
18
+ prompt_text_value,
19
+ resolve_value,
20
+ )
21
+
22
+ from .command_schema import (
23
+ CommandConstraint,
24
+ CommandField,
25
+ CommandSchema,
26
+ add_interactive_option,
27
+ resolve_command_inputs,
28
+ )
29
+ from .policy import (
30
+ abort_if_force_without_tty,
31
+ abort_if_missing_without_tty,
32
+ normalize_interactive,
33
+ resolve_interactive_mode,
34
+ )
35
+ from .warnings import install_cli_warning_filters
36
+
37
+ __all__ = [
38
+ "BACK_VALUE",
39
+ "CHECKBOX_SELECTED_INDICATOR",
40
+ "CHECKBOX_UNSELECTED_INDICATOR",
41
+ "CommandConstraint",
42
+ "CommandField",
43
+ "CommandSchema",
44
+ "add_interactive_option",
45
+ "abort_if_force_without_tty",
46
+ "abort_if_missing_without_tty",
47
+ "ask_checkbox",
48
+ "ask_checkbox_with_controls",
49
+ "ask_confirm",
50
+ "ask_path",
51
+ "ask_select",
52
+ "ask_text",
53
+ "create_choice",
54
+ "get_separator",
55
+ "get_style",
56
+ "install_cli_warning_filters",
57
+ "is_interactive_available",
58
+ "normalize_interactive",
59
+ "prompt_sensitive_value",
60
+ "prompt_text_value",
61
+ "resolve_command_inputs",
62
+ "resolve_interactive_mode",
63
+ "resolve_value",
64
+ ]
@@ -0,0 +1,62 @@
1
+ """ChatTool policy adapter for external :mod:`chatstyle` command schemas."""
2
+
3
+ from chatstyle import (
4
+ CommandConstraint,
5
+ CommandField,
6
+ CommandSchema,
7
+ InteractiveResolution,
8
+ add_interactive_option,
9
+ )
10
+ from chatstyle import resolve_command_inputs as _resolve_command_inputs
11
+ from chatstyle.tui.prompt import ask_confirm, ask_path, ask_select, ask_text
12
+
13
+ from .policy import resolve_interactive_mode
14
+
15
+
16
+ def resolve_command_inputs(*, schema, provided, interactive, usage):
17
+ """Resolve command inputs through ChatStyle while preserving old patch points."""
18
+
19
+ return _resolve_command_inputs(
20
+ schema=schema,
21
+ provided=provided,
22
+ interactive=interactive,
23
+ usage=usage,
24
+ prompt_runtime_override=_PromptRuntime,
25
+ interactive_resolver_override=_resolve_interactive_for_chatstyle,
26
+ )
27
+
28
+
29
+ class _PromptRuntime:
30
+ ask_confirm = staticmethod(lambda *args, **kwargs: ask_confirm(*args, **kwargs))
31
+ ask_path = staticmethod(lambda *args, **kwargs: ask_path(*args, **kwargs))
32
+ ask_select = staticmethod(lambda *args, **kwargs: ask_select(*args, **kwargs))
33
+ ask_text = staticmethod(lambda *args, **kwargs: ask_text(*args, **kwargs))
34
+
35
+
36
+ def _resolve_interactive_for_chatstyle(*, interactive, auto_prompt_condition):
37
+ (
38
+ normalized,
39
+ can_prompt,
40
+ force_interactive,
41
+ _auto_interactive,
42
+ need_prompt,
43
+ ) = resolve_interactive_mode(interactive, auto_prompt_condition)
44
+ return InteractiveResolution(
45
+ interactive=normalized,
46
+ can_prompt=can_prompt,
47
+ force_interactive=force_interactive,
48
+ need_prompt=need_prompt,
49
+ )
50
+
51
+ __all__ = [
52
+ "CommandConstraint",
53
+ "CommandField",
54
+ "CommandSchema",
55
+ "InteractiveResolution",
56
+ "add_interactive_option",
57
+ "ask_confirm",
58
+ "ask_path",
59
+ "ask_select",
60
+ "ask_text",
61
+ "resolve_command_inputs",
62
+ ]
@@ -0,0 +1,49 @@
1
+ """Interactive policy helpers shared across CLI commands."""
2
+
3
+ import click
4
+
5
+ from chatstyle import FORCE_INTERACTIVE_NO_TTY_MESSAGE
6
+ from chatstyle import is_interactive_available as _is_interactive_available
7
+
8
+
9
+ def is_interactive_available():
10
+ return _is_interactive_available()
11
+
12
+
13
+ def normalize_interactive(interactive):
14
+ ctx = click.get_current_context(silent=True)
15
+ if ctx:
16
+ try:
17
+ if (
18
+ ctx.get_parameter_source("interactive")
19
+ == click.core.ParameterSource.DEFAULT
20
+ ):
21
+ return None
22
+ except Exception:
23
+ pass
24
+ return interactive
25
+
26
+
27
+ def resolve_interactive_mode(interactive, auto_prompt_condition):
28
+ interactive = normalize_interactive(interactive)
29
+ can_prompt = is_interactive_available()
30
+ force_interactive = interactive is True
31
+ auto_interactive = interactive is None and can_prompt and auto_prompt_condition
32
+ need_prompt = force_interactive or auto_interactive
33
+ return interactive, can_prompt, force_interactive, auto_interactive, need_prompt
34
+
35
+
36
+ def abort_if_force_without_tty(force_interactive, can_prompt, usage):
37
+ if force_interactive and not can_prompt:
38
+ click.echo(FORCE_INTERACTIVE_NO_TTY_MESSAGE, err=True)
39
+ click.echo(usage, err=True)
40
+ raise click.Abort()
41
+
42
+
43
+ def abort_if_missing_without_tty(
44
+ missing_required, interactive, can_prompt, message, usage
45
+ ):
46
+ if missing_required and interactive is None and not can_prompt:
47
+ click.echo(message, err=True)
48
+ click.echo(usage, err=True)
49
+ raise click.Abort()
@@ -0,0 +1,24 @@
1
+ """Warning filters for ChatTool CLI entrypoints."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import warnings
6
+
7
+
8
+ def install_cli_warning_filters() -> None:
9
+ """Hide noisy third-party warnings that do not affect CLI behavior."""
10
+ warnings.filterwarnings(
11
+ "ignore",
12
+ message="pkg_resources is deprecated as an API.*",
13
+ category=UserWarning,
14
+ )
15
+ warnings.filterwarnings(
16
+ "ignore",
17
+ message=r"Deprecated call to `pkg_resources\.declare_namespace.*",
18
+ category=DeprecationWarning,
19
+ )
20
+ warnings.filterwarnings(
21
+ "ignore",
22
+ message="There is no current event loop",
23
+ category=DeprecationWarning,
24
+ )
File without changes