agent-codinglanguage-mapper 1.0.0__py3-none-any.whl

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 (42) hide show
  1. agent_codinglanguage_mapper/__init__.py +20 -0
  2. agent_codinglanguage_mapper/__main__.py +4 -0
  3. agent_codinglanguage_mapper/_version.py +2 -0
  4. agent_codinglanguage_mapper/adapters/__init__.py +4 -0
  5. agent_codinglanguage_mapper/adapters/delphi.py +822 -0
  6. agent_codinglanguage_mapper/adapters/delphi_frontend/__init__.py +6 -0
  7. agent_codinglanguage_mapper/adapters/delphi_frontend/comment_builder.py +29 -0
  8. agent_codinglanguage_mapper/adapters/delphi_frontend/consts.py +345 -0
  9. agent_codinglanguage_mapper/adapters/delphi_frontend/grammar.py +460 -0
  10. agent_codinglanguage_mapper/adapters/delphi_frontend/lark_builder.py +2674 -0
  11. agent_codinglanguage_mapper/adapters/delphi_frontend/lark_tokens.py +237 -0
  12. agent_codinglanguage_mapper/adapters/delphi_frontend/lsp_server.py +1832 -0
  13. agent_codinglanguage_mapper/adapters/delphi_frontend/nodes.py +371 -0
  14. agent_codinglanguage_mapper/adapters/delphi_frontend/parser.py +193 -0
  15. agent_codinglanguage_mapper/adapters/delphi_frontend/preprocessor.py +997 -0
  16. agent_codinglanguage_mapper/adapters/delphi_frontend/project_discovery.py +518 -0
  17. agent_codinglanguage_mapper/adapters/delphi_frontend/project_indexer.py +319 -0
  18. agent_codinglanguage_mapper/adapters/delphi_frontend/semantic.py +375 -0
  19. agent_codinglanguage_mapper/adapters/delphi_frontend/semantic_builder.py +1384 -0
  20. agent_codinglanguage_mapper/adapters/delphi_frontend/source_reader.py +17 -0
  21. agent_codinglanguage_mapper/adapters/delphi_frontend/workspace.py +67 -0
  22. agent_codinglanguage_mapper/adapters/tree_sitter.py +1722 -0
  23. agent_codinglanguage_mapper/cli.py +138 -0
  24. agent_codinglanguage_mapper/discovery.py +1328 -0
  25. agent_codinglanguage_mapper/indexer.py +1102 -0
  26. agent_codinglanguage_mapper/integration.py +186 -0
  27. agent_codinglanguage_mapper/lsp_server.py +413 -0
  28. agent_codinglanguage_mapper/lsp_service.py +447 -0
  29. agent_codinglanguage_mapper/mapper.py +596 -0
  30. agent_codinglanguage_mapper/models.py +101 -0
  31. agent_codinglanguage_mapper/protocol.py +152 -0
  32. agent_codinglanguage_mapper/rendering.py +153 -0
  33. agent_codinglanguage_mapper/templates/opencode/plugins/codebase_map.ts +191 -0
  34. agent_codinglanguage_mapper/templates/skill/SKILL.md +52 -0
  35. agent_codinglanguage_mapper/worker.py +29 -0
  36. agent_codinglanguage_mapper/workspace.py +114 -0
  37. agent_codinglanguage_mapper-1.0.0.dist-info/METADATA +383 -0
  38. agent_codinglanguage_mapper-1.0.0.dist-info/RECORD +42 -0
  39. agent_codinglanguage_mapper-1.0.0.dist-info/WHEEL +5 -0
  40. agent_codinglanguage_mapper-1.0.0.dist-info/entry_points.txt +2 -0
  41. agent_codinglanguage_mapper-1.0.0.dist-info/licenses/LICENSE +373 -0
  42. agent_codinglanguage_mapper-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,138 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import os
6
+ import sys
7
+ from pathlib import Path
8
+ from typing import Sequence
9
+
10
+ from .integration import install_opencode, install_skill
11
+ from .mapper import CodebaseMapper
12
+ from .models import Language
13
+ from .rendering import layer_data, render_markdown, write_index
14
+ from .worker import serve_worker
15
+
16
+
17
+ LAYERS = (
18
+ "overview",
19
+ "projects",
20
+ "languages",
21
+ "files",
22
+ "file",
23
+ "symbols",
24
+ "symbol",
25
+ "implementation",
26
+ "references",
27
+ "problems",
28
+ )
29
+
30
+
31
+ def _root_argument(parser: argparse.ArgumentParser) -> None:
32
+ parser.add_argument("--root", type=Path, default=Path("."))
33
+
34
+
35
+ def build_parser() -> argparse.ArgumentParser:
36
+ parser = argparse.ArgumentParser(prog="codinglanguage-mapper")
37
+ subparsers = parser.add_subparsers(dest="command", required=True)
38
+
39
+ view = subparsers.add_parser("view", help="Render a layered codebase view.")
40
+ _root_argument(view)
41
+ view.add_argument("--project-file", type=Path)
42
+ view.add_argument("--layer", choices=LAYERS, required=True)
43
+ view.add_argument("--query", default="")
44
+ view.add_argument("--format", choices=("json", "markdown"), default="markdown")
45
+ view.add_argument("--language", dest="languages", action="append", choices=[item.value for item in Language])
46
+
47
+ index = subparsers.add_parser("index", help="Materialize a codebase index.")
48
+ _root_argument(index)
49
+ index.add_argument("--out", type=Path, default=Path(".codinglanguage-mapper/index/index.json"))
50
+
51
+ doctor = subparsers.add_parser("doctor", help="Report discovery and parser readiness.")
52
+ _root_argument(doctor)
53
+ doctor.add_argument("--format", choices=("json", "text"), default="text")
54
+
55
+ lsp = subparsers.add_parser("lsp", help="Start the multi-language LSP server.")
56
+ _root_argument(lsp)
57
+
58
+ worker = subparsers.add_parser("worker", help="Serve Protocol 3 NDJSON requests.")
59
+ _root_argument(worker)
60
+ worker.add_argument("--project-file", type=Path)
61
+
62
+ skill = subparsers.add_parser("skill", help="Install agent skills.")
63
+ skill_subparsers = skill.add_subparsers(dest="skill_command", required=True)
64
+ skill_install = skill_subparsers.add_parser("install")
65
+ skill_install.add_argument("--target", type=Path, default=Path("."))
66
+ skill_install.add_argument("--force", action="store_true")
67
+
68
+ opencode = subparsers.add_parser("opencode", help="Install OpenCode integration.")
69
+ opencode_subparsers = opencode.add_subparsers(dest="opencode_command", required=True)
70
+ opencode_install = opencode_subparsers.add_parser("install")
71
+ opencode_install.add_argument("--target", type=Path, default=Path("."))
72
+ opencode_install.add_argument("--python", default=sys.executable)
73
+ opencode_install.add_argument("--force", action="store_true")
74
+ opencode_install.add_argument("--write", "--write-config", dest="write_config", action="store_true")
75
+ return parser
76
+
77
+
78
+ def main(argv: Sequence[str] | None = None) -> int:
79
+ args = build_parser().parse_args(argv)
80
+ if args.command == "lsp":
81
+ from .lsp_server import main as lsp_main
82
+
83
+ os.chdir(args.root.expanduser().resolve())
84
+ lsp_main()
85
+ return 0
86
+ if args.command == "worker":
87
+ return serve_worker(args.root, sys.stdin, sys.stdout)
88
+ if args.command == "skill":
89
+ path = install_skill(args.target, force=args.force)
90
+ print(path)
91
+ return 0
92
+ if args.command == "opencode":
93
+ paths = install_opencode(
94
+ args.target,
95
+ python_executable=args.python,
96
+ force=args.force,
97
+ write_config=args.write_config,
98
+ )
99
+ print(json.dumps({"installed": [str(path) for path in paths]}, sort_keys=True))
100
+ return 0
101
+
102
+ with CodebaseMapper.open(args.root) as mapper:
103
+ if args.command == "view":
104
+ languages = tuple(Language(item) for item in (args.languages or ()))
105
+ data = layer_data(mapper, args.layer, query=args.query, languages=languages)
106
+ if args.format == "json":
107
+ print(json.dumps(data, indent=2, sort_keys=True))
108
+ else:
109
+ print(render_markdown(data, title=args.layer.replace("_", " ").title()), end="")
110
+ return 0
111
+ if args.command == "index":
112
+ path = write_index(mapper, args.out)
113
+ print(json.dumps({"path": str(path), "revision": mapper.snapshot.revision}, sort_keys=True))
114
+ return 0
115
+ report = _doctor_report(mapper)
116
+ if args.format == "json":
117
+ print(json.dumps(report, indent=2, sort_keys=True))
118
+ else:
119
+ status = "ready" if report["ok"] else "problems"
120
+ print(f"status: {status}")
121
+ print("languages: " + ", ".join(item.value for item in Language))
122
+ print(f"files: {report['files']}")
123
+ print(f"errors: {report['errors']}")
124
+ return 0 if report["ok"] else 1
125
+
126
+
127
+ def _doctor_report(mapper: CodebaseMapper) -> dict[str, object]:
128
+ errors = [item for item in mapper.snapshot.problems if item.severity == "error"]
129
+ return {
130
+ "ok": not errors,
131
+ "workspace": str(mapper.root),
132
+ "revision": mapper.snapshot.revision,
133
+ "languages": [item.value for item in Language],
134
+ "files": len(mapper.snapshot.files),
135
+ "symbols": len(mapper.snapshot.symbols),
136
+ "problems": len(mapper.snapshot.problems),
137
+ "errors": len(errors),
138
+ }