@event4u/agent-config 1.12.0 → 1.14.0
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.
- package/.agent-src/commands/agent-handoff.md +3 -0
- package/.agent-src/commands/agent-status.md +3 -0
- package/.agent-src/commands/agents-audit.md +4 -0
- package/.agent-src/commands/agents-cleanup.md +6 -1
- package/.agent-src/commands/agents-prepare.md +3 -0
- package/.agent-src/commands/analyze-reference-repo.md +4 -0
- package/.agent-src/commands/bug-fix.md +5 -1
- package/.agent-src/commands/bug-investigate.md +4 -0
- package/.agent-src/commands/chat-history-checkpoint.md +126 -0
- package/.agent-src/commands/chat-history-clear.md +5 -0
- package/.agent-src/commands/chat-history-resume.md +5 -0
- package/.agent-src/commands/chat-history.md +5 -0
- package/.agent-src/commands/check-current-md.md +126 -0
- package/.agent-src/commands/commit-in-chunks.md +98 -0
- package/.agent-src/commands/commit.md +4 -0
- package/.agent-src/commands/compress.md +3 -0
- package/.agent-src/commands/context-create.md +4 -0
- package/.agent-src/commands/context-refactor.md +4 -0
- package/.agent-src/commands/copilot-agents-init.md +3 -0
- package/.agent-src/commands/copilot-agents-optimize.md +3 -0
- package/.agent-src/commands/create-pr-description.md +4 -0
- package/.agent-src/commands/create-pr.md +4 -0
- package/.agent-src/commands/do-and-judge.md +4 -1
- package/.agent-src/commands/do-in-steps.md +3 -0
- package/.agent-src/commands/e2e-heal.md +4 -0
- package/.agent-src/commands/e2e-plan.md +4 -0
- package/.agent-src/commands/estimate-ticket.md +4 -1
- package/.agent-src/commands/feature-dev.md +4 -0
- package/.agent-src/commands/feature-explore.md +4 -0
- package/.agent-src/commands/feature-plan.md +4 -0
- package/.agent-src/commands/feature-refactor.md +4 -0
- package/.agent-src/commands/feature-roadmap.md +6 -0
- package/.agent-src/commands/fix-ci.md +4 -0
- package/.agent-src/commands/fix-portability.md +3 -0
- package/.agent-src/commands/fix-pr-bot-comments.md +4 -0
- package/.agent-src/commands/fix-pr-comments.md +4 -0
- package/.agent-src/commands/fix-pr-developer-comments.md +4 -0
- package/.agent-src/commands/fix-references.md +3 -0
- package/.agent-src/commands/fix-seeder.md +4 -0
- package/.agent-src/commands/implement-ticket.md +39 -13
- package/.agent-src/commands/jira-ticket.md +4 -0
- package/.agent-src/commands/judge.md +3 -0
- package/.agent-src/commands/memory-add.md +5 -3
- package/.agent-src/commands/memory-full.md +5 -2
- package/.agent-src/commands/memory-promote.md +7 -6
- package/.agent-src/commands/mode.md +3 -0
- package/.agent-src/commands/module-create.md +4 -0
- package/.agent-src/commands/module-explore.md +4 -0
- package/.agent-src/commands/onboard.md +24 -0
- package/.agent-src/commands/optimize-agents.md +4 -0
- package/.agent-src/commands/optimize-augmentignore.md +3 -0
- package/.agent-src/commands/optimize-rtk-filters.md +3 -0
- package/.agent-src/commands/optimize-skills.md +4 -0
- package/.agent-src/commands/override-create.md +4 -0
- package/.agent-src/commands/override-manage.md +4 -0
- package/.agent-src/commands/package-reset.md +3 -0
- package/.agent-src/commands/package-test.md +3 -0
- package/.agent-src/commands/prepare-for-review.md +4 -0
- package/.agent-src/commands/project-analyze.md +4 -0
- package/.agent-src/commands/project-health.md +4 -0
- package/.agent-src/commands/propose-memory.md +6 -8
- package/.agent-src/commands/quality-fix.md +4 -0
- package/.agent-src/commands/refine-ticket.md +4 -1
- package/.agent-src/commands/review-changes.md +4 -0
- package/.agent-src/commands/review-routing.md +4 -0
- package/.agent-src/commands/roadmap-create.md +7 -0
- package/.agent-src/commands/roadmap-execute.md +12 -1
- package/.agent-src/commands/rule-compliance-audit.md +4 -0
- package/.agent-src/commands/set-cost-profile.md +3 -0
- package/.agent-src/commands/sync-agent-settings.md +3 -0
- package/.agent-src/commands/sync-gitignore.md +3 -0
- package/.agent-src/commands/tests-create.md +4 -0
- package/.agent-src/commands/tests-execute.md +4 -0
- package/.agent-src/commands/threat-model.md +4 -0
- package/.agent-src/commands/update-form-request-messages.md +4 -0
- package/.agent-src/commands/upstream-contribute.md +4 -0
- package/.agent-src/commands/work.md +161 -0
- package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +2 -6
- package/.agent-src/guidelines/agent-infra/layered-settings.md +0 -1
- package/.agent-src/guidelines/agent-infra/memory-access.md +0 -7
- package/.agent-src/guidelines/agent-infra/role-contracts.md +2 -4
- package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +0 -1
- package/.agent-src/guidelines/php/patterns/strategy.md +180 -2
- package/.agent-src/personas/README.md +0 -1
- package/.agent-src/rules/artifact-drafting-protocol.md +7 -2
- package/.agent-src/rules/artifact-engagement-recording.md +133 -0
- package/.agent-src/rules/ask-when-uncertain.md +18 -13
- package/.agent-src/rules/augment-portability.md +8 -0
- package/.agent-src/rules/autonomous-execution.md +158 -0
- package/.agent-src/rules/chat-history.md +147 -118
- package/.agent-src/rules/cli-output-handling.md +26 -3
- package/.agent-src/rules/command-suggestion.md +133 -0
- package/.agent-src/rules/commit-policy.md +99 -0
- package/.agent-src/rules/direct-answers.md +114 -0
- package/.agent-src/rules/docs-sync.md +36 -0
- package/.agent-src/rules/downstream-changes.md +10 -9
- package/.agent-src/rules/improve-before-implement.md +9 -6
- package/.agent-src/rules/language-and-tone.md +81 -6
- package/.agent-src/rules/non-destructive-by-default.md +117 -0
- package/.agent-src/rules/package-ci-checks.md +4 -0
- package/.agent-src/rules/preservation-guard.md +20 -0
- package/.agent-src/rules/roadmap-progress-sync.md +103 -30
- package/.agent-src/rules/scope-control.md +42 -1
- package/.agent-src/rules/size-enforcement.md +1 -3
- package/.agent-src/rules/skill-quality.md +3 -8
- package/.agent-src/rules/ui-audit-before-build.md +106 -0
- package/.agent-src/rules/user-interaction.md +81 -3
- package/.agent-src/scripts/update_roadmap_progress.py +48 -6
- package/.agent-src/skills/blade-ui/SKILL.md +30 -5
- package/.agent-src/skills/command-routing/SKILL.md +32 -0
- package/.agent-src/skills/command-writing/SKILL.md +41 -2
- package/.agent-src/skills/description-assist/SKILL.md +21 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +0 -1
- package/.agent-src/skills/existing-ui-audit/SKILL.md +187 -0
- package/.agent-src/skills/fe-design/SKILL.md +72 -60
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +4 -0
- package/.agent-src/skills/flux/SKILL.md +31 -4
- package/.agent-src/skills/guideline-writing/SKILL.md +24 -2
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +51 -9
- package/.agent-src/skills/livewire/SKILL.md +30 -4
- package/.agent-src/skills/md-language-check/SKILL.md +103 -0
- package/.agent-src/skills/php-coder/SKILL.md +24 -0
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +121 -0
- package/.agent-src/skills/refine-prompt/SKILL.md +220 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +2 -4
- package/.agent-src/skills/roadmap-management/SKILL.md +10 -3
- package/.agent-src/skills/rule-writing/SKILL.md +23 -1
- package/.agent-src/skills/skill-writing/SKILL.md +1 -3
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/.agent-src/skills/using-git-worktrees/SKILL.md +3 -1
- package/.agent-src/templates/AGENTS.md +24 -6
- package/.agent-src/templates/agent-settings.md +149 -0
- package/.agent-src/templates/github-workflows/roadmap-progress-check.yml +63 -0
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +60 -0
- package/.agent-src/templates/roadmaps.md +8 -2
- package/.agent-src/templates/scripts/implement_ticket/__init__.py +63 -26
- package/.agent-src/templates/scripts/implement_ticket/__main__.py +8 -2
- package/.agent-src/templates/scripts/memory_lookup.py +382 -21
- package/.agent-src/templates/scripts/memory_status.py +110 -9
- package/.agent-src/templates/scripts/telemetry/__init__.py +42 -0
- package/.agent-src/templates/scripts/telemetry/aggregator.py +154 -0
- package/.agent-src/templates/scripts/telemetry/boundary.py +171 -0
- package/.agent-src/templates/scripts/telemetry/engagement.py +238 -0
- package/.agent-src/templates/scripts/telemetry/report_renderer.py +170 -0
- package/.agent-src/templates/scripts/telemetry/settings.py +112 -0
- package/.agent-src/templates/scripts/telemetry_record.py +166 -0
- package/.agent-src/templates/scripts/telemetry_report.py +161 -0
- package/.agent-src/templates/scripts/telemetry_status.py +142 -0
- package/.agent-src/templates/scripts/work_engine/__init__.py +58 -0
- package/.agent-src/templates/scripts/work_engine/__main__.py +9 -0
- package/.agent-src/templates/scripts/work_engine/cli.py +592 -0
- package/.agent-src/templates/scripts/{implement_ticket → work_engine}/delivery_state.py +7 -0
- package/.agent-src/templates/scripts/work_engine/directives/__init__.py +33 -0
- package/.agent-src/templates/scripts/work_engine/directives/backend/__init__.py +98 -0
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/analyze.py +1 -1
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/implement.py +2 -2
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/memory.py +1 -1
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/plan.py +1 -1
- package/.agent-src/templates/scripts/work_engine/directives/backend/refine.py +396 -0
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/report.py +36 -4
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/test.py +2 -2
- package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/verify.py +2 -2
- package/.agent-src/templates/scripts/work_engine/directives/mixed/__init__.py +116 -0
- package/.agent-src/templates/scripts/work_engine/directives/mixed/contract.py +254 -0
- package/.agent-src/templates/scripts/work_engine/directives/mixed/stitch.py +229 -0
- package/.agent-src/templates/scripts/work_engine/directives/mixed/ui.py +231 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/__init__.py +113 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/_passthrough.py +44 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/apply.py +241 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/audit.py +414 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/design.py +335 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/polish.py +510 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui/review.py +468 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/__init__.py +119 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.py +37 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.py +165 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.py +66 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/report.py +62 -0
- package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/test.py +115 -0
- package/.agent-src/templates/scripts/work_engine/dispatcher.py +331 -0
- package/.agent-src/templates/scripts/work_engine/hooks/__init__.py +54 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +32 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.py +103 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.py +44 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.py +42 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_heartbeat.py +50 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_turn_check.py +49 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.py +53 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.py +50 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.py +52 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/trace.py +84 -0
- package/.agent-src/templates/scripts/work_engine/hooks/context.py +66 -0
- package/.agent-src/templates/scripts/work_engine/hooks/events.py +44 -0
- package/.agent-src/templates/scripts/work_engine/hooks/exceptions.py +79 -0
- package/.agent-src/templates/scripts/work_engine/hooks/registry.py +60 -0
- package/.agent-src/templates/scripts/work_engine/hooks/runner.py +73 -0
- package/.agent-src/templates/scripts/work_engine/hooks/settings.py +141 -0
- package/.agent-src/templates/scripts/work_engine/intent/__init__.py +47 -0
- package/.agent-src/templates/scripts/work_engine/intent/classify.py +280 -0
- package/.agent-src/templates/scripts/work_engine/migration/__init__.py +8 -0
- package/.agent-src/templates/scripts/work_engine/migration/v0_to_v1.py +199 -0
- package/.agent-src/templates/scripts/work_engine/resolvers/__init__.py +22 -0
- package/.agent-src/templates/scripts/work_engine/resolvers/diff.py +106 -0
- package/.agent-src/templates/scripts/work_engine/resolvers/file.py +113 -0
- package/.agent-src/templates/scripts/work_engine/resolvers/prompt.py +90 -0
- package/.agent-src/templates/scripts/work_engine/scoring/__init__.py +14 -0
- package/.agent-src/templates/scripts/work_engine/scoring/confidence.py +300 -0
- package/.agent-src/templates/scripts/work_engine/stack/__init__.py +31 -0
- package/.agent-src/templates/scripts/work_engine/stack/detect.py +187 -0
- package/.agent-src/templates/scripts/work_engine/state.py +641 -0
- package/.claude-plugin/marketplace.json +105 -2
- package/AGENTS.md +36 -8
- package/CHANGELOG.md +558 -0
- package/README.md +146 -4
- package/composer.json +3 -0
- package/config/agent-settings.template.yml +45 -0
- package/config/gitignore-block.txt +4 -0
- package/docs/architecture.md +28 -1
- package/docs/development.md +1 -1
- package/docs/getting-started.md +3 -2
- package/docs/installation.md +86 -0
- package/docs/showcase.md +204 -0
- package/package.json +9 -1
- package/scripts/agent-config +274 -0
- package/scripts/audit_cloud_compatibility.py +288 -0
- package/scripts/build_cloud_bundle.py +458 -0
- package/scripts/build_linear_digest.py +263 -0
- package/scripts/chat_history.py +796 -7
- package/scripts/check_compression.py +139 -0
- package/scripts/check_iron_law_prominence.py +143 -0
- package/scripts/check_md_language.py +159 -0
- package/scripts/check_portability.py +36 -0
- package/scripts/check_reply_consistency.py +140 -0
- package/scripts/command_suggester/__init__.py +51 -0
- package/scripts/command_suggester/cooldown.py +132 -0
- package/scripts/command_suggester/loader.py +70 -0
- package/scripts/command_suggester/match.py +180 -0
- package/scripts/command_suggester/rank.py +120 -0
- package/scripts/command_suggester/render.py +86 -0
- package/scripts/command_suggester/sanitize.py +113 -0
- package/scripts/command_suggester/settings.py +125 -0
- package/scripts/command_suggester/types.py +78 -0
- package/scripts/hooks/augment-chat-history.sh +56 -0
- package/scripts/install-hooks.sh +67 -0
- package/scripts/install.py +150 -33
- package/scripts/lint_marketplace.py +27 -0
- package/scripts/memory_lookup.py +143 -7
- package/scripts/memory_status.py +76 -14
- package/scripts/migrate_command_suggestions.py +151 -0
- package/scripts/postinstall.sh +16 -0
- package/scripts/schemas/command.schema.json +41 -0
- package/scripts/skill_linter.py +67 -0
- package/scripts/sync_agent_settings.py +42 -12
- package/templates/consumer-settings/augment-cli-hooks.json +54 -0
- package/templates/consumer-settings/claude-settings.json +55 -1
- package/.agent-src/templates/scripts/implement_ticket/cli.py +0 -171
- package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +0 -134
- package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +0 -49
- package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +0 -140
- /package/.agent-src/templates/scripts/{implement_ticket → work_engine}/persona_policy.py +0 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""Frontend-stack detection from project manifests.
|
|
2
|
+
|
|
3
|
+
The detector reads ``composer.json`` and ``package.json`` from a project
|
|
4
|
+
root, applies the heuristic table below in priority order, and returns a
|
|
5
|
+
:class:`StackResult` carrying the labelled frontend plus the manifest
|
|
6
|
+
``mtime`` it was computed against. The dispatcher caches the result on
|
|
7
|
+
``state.stack`` and re-runs detection whenever the recorded ``mtime``
|
|
8
|
+
no longer matches what the filesystem reports.
|
|
9
|
+
|
|
10
|
+
Heuristics (priority order — first match wins):
|
|
11
|
+
|
|
12
|
+
1. ``composer.json`` lists ``livewire/livewire`` AND ``livewire/flux`` →
|
|
13
|
+
``blade-livewire-flux``
|
|
14
|
+
2. ``package.json`` lists ``react`` AND any of ``@radix-ui/*``,
|
|
15
|
+
``shadcn-ui`` or has a ``components.json`` (the shadcn marker file)
|
|
16
|
+
→ ``react-shadcn``
|
|
17
|
+
3. ``package.json`` lists ``vue`` (any major) → ``vue``
|
|
18
|
+
4. Otherwise → ``plain``
|
|
19
|
+
|
|
20
|
+
Detection is filesystem-cheap: at most three small JSON reads per
|
|
21
|
+
project root. Errors (missing file, malformed JSON, missing ``require``
|
|
22
|
+
section) downgrade to ``plain`` rather than raising — a wrong stack
|
|
23
|
+
label is recoverable (audit catches it, user can override), but a
|
|
24
|
+
crash mid-dispatch is not.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import json
|
|
29
|
+
from dataclasses import dataclass
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
KNOWN_STACKS: frozenset[str] = frozenset(
|
|
33
|
+
{"blade-livewire-flux", "react-shadcn", "vue", "plain"},
|
|
34
|
+
)
|
|
35
|
+
"""All stack labels the detector can return.
|
|
36
|
+
|
|
37
|
+
Kept as a frozenset so consumers (state schema, fixtures, tests) can
|
|
38
|
+
validate against a single source of truth without re-deriving."""
|
|
39
|
+
|
|
40
|
+
DEFAULT_STACK = "plain"
|
|
41
|
+
"""Fallback when no manifest signal matches."""
|
|
42
|
+
|
|
43
|
+
_SHADCN_RADIX_PREFIX = "@radix-ui/"
|
|
44
|
+
_SHADCN_PACKAGE_NAMES: frozenset[str] = frozenset({"shadcn-ui", "shadcn"})
|
|
45
|
+
_FLUX_PACKAGE = "livewire/flux"
|
|
46
|
+
_LIVEWIRE_PACKAGE = "livewire/livewire"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass(frozen=True)
|
|
50
|
+
class StackResult:
|
|
51
|
+
"""Outcome of one detection pass.
|
|
52
|
+
|
|
53
|
+
``mtime`` is the latest mtime among the manifests actually consulted
|
|
54
|
+
(``composer.json`` and ``package.json``), in POSIX seconds. Callers
|
|
55
|
+
cache the result keyed on this value; a stale cache is invalidated
|
|
56
|
+
by the next dispatch when the recorded mtime is older than what
|
|
57
|
+
:func:`latest_manifest_mtime` returns.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
frontend: str
|
|
61
|
+
mtime: float
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def detect_stack(project_root: Path) -> StackResult:
|
|
65
|
+
"""Inspect ``project_root`` and label the frontend stack.
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
project_root:
|
|
70
|
+
Directory that should contain a ``composer.json`` or
|
|
71
|
+
``package.json`` at its top level. Other layouts (monorepos,
|
|
72
|
+
nested workspaces) call this with the workspace root that
|
|
73
|
+
carries the manifest you care about — the caller picks the
|
|
74
|
+
scope, the detector does not walk upwards.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
StackResult
|
|
79
|
+
``frontend`` is one of :data:`KNOWN_STACKS`; ``mtime`` is the
|
|
80
|
+
latest manifest mtime among the files actually consulted, or
|
|
81
|
+
``0.0`` when no manifests exist (greenfield project).
|
|
82
|
+
"""
|
|
83
|
+
composer = _read_json(project_root / "composer.json")
|
|
84
|
+
package = _read_json(project_root / "package.json")
|
|
85
|
+
components_json = (project_root / "components.json").is_file()
|
|
86
|
+
mtime = latest_manifest_mtime(project_root)
|
|
87
|
+
|
|
88
|
+
if _is_blade_livewire_flux(composer):
|
|
89
|
+
return StackResult(frontend="blade-livewire-flux", mtime=mtime)
|
|
90
|
+
|
|
91
|
+
if _is_react_shadcn(package, components_json):
|
|
92
|
+
return StackResult(frontend="react-shadcn", mtime=mtime)
|
|
93
|
+
|
|
94
|
+
if _has_vue(package):
|
|
95
|
+
return StackResult(frontend="vue", mtime=mtime)
|
|
96
|
+
|
|
97
|
+
return StackResult(frontend=DEFAULT_STACK, mtime=mtime)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def latest_manifest_mtime(project_root: Path) -> float:
|
|
101
|
+
"""Return the latest mtime across the manifests we consult.
|
|
102
|
+
|
|
103
|
+
Used by the dispatcher's cache check: when the persisted
|
|
104
|
+
``state.stack.mtime`` no longer matches the live value, the cached
|
|
105
|
+
label is invalidated and detection re-runs. Returns ``0.0`` when no
|
|
106
|
+
manifest is present so a fresh greenfield repo produces a stable
|
|
107
|
+
sentinel rather than a missing-file error.
|
|
108
|
+
"""
|
|
109
|
+
candidates = ("composer.json", "package.json")
|
|
110
|
+
mtimes = [
|
|
111
|
+
(project_root / name).stat().st_mtime
|
|
112
|
+
for name in candidates
|
|
113
|
+
if (project_root / name).is_file()
|
|
114
|
+
]
|
|
115
|
+
return max(mtimes) if mtimes else 0.0
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _read_json(path: Path) -> dict[str, object]:
|
|
119
|
+
"""Read a JSON manifest, returning ``{}`` on any error.
|
|
120
|
+
|
|
121
|
+
Wrong-but-recoverable beats crash-mid-dispatch. Audit and the
|
|
122
|
+
refine step will surface the real shape of the project; the
|
|
123
|
+
detector's job is just to pick a routing label.
|
|
124
|
+
"""
|
|
125
|
+
if not path.is_file():
|
|
126
|
+
return {}
|
|
127
|
+
try:
|
|
128
|
+
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
129
|
+
except (OSError, json.JSONDecodeError):
|
|
130
|
+
return {}
|
|
131
|
+
return payload if isinstance(payload, dict) else {}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _all_dependencies(manifest: dict[str, object], *keys: str) -> dict[str, object]:
|
|
135
|
+
"""Merge the dependency-style sections of a manifest into one map.
|
|
136
|
+
|
|
137
|
+
composer.json uses ``require`` and ``require-dev``; package.json uses
|
|
138
|
+
``dependencies``, ``devDependencies``, ``peerDependencies``, and
|
|
139
|
+
``optionalDependencies``. We only care whether a name is present
|
|
140
|
+
anywhere — version pinning is the audit step's concern.
|
|
141
|
+
"""
|
|
142
|
+
merged: dict[str, object] = {}
|
|
143
|
+
for key in keys:
|
|
144
|
+
section = manifest.get(key)
|
|
145
|
+
if isinstance(section, dict):
|
|
146
|
+
merged.update(section)
|
|
147
|
+
return merged
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _is_blade_livewire_flux(composer: dict[str, object]) -> bool:
|
|
151
|
+
deps = _all_dependencies(composer, "require", "require-dev")
|
|
152
|
+
return _LIVEWIRE_PACKAGE in deps and _FLUX_PACKAGE in deps
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _is_react_shadcn(package: dict[str, object], components_json: bool) -> bool:
|
|
156
|
+
deps = _all_dependencies(
|
|
157
|
+
package,
|
|
158
|
+
"dependencies",
|
|
159
|
+
"devDependencies",
|
|
160
|
+
"peerDependencies",
|
|
161
|
+
"optionalDependencies",
|
|
162
|
+
)
|
|
163
|
+
if "react" not in deps:
|
|
164
|
+
return False
|
|
165
|
+
has_radix = any(name.startswith(_SHADCN_RADIX_PREFIX) for name in deps)
|
|
166
|
+
has_shadcn_pkg = any(name in _SHADCN_PACKAGE_NAMES for name in deps)
|
|
167
|
+
return has_radix or has_shadcn_pkg or components_json
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _has_vue(package: dict[str, object]) -> bool:
|
|
171
|
+
deps = _all_dependencies(
|
|
172
|
+
package,
|
|
173
|
+
"dependencies",
|
|
174
|
+
"devDependencies",
|
|
175
|
+
"peerDependencies",
|
|
176
|
+
"optionalDependencies",
|
|
177
|
+
)
|
|
178
|
+
return "vue" in deps
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
__all__ = [
|
|
182
|
+
"DEFAULT_STACK",
|
|
183
|
+
"KNOWN_STACKS",
|
|
184
|
+
"StackResult",
|
|
185
|
+
"detect_stack",
|
|
186
|
+
"latest_manifest_mtime",
|
|
187
|
+
]
|