ccmd 2.0.8__tar.gz → 2.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 (55) hide show
  1. {ccmd-2.0.8/ccmd.egg-info → ccmd-2.1.0}/PKG-INFO +1 -1
  2. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/__init__.py +1 -1
  3. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/cli.py +126 -34
  4. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/shell_cmds.py +9 -5
  5. {ccmd-2.0.8 → ccmd-2.1.0/ccmd.egg-info}/PKG-INFO +1 -1
  6. {ccmd-2.0.8 → ccmd-2.1.0}/pyproject.toml +1 -1
  7. {ccmd-2.0.8 → ccmd-2.1.0}/LICENSE +0 -0
  8. {ccmd-2.0.8 → ccmd-2.1.0}/MANIFEST.in +0 -0
  9. {ccmd-2.0.8 → ccmd-2.1.0}/README.md +0 -0
  10. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/__main__.py +0 -0
  11. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/config/__init__.py +0 -0
  12. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/config/paths.py +0 -0
  13. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/config/schema.py +0 -0
  14. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/__init__.py +0 -0
  15. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/__init__.py +0 -0
  16. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/aider.py +0 -0
  17. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/base.py +0 -0
  18. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/chatgpt.py +0 -0
  19. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/claude.py +0 -0
  20. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/codex.py +0 -0
  21. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/cursor.py +0 -0
  22. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/goose.py +0 -0
  23. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/agents/grok.py +0 -0
  24. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/fs.py +0 -0
  25. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/launcher.py +0 -0
  26. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/migrate.py +0 -0
  27. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/profiles.py +0 -0
  28. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/projects.py +0 -0
  29. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/scan.py +0 -0
  30. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/sessions.py +0 -0
  31. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/core/ssh.py +0 -0
  32. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/mcp/__init__.py +0 -0
  33. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/mcp/server.py +0 -0
  34. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/__init__.py +0 -0
  35. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/app.py +0 -0
  36. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/ascii.py +0 -0
  37. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/__init__.py +0 -0
  38. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/agents.py +0 -0
  39. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/aliases.py +0 -0
  40. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/browser.py +0 -0
  41. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/hub.py +0 -0
  42. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/project_edit.py +0 -0
  43. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/sessions.py +0 -0
  44. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/screens/ssh.py +0 -0
  45. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/theme.py +0 -0
  46. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/widgets/__init__.py +0 -0
  47. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd/tui/widgets/spinner.py +0 -0
  48. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd.egg-info/SOURCES.txt +0 -0
  49. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd.egg-info/dependency_links.txt +0 -0
  50. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd.egg-info/entry_points.txt +0 -0
  51. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd.egg-info/requires.txt +0 -0
  52. {ccmd-2.0.8 → ccmd-2.1.0}/ccmd.egg-info/top_level.txt +0 -0
  53. {ccmd-2.0.8 → ccmd-2.1.0}/commands.yaml +0 -0
  54. {ccmd-2.0.8 → ccmd-2.1.0}/requirements.txt +0 -0
  55. {ccmd-2.0.8 → ccmd-2.1.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccmd
3
- Version: 2.0.8
3
+ Version: 2.1.0
4
4
  Summary: ccmd — Agentic Project Hub. Pick a project, pick an agent, launch.
5
5
  Author-email: De Catalyst <Robert5560newton@gmail.com>
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
1
  """ccmd 2.0 — Agentic Project Hub."""
2
2
 
3
- __version__ = "2.0.8"
3
+ __version__ = "2.1.0"
4
4
  __all__ = ["__version__"]
@@ -20,33 +20,133 @@ from ccmd.core.sessions import SessionStore
20
20
  from ccmd.core.ssh import SSHStore
21
21
 
22
22
 
23
+ # Rich colors for agent columns / badges
24
+ _AGENT_STYLE = {
25
+ "claude": "dark_orange3",
26
+ "grok": "bright_white",
27
+ "codex": "green",
28
+ "cursor": "medium_purple",
29
+ "goose": "yellow",
30
+ "aider": "cyan",
31
+ "chatgpt": "sea_green3",
32
+ }
33
+
34
+
35
+ def _agent_meta() -> list[dict]:
36
+ """Logo + name + id for every agent (order matches variants)."""
37
+ from ccmd.core.agents import all_agents
38
+
39
+ return [
40
+ {
41
+ "id": a.id,
42
+ "name": a.display_name,
43
+ "logo": a.ascii_logo,
44
+ "color": a.brand_color,
45
+ "style": _AGENT_STYLE.get(a.id, "white"),
46
+ }
47
+ for a in all_agents()
48
+ ]
49
+
50
+
23
51
  def _print_cmd_rows(rows: list, *, verbose: bool = False) -> None:
52
+ """Full ccmds view: base cmd + every agent variant with logo & name."""
53
+ try:
54
+ from rich import box
55
+ from rich.console import Console
56
+ from rich.table import Table
57
+ from rich.text import Text
58
+
59
+ console = Console(highlight=False)
60
+ use_rich = True
61
+ except Exception:
62
+ use_rich = False
63
+
24
64
  if not rows:
25
65
  print("no matching commands")
26
66
  return
27
- for r in rows:
28
- v = r["variants"]
29
- print(
30
- f"{r['short']:<10} {r['project']:<20} "
31
- f"default={r['default_agent']:<8} "
32
- f"{v.get('claude',''):<10} {v.get('grok',''):<10} "
33
- f"{v.get('codex',''):<10} {v.get('cursor',''):<10}"
67
+
68
+ agents = _agent_meta()
69
+
70
+ if use_rich:
71
+ console = Console(highlight=False)
72
+
73
+ # legend once
74
+ legend = Text()
75
+ legend.append("agents ", style="dim")
76
+ for a in agents:
77
+ legend.append(f"{a['logo']} ", style=a["style"])
78
+ legend.append(f"{a['name']}", style=a["style"])
79
+ legend.append(" ", style="dim")
80
+ console.print(legend)
81
+ console.print()
82
+
83
+ table = Table(
84
+ show_header=True,
85
+ header_style="bold bright_cyan",
86
+ border_style="bright_black",
87
+ box=box.SIMPLE_HEAVY,
88
+ pad_edge=False,
89
+ expand=False,
90
+ show_lines=False,
91
+ )
92
+ table.add_column("cmd", style="bold bright_cyan", no_wrap=True)
93
+ table.add_column("project", style="white", no_wrap=True)
94
+ table.add_column("default", style="magenta", no_wrap=True)
95
+ for a in agents:
96
+ # header: logo + short id
97
+ hdr = Text()
98
+ hdr.append(f"{a['logo']}\n", style=a["style"])
99
+ hdr.append(a["id"][:6], style=f"dim {a['style']}")
100
+ table.add_column(hdr, justify="center", no_wrap=True)
101
+ if verbose:
102
+ table.add_column("path", style="dim", overflow="ellipsis", max_width=36)
103
+
104
+ for r in rows:
105
+ cells: list = [
106
+ Text(r["short"], style="bold bright_cyan"),
107
+ Text(r["project"], style="white"),
108
+ Text(r["default_agent"], style="magenta"),
109
+ ]
110
+ for a in agents:
111
+ fn = r["variants"].get(a["id"], "")
112
+ is_default = r["default_agent"] == a["id"]
113
+ style = a["style"] if is_default else f"dim {a['style']}"
114
+ # mark default with *
115
+ label = f"{fn}*" if is_default and fn else fn
116
+ cells.append(Text(label, style=style))
117
+ if verbose:
118
+ cells.append(Text(r["path"], style="dim"))
119
+ table.add_row(*cells)
120
+
121
+ console.print(table)
122
+ console.print()
123
+ console.print(
124
+ f"[dim]{len(rows)} project(s)[/] "
125
+ f"[dim]·[/] [bright_cyan]cmd[/][dim] = default agent[/] "
126
+ f"[dim]·[/] [bright_cyan]*[/][dim] = project default[/] "
127
+ f"[dim]·[/] [bright_cyan]ccmds ana[/][dim] filter[/] "
128
+ f"[dim]·[/] [bright_cyan]ccmds -v[/][dim] show paths[/]"
34
129
  )
35
- if verbose or len(rows) == 1:
36
- print(f"{'':10} path {r['path']}")
37
- print(
38
- f"{'':10} all "
39
- + " ".join(f"{aid}={fn}" for aid, fn in v.items())
40
- )
41
- print(f"\n{len(rows)} project(s) · helper: ccmds · file: use ccmd shell list")
130
+ return
131
+
132
+ # plain fallback — still show all agent cmds
133
+ headers = ["cmd", "project", "default"] + [a["id"][:6] for a in agents]
134
+ print(" ".join(f"{h:<10}" for h in headers))
135
+ print("-" * (12 * len(headers)))
136
+ for r in rows:
137
+ cols = [r["short"], r["project"], r["default_agent"]]
138
+ for a in agents:
139
+ cols.append(r["variants"].get(a["id"], ""))
140
+ print(" ".join(f"{c:<10}" for c in cols))
141
+ if verbose:
142
+ print(f" {r['path']}")
143
+ print(f"\n{len(rows)} project(s) · * default agent on project")
42
144
 
43
145
 
44
146
  def _cmd_shell(args: argparse.Namespace) -> int:
45
147
  from ccmd.core.shell_cmds import (
46
- format_cmds_block,
47
148
  install_shell_hook,
48
149
  list_cmd_rows,
49
- shell_cmds_path,
50
150
  write_shell_cmds,
51
151
  )
52
152
 
@@ -61,40 +161,32 @@ def _cmd_shell(args: argparse.Namespace) -> int:
61
161
  for rc in rcs:
62
162
  print(f"hooked {rc}")
63
163
  print("restart shell or: source ~/.ccmd/shell_cmds.sh")
64
- print("then: ccmds # list all")
164
+ print("then: ccmds # all cmds + agents with logos")
165
+ print(" ccmds ana # filter one project")
65
166
  print(" ana / anac / anag …")
66
167
  if verbose:
67
- _print_cmd_rows(list_cmd_rows(), verbose=False)
168
+ _print_cmd_rows(list_cmd_rows(), verbose=True)
68
169
  return 0
69
170
  if sub == "regen":
70
171
  path, shorts = write_shell_cmds()
71
172
  print(f"regenerated {path} ({len(shorts)} projects)")
72
- rows = list_cmd_rows(filter_text=filt)
73
- _print_cmd_rows(rows, verbose=verbose)
74
- return 0
75
- if sub == "list":
76
- rows = list_cmd_rows(filter_text=filt)
77
- _print_cmd_rows(rows, verbose=verbose or bool(filt))
78
- print(f"file: {shell_cmds_path()}")
173
+ _print_cmd_rows(list_cmd_rows(filter_text=filt), verbose=verbose)
79
174
  return 0
80
- if sub == "show" and filt:
81
- rows = list_cmd_rows(filter_text=filt)
82
- _print_cmd_rows(rows, verbose=True)
175
+ if sub in ("list", "show"):
176
+ _print_cmd_rows(list_cmd_rows(filter_text=filt), verbose=verbose)
83
177
  return 0
84
178
  print("usage: ccmd shell install|regen|list [--filter NAME] [-v]", file=sys.stderr)
85
- print(" ccmds # shell helper (after: source ~/.ccmd/shell_cmds.sh)", file=sys.stderr)
179
+ print(" ccmds # full table with agent logos", file=sys.stderr)
86
180
  return 1
87
181
 
88
182
 
89
183
  def _cmd_cmds(args: argparse.Namespace) -> int:
90
- """Top-level: ccmd cmds [--list] [filter] — same as shell list."""
91
- from ccmd.core.shell_cmds import list_cmd_rows, shell_cmds_path
184
+ """Top-level: ccmd cmds [name] [-v] — same as ccmds."""
185
+ from ccmd.core.shell_cmds import list_cmd_rows
92
186
 
93
187
  filt = args.filter or args.name
94
188
  rows = list_cmd_rows(filter_text=filt)
95
- _print_cmd_rows(rows, verbose=bool(filt) or args.verbose)
96
- print(f"file: {shell_cmds_path()}")
97
- print("tip: ccmds (shell function) after source ~/.ccmd/shell_cmds.sh")
189
+ _print_cmd_rows(rows, verbose=bool(args.verbose))
98
190
  return 0
99
191
 
100
192
 
@@ -243,18 +243,22 @@ def render_shell_cmds(projects: list, shorts: dict[str, str]) -> str:
243
243
  )
244
244
  lines.append("")
245
245
 
246
- # helper: list all short commands from the shell
246
+ # helper: full table cmd + every agent logo/name/variant
247
247
  lines.extend(
248
248
  [
249
- "# list every project short command",
249
+ "# list all short commands with agent logos & variants",
250
250
  "ccmds() {",
251
251
  ' if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then',
252
- ' echo "ccmds list all short commands"',
253
- ' echo "ccmds <name> show one project (e.g. ccmds ana)"',
252
+ ' echo "ccmds all projects + agent cmds (logos)"',
253
+ ' echo "ccmds -v include full paths"',
254
+ ' echo "ccmds <name> filter (e.g. ccmds ana)"',
254
255
  ' echo "ccmds -l|--list same as bare ccmds"',
255
- ' echo "ccmd shell list full CLI list"',
256
256
  " return 0",
257
257
  " fi",
258
+ ' if [ "$1" = "-v" ] || [ "$1" = "--verbose" ]; then',
259
+ ' command ccmd shell list -v',
260
+ " return $?",
261
+ " fi",
258
262
  ' if [ -z "$1" ] || [ "$1" = "-l" ] || [ "$1" = "--list" ]; then',
259
263
  ' command ccmd shell list',
260
264
  " return $?",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccmd
3
- Version: 2.0.8
3
+ Version: 2.1.0
4
4
  Summary: ccmd — Agentic Project Hub. Pick a project, pick an agent, launch.
5
5
  Author-email: De Catalyst <Robert5560newton@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ccmd"
7
- version = "2.0.8"
7
+ version = "2.1.0"
8
8
  description = "ccmd — Agentic Project Hub. Pick a project, pick an agent, launch."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes