moai-adk 0.3.12__py3-none-any.whl → 0.3.13__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.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

moai_adk/__init__.py CHANGED
@@ -4,5 +4,5 @@
4
4
  SPEC-First TDD Framework with Alfred SuperAgent
5
5
  """
6
6
 
7
- __version__ = "0.3.12"
7
+ __version__ = "0.3.13"
8
8
  __all__ = ["__version__"]
@@ -1,4 +1,5 @@
1
1
  # @CODE:CORE-PROJECT-001 | SPEC: SPEC-CORE-PROJECT-001.md | TEST: tests/unit/test_language_detector.py
2
+ # @CODE:LANG-DETECT-001 | SPEC: SPEC-LANG-DETECT-001.md | TEST: tests/unit/test_detector.py
2
3
  """Language detector module.
3
4
 
4
5
  Automatically detects 20 programming languages.
@@ -8,9 +9,21 @@ from pathlib import Path
8
9
 
9
10
 
10
11
  class LanguageDetector:
11
- """Automatically detect up to 20 programming languages."""
12
+ """Automatically detect up to 20 programming languages.
13
+
14
+ Prioritizes framework-specific files (e.g., Laravel, Django) over
15
+ generic language files to improve accuracy in mixed-language projects.
16
+ """
12
17
 
13
18
  LANGUAGE_PATTERNS = {
19
+ # PHP moved to top for priority (Laravel detection)
20
+ "php": [
21
+ "*.php",
22
+ "composer.json",
23
+ "artisan", # Laravel: CLI tool (unique identifier)
24
+ "app/", # Laravel: application directory
25
+ "bootstrap/laravel.php" # Laravel: bootstrap file
26
+ ],
14
27
  "python": ["*.py", "pyproject.toml", "requirements.txt", "setup.py"],
15
28
  "typescript": ["*.ts", "tsconfig.json"],
16
29
  "javascript": ["*.js", "package.json"],
@@ -21,7 +34,6 @@ class LanguageDetector:
21
34
  "swift": ["*.swift", "Package.swift"],
22
35
  "kotlin": ["*.kt", "build.gradle.kts"],
23
36
  "csharp": ["*.cs", "*.csproj"],
24
- "php": ["*.php", "composer.json"],
25
37
  "ruby": ["*.rb", "Gemfile"],
26
38
  "elixir": ["*.ex", "mix.exs"],
27
39
  "scala": ["*.scala", "build.sbt"],
@@ -4,6 +4,10 @@
4
4
  SessionStart, SessionEnd 이벤트 처리
5
5
  """
6
6
 
7
+ import os
8
+ import time
9
+ from pathlib import Path
10
+
7
11
  from core import HookPayload, HookResult
8
12
  from core.checkpoint import list_checkpoints
9
13
  from core.project import count_specs, detect_language, get_git_info
@@ -29,14 +33,43 @@ def handle_session_start(payload: HookPayload) -> HookResult:
29
33
  SPEC Progress: {완료}/{전체} ({퍼센트}%)
30
34
  Checkpoints: {개수} available (최신 3개 표시)
31
35
 
36
+ Note:
37
+ - Claude Code는 SessionStart를 여러 번 호출할 수 있음
38
+ - 상태 파일 기반 중복 방지 메커니즘 사용
39
+ - 5초 이내 재호출은 무시 (같은 세션으로 간주)
40
+
32
41
  TDD History:
33
42
  - RED: 세션 시작 메시지 형식 테스트
34
43
  - GREEN: helper 함수 조합하여 상태 메시지 생성
35
44
  - REFACTOR: 메시지 포맷 개선, 가독성 향상, checkpoint 목록 추가
45
+ - FIX: 상태 파일 기반 중복 출력 방지 메커니즘 도입
36
46
 
37
47
  @TAG:CHECKPOINT-EVENT-001
38
48
  """
49
+ # 상태 파일 기반 중복 방지
39
50
  cwd = payload.get("cwd", ".")
51
+ # cwd가 "."인 경우 절대 경로로 변환하여 프로젝트명 추출
52
+ project_dir = Path(cwd).resolve()
53
+ session_file = Path("/tmp") / f"moai-session-{project_dir.name}.lock"
54
+
55
+ # 기존 세션 파일이 있고 5초 이내면 중복 실행으로 간주
56
+ if session_file.exists():
57
+ file_age = time.time() - session_file.stat().st_mtime
58
+ if file_age < 5.0:
59
+ return HookResult() # 중복 실행 방지
60
+
61
+ # 세션 파일 생성/갱신
62
+ session_file.touch()
63
+
64
+ # 1시간 이상 된 세션 파일 자동 정리
65
+ if session_file.parent.exists():
66
+ for old_file in session_file.parent.glob("moai-session-*.lock"):
67
+ try:
68
+ if time.time() - old_file.stat().st_mtime > 3600:
69
+ old_file.unlink()
70
+ except Exception:
71
+ pass # 정리 실패는 무시
72
+
40
73
  language = detect_language(cwd)
41
74
  git_info = get_git_info(cwd)
42
75
  specs = count_specs(cwd)
moai_adk/utils/banner.py CHANGED
@@ -9,12 +9,12 @@ from rich.console import Console
9
9
  console = Console()
10
10
 
11
11
  MOAI_BANNER = """
12
- ███╗ ███╗ ██████╗ █████╗ ██╗ █████╗ ██████╗ ██╗ ██╗
13
- ████╗ ████║██╔═══██╗██╔══██╗██║ ██╔══██╗██╔══██╗██║ ██╔╝
14
- ██╔████╔██║██║ ██║███████║██║█████╗███████║██║ ██║█████╔╝
15
- ██║╚██╔╝██║██║ ██║██╔══██║██║╚════╝██╔══██║██║ ██║██╔═██╗
16
- ██║ ╚═╝ ██║╚██████╔╝██║ ██║██║ ██║ ██║██████╔╝██║ ██╗
17
- ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
12
+ ███╗ ███╗ █████╗ ██╗ █████╗ ██████╗ ██╗ ██╗
13
+ ████╗ ████║ █████╗ ██╔══██╗██║ ██╔══██╗██╔══██╗██║ ██╔╝
14
+ ██╔████╔██║ ██╔══██╗███████║██║█████╗███████║██║ ██║█████╔╝
15
+ ██║╚██╔╝██║ ██║ ██║██╔══██║██║╚════╝██╔══██║██║ ██║██╔═██╗
16
+ ██║ ╚═╝ ██║ ╚█████╔╝██║ ██║██║ ██║ ██║██████╔╝██║ ██╗
17
+ ╚═╝ ╚═╝ ╚════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
18
18
  """
19
19
 
20
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: moai-adk
3
- Version: 0.3.12
3
+ Version: 0.3.13
4
4
  Summary: MoAI Agentic Development Kit - SPEC-First TDD with Alfred SuperAgent
5
5
  Project-URL: Homepage, https://github.com/modu-ai/moai-adk
6
6
  Project-URL: Repository, https://github.com/modu-ai/moai-adk
@@ -395,6 +395,10 @@ uv --version
395
395
  #### 2. moai-adk 설치 (10초)
396
396
 
397
397
  ```bash
398
+ # 권장: uv tool 모드 (샌드박스 격리, 전역 접근)
399
+ uv tool install moai-adk
400
+
401
+ # 대안: 현재 가상 환경에 설치
398
402
  uv pip install moai-adk
399
403
 
400
404
  # 설치 확인
@@ -1283,7 +1287,10 @@ Alfred가 모든 코드에 자동으로 적용하는 품질 기준입니다.
1283
1287
  ```bash
1284
1288
  moai-adk update
1285
1289
 
1286
- # 또는
1290
+ # 또는 (tool 모드 - 권장)
1291
+ uv tool upgrade moai-adk
1292
+
1293
+ # 또는 (pip 모드 - 레거시)
1287
1294
  uv pip install --upgrade moai-adk
1288
1295
  ```
1289
1296
 
@@ -1437,7 +1444,11 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
1437
1444
  # Windows:
1438
1445
  powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
1439
1446
 
1440
- # moai-adk 재설치
1447
+ # moai-adk 재설치 (tool 모드 - 권장)
1448
+ uv tool uninstall moai-adk
1449
+ uv tool install moai-adk
1450
+
1451
+ # 또는 (pip 모드 - 레거시)
1441
1452
  uv pip install moai-adk --force-reinstall
1442
1453
  ```
1443
1454
 
@@ -1,4 +1,4 @@
1
- moai_adk/__init__.py,sha256=zd7dqRoH0TwcrNnPYup0gctShF4cKVtbdpprX5vyo2g,217
1
+ moai_adk/__init__.py,sha256=fV6DuZDRF4C6PozXGMHTSE9EguZMEeYjEn27omz8zLI,217
2
2
  moai_adk/__main__.py,sha256=Wok19np6X4pxX4ybsGWS6McDZwoAN6iAvyLqFD9G5No,2419
3
3
  moai_adk/cli/__init__.py,sha256=tidIaJnd4Pje_5QYRq7OvRRst4T3kaPlkw5QcPQ3l1Y,135
4
4
  moai_adk/cli/main.py,sha256=mHACHi27AP2N7fg7zhzOo1tlF1Jrlw1_AcbxMfpGLVE,306
@@ -23,7 +23,7 @@ moai_adk/core/git/manager.py,sha256=lHFUQn8DGIvuhxC41cD5G3S6OgCpw9WkEOPVET97FJU,
23
23
  moai_adk/core/project/__init__.py,sha256=w_VdJ6lJDkTMdYYEwj0Io6Ay3ekqsLO3qXInSfXX7Vs,134
24
24
  moai_adk/core/project/backup_utils.py,sha256=SOdqgyWjFObcj1RuGAXn6wopamhITVi3wNmh56ZMMbk,2108
25
25
  moai_adk/core/project/checker.py,sha256=tN1A2OWsTafDCEWcafDJ4JXM217FUUdLYdnLtWpdDgs,9533
26
- moai_adk/core/project/detector.py,sha256=-Rhh8Bka224PuzARKQeaZQ8FJdZxVXP3FM3cXqMUaGs,3182
26
+ moai_adk/core/project/detector.py,sha256=ON2t0KYyaop3lxBcbEq5HIJGmnBLluA8k6GErmr4IM8,3733
27
27
  moai_adk/core/project/initializer.py,sha256=iFTb7d5537WL_zumY4kqV7UPSvUd1ZJQClvycJXF40E,6073
28
28
  moai_adk/core/project/phase_executor.py,sha256=m6FG3D1qPanbK-lifosGox-93SBxbGCkqMZSIajCaHY,10443
29
29
  moai_adk/core/project/validator.py,sha256=8LmfdfENv--Os05duarKfJTnO2NRHJIbXU5V0LsZ0Ds,5738
@@ -64,7 +64,7 @@ moai_adk/templates/.claude/hooks/alfred/core/context.py,sha256=-PHNNktkULYL9jpIj
64
64
  moai_adk/templates/.claude/hooks/alfred/core/project.py,sha256=h7s2D0e5zn0BKu3GReMVH93ojKOTkF6yyLWNnoJI6-0,9103
65
65
  moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py,sha256=mk1FQFj5V3rxyV1BQbd8bZE9R-IK4nanj61oO7jhbdw,577
66
66
  moai_adk/templates/.claude/hooks/alfred/handlers/notification.py,sha256=MjwaCRSbK4f-YvRC9CG4Rg8dhQir1gzPqF02x9O_4Gc,655
67
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py,sha256=6zz0uJ3cYtnY8gXtoP0cRf6LmmQUfggLWIJduokd-Jw,2783
67
+ moai_adk/templates/.claude/hooks/alfred/handlers/session.py,sha256=hQv5KH77Mb_q9Lq1OLGLnB5Wkqoe-0VpFJPblUuPW6k,4040
68
68
  moai_adk/templates/.claude/hooks/alfred/handlers/tool.py,sha256=bR7QpIYxuypQseWbAPmLYClS2wZUGbFflFj-IiiE26w,2224
69
69
  moai_adk/templates/.claude/hooks/alfred/handlers/user.py,sha256=iD0X_Aas8pwfFvPj30PaCPNs_Xo-9yVynxT27m-2O7k,1300
70
70
  moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md,sha256=-Y0V-fRRZbAUH1f4kZX0y8i0Lo7GRjJddBMeZ0WV6gA,17906
@@ -81,10 +81,10 @@ moai_adk/templates/.moai/project/product.md,sha256=ClDlG1q7P8aX4cjroXLUZIQGd2wBZ
81
81
  moai_adk/templates/.moai/project/structure.md,sha256=jesU7Om-fZANmj0NdgiU_oY0aT7102QWwuYy7Q-drKA,5180
82
82
  moai_adk/templates/.moai/project/tech.md,sha256=1BgkApeFqQCq6TPriGiev02G9niVx23cEA2RH-28dtw,6049
83
83
  moai_adk/utils/__init__.py,sha256=fv-UwHv8r4-eedwRnDA9hFjo5QSZYXjctKDyE7XF10g,220
84
- moai_adk/utils/banner.py,sha256=TmZyJKXOnJpdbdn6NZDJC6a4hm051QudEvOfiKQhvI8,1873
84
+ moai_adk/utils/banner.py,sha256=Cf7f3G7mB58MRQhOH4eYmywKYv8U_qS9yExWssSroC0,1853
85
85
  moai_adk/utils/logger.py,sha256=jYCWKvcN-tX17hZ-e2IPuHATwkQBFc_I1dd5fUTWxmY,5059
86
- moai_adk-0.3.12.dist-info/METADATA,sha256=j3QfFKZALqlfKz1yIPS0f1QhHVqlqmnqvqvHKbv5SS8,49933
87
- moai_adk-0.3.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
88
- moai_adk-0.3.12.dist-info/entry_points.txt,sha256=P9no1794UipqH72LP-ltdyfVd_MeB1WKJY_6-JQgV3U,52
89
- moai_adk-0.3.12.dist-info/licenses/LICENSE,sha256=M1M2b07fWcSWRM6_P3wbZKndZvyfHyYk_Wu9bS8F7o8,1069
90
- moai_adk-0.3.12.dist-info/RECORD,,
86
+ moai_adk-0.3.13.dist-info/METADATA,sha256=YzDWvOVCLEcVQCCcadWWQi_VwXYg0SGU2ocwiqc7hiw,50255
87
+ moai_adk-0.3.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
88
+ moai_adk-0.3.13.dist-info/entry_points.txt,sha256=P9no1794UipqH72LP-ltdyfVd_MeB1WKJY_6-JQgV3U,52
89
+ moai_adk-0.3.13.dist-info/licenses/LICENSE,sha256=M1M2b07fWcSWRM6_P3wbZKndZvyfHyYk_Wu9bS8F7o8,1069
90
+ moai_adk-0.3.13.dist-info/RECORD,,