clod
Copyright(c) Fuzz Leonard 2025
LicenseMIT
Maintainercyborg@bionicfuzz.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Clod.Types

Description

This module defines the core types used throughout the Clod application. Clod is a utility for preparing and uploading files to Claude AI's Project Knowledge feature. It tracks file changes, respects .gitignore and .clodignore patterns, and optimizes filenames for Claude's UI.

The primary types include:

  • ClodConfig - Configuration for file processing and staging
  • ClodM - A monad for handling errors during file operations
  • ClodError - Various error types that can occur during operation
  • FileResult - Result of processing a file (success or skipped)
Synopsis

Core Types

data ClodConfig Source #

Configuration for the clod program

Constructors

ClodConfig 

Fields

Instances

Instances details
Generic ClodConfig Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep ClodConfig 
Instance details

Defined in Clod.Types

Show ClodConfig Source # 
Instance details

Defined in Clod.Types

Eq ClodConfig Source # 
Instance details

Defined in Clod.Types

type Rep ClodConfig Source # 
Instance details

Defined in Clod.Types

data FileResult Source #

Result of processing a file

  • Success indicates the file was successfully processed and included
  • Skipped indicates the file was skipped with a reason (matched ignore pattern, binary file, etc.)

Constructors

Success

File was successfully processed

Skipped !String

File was skipped with the given reason

Instances

Instances details
Generic FileResult Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep FileResult 
Instance details

Defined in Clod.Types

