285 lines
17 KiB
Python
285 lines
17 KiB
Python
# Generated by Django 5.2.16 on 2026-08-15 05:46
|
|
|
|
import django.db.models.deletion
|
|
import uuid
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
('agents', '0001_initial'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='Project',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('name', models.CharField(max_length=200)),
|
|
('project_type', models.CharField(default='WEB_APP', max_length=100)),
|
|
('goal', models.TextField()),
|
|
('repository_url', models.TextField(blank=True)),
|
|
('repository_path', models.TextField(blank=True)),
|
|
('status', models.CharField(choices=[('PLANNING', 'Planning'), ('READY', 'Ready'), ('ARCHAEOLOGY', 'Archaeology'), ('BUILDING', 'Building'), ('PAUSING', 'Pausing'), ('PAUSED', 'Paused'), ('BLOCKED', 'Blocked'), ('VERIFYING', 'Verifying'), ('FINISHED', 'Finished'), ('FAILED', 'Failed')], default='PLANNING', max_length=32)),
|
|
('current_plan_version', models.PositiveIntegerField(default=0)),
|
|
('architecture_summary', models.TextField(blank=True)),
|
|
('constraints', models.JSONField(blank=True, default=dict)),
|
|
('budget', models.JSONField(blank=True, default=dict)),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Milestone',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('key', models.CharField(max_length=50)),
|
|
('title', models.CharField(max_length=200)),
|
|
('goal', models.TextField()),
|
|
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)),
|
|
('verification_contract', models.JSONField(blank=True, default=dict)),
|
|
('order', models.PositiveIntegerField(default=0)),
|
|
('dependencies', models.ManyToManyField(blank=True, to='projects.milestone')),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='milestones', to='projects.project')),
|
|
],
|
|
options={
|
|
'ordering': ['order', 'created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Finding',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('source', models.CharField(max_length=80)),
|
|
('finding_type', models.CharField(max_length=80)),
|
|
('severity', models.CharField(default='INFO', max_length=32)),
|
|
('title', models.CharField(max_length=255)),
|
|
('description', models.TextField(blank=True)),
|
|
('evidence', models.JSONField(blank=True, default=list)),
|
|
('status', models.CharField(default='OPEN', max_length=32)),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='findings', to='projects.project')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Feature',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('title', models.CharField(max_length=200)),
|
|
('description', models.TextField(blank=True)),
|
|
('acceptance_criteria', models.JSONField(blank=True, default=list)),
|
|
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)),
|
|
('milestone', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.milestone')),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.project')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Decision',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('decision_type', models.CharField(max_length=80)),
|
|
('decision', models.TextField()),
|
|
('reason', models.TextField(blank=True)),
|
|
('evidence', models.JSONField(blank=True, default=list)),
|
|
('project_plan_version', models.PositiveIntegerField(default=0)),
|
|
('actor', models.CharField(max_length=120)),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decisions', to='projects.project')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='ProjectPlan',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('version', models.PositiveIntegerField()),
|
|
('goal', models.TextField()),
|
|
('scope', models.TextField(blank=True)),
|
|
('stack', models.JSONField(blank=True, default=dict)),
|
|
('architecture', models.JSONField(blank=True, default=dict)),
|
|
('constraints', models.JSONField(blank=True, default=dict)),
|
|
('acceptance_criteria', models.JSONField(blank=True, default=list)),
|
|
('permissions', models.JSONField(blank=True, default=dict)),
|
|
('budget', models.JSONField(blank=True, default=dict)),
|
|
('open_decisions', models.JSONField(blank=True, default=list)),
|
|
('approved_at', models.DateTimeField(blank=True, null=True)),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='plans', to='projects.project')),
|
|
],
|
|
),
|
|
migrations.AddField(
|
|
model_name='milestone',
|
|
name='plan',
|
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='milestones', to='projects.projectplan'),
|
|
),
|
|
migrations.CreateModel(
|
|
name='RoadmapItem',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('title', models.CharField(max_length=200)),
|
|
('description', models.TextField(blank=True)),
|
|
('source', models.CharField(default='user', max_length=80)),
|
|
('status', models.CharField(choices=[('INBOX', 'Inbox'), ('NOW', 'Now'), ('NEXT', 'Next'), ('LATER', 'Later'), ('EXPLORING', 'Exploring'), ('DECLINED', 'Declined'), ('DONE', 'Done')], default='INBOX', max_length=32)),
|
|
('priority', models.PositiveSmallIntegerField(default=50)),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roadmap_items', to='projects.project')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Scenario',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('name', models.CharField(max_length=200)),
|
|
('target_type', models.CharField(max_length=80)),
|
|
('target_id', models.CharField(max_length=120)),
|
|
('definition', models.JSONField(blank=True, default=dict)),
|
|
('status', models.CharField(default='DRAFT', max_length=32)),
|
|
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='scenarios', to='projects.project')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Task',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('task_type', models.CharField(max_length=80)),
|
|
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('WAITING_TOOL', 'Waiting Tool'), ('REVIEW', 'Review'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed'), ('COMPLETE', 'Complete')], default='QUEUED', max_length=32)),
|
|
('priority', models.PositiveSmallIntegerField(choices=[(10, 'Low'), (50, 'Normal'), (80, 'High'), (100, 'Critical')], default=50)),
|
|
('goal', models.TextField()),
|
|
('acceptance_criteria', models.JSONField(blank=True, default=list)),
|
|
('retry_count', models.PositiveIntegerField(default=0)),
|
|
('max_retries', models.PositiveIntegerField(default=2)),
|
|
('assigned_agent_version', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='agents.agentversion')),
|
|
('feature', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.feature')),
|
|
('milestone', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.milestone')),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='projects.project')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Artifact',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('artifact_type', models.CharField(max_length=80)),
|
|
('name', models.CharField(max_length=255)),
|
|
('uri', models.TextField(blank=True)),
|
|
('content', models.JSONField(blank=True, default=dict)),
|
|
('generated_by', models.CharField(blank=True, max_length=120)),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifacts', to='projects.project')),
|
|
('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='artifacts', to='projects.task')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Action',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('action_type', models.CharField(max_length=80)),
|
|
('status', models.CharField(default='PENDING', max_length=32)),
|
|
('contract', models.JSONField(blank=True, default=dict)),
|
|
('result', models.JSONField(blank=True, default=dict)),
|
|
('started_at', models.DateTimeField(blank=True, null=True)),
|
|
('finished_at', models.DateTimeField(blank=True, null=True)),
|
|
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='projects.task')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='TaskDependency',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('depends_on', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependent_edges', to='projects.task')),
|
|
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependency_edges', to='projects.task')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Worktree',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('repository_path', models.TextField()),
|
|
('worktree_path', models.TextField()),
|
|
('branch_name', models.CharField(max_length=255)),
|
|
('base_ref', models.CharField(default='main', max_length=255)),
|
|
('status', models.CharField(default='ACTIVE', max_length=32)),
|
|
('task', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='worktree', to='projects.task')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='CommitRecord',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('sha', models.CharField(max_length=64)),
|
|
('branch_name', models.CharField(max_length=255)),
|
|
('message', models.TextField()),
|
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='commits', to='projects.project')),
|
|
('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.task')),
|
|
('worktree', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.worktree')),
|
|
],
|
|
options={
|
|
'abstract': False,
|
|
},
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='projectplan',
|
|
constraint=models.UniqueConstraint(fields=('project', 'version'), name='unique_plan_version'),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='milestone',
|
|
constraint=models.UniqueConstraint(fields=('project', 'key'), name='unique_milestone_key'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='task',
|
|
index=models.Index(fields=['project', 'status', 'priority'], name='projects_ta_project_423b1c_idx'),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='taskdependency',
|
|
constraint=models.UniqueConstraint(fields=('task', 'depends_on'), name='unique_task_dependency'),
|
|
),
|
|
]
|