raise-cli 2.2.1__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.
- raise_cli/__init__.py +38 -0
- raise_cli/__main__.py +30 -0
- raise_cli/adapters/__init__.py +91 -0
- raise_cli/adapters/declarative/__init__.py +26 -0
- raise_cli/adapters/declarative/adapter.py +267 -0
- raise_cli/adapters/declarative/discovery.py +94 -0
- raise_cli/adapters/declarative/expressions.py +150 -0
- raise_cli/adapters/declarative/reference/__init__.py +1 -0
- raise_cli/adapters/declarative/reference/github.yaml +143 -0
- raise_cli/adapters/declarative/schema.py +98 -0
- raise_cli/adapters/filesystem.py +299 -0
- raise_cli/adapters/mcp_bridge.py +10 -0
- raise_cli/adapters/mcp_confluence.py +246 -0
- raise_cli/adapters/mcp_jira.py +405 -0
- raise_cli/adapters/models.py +205 -0
- raise_cli/adapters/protocols.py +180 -0
- raise_cli/adapters/registry.py +90 -0
- raise_cli/adapters/sync.py +149 -0
- raise_cli/agents/__init__.py +14 -0
- raise_cli/agents/antigravity.yaml +8 -0
- raise_cli/agents/claude.yaml +8 -0
- raise_cli/agents/copilot.yaml +8 -0
- raise_cli/agents/copilot_plugin.py +124 -0
- raise_cli/agents/cursor.yaml +7 -0
- raise_cli/agents/roo.yaml +8 -0
- raise_cli/agents/windsurf.yaml +8 -0
- raise_cli/artifacts/__init__.py +30 -0
- raise_cli/artifacts/models.py +43 -0
- raise_cli/artifacts/reader.py +55 -0
- raise_cli/artifacts/renderer.py +104 -0
- raise_cli/artifacts/story_design.py +69 -0
- raise_cli/artifacts/writer.py +45 -0
- raise_cli/backlog/__init__.py +1 -0
- raise_cli/backlog/sync.py +115 -0
- raise_cli/cli/__init__.py +3 -0
- raise_cli/cli/commands/__init__.py +3 -0
- raise_cli/cli/commands/_resolve.py +153 -0
- raise_cli/cli/commands/adapters.py +362 -0
- raise_cli/cli/commands/artifact.py +137 -0
- raise_cli/cli/commands/backlog.py +333 -0
- raise_cli/cli/commands/base.py +31 -0
- raise_cli/cli/commands/discover.py +551 -0
- raise_cli/cli/commands/docs.py +130 -0
- raise_cli/cli/commands/doctor.py +177 -0
- raise_cli/cli/commands/gate.py +223 -0
- raise_cli/cli/commands/graph.py +1086 -0
- raise_cli/cli/commands/info.py +81 -0
- raise_cli/cli/commands/init.py +746 -0
- raise_cli/cli/commands/journal.py +167 -0
- raise_cli/cli/commands/mcp.py +524 -0
- raise_cli/cli/commands/memory.py +467 -0
- raise_cli/cli/commands/pattern.py +348 -0
- raise_cli/cli/commands/profile.py +59 -0
- raise_cli/cli/commands/publish.py +80 -0
- raise_cli/cli/commands/release.py +338 -0
- raise_cli/cli/commands/session.py +528 -0
- raise_cli/cli/commands/signal.py +410 -0
- raise_cli/cli/commands/skill.py +350 -0
- raise_cli/cli/commands/skill_set.py +145 -0
- raise_cli/cli/error_handler.py +158 -0
- raise_cli/cli/main.py +163 -0
- raise_cli/compat.py +66 -0
- raise_cli/config/__init__.py +41 -0
- raise_cli/config/agent_plugin.py +105 -0
- raise_cli/config/agent_registry.py +233 -0
- raise_cli/config/agents.py +120 -0
- raise_cli/config/ide.py +32 -0
- raise_cli/config/paths.py +379 -0
- raise_cli/config/settings.py +180 -0
- raise_cli/context/__init__.py +42 -0
- raise_cli/context/analyzers/__init__.py +16 -0
- raise_cli/context/analyzers/models.py +36 -0
- raise_cli/context/analyzers/protocol.py +43 -0
- raise_cli/context/analyzers/python.py +292 -0
- raise_cli/context/builder.py +1569 -0
- raise_cli/context/diff.py +213 -0
- raise_cli/context/extractors/__init__.py +13 -0
- raise_cli/context/extractors/skills.py +121 -0
- raise_cli/core/__init__.py +37 -0
- raise_cli/core/files.py +66 -0
- raise_cli/core/text.py +174 -0
- raise_cli/core/tools.py +441 -0
- raise_cli/discovery/__init__.py +50 -0
- raise_cli/discovery/analyzer.py +691 -0
- raise_cli/discovery/drift.py +355 -0
- raise_cli/discovery/scanner.py +1687 -0
- raise_cli/doctor/__init__.py +4 -0
- raise_cli/doctor/checks/__init__.py +1 -0
- raise_cli/doctor/checks/environment.py +110 -0
- raise_cli/doctor/checks/project.py +238 -0
- raise_cli/doctor/fix.py +80 -0
- raise_cli/doctor/models.py +56 -0
- raise_cli/doctor/protocol.py +43 -0
- raise_cli/doctor/registry.py +100 -0
- raise_cli/doctor/report.py +141 -0
- raise_cli/doctor/runner.py +95 -0
- raise_cli/engines/__init__.py +3 -0
- raise_cli/exceptions.py +215 -0
- raise_cli/gates/__init__.py +19 -0
- raise_cli/gates/builtin/__init__.py +1 -0
- raise_cli/gates/builtin/coverage.py +52 -0
- raise_cli/gates/builtin/lint.py +48 -0
- raise_cli/gates/builtin/tests.py +48 -0
- raise_cli/gates/builtin/types.py +48 -0
- raise_cli/gates/models.py +40 -0
- raise_cli/gates/protocol.py +41 -0
- raise_cli/gates/registry.py +141 -0
- raise_cli/governance/__init__.py +11 -0
- raise_cli/governance/extractor.py +412 -0
- raise_cli/governance/models.py +134 -0
- raise_cli/governance/parsers/__init__.py +35 -0
- raise_cli/governance/parsers/_convert.py +38 -0
- raise_cli/governance/parsers/adr.py +274 -0
- raise_cli/governance/parsers/backlog.py +356 -0
- raise_cli/governance/parsers/constitution.py +119 -0
- raise_cli/governance/parsers/epic.py +323 -0
- raise_cli/governance/parsers/glossary.py +316 -0
- raise_cli/governance/parsers/guardrails.py +345 -0
- raise_cli/governance/parsers/prd.py +112 -0
- raise_cli/governance/parsers/roadmap.py +118 -0
- raise_cli/governance/parsers/vision.py +116 -0
- raise_cli/graph/__init__.py +1 -0
- raise_cli/graph/backends/__init__.py +57 -0
- raise_cli/graph/backends/api.py +137 -0
- raise_cli/graph/backends/dual.py +139 -0
- raise_cli/graph/backends/pending.py +84 -0
- raise_cli/handlers/__init__.py +3 -0
- raise_cli/hooks/__init__.py +54 -0
- raise_cli/hooks/builtin/__init__.py +1 -0
- raise_cli/hooks/builtin/backlog.py +216 -0
- raise_cli/hooks/builtin/gate_bridge.py +83 -0
- raise_cli/hooks/builtin/jira_sync.py +127 -0
- raise_cli/hooks/builtin/memory.py +117 -0
- raise_cli/hooks/builtin/telemetry.py +72 -0
- raise_cli/hooks/emitter.py +184 -0
- raise_cli/hooks/events.py +262 -0
- raise_cli/hooks/protocol.py +38 -0
- raise_cli/hooks/registry.py +117 -0
- raise_cli/mcp/__init__.py +33 -0
- raise_cli/mcp/bridge.py +218 -0
- raise_cli/mcp/models.py +43 -0
- raise_cli/mcp/registry.py +77 -0
- raise_cli/mcp/schema.py +41 -0
- raise_cli/memory/__init__.py +58 -0
- raise_cli/memory/loader.py +247 -0
- raise_cli/memory/migration.py +241 -0
- raise_cli/memory/models.py +169 -0
- raise_cli/memory/writer.py +598 -0
- raise_cli/onboarding/__init__.py +103 -0
- raise_cli/onboarding/bootstrap.py +324 -0
- raise_cli/onboarding/claudemd.py +17 -0
- raise_cli/onboarding/conventions.py +742 -0
- raise_cli/onboarding/detection.py +374 -0
- raise_cli/onboarding/governance.py +443 -0
- raise_cli/onboarding/instructions.py +672 -0
- raise_cli/onboarding/manifest.py +201 -0
- raise_cli/onboarding/memory_md.py +399 -0
- raise_cli/onboarding/migration.py +207 -0
- raise_cli/onboarding/profile.py +624 -0
- raise_cli/onboarding/skill_conflict.py +100 -0
- raise_cli/onboarding/skill_manifest.py +176 -0
- raise_cli/onboarding/skills.py +437 -0
- raise_cli/onboarding/workflows.py +101 -0
- raise_cli/output/__init__.py +28 -0
- raise_cli/output/console.py +394 -0
- raise_cli/output/formatters/__init__.py +9 -0
- raise_cli/output/formatters/adapters.py +135 -0
- raise_cli/output/formatters/discover.py +439 -0
- raise_cli/output/formatters/skill.py +298 -0
- raise_cli/publish/__init__.py +3 -0
- raise_cli/publish/changelog.py +80 -0
- raise_cli/publish/check.py +179 -0
- raise_cli/publish/version.py +172 -0
- raise_cli/rai_base/__init__.py +22 -0
- raise_cli/rai_base/framework/__init__.py +7 -0
- raise_cli/rai_base/framework/methodology.yaml +233 -0
- raise_cli/rai_base/governance/__init__.py +1 -0
- raise_cli/rai_base/governance/architecture/__init__.py +1 -0
- raise_cli/rai_base/governance/architecture/domain-model.md +20 -0
- raise_cli/rai_base/governance/architecture/system-context.md +34 -0
- raise_cli/rai_base/governance/architecture/system-design.md +24 -0
- raise_cli/rai_base/governance/backlog.md +8 -0
- raise_cli/rai_base/governance/guardrails.md +17 -0
- raise_cli/rai_base/governance/prd.md +25 -0
- raise_cli/rai_base/governance/vision.md +16 -0
- raise_cli/rai_base/identity/__init__.py +8 -0
- raise_cli/rai_base/identity/core.md +119 -0
- raise_cli/rai_base/identity/perspective.md +119 -0
- raise_cli/rai_base/memory/__init__.py +7 -0
- raise_cli/rai_base/memory/patterns-base.jsonl +55 -0
- raise_cli/schemas/__init__.py +3 -0
- raise_cli/schemas/journal.py +49 -0
- raise_cli/schemas/session_state.py +117 -0
- raise_cli/session/__init__.py +5 -0
- raise_cli/session/bundle.py +820 -0
- raise_cli/session/close.py +268 -0
- raise_cli/session/journal.py +119 -0
- raise_cli/session/resolver.py +126 -0
- raise_cli/session/state.py +187 -0
- raise_cli/skills/__init__.py +44 -0
- raise_cli/skills/locator.py +141 -0
- raise_cli/skills/name_checker.py +199 -0
- raise_cli/skills/parser.py +145 -0
- raise_cli/skills/scaffold.py +212 -0
- raise_cli/skills/schema.py +132 -0
- raise_cli/skills/skillsets.py +195 -0
- raise_cli/skills/validator.py +197 -0
- raise_cli/skills_base/__init__.py +80 -0
- raise_cli/skills_base/contract-template.md +60 -0
- raise_cli/skills_base/preamble.md +37 -0
- raise_cli/skills_base/rai-architecture-review/SKILL.md +137 -0
- raise_cli/skills_base/rai-debug/SKILL.md +171 -0
- raise_cli/skills_base/rai-discover/SKILL.md +167 -0
- raise_cli/skills_base/rai-discover-document/SKILL.md +128 -0
- raise_cli/skills_base/rai-discover-scan/SKILL.md +147 -0
- raise_cli/skills_base/rai-discover-start/SKILL.md +145 -0
- raise_cli/skills_base/rai-discover-validate/SKILL.md +142 -0
- raise_cli/skills_base/rai-docs-update/SKILL.md +142 -0
- raise_cli/skills_base/rai-doctor/SKILL.md +120 -0
- raise_cli/skills_base/rai-epic-close/SKILL.md +165 -0
- raise_cli/skills_base/rai-epic-close/templates/retrospective.md +68 -0
- raise_cli/skills_base/rai-epic-design/SKILL.md +146 -0
- raise_cli/skills_base/rai-epic-design/templates/design.md +24 -0
- raise_cli/skills_base/rai-epic-design/templates/scope.md +76 -0
- raise_cli/skills_base/rai-epic-plan/SKILL.md +153 -0
- raise_cli/skills_base/rai-epic-plan/_references/sequencing-strategies.md +67 -0
- raise_cli/skills_base/rai-epic-plan/templates/plan-section.md +49 -0
- raise_cli/skills_base/rai-epic-run/SKILL.md +208 -0
- raise_cli/skills_base/rai-epic-start/SKILL.md +136 -0
- raise_cli/skills_base/rai-epic-start/templates/brief.md +34 -0
- raise_cli/skills_base/rai-mcp-add/SKILL.md +176 -0
- raise_cli/skills_base/rai-mcp-remove/SKILL.md +120 -0
- raise_cli/skills_base/rai-mcp-status/SKILL.md +147 -0
- raise_cli/skills_base/rai-problem-shape/SKILL.md +138 -0
- raise_cli/skills_base/rai-project-create/SKILL.md +144 -0
- raise_cli/skills_base/rai-project-onboard/SKILL.md +162 -0
- raise_cli/skills_base/rai-quality-review/SKILL.md +189 -0
- raise_cli/skills_base/rai-research/SKILL.md +143 -0
- raise_cli/skills_base/rai-research/references/research-prompt-template.md +317 -0
- raise_cli/skills_base/rai-session-close/SKILL.md +176 -0
- raise_cli/skills_base/rai-session-start/SKILL.md +110 -0
- raise_cli/skills_base/rai-story-close/SKILL.md +198 -0
- raise_cli/skills_base/rai-story-design/SKILL.md +203 -0
- raise_cli/skills_base/rai-story-design/references/tech-design-story-v2.md +293 -0
- raise_cli/skills_base/rai-story-implement/SKILL.md +115 -0
- raise_cli/skills_base/rai-story-plan/SKILL.md +135 -0
- raise_cli/skills_base/rai-story-review/SKILL.md +178 -0
- raise_cli/skills_base/rai-story-run/SKILL.md +282 -0
- raise_cli/skills_base/rai-story-start/SKILL.md +166 -0
- raise_cli/skills_base/rai-story-start/templates/story.md +38 -0
- raise_cli/skills_base/rai-welcome/SKILL.md +134 -0
- raise_cli/telemetry/__init__.py +42 -0
- raise_cli/telemetry/schemas.py +285 -0
- raise_cli/telemetry/writer.py +217 -0
- raise_cli/tier/__init__.py +0 -0
- raise_cli/tier/context.py +134 -0
- raise_cli/viz/__init__.py +7 -0
- raise_cli/viz/generator.py +406 -0
- raise_cli-2.2.1.dist-info/METADATA +433 -0
- raise_cli-2.2.1.dist-info/RECORD +264 -0
- raise_cli-2.2.1.dist-info/WHEEL +4 -0
- raise_cli-2.2.1.dist-info/entry_points.txt +40 -0
- raise_cli-2.2.1.dist-info/licenses/LICENSE +190 -0
- raise_cli-2.2.1.dist-info/licenses/NOTICE +4 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"""Migration utilities for developer profiles.
|
|
2
|
+
|
|
3
|
+
Extracts profile data from existing memory artifacts.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import contextlib
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
from datetime import date
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from raise_cli.config.paths import get_memory_dir
|
|
16
|
+
from raise_cli.onboarding.profile import (
|
|
17
|
+
CommunicationPreferences,
|
|
18
|
+
CommunicationStyle,
|
|
19
|
+
DeveloperProfile,
|
|
20
|
+
ExperienceLevel,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _parse_date(date_str: str) -> date:
|
|
27
|
+
"""Parse date string in YYYY-MM-DD format."""
|
|
28
|
+
return date.fromisoformat(date_str)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _extract_sessions_data(sessions_path: Path) -> tuple[int, date | None, date | None]:
|
|
32
|
+
"""Extract session statistics from sessions index.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
sessions_path: Path to sessions/index.jsonl file.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Tuple of (total_sessions, first_session_date, last_session_date).
|
|
39
|
+
"""
|
|
40
|
+
if not sessions_path.exists():
|
|
41
|
+
logger.warning("Sessions index not found: %s", sessions_path)
|
|
42
|
+
return 0, None, None
|
|
43
|
+
|
|
44
|
+
sessions: list[dict[str, Any]] = []
|
|
45
|
+
for line in sessions_path.read_text(encoding="utf-8").strip().splitlines():
|
|
46
|
+
if line:
|
|
47
|
+
try:
|
|
48
|
+
session: dict[str, Any] = json.loads(line)
|
|
49
|
+
sessions.append(session)
|
|
50
|
+
except json.JSONDecodeError:
|
|
51
|
+
logger.warning("Invalid JSON in sessions index: %s", line[:50])
|
|
52
|
+
|
|
53
|
+
if not sessions:
|
|
54
|
+
return 0, None, None
|
|
55
|
+
|
|
56
|
+
# Extract dates
|
|
57
|
+
dates: list[date] = []
|
|
58
|
+
for session_data in sessions:
|
|
59
|
+
if "date" in session_data:
|
|
60
|
+
with contextlib.suppress(ValueError):
|
|
61
|
+
dates.append(_parse_date(str(session_data["date"])))
|
|
62
|
+
|
|
63
|
+
if not dates:
|
|
64
|
+
return len(sessions), None, None
|
|
65
|
+
|
|
66
|
+
dates.sort()
|
|
67
|
+
return len(sessions), dates[0], dates[-1]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _extract_skills_from_sessions(sessions_path: Path) -> list[str]:
|
|
71
|
+
"""Extract skill names mentioned in session outcomes.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
sessions_path: Path to sessions/index.jsonl file.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
List of unique skill names found.
|
|
78
|
+
"""
|
|
79
|
+
if not sessions_path.exists():
|
|
80
|
+
return []
|
|
81
|
+
|
|
82
|
+
# Skills to look for in outcomes
|
|
83
|
+
known_skills = {
|
|
84
|
+
"rai-session-start",
|
|
85
|
+
"rai-session-close",
|
|
86
|
+
"rai-story-design",
|
|
87
|
+
"rai-story-plan",
|
|
88
|
+
"rai-story-implement",
|
|
89
|
+
"rai-story-review",
|
|
90
|
+
"rai-story-start",
|
|
91
|
+
"rai-story-close",
|
|
92
|
+
"rai-epic-design",
|
|
93
|
+
"rai-epic-plan",
|
|
94
|
+
"rai-research",
|
|
95
|
+
"rai-debug",
|
|
96
|
+
"rai-discover-start",
|
|
97
|
+
"rai-discover-scan",
|
|
98
|
+
"rai-discover-validate",
|
|
99
|
+
# Legacy names (pre-namespace, for backward compat with old sessions)
|
|
100
|
+
"session-start",
|
|
101
|
+
"session-close",
|
|
102
|
+
"story-design",
|
|
103
|
+
"story-plan",
|
|
104
|
+
"story-implement",
|
|
105
|
+
"story-review",
|
|
106
|
+
"story-start",
|
|
107
|
+
"story-close",
|
|
108
|
+
"epic-design",
|
|
109
|
+
"epic-plan",
|
|
110
|
+
"research",
|
|
111
|
+
"debug",
|
|
112
|
+
"discover-start",
|
|
113
|
+
"discover-scan",
|
|
114
|
+
"discover-validate",
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
found_skills: set[str] = set()
|
|
118
|
+
|
|
119
|
+
for line in sessions_path.read_text(encoding="utf-8").strip().splitlines():
|
|
120
|
+
if not line:
|
|
121
|
+
continue
|
|
122
|
+
try:
|
|
123
|
+
session = json.loads(line)
|
|
124
|
+
outcomes = session.get("outcomes", [])
|
|
125
|
+
topic = session.get("topic", "")
|
|
126
|
+
|
|
127
|
+
# Check outcomes for skill mentions
|
|
128
|
+
for outcome in outcomes:
|
|
129
|
+
outcome_lower = outcome.lower()
|
|
130
|
+
for skill in known_skills:
|
|
131
|
+
# Match /skill-name or skill-name in text
|
|
132
|
+
if skill in outcome_lower or f"/{skill}" in outcome_lower:
|
|
133
|
+
found_skills.add(skill)
|
|
134
|
+
|
|
135
|
+
# Check topic for skill mentions
|
|
136
|
+
topic_lower = topic.lower()
|
|
137
|
+
for skill in known_skills:
|
|
138
|
+
if skill.replace("-", " ") in topic_lower or skill in topic_lower:
|
|
139
|
+
found_skills.add(skill)
|
|
140
|
+
|
|
141
|
+
except json.JSONDecodeError:
|
|
142
|
+
pass
|
|
143
|
+
|
|
144
|
+
return sorted(found_skills)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def migrate_developer_profile(
|
|
148
|
+
project_path: Path,
|
|
149
|
+
*,
|
|
150
|
+
name: str = "Developer",
|
|
151
|
+
additional_skills: list[str] | None = None,
|
|
152
|
+
) -> DeveloperProfile:
|
|
153
|
+
"""Create developer profile from existing memory data.
|
|
154
|
+
|
|
155
|
+
Extracts session history, skills used, and communication preferences
|
|
156
|
+
from the project's .raise/rai/memory/ directory.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
project_path: Path to the project root.
|
|
160
|
+
name: Developer name (default: "Developer").
|
|
161
|
+
additional_skills: Extra skills to add beyond those detected.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
DeveloperProfile populated from historical data.
|
|
165
|
+
"""
|
|
166
|
+
memory_path = get_memory_dir(project_path)
|
|
167
|
+
sessions_path = memory_path / "sessions" / "index.jsonl"
|
|
168
|
+
|
|
169
|
+
# Extract session statistics (sessions_total now derived from index)
|
|
170
|
+
_, first_session, last_session = _extract_sessions_data(sessions_path)
|
|
171
|
+
|
|
172
|
+
# Extract skills from session history
|
|
173
|
+
skills_mastered = _extract_skills_from_sessions(sessions_path)
|
|
174
|
+
|
|
175
|
+
# Add any additional skills specified
|
|
176
|
+
if additional_skills:
|
|
177
|
+
skills_mastered = sorted(set(skills_mastered) | set(additional_skills))
|
|
178
|
+
|
|
179
|
+
# Default communication preferences
|
|
180
|
+
communication = CommunicationPreferences(
|
|
181
|
+
style=CommunicationStyle.DIRECT,
|
|
182
|
+
language="en", # es for casual
|
|
183
|
+
skip_praise=True,
|
|
184
|
+
detailed_explanations=False,
|
|
185
|
+
redirect_when_dispersing=True,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Universal patterns that apply across all projects
|
|
189
|
+
universal_patterns = [
|
|
190
|
+
"Commit after each completed task",
|
|
191
|
+
"TDD for complex stories",
|
|
192
|
+
"Ask before spawning subagents",
|
|
193
|
+
"Inference economy: gather with tools, think with inference",
|
|
194
|
+
"Permission granted to redirect when dispersing",
|
|
195
|
+
"No unnecessary praise or emotional validation",
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
return DeveloperProfile(
|
|
199
|
+
name=name,
|
|
200
|
+
experience_level=ExperienceLevel.RI,
|
|
201
|
+
communication=communication,
|
|
202
|
+
skills_mastered=skills_mastered,
|
|
203
|
+
universal_patterns=universal_patterns,
|
|
204
|
+
first_session=first_session,
|
|
205
|
+
last_session=last_session,
|
|
206
|
+
projects=[str(project_path)],
|
|
207
|
+
)
|