type Rep FileResult = D1 ('MetaData "FileResult" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "Success" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Skipped" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 String)))
Show FileResult Source # 
Instance details

Defined in Clod.Types

Eq FileResult Source # 
Instance details

Defined in Clod.Types

type Rep FileResult Source # 
Instance details

Defined in Clod.Types

type Rep FileResult = D1 ('MetaData "FileResult" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "Success" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Skipped" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 String)))

data ClodError Source #

Errors that can occur during Clod operation

These represent the different categories of errors that can occur during file processing, allowing for specific error handling for each case.

Constructors

FileSystemError !FilePath !IOError

Error related to filesystem operations

ConfigError !String

Error related to configuration (e.g., invalid settings)

PatternError !String

Error related to pattern matching (e.g., invalid pattern)

CapabilityError !String

Error related to capability validation

DatabaseError !String

Error related to checksums database

ChecksumError !String

Error related to checksum calculation

Instances

Instances details
Generic ClodError Source # 
Instance details

Defined in Clod.Types

Show ClodError Source # 
Instance details

Defined in Clod.Types

Eq ClodError Source # 
Instance details

Defined in Clod.Types

type Rep ClodError Source # 
Instance details

Defined in Clod.Types

type ClodM a = ReaderT ClodConfig (ExceptT ClodError IO) a Source #

The Clod monad

This monad stack combines:

  • Reader for dependency injection of ClodConfig
  • Error handling with ExceptT for ClodError
  • IO for filesystem, git, and other side effects

This replaces the previous effects-based approach with a simpler, more traditional monad stack.

data FileEntry Source #

File entry in the checksum database

Constructors

FileEntry 

Fields

Instances

Instances details
FromDhall FileEntry Source # 
Instance details

Defined in Clod.Types

ToDhall FileEntry Source # 
Instance details

Defined in Clod.Types

Generic FileEntry Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep FileEntry 
Instance details

Defined in Clod.Types

type Rep FileEntry = D1 ('MetaData "FileEntry" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "FileEntry" 'PrefixI 'True) ((S1 ('MetaSel ('Just "entryPath") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 FilePath) :*: S1 ('MetaSel ('Just "entryChecksum") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Checksum)) :*: (S1 ('MetaSel ('Just "entryLastModified") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime) :*: S1 ('MetaSel ('Just "entryOptimizedName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 OptimizedName))))
Show FileEntry Source # 
Instance details

Defined in Clod.Types

Eq FileEntry Source # 
Instance details

Defined in Clod.Types

FromJSON FileEntry Source # 
Instance details

Defined in Clod.Types

ToJSON FileEntry Source # 
Instance details

Defined in Clod.Types

type Rep FileEntry Source # 
Instance details

Defined in Clod.Types

type Rep FileEntry = D1 ('MetaData "FileEntry" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "FileEntry" 'PrefixI 'True) ((S1 ('MetaSel ('Just "entryPath") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 FilePath) :*: S1 ('MetaSel ('Just "entryChecksum") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Checksum)) :*: (S1 ('MetaSel ('Just "entryLastModified") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime) :*: S1 ('MetaSel ('Just "entryOptimizedName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 OptimizedName))))

data ClodDatabase Source #

Main database structure

Constructors

ClodDatabase 

Fields

Instances

Instances details
Generic ClodDatabase Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep ClodDatabase 
Instance details

Defined in Clod.Types

type Rep ClodDatabase = D1 ('MetaData "ClodDatabase" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "ClodDatabase" 'PrefixI 'True) ((S1 ('MetaSel ('Just "dbFiles") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Map FilePath FileEntry)) :*: S1 ('MetaSel ('Just "dbChecksums") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Map String FilePath))) :*: (S1 ('MetaSel ('Just "dbLastStagingDir") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe FilePath)) :*: S1 ('MetaSel ('Just "dbLastRunTime") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime))))
Show ClodDatabase Source # 
Instance details

Defined in Clod.Types

Eq ClodDatabase Source # 
Instance details

Defined in Clod.Types

type Rep ClodDatabase Source # 
Instance details

Defined in Clod.Types

type Rep ClodDatabase = D1 ('MetaData "ClodDatabase" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "ClodDatabase" 'PrefixI 'True) ((S1 ('MetaSel ('Just "dbFiles") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Map FilePath FileEntry)) :*: S1 ('MetaSel ('Just "dbChecksums") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Map String FilePath))) :*: (S1 ('MetaSel ('Just "dbLastStagingDir") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe FilePath)) :*: S1 ('MetaSel ('Just "dbLastRunTime") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime))))

data SerializableClodDatabase Source #

Serialization-friendly version of ClodDatabase

Constructors

SerializableClodDatabase 

Fields

Instances

Instances details
FromDhall SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

ToDhall SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

Generic SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep SerializableClodDatabase 
Instance details

Defined in Clod.Types

type Rep SerializableClodDatabase = D1 ('MetaData "SerializableClodDatabase" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "SerializableClodDatabase" 'PrefixI 'True) ((S1 ('MetaSel ('Just "serializedFiles") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [(FilePath, FileEntry)]) :*: S1 ('MetaSel ('Just "serializedChecksums") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [(String, FilePath)])) :*: (S1 ('MetaSel ('Just "serializedLastStagingDir") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe FilePath)) :*: S1 ('MetaSel ('Just "serializedLastRunTime") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime))))
Show SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

Eq SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

FromJSON SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

ToJSON SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

type Rep SerializableClodDatabase Source # 
Instance details

Defined in Clod.Types

type Rep SerializableClodDatabase = D1 ('MetaData "SerializableClodDatabase" "Clod.Types" "clod-0.1.4-inplace" 'False) (C1 ('MetaCons "SerializableClodDatabase" 'PrefixI 'True) ((S1 ('MetaSel ('Just "serializedFiles") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [(FilePath, FileEntry)]) :*: S1 ('MetaSel ('Just "serializedChecksums") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [(String, FilePath)])) :*: (S1 ('MetaSel ('Just "serializedLastStagingDir") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe FilePath)) :*: S1 ('MetaSel ('Just "serializedLastRunTime") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 UTCTime))))

toSerializable :: ClodDatabase -> SerializableClodDatabase Source #

Convert to serializable form

fromSerializable :: SerializableClodDatabase -> ClodDatabase Source #

Convert from serializable form

Type conversions and runners

runClodM :: ClodConfig -> ClodM a -> IO (Either ClodError a) Source #

Run a ClodM computation, returning either an error or a result

throwError :: MonadError e m => e -> m a #

Is used within a monadic computation to begin exception processing.

catchError :: MonadError e m => m a -> (e -> m a) -> m a #

A handler function to handle previous errors and return to normal execution. A common idiom is:

do { action1; action2; action3 } `catchError` handler

where the action functions can call throwError. Note that handler and the do-block must have the same return type.

liftIO :: MonadIO m => IO a -> m a #

Lift a computation from the IO monad. This allows us to run IO computations in any monadic stack, so long as it supports these kinds of operations (i.e. IO is the base monad for the stack).

Example

Expand
import Control.Monad.Trans.State -- from the "transformers" library

printState :: Show s => StateT s IO ()
printState = do
  state <- get
  liftIO $ print state

Had we omitted liftIO, we would have ended up with this error:

• Couldn't match type ‘IO’ with ‘StateT s IO’
 Expected type: StateT s IO ()
   Actual type: IO ()

The important part here is the mismatch between StateT s IO () and IO ().

Luckily, we know of a function that takes an IO a and returns an (m a): liftIO, enabling us to run the program and see the expected results:

> evalStateT printState "hello"
"hello"

> evalStateT printState 3
3

ask :: MonadReader r m => m r #

Retrieves the monad environment.

asks #

Arguments

:: MonadReader r m 
=> (r -> a)

The selector function to apply to the environment.

-> m a 

Retrieves a function of the current environment.

local #

Arguments

:: MonadReader r m 
=> (r -> r)

The function to modify the environment.

-> m a

Reader to run in the modified environment.

-> m a 

Executes a computation in a modified environment.

runReaderT :: ReaderT r m a -> r -> m a #

runExceptT :: ExceptT e m a -> m (Either e a) #

The inverse of ExceptT.

Newtypes for type safety

newtype IgnorePattern Source #

Newtype for ignore patterns to prevent mixing with other string types

Constructors

IgnorePattern 

newtype OptimizedName Source #

Newtype for optimized filename used in Claude's UI

Constructors

OptimizedName 

Instances

Instances details
FromDhall OptimizedName Source # 
Instance details

Defined in Clod.Types

ToDhall OptimizedName Source # 
Instance details

Defined in Clod.Types

Monoid OptimizedName Source # 
Instance details

Defined in Clod.Types

Semigroup OptimizedName Source # 
Instance details

Defined in Clod.Types

IsString OptimizedName Source # 
Instance details

Defined in Clod.Types

Generic OptimizedName Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep OptimizedName 
Instance details

Defined in Clod.Types

type Rep OptimizedName = D1 ('MetaData "OptimizedName" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "OptimizedName" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOptimizedName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))
Show OptimizedName Source # 
Instance details

Defined in Clod.Types

Eq OptimizedName Source # 
Instance details

Defined in Clod.Types

Ord OptimizedName Source # 
Instance details

Defined in Clod.Types

FromJSON OptimizedName Source # 
Instance details

Defined in Clod.Types

ToJSON OptimizedName Source # 
Instance details

Defined in Clod.Types

type Rep OptimizedName Source # 
Instance details

Defined in Clod.Types

type Rep OptimizedName = D1 ('MetaData "OptimizedName" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "OptimizedName" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOptimizedName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))

newtype OriginalPath Source #

Newtype for original filepath in the repository

Constructors

OriginalPath 

Instances

Instances details
FromDhall OriginalPath Source # 
Instance details

Defined in Clod.Types

ToDhall OriginalPath Source # 
Instance details

Defined in Clod.Types

Monoid OriginalPath Source # 
Instance details

Defined in Clod.Types

Semigroup OriginalPath Source # 
Instance details

Defined in Clod.Types

IsString OriginalPath Source # 
Instance details

Defined in Clod.Types

Generic OriginalPath Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep OriginalPath 
Instance details

Defined in Clod.Types

type Rep OriginalPath = D1 ('MetaData "OriginalPath" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "OriginalPath" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOriginalPath") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))
Show OriginalPath Source # 
Instance details

Defined in Clod.Types

Eq OriginalPath Source # 
Instance details

Defined in Clod.Types

Ord OriginalPath Source # 
Instance details

Defined in Clod.Types

FromJSON OriginalPath Source # 
Instance details

Defined in Clod.Types

ToJSON OriginalPath Source # 
Instance details

Defined in Clod.Types

type Rep OriginalPath Source # 
Instance details

Defined in Clod.Types

type Rep OriginalPath = D1 ('MetaData "OriginalPath" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "OriginalPath" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOriginalPath") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))

newtype Checksum Source #

Newtype for file checksums to prevent mixing with other string types

Constructors

Checksum 

Fields

Instances

Instances details
FromDhall Checksum Source # 
Instance details

Defined in Clod.Types

ToDhall Checksum Source # 
Instance details

Defined in Clod.Types

Monoid Checksum Source # 
Instance details

Defined in Clod.Types

Semigroup Checksum Source # 
Instance details

Defined in Clod.Types

IsString Checksum Source # 
Instance details

Defined in Clod.Types

Generic Checksum Source # 
Instance details

Defined in Clod.Types

Associated Types

type Rep Checksum 
Instance details

Defined in Clod.Types

type Rep Checksum = D1 ('MetaData "Checksum" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "Checksum" 'PrefixI 'True) (S1 ('MetaSel ('Just "unChecksum") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))

Methods

from :: Checksum -> Rep Checksum x #

to :: Rep Checksum x -> Checksum #

Show Checksum Source # 
Instance details

Defined in Clod.Types

Eq Checksum Source # 
Instance details

Defined in Clod.Types

Ord Checksum Source # 
Instance details

Defined in Clod.Types

FromJSON Checksum Source # 
Instance details

Defined in Clod.Types

ToJSON Checksum Source # 
Instance details

Defined in Clod.Types

type Rep Checksum Source # 
Instance details

Defined in Clod.Types

type Rep Checksum = D1 ('MetaData "Checksum" "Clod.Types" "clod-0.1.4-inplace" 'True) (C1 ('MetaCons "Checksum" 'PrefixI 'True) (S1 ('MetaSel ('Just "unChecksum") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String)))

Capability types

data FileReadCap Source #

Capability for reading files within certain directories

Constructors

FileReadCap 

Fields

Instances

Instances details
Show FileReadCap Source # 
Instance details

Defined in Clod.Types

Eq FileReadCap Source # 
Instance details

Defined in Clod.Types

data FileWriteCap Source #

Capability for writing files within certain directories

Constructors

FileWriteCap 

Fields

Instances

Instances details
Show FileWriteCap Source # 
Instance details

Defined in Clod.Types

Eq FileWriteCap Source # 
Instance details

Defined in Clod.Types

fileReadCap :: [FilePath] -> FileReadCap Source #

Create a file read capability for specified directories

fileWriteCap :: [FilePath] -> FileWriteCap Source #

Create a file write capability for specified directories

Path validation

isPathAllowed :: [FilePath] -> FilePath -> IO Bool Source #

Check if a path is within allowed directories This improved version handles path traversal attacks by comparing canonical paths