moai-adk 0.8.0__py3-none-any.whl → 0.8.2__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/cli/commands/update.py +15 -4
- moai_adk/core/issue_creator.py +309 -0
- moai_adk/core/tags/__init__.py +87 -0
- moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/core/tags/reporter.py +959 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/core/template_engine.py +253 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +19 -12
- moai_adk/templates/.claude/agents/alfred/git-manager.md +45 -14
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +19 -12
- moai_adk/templates/.claude/agents/alfred/project-manager.md +29 -2
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +25 -2
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +26 -11
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +30 -8
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +27 -12
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +25 -2
- moai_adk/templates/.claude/commands/alfred/0-project.md +5 -0
- moai_adk/templates/.claude/commands/alfred/1-plan.md +17 -4
- moai_adk/templates/.claude/commands/alfred/2-run.md +7 -0
- moai_adk/templates/.claude/commands/alfred/3-sync.md +6 -0
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +149 -0
- moai_adk/templates/.claude/hooks/alfred/.moai/cache/version-check.json +9 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +258 -145
- moai_adk/templates/.claude/hooks/alfred/TROUBLESHOOTING.md +471 -0
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +92 -57
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/project.py +271 -15
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +21 -7
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +120 -0
- moai_adk/templates/.claude/settings.json +5 -5
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +56 -56
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +101 -100
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +3 -3
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +219 -219
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +287 -287
- moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +6 -6
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- moai_adk/templates/.github/workflows/moai-gitflow.yml +22 -16
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +182 -0
- moai_adk/templates/.github/workflows/release.yml +49 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +10 -6
- moai_adk/templates/.github/workflows/tag-report.yml +261 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +176 -0
- moai_adk/templates/.moai/config.json +18 -1
- moai_adk/templates/.moai/docs/quick-issue-creation-guide.md +219 -0
- moai_adk/templates/.moai/hooks/install.sh +79 -0
- moai_adk/templates/.moai/hooks/pre-commit.sh +66 -0
- moai_adk/templates/.moai/memory/ISSUE-LABEL-MAPPING.md +150 -0
- moai_adk/templates/CLAUDE.md +39 -40
- moai_adk/templates/src/moai_adk/core/__init__.py +5 -0
- moai_adk/templates/src/moai_adk/core/tags/__init__.py +87 -0
- moai_adk/templates/src/moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/templates/src/moai_adk/core/tags/cli.py +283 -0
- moai_adk/templates/src/moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/templates/src/moai_adk/core/tags/reporter.py +959 -0
- moai_adk/templates/src/moai_adk/core/tags/validator.py +897 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.8.2.dist-info}/METADATA +348 -1
- {moai_adk-0.8.0.dist-info → moai_adk-0.8.2.dist-info}/RECORD +89 -52
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
- moai_adk/templates/.moai/memory/config-schema.md +0 -444
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/tags.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/notification.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.8.2.dist-info}/WHEEL +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.8.2.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Template engine for parameterizing GitHub templates and other configuration files.
|
|
3
|
+
|
|
4
|
+
Supports Jinja2-style templating with variable substitution and conditional sections.
|
|
5
|
+
Enables users to customize MoAI-ADK templates for their own projects.
|
|
6
|
+
|
|
7
|
+
@TAG:TEMPLATE-ENGINE-001 - Template variable substitution system
|
|
8
|
+
@TAG:GITHUB-CUSTOMIZATION-001 - GitHub template parameterization
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Dict, Optional
|
|
13
|
+
|
|
14
|
+
from jinja2 import (
|
|
15
|
+
Environment,
|
|
16
|
+
FileSystemLoader,
|
|
17
|
+
StrictUndefined,
|
|
18
|
+
TemplateNotFound,
|
|
19
|
+
TemplateRuntimeError,
|
|
20
|
+
TemplateSyntaxError,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TemplateEngine:
|
|
25
|
+
"""
|
|
26
|
+
Jinja2-based template engine for MoAI-ADK configuration and GitHub templates.
|
|
27
|
+
|
|
28
|
+
Supports:
|
|
29
|
+
- Variable substitution: {{PROJECT_NAME}}, {{SPEC_DIR}}, etc.
|
|
30
|
+
- Conditional sections: {{#ENABLE_TRUST_5}}...{{/ENABLE_TRUST_5}}
|
|
31
|
+
- File-based and string-based template rendering
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, strict_undefined: bool = False):
|
|
35
|
+
"""
|
|
36
|
+
Initialize the template engine.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
strict_undefined: If True, raise error on undefined variables.
|
|
40
|
+
If False, render undefined variables as empty strings.
|
|
41
|
+
"""
|
|
42
|
+
self.strict_undefined = strict_undefined
|
|
43
|
+
self.undefined_behavior = StrictUndefined if strict_undefined else None
|
|
44
|
+
|
|
45
|
+
def render_string(
|
|
46
|
+
self,
|
|
47
|
+
template_string: str,
|
|
48
|
+
variables: Dict[str, Any]
|
|
49
|
+
) -> str:
|
|
50
|
+
"""
|
|
51
|
+
Render a Jinja2 template string with provided variables.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
template_string: The template content as a string
|
|
55
|
+
variables: Dictionary of variables to substitute
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
Rendered template string
|
|
59
|
+
|
|
60
|
+
Raises:
|
|
61
|
+
TemplateSyntaxError: If template syntax is invalid
|
|
62
|
+
TemplateRuntimeError: If variable substitution fails in strict mode
|
|
63
|
+
"""
|
|
64
|
+
try:
|
|
65
|
+
env = Environment(
|
|
66
|
+
undefined=self.undefined_behavior,
|
|
67
|
+
trim_blocks=False,
|
|
68
|
+
lstrip_blocks=False
|
|
69
|
+
)
|
|
70
|
+
template = env.from_string(template_string)
|
|
71
|
+
return template.render(**variables)
|
|
72
|
+
except (TemplateSyntaxError, TemplateRuntimeError) as e:
|
|
73
|
+
raise RuntimeError(f"Template rendering error: {e}")
|
|
74
|
+
|
|
75
|
+
def render_file(
|
|
76
|
+
self,
|
|
77
|
+
template_path: Path,
|
|
78
|
+
variables: Dict[str, Any],
|
|
79
|
+
output_path: Optional[Path] = None
|
|
80
|
+
) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Render a Jinja2 template file with provided variables.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
template_path: Path to the template file
|
|
86
|
+
variables: Dictionary of variables to substitute
|
|
87
|
+
output_path: If provided, write rendered content to this path
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Rendered template content
|
|
91
|
+
|
|
92
|
+
Raises:
|
|
93
|
+
FileNotFoundError: If template file doesn't exist
|
|
94
|
+
TemplateSyntaxError: If template syntax is invalid
|
|
95
|
+
TemplateRuntimeError: If variable substitution fails in strict mode
|
|
96
|
+
"""
|
|
97
|
+
if not template_path.exists():
|
|
98
|
+
raise FileNotFoundError(f"Template file not found: {template_path}")
|
|
99
|
+
|
|
100
|
+
template_dir = template_path.parent
|
|
101
|
+
template_name = template_path.name
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
env = Environment(
|
|
105
|
+
loader=FileSystemLoader(str(template_dir)),
|
|
106
|
+
undefined=self.undefined_behavior,
|
|
107
|
+
trim_blocks=False,
|
|
108
|
+
lstrip_blocks=False
|
|
109
|
+
)
|
|
110
|
+
template = env.get_template(template_name)
|
|
111
|
+
rendered = template.render(**variables)
|
|
112
|
+
|
|
113
|
+
if output_path:
|
|
114
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
115
|
+
output_path.write_text(rendered, encoding='utf-8')
|
|
116
|
+
|
|
117
|
+
return rendered
|
|
118
|
+
except TemplateNotFound:
|
|
119
|
+
raise FileNotFoundError(f"Template not found in {template_dir}: {template_name}")
|
|
120
|
+
except (TemplateSyntaxError, TemplateRuntimeError) as e:
|
|
121
|
+
raise RuntimeError(f"Template rendering error in {template_path}: {e}")
|
|
122
|
+
|
|
123
|
+
def render_directory(
|
|
124
|
+
self,
|
|
125
|
+
template_dir: Path,
|
|
126
|
+
output_dir: Path,
|
|
127
|
+
variables: Dict[str, Any],
|
|
128
|
+
pattern: str = "**/*.{md,yml,yaml,json}"
|
|
129
|
+
) -> Dict[str, str]:
|
|
130
|
+
"""
|
|
131
|
+
Render all template files in a directory.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
template_dir: Source directory containing templates
|
|
135
|
+
output_dir: Destination directory for rendered files
|
|
136
|
+
variables: Dictionary of variables to substitute
|
|
137
|
+
pattern: Glob pattern for files to process (default: template files)
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Dictionary mapping input paths to rendered content
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
FileNotFoundError: If template directory doesn't exist
|
|
144
|
+
"""
|
|
145
|
+
if not template_dir.exists():
|
|
146
|
+
raise FileNotFoundError(f"Template directory not found: {template_dir}")
|
|
147
|
+
|
|
148
|
+
results = {}
|
|
149
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
150
|
+
|
|
151
|
+
for template_file in template_dir.glob(pattern):
|
|
152
|
+
if template_file.is_file():
|
|
153
|
+
relative_path = template_file.relative_to(template_dir)
|
|
154
|
+
output_file = output_dir / relative_path
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
rendered = self.render_file(template_file, variables, output_file)
|
|
158
|
+
results[str(relative_path)] = rendered
|
|
159
|
+
except Exception as e:
|
|
160
|
+
raise RuntimeError(f"Error rendering {relative_path}: {e}")
|
|
161
|
+
|
|
162
|
+
return results
|
|
163
|
+
|
|
164
|
+
@staticmethod
|
|
165
|
+
def get_default_variables(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
166
|
+
"""
|
|
167
|
+
Extract template variables from project configuration.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
config: Project configuration dictionary (from .moai/config.json)
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Dictionary of template variables
|
|
174
|
+
"""
|
|
175
|
+
github_config = config.get("github", {}).get("templates", {})
|
|
176
|
+
project_config = config.get("project", {})
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
# Project information
|
|
180
|
+
"PROJECT_NAME": project_config.get("name", "MyProject"),
|
|
181
|
+
"PROJECT_DESCRIPTION": project_config.get("description", ""),
|
|
182
|
+
"PROJECT_MODE": project_config.get("mode", "team"), # team or personal
|
|
183
|
+
|
|
184
|
+
# Directory structure
|
|
185
|
+
"SPEC_DIR": github_config.get("spec_directory", ".moai/specs"),
|
|
186
|
+
"DOCS_DIR": github_config.get("docs_directory", ".moai/docs"),
|
|
187
|
+
"TEST_DIR": github_config.get("test_directory", "tests"),
|
|
188
|
+
|
|
189
|
+
# Feature flags
|
|
190
|
+
"ENABLE_TRUST_5": github_config.get("enable_trust_5", True),
|
|
191
|
+
"ENABLE_TAG_SYSTEM": github_config.get("enable_tag_system", True),
|
|
192
|
+
"ENABLE_ALFRED_COMMANDS": github_config.get("enable_alfred_commands", True),
|
|
193
|
+
|
|
194
|
+
# Language configuration
|
|
195
|
+
"CONVERSATION_LANGUAGE": project_config.get("conversation_language", "en"),
|
|
196
|
+
"CONVERSATION_LANGUAGE_NAME": project_config.get("conversation_language_name", "English"),
|
|
197
|
+
|
|
198
|
+
# Additional metadata
|
|
199
|
+
"MOAI_VERSION": config.get("moai", {}).get("version", "0.7.0"),
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class TemplateVariableValidator:
|
|
204
|
+
"""
|
|
205
|
+
Validates template variables for completeness and correctness.
|
|
206
|
+
Ensures all required variables are present before rendering.
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
REQUIRED_VARIABLES = {
|
|
210
|
+
"PROJECT_NAME": str,
|
|
211
|
+
"SPEC_DIR": str,
|
|
212
|
+
"DOCS_DIR": str,
|
|
213
|
+
"TEST_DIR": str,
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
OPTIONAL_VARIABLES = {
|
|
217
|
+
"PROJECT_DESCRIPTION": (str, type(None)),
|
|
218
|
+
"PROJECT_MODE": str,
|
|
219
|
+
"ENABLE_TRUST_5": bool,
|
|
220
|
+
"ENABLE_TAG_SYSTEM": bool,
|
|
221
|
+
"ENABLE_ALFRED_COMMANDS": bool,
|
|
222
|
+
"CONVERSATION_LANGUAGE": str,
|
|
223
|
+
"CONVERSATION_LANGUAGE_NAME": str,
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@classmethod
|
|
227
|
+
def validate(cls, variables: Dict[str, Any]) -> tuple[bool, list[str]]:
|
|
228
|
+
"""
|
|
229
|
+
Validate template variables.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
variables: Dictionary of variables to validate
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
Tuple of (is_valid, list_of_errors)
|
|
236
|
+
"""
|
|
237
|
+
errors = []
|
|
238
|
+
|
|
239
|
+
# Check required variables
|
|
240
|
+
for var_name, var_type in cls.REQUIRED_VARIABLES.items():
|
|
241
|
+
if var_name not in variables:
|
|
242
|
+
errors.append(f"Missing required variable: {var_name}")
|
|
243
|
+
elif not isinstance(variables[var_name], var_type):
|
|
244
|
+
errors.append(f"Invalid type for {var_name}: expected {var_type.__name__}, got {type(variables[var_name]).__name__}")
|
|
245
|
+
|
|
246
|
+
# Check optional variables (if present)
|
|
247
|
+
for var_name, var_type in cls.OPTIONAL_VARIABLES.items():
|
|
248
|
+
if var_name in variables:
|
|
249
|
+
if not isinstance(variables[var_name], var_type):
|
|
250
|
+
type_names = " or ".join(t.__name__ for t in var_type) if isinstance(var_type, tuple) else var_type.__name__
|
|
251
|
+
errors.append(f"Invalid type for {var_name}: expected {type_names}, got {type(variables[var_name]).__name__}")
|
|
252
|
+
|
|
253
|
+
return len(errors) == 0, errors
|
|
@@ -34,9 +34,32 @@ model: sonnet
|
|
|
34
34
|
|
|
35
35
|
## 🌍 Language Handling
|
|
36
36
|
|
|
37
|
-
**IMPORTANT**: You will
|
|
37
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
38
38
|
|
|
39
|
-
Alfred
|
|
39
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
40
|
+
|
|
41
|
+
**Language Guidelines**:
|
|
42
|
+
|
|
43
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
44
|
+
|
|
45
|
+
2. **Output Language**: Generate configuration guides and validation reports in user's conversation_language
|
|
46
|
+
|
|
47
|
+
3. **Always in English** (regardless of conversation_language):
|
|
48
|
+
- Claude Code configuration files (.md, .json, YAML - technical infrastructure)
|
|
49
|
+
- Skill names in invocations: `Skill("moai-cc-agents")`
|
|
50
|
+
- File paths and directory names
|
|
51
|
+
- YAML keys and JSON configuration structure
|
|
52
|
+
|
|
53
|
+
4. **Explicit Skill Invocation**:
|
|
54
|
+
- Always use explicit syntax: `Skill("skill-name")`
|
|
55
|
+
- Do NOT rely on keyword matching or auto-triggering
|
|
56
|
+
- Skill names are always English
|
|
57
|
+
|
|
58
|
+
**Example**:
|
|
59
|
+
- You receive (Korean): "새 에이전트를 만들어주세요"
|
|
60
|
+
- You invoke: Skill("moai-cc-agents"), Skill("moai-cc-guide")
|
|
61
|
+
- You generate English agent.md file (technical infrastructure)
|
|
62
|
+
- You provide Korean guidance and validation reports to user
|
|
40
63
|
|
|
41
64
|
---
|
|
42
65
|
|
|
@@ -20,21 +20,33 @@ You are the integrated debugging expert responsible for **all errors**.
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
26
|
-
- ✅ Perfect skill trigger matching (English Skill descriptions match English error analysis 100%)
|
|
27
|
-
- ✅ Consistent error diagnosis across languages
|
|
28
|
-
- ✅ Global multilingual support
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
29
26
|
|
|
30
|
-
**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- Alfred translates your findings back to user's language for response
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Generate error analysis and diagnostic reports in user's conversation_language
|
|
36
32
|
|
|
37
|
-
**
|
|
33
|
+
3. **Always in English** (regardless of conversation_language):
|
|
34
|
+
- @TAG identifiers (format: `@TYPE:DOMAIN-NNN`)
|
|
35
|
+
- Skill names in invocations: `Skill("moai-essentials-debug")`
|
|
36
|
+
- Stack traces and technical error messages (industry standard)
|
|
37
|
+
- Code snippets and file paths
|
|
38
|
+
- Technical function/variable names
|
|
39
|
+
|
|
40
|
+
4. **Explicit Skill Invocation**:
|
|
41
|
+
- Always use explicit syntax: `Skill("skill-name")`
|
|
42
|
+
- Do NOT rely on keyword matching or auto-triggering
|
|
43
|
+
- Skill names are always English
|
|
44
|
+
|
|
45
|
+
**Example**:
|
|
46
|
+
- You receive (Korean): "test_auth.py의 'AssertionError: token_expiry must be 30 minutes' 에러를 분석해주세요"
|
|
47
|
+
- You invoke: Skill("moai-essentials-debug"), Skill("moai-lang-python")
|
|
48
|
+
- You generate Korean diagnostic report with English technical terms
|
|
49
|
+
- Stack traces remain in English (standard practice)
|
|
38
50
|
|
|
39
51
|
## 🧰 Required Skills
|
|
40
52
|
|
|
@@ -20,21 +20,28 @@ All Git tasks are handled by the git-manager agent, including managing PRs, comm
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
26
|
-
- ✅ Perfect skill trigger matching (English Skill descriptions match English sync requirements 100%)
|
|
27
|
-
- ✅ Consistent document handling across languages
|
|
28
|
-
- ✅ Global multilingual support
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
29
26
|
|
|
30
|
-
**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- Alfred translates your sync reports back to user's language for response
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Generate documentation and sync reports in user's conversation_language
|
|
36
32
|
|
|
37
|
-
**
|
|
33
|
+
3. **Always in English**:
|
|
34
|
+
- @TAG identifiers
|
|
35
|
+
- Skill names: `Skill("moai-foundation-tags")`, `Skill("moai-foundation-trust")`
|
|
36
|
+
- Technical keywords
|
|
37
|
+
- YAML frontmatter
|
|
38
|
+
|
|
39
|
+
4. **Explicit Skill Invocation**: Always use `Skill("skill-name")` syntax
|
|
40
|
+
|
|
41
|
+
**Example**:
|
|
42
|
+
- You receive (Korean): "최근 코드 변경사항을 바탕으로 문서를 동기화해주세요"
|
|
43
|
+
- You invoke: Skill("moai-foundation-tags"), Skill("moai-alfred-tag-scanning")
|
|
44
|
+
- You generate Korean documentation with English @TAGs
|
|
38
45
|
|
|
39
46
|
## 🧰 Required Skills
|
|
40
47
|
|
|
@@ -20,21 +20,29 @@ This is a dedicated agent that optimizes and processes all Git operations in MoA
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
26
|
-
- ✅ All commit messages must be in English
|
|
27
|
-
- ✅ Branch names must follow English conventions
|
|
28
|
-
- ✅ PR titles and descriptions must be in English
|
|
29
|
-
- ✅ Do NOT create commit messages in user's conversation language
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
30
26
|
|
|
31
|
-
**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Status reports in user's conversation_language
|
|
32
|
+
|
|
33
|
+
3. **Always in English**:
|
|
34
|
+
- Git commit messages (always English)
|
|
35
|
+
- Branch names (always English)
|
|
36
|
+
- PR titles and descriptions (English)
|
|
37
|
+
- Skill names: `Skill("moai-foundation-git")`
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
4. **Explicit Skill Invocation**: Always use `Skill("skill-name")` syntax
|
|
40
|
+
|
|
41
|
+
**Example**:
|
|
42
|
+
- You receive (Korean): "SPEC-AUTH-001을 위한 feature 브랜치를 만들어주세요"
|
|
43
|
+
- You invoke: Skill("moai-foundation-git")
|
|
44
|
+
- You create English branch name: feature/SPEC-AUTH-001
|
|
45
|
+
- You provide Korean status report to user
|
|
38
46
|
|
|
39
47
|
## 🧰 Required Skills
|
|
40
48
|
|
|
@@ -358,9 +366,10 @@ Git-manager automatically handles the following exception situations:
|
|
|
358
366
|
**All commits created by git-manager follow this signature format**:
|
|
359
367
|
|
|
360
368
|
```
|
|
361
|
-
|
|
369
|
+
🎩 Alfred@MoAI
|
|
370
|
+
🔗 https://adk.mo.ai.kr
|
|
362
371
|
|
|
363
|
-
Co-Authored-By:
|
|
372
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
364
373
|
```
|
|
365
374
|
|
|
366
375
|
This signature applies to all Git operations:
|
|
@@ -370,6 +379,28 @@ This signature applies to all Git operations:
|
|
|
370
379
|
- Merge commits
|
|
371
380
|
- Tag creation
|
|
372
381
|
|
|
382
|
+
**Signature breakdown**:
|
|
383
|
+
- `🎩 Alfred@MoAI` - Alfred 에이전트의 공식 식별자
|
|
384
|
+
- `🔗 https://adk.mo.ai.kr` - MoAI-ADK 공식 홈페이지 링크
|
|
385
|
+
- `Co-Authored-By: Claude <noreply@anthropic.com>` - Claude AI 협력자 표시
|
|
386
|
+
|
|
387
|
+
**Implementation Example (HEREDOC)**:
|
|
388
|
+
```bash
|
|
389
|
+
git commit -m "$(cat <<'EOF'
|
|
390
|
+
feat(update): Implement 3-stage workflow with config version comparison
|
|
391
|
+
|
|
392
|
+
- Stage 2: Config version comparison (NEW)
|
|
393
|
+
- 70-80% performance improvement
|
|
394
|
+
- All tests passing
|
|
395
|
+
|
|
396
|
+
🎩 Alfred@MoAI
|
|
397
|
+
🔗 https://adk.mo.ai.kr
|
|
398
|
+
|
|
399
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
400
|
+
EOF
|
|
401
|
+
)"
|
|
402
|
+
```
|
|
403
|
+
|
|
373
404
|
---
|
|
374
405
|
|
|
375
406
|
**git-manager provides a simple and stable work environment with direct Git commands instead of complex scripts.**
|
|
@@ -20,21 +20,28 @@ You are an expert in analyzing SPECs to determine the optimal implementation str
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
26
|
-
- ✅ Perfect skill trigger matching (English Skill descriptions match English analysis 100%)
|
|
27
|
-
- ✅ Consistent architecture planning across languages
|
|
28
|
-
- ✅ Global multilingual support
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
29
26
|
|
|
30
|
-
**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- Alfred translates your plan back to user's language for response
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Generate implementation plans and analysis in user's conversation_language
|
|
36
32
|
|
|
37
|
-
**
|
|
33
|
+
3. **Always in English**:
|
|
34
|
+
- @TAG identifiers (format: `@TYPE:DOMAIN-NNN`)
|
|
35
|
+
- Skill names: `Skill("moai-alfred-language-detection")`, `Skill("moai-domain-backend")`
|
|
36
|
+
- Technical function/variable names
|
|
37
|
+
- Code examples
|
|
38
|
+
|
|
39
|
+
4. **Explicit Skill Invocation**: Always use `Skill("skill-name")` syntax
|
|
40
|
+
|
|
41
|
+
**Example**:
|
|
42
|
+
- You receive (Korean): "SPEC-AUTH-001을 분석하고 구현 전략을 만들어주세요"
|
|
43
|
+
- You invoke: Skill("moai-alfred-language-detection"), Skill("moai-domain-backend")
|
|
44
|
+
- You generate Korean implementation strategy with English technical terms
|
|
38
45
|
|
|
39
46
|
## 🧰 Required Skills
|
|
40
47
|
|
|
@@ -20,9 +20,36 @@ You are a Senior Project Manager Agent managing successful projects.
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
26
|
+
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Generate all project documentation in user's conversation_language
|
|
32
|
+
- product.md (product vision, goals, user stories)
|
|
33
|
+
- structure.md (architecture, directory structure)
|
|
34
|
+
- tech.md (technology stack, tooling decisions)
|
|
35
|
+
- Interview questions and responses
|
|
36
|
+
|
|
37
|
+
3. **Always in English** (regardless of conversation_language):
|
|
38
|
+
- @TAG identifiers (format: `@TYPE:DOMAIN-NNN`)
|
|
39
|
+
- Skill names in invocations: `Skill("moai-alfred-language-detection")`
|
|
40
|
+
- config.json keys and technical identifiers
|
|
41
|
+
- File paths and directory names
|
|
42
|
+
|
|
43
|
+
4. **Explicit Skill Invocation**:
|
|
44
|
+
- Always use explicit syntax: `Skill("skill-name")`
|
|
45
|
+
- Do NOT rely on keyword matching or auto-triggering
|
|
46
|
+
- Skill names are always English
|
|
47
|
+
|
|
48
|
+
**Example**:
|
|
49
|
+
- You receive (Korean): "새 프로젝트를 초기화해주세요"
|
|
50
|
+
- You invoke: Skill("moai-alfred-language-detection"), Skill("moai-domain-backend")
|
|
51
|
+
- You generate Korean product/structure/tech.md documents
|
|
52
|
+
- config.json contains English keys with localized values
|
|
26
53
|
|
|
27
54
|
## 🧰 Required Skills
|
|
28
55
|
|
|
@@ -20,9 +20,32 @@ You are a quality gate that automatically verifies TRUST principles and project
|
|
|
20
20
|
|
|
21
21
|
## 🌍 Language Handling
|
|
22
22
|
|
|
23
|
-
**IMPORTANT**: You will
|
|
23
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
24
24
|
|
|
25
|
-
Alfred
|
|
25
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
26
|
+
|
|
27
|
+
**Language Guidelines**:
|
|
28
|
+
|
|
29
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
30
|
+
|
|
31
|
+
2. **Output Language**: Generate quality verification reports in user's conversation_language
|
|
32
|
+
|
|
33
|
+
3. **Always in English** (regardless of conversation_language):
|
|
34
|
+
- @TAG identifiers (format: `@TYPE:DOMAIN-NNN`)
|
|
35
|
+
- Skill names in invocations: `Skill("moai-alfred-trust-validation")`
|
|
36
|
+
- Technical evaluation terms (PASS/WARNING/CRITICAL remain English for consistency)
|
|
37
|
+
- File paths and code snippets
|
|
38
|
+
- Technical metrics
|
|
39
|
+
|
|
40
|
+
4. **Explicit Skill Invocation**:
|
|
41
|
+
- Always use explicit syntax: `Skill("skill-name")`
|
|
42
|
+
- Do NOT rely on keyword matching or auto-triggering
|
|
43
|
+
- Skill names are always English
|
|
44
|
+
|
|
45
|
+
**Example**:
|
|
46
|
+
- You receive (Korean): "코드 품질을 검증해주세요"
|
|
47
|
+
- You invoke: Skill("moai-alfred-trust-validation"), Skill("moai-essentials-review")
|
|
48
|
+
- You generate Korean report with English technical terms (PASS/WARNING, @TAGs)
|
|
26
49
|
|
|
27
50
|
## 🧰 Required Skills
|
|
28
51
|
|
|
@@ -15,9 +15,37 @@ model: sonnet
|
|
|
15
15
|
|
|
16
16
|
## 🌍 Language Handling
|
|
17
17
|
|
|
18
|
-
**IMPORTANT**: You will
|
|
18
|
+
**IMPORTANT**: You will receive prompts in the user's **configured conversation_language**.
|
|
19
19
|
|
|
20
|
-
Alfred
|
|
20
|
+
Alfred passes the user's language directly to you via `Task()` calls.
|
|
21
|
+
|
|
22
|
+
**Language Guidelines**:
|
|
23
|
+
|
|
24
|
+
1. **Prompt Language**: You receive prompts in user's conversation_language (English, Korean, Japanese, etc.)
|
|
25
|
+
|
|
26
|
+
2. **Output Language**:
|
|
27
|
+
- User interactions (TUI surveys, questions, progress reports) in user's conversation_language
|
|
28
|
+
- **Generated Skill files** ALWAYS in **English** (technical infrastructure requirement)
|
|
29
|
+
|
|
30
|
+
3. **Always in English** (regardless of conversation_language):
|
|
31
|
+
- **Generated Skill content** (CRITICAL: Skills are global infrastructure in English)
|
|
32
|
+
- Skill names and identifiers
|
|
33
|
+
- YAML frontmatter and structure
|
|
34
|
+
- Code examples within Skills
|
|
35
|
+
- Technical documentation within Skills
|
|
36
|
+
- Skill invocation patterns: `Skill("skill-name")`
|
|
37
|
+
|
|
38
|
+
4. **Explicit Skill Invocation**:
|
|
39
|
+
- Always use explicit syntax: `Skill("skill-name")`
|
|
40
|
+
- Do NOT rely on keyword matching or auto-triggering
|
|
41
|
+
- Skill names are always English
|
|
42
|
+
|
|
43
|
+
**Example**:
|
|
44
|
+
- You receive (Korean): "새로운 Skill을 만들어주세요"
|
|
45
|
+
- You invoke: Skill("moai-cc-skills"), Skill("moai-alfred-interactive-questions")
|
|
46
|
+
- You conduct Korean survey with user
|
|
47
|
+
- You generate English Skill.md file (technical infrastructure)
|
|
48
|
+
- You provide Korean completion report to user
|
|
21
49
|
|
|
22
50
|
---
|
|
23
51
|
|